commit b02e4d69ddb4aa63c4c971e08caf4ee8e95ae3c7
parent 8e2fa9daffbe713eb725e366d4c275951b146d97
Author: Christian Grothoff <christian@grothoff.org>
Date: Thu, 30 Jul 2026 00:08:30 +0200
migrate to Gtk4
Diffstat:
97 files changed, 8078 insertions(+), 9613 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -34,6 +34,12 @@ anastasis_gtk_config.h
anastasis_gtk_config.h.in
build-aux/
.clang-format
+build/
+doc/doxygen/html/
+doc/doxygen/version.doxy
+doc/doxygen/*.tag
+# hand-written (not generated), so it must survive the bare 'Makefile' rule above
+!doc/doxygen/Makefile
src/testing/taler-bank.err
src/testing/test_reducer_home/
.version
diff --git a/README b/README
@@ -36,8 +36,7 @@ These are the direct dependencies for running Anastasis:
- gnunet-gtk >= 0.23.1
- PostgreSQL >= 15.0
- libmagic
-- libgtk3+
-- libgladeui
+- libgtk4 (>= 4.10)
- libhpdf (optional)
@@ -57,8 +56,9 @@ $ export GNUNET_PREFIX=/usr/local/lib # or other directory of your choice
$ ./configure --prefix=$GNUNET_PREFIX/.. --with-gnunet=$GNUNET_PREFIX/..
$ make install
-anastasis-gtk requires GTK 3.22.0 or higher and libgladeui-2 (i.e. 3.8
-or 3.10). glade-3.8 should be used to edit the UI.
+anastasis-gtk requires GTK 4.10.0 or higher. The user interface is
+described by the GtkBuilder .ui files in contrib/; edit them with a text
+editor and check them with "gtk4-builder-tool validate".
After installation, you should have the following new programs:
diff --git a/contrib/.gitignore b/contrib/.gitignore
@@ -1 +1 @@
-anastasis_gtk_about_window.glade
+anastasis_gtk_about_window.ui
diff --git a/contrib/anastasis-gtk.css b/contrib/anastasis-gtk.css
@@ -0,0 +1,31 @@
+/*
+ This file is part of anastasis-gtk.
+ Copyright (C) 2025 Anastasis SARL
+
+ anastasis-gtk is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ anastasis-gtk is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+/* The frames that group the per-state pages carry no visible border. GTK3
+ expressed that with shadow-type=none, which GTK4 dropped in favour of CSS,
+ so the UI files tag those frames with the "flat" class instead. */
+frame.flat {
+ border-style: none;
+}
+
+/* AG_mark_invalid_input() adds this class to the identity attribute widget
+ whose contents the reducer rejected. */
+.anastasis-invalid,
+.anastasis-invalid * {
+ background-color: #FF4500;
+}
diff --git a/contrib/anastasis_gtk_add_provider.glade b/contrib/anastasis_gtk_add_provider.glade
@@ -1,176 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of Anastasis-gtk.
-
-Anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-Anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public License
-along with Anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Christian Grothoff
-
--->
-<interface>
- <requires lib="gtk+" version="3.8"/>
- <!-- interface-license-type lgplv3 -->
- <!-- interface-name Anastasis-gtk -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Christian Grothoff -->
- <object class="GtkDialog" id="add_provider_dialog">
- <property name="can-focus">False</property>
- <property name="modal">True</property>
- <property name="window-position">center</property>
- <property name="type-hint">dialog</property>
- <signal name="response" handler="add_provider_dialog_response_cb" swapped="no"/>
- <child internal-child="vbox">
- <object class="GtkBox">
- <property name="visible">True</property>
- <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="visible">True</property>
- <property name="can-focus">False</property>
- <property name="layout-style">end</property>
- <child>
- <object class="GtkButton" id="cancel_button">
- <property name="label">gtk-cancel</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="receives-default">False</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="close_button">
- <property name="label">gtk-add</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="receives-default">False</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="error_label">
- <property name="can-focus">False</property>
- <property name="label">DYNAMICALLY GENERATED</property>
- <attributes>
- <attribute name="foreground" value="#e0e01b1b2424"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">10</property>
- <property name="label" translatable="yes">Provider URL:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="url_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="has-focus">True</property>
- <property name="is-focus">True</property>
- <property name="activates-default">True</property>
- <property name="width-chars">54</property>
- <property name="primary-icon-stock">gtk-edit</property>
- <property name="secondary-icon-activatable">False</property>
- <property name="secondary-icon-sensitive">False</property>
- <property name="placeholder-text" translatable="yes">https://</property>
- <signal name="changed" handler="add_provider_url_entry_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">cancel_button</action-widget>
- <action-widget response="-10">close_button</action-widget>
- </action-widgets>
- <child type="titlebar">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Add Anastasis provider</property>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">cancel_button</action-widget>
- <action-widget response="-10">close_button</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_add_provider.ui b/contrib/anastasis_gtk_add_provider.ui
@@ -0,0 +1,149 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of Anastasis-gtk.
+
+Anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with Anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Christian Grothoff-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkDialog" id="add_provider_dialog">
+ <property name="modal">1</property>
+ <property name="focus-widget">url_entry</property>
+ <signal name="response" handler="add_provider_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkBox">
+ <property name="vexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="error_label">
+ <property name="visible">0</property>
+ <property name="label">DYNAMICALLY GENERATED</property>
+ <attributes>
+ <attribute name="foreground" value="#e0e01b1b2424"></attribute>
+ </attributes>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="valign">center</property>
+ <property name="focusable">1</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="hexpand">0</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Provider URL:</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="url_entry">
+ <property name="hexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="activates-default">1</property>
+ <property name="width-chars">54</property>
+ <property name="primary-icon-name">gtk-edit</property>
+ <property name="secondary-icon-activatable">0</property>
+ <property name="secondary-icon-sensitive">0</property>
+ <property name="placeholder-text" translatable="1">https://</property>
+ <signal name="changed" handler="add_provider_url_entry_changed_cb" swapped="no"/>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">cancel_button</action-widget>
+ <action-widget response="-10">close_button</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Add Anastasis provider</property>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">cancel_button</action-widget>
+ <action-widget response="-10">close_button</action-widget>
+ </action-widgets>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="can-focus">0</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkButton" id="cancel_button">
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-cancel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Cancel</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">cancel_button</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="close_button">
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">list-add</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Add</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">close_button</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_auth_add_email.glade b/contrib/anastasis_gtk_auth_add_email.glade
@@ -1,184 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of anastasis-gtk.
-
-anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Belen Pena, Christian Grothoff, Dennis Neufeld
-
--->
-<interface domain="">
- <requires lib="gtk+" version="3.12"/>
- <!-- interface-license-type gplv3 -->
- <!-- interface-name anastasis-gtk -->
- <!-- interface-description Key backup and recovery -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Belen Pena, Christian Grothoff, Dennis Neufeld -->
- <object class="GtkDialog" id="anastasis_gtk_b_email_dialog">
- <property name="can-focus">False</property>
- <property name="icon">outline_email_black_24dp.png</property>
- <property name="type-hint">dialog</property>
- <signal name="response" handler="anastasis_gtk_b_email_dialog_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="action_area">
- <object class="GtkButtonBox">
- <property name="can-focus">False</property>
- <property name="layout-style">end</property>
- <child>
- <object class="GtkButton" id="anastasis_gtk_b_email_dialog_btn_cancel">
- <property name="label">gtk-cancel</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="receives-default">False</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="anastasis_gtk_b_email_dialog_btn_ok">
- <property name="label">gtk-ok</property>
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can-focus">False</property>
- <property name="can-default">True</property>
- <property name="has-default">True</property>
- <property name="receives-default">False</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="explainer_label">
- <property name="name">explainer_label</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">For email authentication, you need to
-provide an email address. When recovering
-your secret, you will be asked to enter the
-code you will receive by email.</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">20</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-bottom">50</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="margin-start">25</property>
- <property name="margin-end">25</property>
- <property name="label" translatable="yes">Email address</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_b_email_dialog_mailaddress_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="has-focus">True</property>
- <property name="margin-start">25</property>
- <property name="margin-end">25</property>
- <property name="hexpand">True</property>
- <property name="activates-default">True</property>
- <property name="width-chars">36</property>
- <property name="primary-icon-stock">gtk-dialog-authentication</property>
- <property name="input-purpose">email</property>
- <signal name="changed" handler="anastasis_gtk_b_email_dialog_mailaddress_entry_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_b_email_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_b_email_dialog_btn_ok</action-widget>
- </action-widgets>
- <child type="titlebar">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Configure email</property>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_b_email_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_b_email_dialog_btn_ok</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_auth_add_email.ui b/contrib/anastasis_gtk_auth_add_email.ui
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of anastasis-gtk.
+
+anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Belen Pena, Christian Grothoff, Dennis Neufeld-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkDialog" id="anastasis_gtk_b_email_dialog">
+ <property name="focus-widget">anastasis_gtk_b_email_dialog_mailaddress_entry</property>
+ <property name="default-widget">anastasis_gtk_b_email_dialog_btn_ok</property>
+ <signal name="response" handler="anastasis_gtk_b_email_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel" id="explainer_label">
+ <property name="name">explainer_label</property>
+ <property name="label" translatable="1">For email authentication, you need to
+provide an email address. When recovering
+your secret, you will be asked to enter the
+code you will receive by email.</property>
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">20</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="valign">center</property>
+ <property name="margin-bottom">55</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="valign">center</property>
+ <property name="halign">start</property>
+ <property name="margin-start">25</property>
+ <property name="margin-end">25</property>
+ <property name="label" translatable="1">Email address</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_b_email_dialog_mailaddress_entry">
+ <property name="vexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="margin-start">25</property>
+ <property name="margin-end">25</property>
+ <property name="hexpand">1</property>
+ <property name="activates-default">1</property>
+ <property name="width-chars">36</property>
+ <property name="primary-icon-name">dialog-password</property>
+ <property name="input-purpose">email</property>
+ <signal name="changed" handler="anastasis_gtk_b_email_dialog_mailaddress_entry_changed_cb" swapped="no"/>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_b_email_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_b_email_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Configure email</property>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_b_email_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_b_email_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="can-focus">0</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_b_email_dialog_btn_cancel">
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-cancel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Cancel</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_b_email_dialog_btn_cancel</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_b_email_dialog_btn_ok">
+ <property name="sensitive">0</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-ok</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_OK</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_b_email_dialog_btn_ok</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_auth_add_iban.glade b/contrib/anastasis_gtk_auth_add_iban.glade
@@ -1,190 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of anastasis-gtk.
-
-anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Belen Pena, Christian Grothoff, Dennis Neufeld
-
--->
-<interface domain="">
- <requires lib="gtk+" version="3.12"/>
- <!-- interface-license-type gplv3 -->
- <!-- interface-name anastasis-gtk -->
- <!-- interface-description Key backup and recovery -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Belen Pena, Christian Grothoff, Dennis Neufeld -->
- <object class="GtkDialog" id="anastasis_gtk_b_iban_dialog">
- <property name="can-focus">False</property>
- <property name="type-hint">dialog</property>
- <signal name="response" handler="anastasis_gtk_b_iban_dialog_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="action_area">
- <object class="GtkButtonBox">
- <property name="can-focus">False</property>
- <property name="layout-style">end</property>
- <child>
- <object class="GtkButton" id="anastasis_gtk_b_iban_dialog_btn_cancel">
- <property name="label">gtk-cancel</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="receives-default">False</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="anastasis_gtk_b_iban_dialog_btn_ok">
- <property name="label">gtk-ok</property>
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can-focus">False</property>
- <property name="can-default">True</property>
- <property name="has-default">True</property>
- <property name="receives-default">False</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="explainer_label">
- <property name="name">explainer_label</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">For bank transfer authentication, you need
-to provide the IBAN of one of your bank accounts.
-When recovering your secret, you will be
-asked to pay the recovery fee via bank
-transfer from the account you provided here.</property>
- <attributes>
- <attribute name="weight" value="medium"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">20</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">20</property>
- <property name="margin-end">20</property>
- <property name="margin-bottom">50</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="margin-start">25</property>
- <property name="margin-end">25</property>
- <property name="label" translatable="yes">IBAN</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_b_iban_dialog_iban_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="has-focus">True</property>
- <property name="margin-start">25</property>
- <property name="margin-end">25</property>
- <property name="hexpand">True</property>
- <property name="activates-default">True</property>
- <property name="width-chars">36</property>
- <property name="primary-icon-stock">gtk-dialog-authentication</property>
- <property name="placeholder-text" translatable="yes">DE67830625024024853256</property>
- <property name="input-purpose">alpha</property>
- <signal name="changed" handler="anastasis_gtk_b_iban_dialog_iban_entry_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_b_iban_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_b_iban_dialog_btn_ok</action-widget>
- </action-widgets>
- <child type="titlebar">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Configure bank transfer</property>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_b_iban_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_b_iban_dialog_btn_ok</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_auth_add_iban.ui b/contrib/anastasis_gtk_auth_add_iban.ui
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of anastasis-gtk.
+
+anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Belen Pena, Christian Grothoff, Dennis Neufeld-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkDialog" id="anastasis_gtk_b_iban_dialog">
+ <property name="focus-widget">anastasis_gtk_b_iban_dialog_iban_entry</property>
+ <property name="default-widget">anastasis_gtk_b_iban_dialog_btn_ok</property>
+ <signal name="response" handler="anastasis_gtk_b_iban_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel" id="explainer_label">
+ <property name="name">explainer_label</property>
+ <property name="label" translatable="1">For bank transfer authentication, you need
+to provide the IBAN of one of your bank accounts.
+When recovering your secret, you will be
+asked to pay the recovery fee via bank
+transfer from the account you provided here.</property>
+ <attributes>
+ <attribute name="weight" value="medium"></attribute>
+ </attributes>
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">20</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="valign">center</property>
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="margin-bottom">55</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="valign">center</property>
+ <property name="halign">start</property>
+ <property name="margin-start">25</property>
+ <property name="margin-end">25</property>
+ <property name="label" translatable="1">IBAN</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_b_iban_dialog_iban_entry">
+ <property name="vexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="margin-start">25</property>
+ <property name="margin-end">25</property>
+ <property name="hexpand">1</property>
+ <property name="activates-default">1</property>
+ <property name="width-chars">36</property>
+ <property name="primary-icon-name">dialog-password</property>
+ <property name="placeholder-text" translatable="1">DE67830625024024853256</property>
+ <property name="input-purpose">alpha</property>
+ <signal name="changed" handler="anastasis_gtk_b_iban_dialog_iban_entry_changed_cb" swapped="no"/>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_b_iban_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_b_iban_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Configure bank transfer</property>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_b_iban_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_b_iban_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="can-focus">0</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_b_iban_dialog_btn_cancel">
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-cancel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Cancel</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_b_iban_dialog_btn_cancel</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_b_iban_dialog_btn_ok">
+ <property name="sensitive">0</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-ok</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_OK</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_b_iban_dialog_btn_ok</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_auth_add_post.glade b/contrib/anastasis_gtk_auth_add_post.glade
@@ -1,374 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of anastasis-gtk.
-
-anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Christian Grothoff
-
--->
-<interface>
- <requires lib="gtk+" version="3.12"/>
- <!-- interface-license-type gplv3 -->
- <!-- interface-name anastasis-gtk -->
- <!-- interface-description Key backup and recovery -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Christian Grothoff -->
- <object class="GtkDialog" id="anastasis_gtk_b_post_dialog">
- <property name="can-focus">False</property>
- <property name="icon">outline_home_work_black_24dp.png</property>
- <property name="type-hint">dialog</property>
- <signal name="response" handler="anastasis_gtk_b_post_dialog_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="action_area">
- <object class="GtkButtonBox">
- <property name="can-focus">False</property>
- <property name="layout-style">end</property>
- <child>
- <object class="GtkButton" id="anastasis_gtk_b_post_dialog_btn_cancel">
- <property name="label">gtk-cancel</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="receives-default">False</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="anastasis_gtk_b_post_dialog_btn_ok">
- <property name="label">gtk-ok</property>
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can-focus">False</property>
- <property name="can-default">True</property>
- <property name="has-default">True</property>
- <property name="receives-default">False</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <property name="spacing">5</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">For postal letter authentication, you need to
-provide a postal address. When recovering
-your secret, you will be asked to enter the
-code you will receive in a letter to that
-address.</property>
- <attributes>
- <attribute name="weight" value="medium"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">25</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">20</property>
- <property name="margin-end">20</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="label" translatable="yes">_Name</property>
- <property name="use-underline">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_b_post_dialog_full_name_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="has-focus">True</property>
- <property name="hexpand">True</property>
- <property name="activates-default">True</property>
- <signal name="changed" handler="anastasis_gtk_b_post_dialog_entry_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">20</property>
- <property name="margin-end">20</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="label" translatable="yes">_Street and number</property>
- <property name="use-underline">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_b_post_dialog_street_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="hexpand">True</property>
- <property name="activates-default">True</property>
- <signal name="changed" handler="anastasis_gtk_b_post_dialog_entry_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">20</property>
- <property name="margin-end">20</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="label" translatable="yes">_City or town</property>
- <property name="use-underline">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_b_post_dialog_city_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="hexpand">True</property>
- <property name="activates-default">True</property>
- <signal name="changed" handler="anastasis_gtk_b_post_dialog_entry_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">4</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">20</property>
- <property name="margin-end">20</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="label" translatable="yes">_Postcode</property>
- <property name="use-underline">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_b_post_dialog_postcode_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="hexpand">True</property>
- <property name="activates-default">True</property>
- <signal name="changed" handler="anastasis_gtk_b_post_dialog_entry_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">6</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">20</property>
- <property name="margin-end">20</property>
- <property name="margin-bottom">40</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="label" translatable="yes">Countr_y</property>
- <property name="use-underline">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_b_post_dialog_country_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="hexpand">True</property>
- <property name="activates-default">True</property>
- <signal name="changed" handler="anastasis_gtk_b_post_dialog_entry_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">7</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_b_post_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_b_post_dialog_btn_ok</action-widget>
- </action-widgets>
- <child type="titlebar">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Configure postal letter</property>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_b_post_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_b_post_dialog_btn_ok</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_auth_add_post.ui b/contrib/anastasis_gtk_auth_add_post.ui
@@ -0,0 +1,276 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of anastasis-gtk.
+
+anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Christian Grothoff-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkDialog" id="anastasis_gtk_b_post_dialog">
+ <property name="focus-widget">anastasis_gtk_b_post_dialog_full_name_entry</property>
+ <property name="default-widget">anastasis_gtk_b_post_dialog_btn_ok</property>
+ <signal name="response" handler="anastasis_gtk_b_post_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">For postal letter authentication, you need to
+provide a postal address. When recovering
+your secret, you will be asked to enter the
+code you will receive in a letter to that
+address.</property>
+ <attributes>
+ <attribute name="weight" value="medium"></attribute>
+ </attributes>
+ <property name="margin-top">25</property>
+ <property name="margin-bottom">25</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="vexpand">1</property>
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="valign">center</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="1">_Name</property>
+ <property name="use-underline">1</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_b_post_dialog_full_name_entry">
+ <property name="vexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="activates-default">1</property>
+ <signal name="changed" handler="anastasis_gtk_b_post_dialog_entry_changed_cb" swapped="no"/>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="halign">start</property>
+ <property name="label" translatable="1">_Street and number</property>
+ <property name="use-underline">1</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_b_post_dialog_street_entry">
+ <property name="vexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="activates-default">1</property>
+ <signal name="changed" handler="anastasis_gtk_b_post_dialog_entry_changed_cb" swapped="no"/>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="halign">start</property>
+ <property name="label" translatable="1">_City or town</property>
+ <property name="use-underline">1</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_b_post_dialog_city_entry">
+ <property name="vexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="activates-default">1</property>
+ <signal name="changed" handler="anastasis_gtk_b_post_dialog_entry_changed_cb" swapped="no"/>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="halign">start</property>
+ <property name="label" translatable="1">_Postcode</property>
+ <property name="use-underline">1</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_b_post_dialog_postcode_entry">
+ <property name="vexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="activates-default">1</property>
+ <signal name="changed" handler="anastasis_gtk_b_post_dialog_entry_changed_cb" swapped="no"/>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="margin-bottom">45</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="halign">start</property>
+ <property name="label" translatable="1">Countr_y</property>
+ <property name="use-underline">1</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_b_post_dialog_country_entry">
+ <property name="vexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="activates-default">1</property>
+ <signal name="changed" handler="anastasis_gtk_b_post_dialog_entry_changed_cb" swapped="no"/>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_b_post_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_b_post_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Configure postal letter</property>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_b_post_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_b_post_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="can-focus">0</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_b_post_dialog_btn_cancel">
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-cancel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Cancel</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_b_post_dialog_btn_cancel</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_b_post_dialog_btn_ok">
+ <property name="sensitive">0</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-ok</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_OK</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_b_post_dialog_btn_ok</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_auth_add_question.glade b/contrib/anastasis_gtk_auth_add_question.glade
@@ -1,383 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of anastasis-gtk.
-
-anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Christian Grothoff
-
--->
-<interface>
- <requires lib="gtk+" version="3.12"/>
- <!-- interface-license-type gplv3 -->
- <!-- interface-name anastasis-gtk -->
- <!-- interface-description Key backup and recovery -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Christian Grothoff -->
- <object class="GtkDialog" id="anastasis_gtk_b_question_dialog">
- <property name="can-focus">False</property>
- <property name="icon">outline_contact_support_black_24dp.png</property>
- <property name="type-hint">dialog</property>
- <signal name="response" handler="anastasis_gtk_b_question_dialog_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="action_area">
- <object class="GtkButtonBox">
- <property name="can-focus">False</property>
- <property name="layout-style">end</property>
- <child>
- <object class="GtkButton" id="anastasis_gtk_b_question_dialog_btn_cancel">
- <property name="label">gtk-cancel</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="receives-default">False</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">True</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_b_question_dialog_btn_ok">
- <property name="label">gtk-ok</property>
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can-focus">False</property>
- <property name="can-default">True</property>
- <property name="has-default">True</property>
- <property name="receives-default">False</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">True</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</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="GtkLabel" id="instruction_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">For security question authentication, you need to provide a question and its answer.
-When recovering your secret, you will be shown the question and you will need to type
-the answer exactly as you typed it here.</property>
- <attributes>
- <attribute name="weight" value="medium"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">20</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="question_vbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">20</property>
- <property name="margin-end">20</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="label" translatable="yes">Security _question</property>
- <property name="use-underline">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_b_question_dialog_question_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="hexpand">True</property>
- <property name="activates-default">True</property>
- <property name="width-chars">60</property>
- <property name="primary-icon-stock">gtk-dialog-question</property>
- <signal name="changed" handler="anastasis_gtk_b_question_dialog_question_entry_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="private_hbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">10</property>
- <property name="margin-right">10</property>
- <child>
- <object class="GtkLabel" id="privacy_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">This stays private</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="blindfold_image">
- <property name="width-request">24</property>
- <property name="height-request">24</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="pixbuf">noun_blindfold_3574196.svg</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">1</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <placeholder/>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">15</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">15</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="answer_vbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">20</property>
- <property name="margin-end">20</property>
- <property name="margin-bottom">50</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="label" translatable="yes">_Answer</property>
- <property name="use-underline">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_b_question_dialog_answer_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="hexpand">True</property>
- <property name="activates-default">True</property>
- <property name="width-chars">60</property>
- <property name="primary-icon-stock">gtk-dialog-authentication</property>
- <signal name="changed" handler="anastasis_gtk_b_question_dialog_answer_entry_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="case_sensitivity_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Note that the answer is case-sensitive and must be entered
-in exactly the same way (punctuation, spaces) during recovery.</property>
- <attributes>
- <attribute name="scale" value="0.80000000000000004"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="private_hbox1">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">10</property>
- <property name="margin-right">10</property>
- <child>
- <object class="GtkLabel" id="privacy_label1">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">This stays private</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="blindfold_image1">
- <property name="width-request">24</property>
- <property name="height-request">24</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="pixbuf">noun_blindfold_3574196.svg</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">1</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <placeholder/>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">15</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_b_question_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_b_question_dialog_btn_ok</action-widget>
- </action-widgets>
- <child type="titlebar">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Configure security question</property>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_b_question_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_b_question_dialog_btn_ok</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_auth_add_question.ui b/contrib/anastasis_gtk_auth_add_question.ui
@@ -0,0 +1,270 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of anastasis-gtk.
+
+anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Christian Grothoff-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkDialog" id="anastasis_gtk_b_question_dialog">
+ <property name="default-widget">anastasis_gtk_b_question_dialog_btn_ok</property>
+ <signal name="response" handler="anastasis_gtk_b_question_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkLabel" id="instruction_label">
+ <property name="label" translatable="1">For security question authentication, you need to provide a question and its answer.
+When recovering your secret, you will be shown the question and you will need to type
+the answer exactly as you typed it here.</property>
+ <attributes>
+ <attribute name="weight" value="medium"></attribute>
+ </attributes>
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">20</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="question_vbox">
+ <property name="orientation">vertical</property>
+ <property name="margin-top">15</property>
+ <property name="margin-bottom">15</property>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-top">15</property>
+ <property name="margin-bottom">15</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="halign">start</property>
+ <property name="label" translatable="1">Security _question</property>
+ <property name="use-underline">1</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_b_question_dialog_question_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="activates-default">1</property>
+ <property name="width-chars">60</property>
+ <property name="primary-icon-name">dialog-question</property>
+ <signal name="changed" handler="anastasis_gtk_b_question_dialog_question_entry_changed_cb" swapped="no"/>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="private_hbox">
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ <child>
+ <object class="GtkLabel" id="privacy_label">
+ <property name="halign">center</property>
+ <property name="label" translatable="1">This stays private</property>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkPicture" id="blindfold_image">
+ <property name="halign">center</property>
+ <property name="width-request">24</property>
+ <property name="height-request">24</property>
+ <property name="file">noun_blindfold_3574196.svg</property>
+ <property name="margin-start">1</property>
+ <property name="margin-end">1</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="answer_vbox">
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="margin-bottom">65</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-top">15</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="halign">start</property>
+ <property name="label" translatable="1">_Answer</property>
+ <property name="use-underline">1</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_b_question_dialog_answer_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="activates-default">1</property>
+ <property name="width-chars">60</property>
+ <property name="primary-icon-name">dialog-password</property>
+ <signal name="changed" handler="anastasis_gtk_b_question_dialog_answer_entry_changed_cb" swapped="no"/>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="case_sensitivity_label">
+ <property name="label" translatable="1">Note that the answer is case-sensitive and must be entered
+in exactly the same way (punctuation, spaces) during recovery.</property>
+ <attributes>
+ <attribute name="scale" value="0.80000000000000004"></attribute>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="private_hbox1">
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ <child>
+ <object class="GtkLabel" id="privacy_label1">
+ <property name="halign">center</property>
+ <property name="label" translatable="1">This stays private</property>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkPicture" id="blindfold_image1">
+ <property name="halign">center</property>
+ <property name="width-request">24</property>
+ <property name="height-request">24</property>
+ <property name="file">noun_blindfold_3574196.svg</property>
+ <property name="margin-start">1</property>
+ <property name="margin-end">1</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_b_question_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_b_question_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Configure security question</property>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_b_question_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_b_question_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="can-focus">0</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_b_question_dialog_btn_cancel">
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-cancel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Cancel</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_b_question_dialog_btn_cancel</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_b_question_dialog_btn_ok">
+ <property name="sensitive">0</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-ok</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_OK</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_b_question_dialog_btn_ok</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_auth_add_sms.glade b/contrib/anastasis_gtk_auth_add_sms.glade
@@ -1,207 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of anastasis-gtk.
-
-anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Christian Grothoff
-
--->
-<interface>
- <requires lib="gtk+" version="3.12"/>
- <!-- interface-license-type gplv3 -->
- <!-- interface-name anastasis-gtk -->
- <!-- interface-description Key backup and recovery -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Christian Grothoff -->
- <object class="GtkDialog" id="anastasis_gtk_b_sms_dialog">
- <property name="can-focus">False</property>
- <property name="icon">outline_stay_current_portrait_black_24dp.png</property>
- <property name="type-hint">dialog</property>
- <signal name="response" handler="anastasis_gtk_b_sms_dialog_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="action_area">
- <object class="GtkButtonBox">
- <property name="can-focus">False</property>
- <property name="layout-style">end</property>
- <child>
- <object class="GtkButton" id="anastasis_gtk_b_sms_dialog_btn_cancel">
- <property name="label">gtk-cancel</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="receives-default">False</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">True</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_b_sms_dialog_btn_ok">
- <property name="label">gtk-ok</property>
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can-focus">False</property>
- <property name="can-default">True</property>
- <property name="has-default">True</property>
- <property name="receives-default">False</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">True</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="explainer_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">20</property>
- <property name="margin-end">20</property>
- <property name="label" translatable="yes">For SMS authentication, you need to
-provide a mobile number. When recovering
-your secret, you will be asked to enter the
-code you will receive by SMS.</property>
- <attributes>
- <attribute name="weight" value="medium"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">20</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="margin-start">25</property>
- <property name="margin-end">25</property>
- <property name="margin-bottom">50</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="label" translatable="yes">Mobile number:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_b_sms_dialog_phonenumber_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="hexpand">True</property>
- <property name="activates-default">True</property>
- <property name="width-chars">24</property>
- <property name="text" translatable="yes">+</property>
- <property name="primary-icon-stock">gtk-dialog-authentication</property>
- <property name="placeholder-text" translatable="yes">+41123456789</property>
- <property name="input-purpose">phone</property>
- <signal name="changed" handler="anastasis_gtk_b_sms_dialog_phonenumber_entry_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="phone_number_format_explainer_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">20</property>
- <property name="margin-end">20</property>
- <property name="label" translatable="yes">Enter mobile number including +CC international dialing prefix.</property>
- <attributes>
- <attribute name="scale" value="0.80000000000000004"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_b_sms_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_b_sms_dialog_btn_ok</action-widget>
- </action-widgets>
- <child type="titlebar">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Configure SMS</property>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_b_sms_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_b_sms_dialog_btn_ok</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_auth_add_sms.ui b/contrib/anastasis_gtk_auth_add_sms.ui
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of anastasis-gtk.
+
+anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Christian Grothoff-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkDialog" id="anastasis_gtk_b_sms_dialog">
+ <property name="default-widget">anastasis_gtk_b_sms_dialog_btn_ok</property>
+ <signal name="response" handler="anastasis_gtk_b_sms_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkLabel" id="explainer_label">
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="label" translatable="1">For SMS authentication, you need to
+provide a mobile number. When recovering
+your secret, you will be asked to enter the
+code you will receive by SMS.</property>
+ <attributes>
+ <attribute name="weight" value="medium"></attribute>
+ </attributes>
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">20</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="vexpand">1</property>
+ <property name="halign">start</property>
+ <property name="margin-start">25</property>
+ <property name="margin-end">25</property>
+ <property name="margin-bottom">55</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="halign">start</property>
+ <property name="label" translatable="1">Mobile number:</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_b_sms_dialog_phonenumber_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="activates-default">1</property>
+ <property name="width-chars">24</property>
+ <property name="text" translatable="1">+</property>
+ <property name="primary-icon-name">dialog-password</property>
+ <property name="placeholder-text" translatable="1">+41123456789</property>
+ <property name="input-purpose">phone</property>
+ <signal name="changed" handler="anastasis_gtk_b_sms_dialog_phonenumber_entry_changed_cb" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="phone_number_format_explainer_label">
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="label" translatable="1">Enter mobile number including +CC international dialing prefix.</property>
+ <attributes>
+ <attribute name="scale" value="0.80000000000000004"></attribute>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_b_sms_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_b_sms_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Configure SMS</property>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_b_sms_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_b_sms_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="can-focus">0</property>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_b_sms_dialog_btn_cancel">
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-cancel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Cancel</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_b_sms_dialog_btn_cancel</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_b_sms_dialog_btn_ok">
+ <property name="sensitive">0</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-ok</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_OK</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_b_sms_dialog_btn_ok</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ </object>
+ </child>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_auth_add_totp.glade b/contrib/anastasis_gtk_auth_add_totp.glade
@@ -1,270 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of anastasis-gtk.
-
-anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Belen Pena, Christian Grothoff, Dennis Neufeld
-
--->
-<interface domain="">
- <requires lib="gtk+" version="3.12"/>
- <!-- interface-license-type gplv3 -->
- <!-- interface-name anastasis-gtk -->
- <!-- interface-description Key backup and recovery -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Belen Pena, Christian Grothoff, Dennis Neufeld -->
- <object class="GtkDialog" id="anastasis_gtk_b_totp_dialog">
- <property name="can-focus">False</property>
- <property name="type-hint">dialog</property>
- <signal name="response" handler="anastasis_gtk_b_totp_dialog_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="action_area">
- <object class="GtkButtonBox">
- <property name="can-focus">False</property>
- <property name="layout-style">end</property>
- <child>
- <object class="GtkButton" id="anastasis_gtk_b_totp_dialog_btn_cancel">
- <property name="label">gtk-cancel</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="receives-default">False</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="anastasis_gtk_b_totp_dialog_btn_ok">
- <property name="label">gtk-ok</property>
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can-focus">False</property>
- <property name="can-default">True</property>
- <property name="has-default">True</property>
- <property name="receives-default">False</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="explainer_label">
- <property name="name">explainer_label</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">For TOTP authentication, you need to set a name for the TOTP secret.
-Then, you must scan the generated QR code with your TOTP App to
-import the TOTP secret it into your TOTP App.</property>
- <property name="use-markup">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">20</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-bottom">50</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="margin-start">25</property>
- <property name="margin-end">25</property>
- <property name="label" translatable="yes">TOTP Name</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_b_totp_dialog_name_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="has-focus">True</property>
- <property name="margin-start">25</property>
- <property name="margin-end">25</property>
- <property name="hexpand">True</property>
- <property name="activates-default">True</property>
- <property name="width-chars">36</property>
- <property name="text" translatable="yes">Anastasis</property>
- <property name="primary-icon-stock">gtk-info</property>
- <property name="input-purpose">name</property>
- <signal name="changed" handler="anastasis_gtk_b_totp_dialog_name_entry_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="qr_image">
- <property name="name">qr_image</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">center</property>
- <property name="margin-start">25</property>
- <property name="margin-end">25</property>
- <property name="margin-top">25</property>
- <property name="margin-bottom">25</property>
- <property name="stock">gtk-missing-image</property>
- <property name="icon_size">6</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="margin-start">10</property>
- <property name="margin-end">10</property>
- <property name="label" translatable="yes">Confirm that your TOTP App works by entering the current 8-digit TOTP code here:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="totp_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="tooltip-text" translatable="yes">Enter the 8-digit TOTP code. Valid for 30s.</property>
- <property name="max-length">9</property>
- <property name="activates-default">True</property>
- <property name="max-width-chars">9</property>
- <property name="primary-icon-stock">gtk-dialog-question</property>
- <property name="placeholder-text" translatable="yes">00000000</property>
- <property name="input-purpose">number</property>
- <signal name="changed" handler="totp_entry_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="google_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="margin-start">20</property>
- <property name="margin-end">20</property>
- <property name="label" translatable="yes">We note that Google's implementation of TOTP is incomplete and will not work. We recommend using FreeOTP+.</property>
- <attributes>
- <attribute name="scale" value="0.80000000000000004"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_b_totp_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_b_totp_dialog_btn_ok</action-widget>
- </action-widgets>
- <child type="titlebar">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Configure TOTP</property>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_b_totp_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_b_totp_dialog_btn_ok</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_auth_add_totp.ui b/contrib/anastasis_gtk_auth_add_totp.ui
@@ -0,0 +1,210 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of anastasis-gtk.
+
+anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Belen Pena, Christian Grothoff, Dennis Neufeld-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkDialog" id="anastasis_gtk_b_totp_dialog">
+ <property name="focus-widget">anastasis_gtk_b_totp_dialog_name_entry</property>
+ <property name="default-widget">anastasis_gtk_b_totp_dialog_btn_ok</property>
+ <signal name="response" handler="anastasis_gtk_b_totp_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel" id="explainer_label">
+ <property name="name">explainer_label</property>
+ <property name="label" translatable="1">For TOTP authentication, you need to set a name for the TOTP secret.
+Then, you must scan the generated QR code with your TOTP App to
+import the TOTP secret it into your TOTP App.</property>
+ <property name="use-markup">1</property>
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">20</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="valign">center</property>
+ <property name="margin-bottom">55</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="valign">center</property>
+ <property name="halign">start</property>
+ <property name="margin-start">25</property>
+ <property name="margin-end">25</property>
+ <property name="label" translatable="1">TOTP Name</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_b_totp_dialog_name_entry">
+ <property name="vexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="margin-start">25</property>
+ <property name="margin-end">25</property>
+ <property name="hexpand">1</property>
+ <property name="activates-default">1</property>
+ <property name="width-chars">36</property>
+ <property name="text" translatable="1">Anastasis</property>
+ <property name="primary-icon-name">dialog-information</property>
+ <property name="input-purpose">name</property>
+ <signal name="changed" handler="anastasis_gtk_b_totp_dialog_name_entry_changed_cb" swapped="no"/>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage" id="qr_image">
+ <property name="valign">center</property>
+ <property name="name">qr_image</property>
+ <property name="halign">center</property>
+ <property name="margin-start">25</property>
+ <property name="margin-end">25</property>
+ <property name="margin-top">30</property>
+ <property name="margin-bottom">30</property>
+ <property name="icon-name">image-missing</property>
+ <property name="icon-size">large</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="halign">start</property>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ <property name="label" translatable="1">Confirm that your TOTP App works by entering the current 8-digit TOTP code here:</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="totp_entry">
+ <property name="focusable">1</property>
+ <property name="tooltip-text" translatable="1">Enter the 8-digit TOTP code. Valid for 30s.</property>
+ <property name="max-length">9</property>
+ <property name="activates-default">1</property>
+ <property name="max-width-chars">9</property>
+ <property name="primary-icon-name">dialog-question</property>
+ <property name="placeholder-text" translatable="1">00000000</property>
+ <property name="input-purpose">number</property>
+ <signal name="changed" handler="totp_entry_changed_cb" swapped="no"/>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="google_label">
+ <property name="halign">start</property>
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="label" translatable="1">We note that Google's implementation of TOTP is incomplete and will not work. We recommend using FreeOTP+.</property>
+ <attributes>
+ <attribute name="scale" value="0.80000000000000004"></attribute>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_b_totp_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_b_totp_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Configure TOTP</property>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_b_totp_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_b_totp_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="can-focus">0</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_b_totp_dialog_btn_cancel">
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-cancel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Cancel</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_b_totp_dialog_btn_cancel</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_b_totp_dialog_btn_ok">
+ <property name="sensitive">0</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-ok</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_OK</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_b_totp_dialog_btn_ok</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_auth_add_video.glade b/contrib/anastasis_gtk_auth_add_video.glade
@@ -1,199 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of anastasis-gtk.
-
-anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Christian Grothoff
-
--->
-<interface>
- <requires lib="gtk+" version="3.12"/>
- <!-- interface-license-type gplv3 -->
- <!-- interface-name anastasis-gtk -->
- <!-- interface-description key backup and recovery -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Christian Grothoff -->
- <object class="GtkDialog" id="anastasis_gtk_b_video_dialog">
- <property name="can-focus">False</property>
- <property name="icon">outline_video_camera_front_black_24dp.png</property>
- <property name="type-hint">dialog</property>
- <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="action_area">
- <object class="GtkButtonBox">
- <property name="can-focus">False</property>
- <property name="layout-style">end</property>
- <child>
- <object class="GtkButton" id="anastasis_gtk_b_video_dialog_btn_cancel">
- <property name="label">gtk-cancel</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="can-default">True</property>
- <property name="has-default">True</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">True</property>
- <signal name="clicked" handler="anastasis_gtk_b_video_dialog_btn_cancel_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_b_video_dialog_btn_ok">
- <property name="label">gtk-ok</property>
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can-focus">True</property>
- <property name="can-default">True</property>
- <property name="has-default">True</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">True</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</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="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-bottom">50</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="explainer_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">20</property>
- <property name="margin-end">20</property>
- <property name="label" translatable="yes">For video identification, you need to provide
-a passport-style photograph. When
-recovering your secret, you will be asked to
-join a video call. During that call, a human
-will use the photograph to verify your
-identity.</property>
- <attributes>
- <attribute name="weight" value="medium"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">20</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">20</property>
- <property name="margin-end">20</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Choose photograph</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkFileChooserButton" id="photo_file_chooser_button">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="has-focus">True</property>
- <property name="title" translatable="yes">Choose photograph</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage">
- <property name="can-focus">False</property>
- <property name="stock">gtk-missing-image</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">3</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_b_video_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_b_video_dialog_btn_ok</action-widget>
- </action-widgets>
- <child type="titlebar">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Configure video authentication</property>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_b_video_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_b_video_dialog_btn_ok</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_auth_add_video.ui b/contrib/anastasis_gtk_auth_add_video.ui
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of anastasis-gtk.
+
+anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Christian Grothoff-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkDialog" id="anastasis_gtk_b_video_dialog">
+ <property name="focus-widget">photo_file_chooser_button</property>
+ <property name="default-widget">anastasis_gtk_b_video_dialog_btn_cancel</property>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkBox">
+ <property name="margin-bottom">50</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="explainer_label">
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="label" translatable="1">For video identification, you need to provide
+a passport-style photograph. When
+recovering your secret, you will be asked to
+join a video call. During that call, a human
+will use the photograph to verify your
+identity.</property>
+ <attributes>
+ <attribute name="weight" value="medium"></attribute>
+ </attributes>
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">20</property>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="valign">center</property>
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Choose photograph</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="photo_file_chooser_button">
+ <property name="valign">center</property>
+ <property name="focusable">1</property>
+ <property name="label" translatable="1">Choose photograph</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkImage">
+ <property name="visible">0</property>
+ <property name="icon-name">image-missing</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_b_video_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_b_video_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Configure video authentication</property>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_b_video_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_b_video_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="can-focus">0</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_b_video_dialog_btn_cancel">
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-cancel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Cancel</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_b_video_dialog_btn_cancel</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_b_video_dialog_btn_ok">
+ <property name="sensitive">0</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-ok</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_OK</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_b_video_dialog_btn_ok</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_challenge_code.glade b/contrib/anastasis_gtk_challenge_code.glade
@@ -1,273 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of anastasis-gtk.
-
-anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Christian Grothoff
-
--->
-<interface>
- <requires lib="gtk+" version="3.6"/>
- <!-- interface-license-type gplv3 -->
- <!-- interface-name anastasis-gtk -->
- <!-- interface-description key backup and recovery -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Christian Grothoff -->
- <object class="GtkDialog" id="anastasis_gtk_c_code_dialog">
- <property name="can-focus">False</property>
- <property name="type-hint">dialog</property>
- <signal name="response" handler="anastasis_gtk_c_code_dialog_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="action_area">
- <object class="GtkButtonBox">
- <property name="can-focus">False</property>
- <property name="layout-style">end</property>
- <child>
- <object class="GtkButton" id="anastasis_gtk_c_code_dialog_btn_cancel">
- <property name="label">gtk-cancel</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="anastasis_gtk_c_code_dialog_btn_ok">
- <property name="label">gtk-ok</property>
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can-focus">False</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="GtkLabel" id="anastasis_gtk_c_code_error_label">
- <property name="can-focus">False</property>
- <property name="label">ERROR MESSAGE (SET DYNAMICALLY BY PROGRAM)</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- <attribute name="foreground" value="#a5a51d1d2d2d"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="anastasis_gtk_c_challenge_box">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_c_challenge_pre_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Challenge:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_c_challenge_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label">SET DYNAMICALLY BY PROGRAM</property>
- <attributes>
- <attribute name="style" value="italic"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Code sent to:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="challenge_instructions_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label">SET DYNAMICALLY BY PROGRAM</property>
- <attributes>
- <attribute name="style" value="italic"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Enter the code:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_c_code_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="hexpand">True</property>
- <property name="width-chars">24</property>
- <property name="text">A-</property>
- <property name="primary-icon-stock">gtk-dialog-authentication</property>
- <property name="placeholder-text" translatable="no">A-</property>
- <signal name="changed" handler="anastasis_gtk_c_code_dialog_answer_entry_changed_cb" swapped="no"/>
- <signal name="insert-text" handler="anastasis_gtk_pin_autocomplete_insert_text" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">3</property>
- </packing>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_c_code_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_c_code_dialog_btn_ok</action-widget>
- </action-widgets>
- <child type="titlebar">
- <object class="GtkLabel" id="anastasis_gtk_c_code_dialog_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Security token challenge</property>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_c_code_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_c_code_dialog_btn_ok</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_challenge_code.ui b/contrib/anastasis_gtk_challenge_code.ui
@@ -0,0 +1,193 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of anastasis-gtk.
+
+anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Christian Grothoff-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkDialog" id="anastasis_gtk_c_code_dialog">
+ <signal name="response" handler="anastasis_gtk_c_code_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_c_code_error_label">
+ <property name="visible">0</property>
+ <property name="label">ERROR MESSAGE (SET DYNAMICALLY BY PROGRAM)</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ <attribute name="foreground" value="#a5a51d1d2d2d"></attribute>
+ </attributes>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_c_challenge_box">
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_c_challenge_pre_label">
+ <property name="halign">center</property>
+ <property name="label" translatable="1">Challenge:</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_c_challenge_label">
+ <property name="label">SET DYNAMICALLY BY PROGRAM</property>
+ <attributes>
+ <attribute name="style" value="italic"></attribute>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Code sent to:</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="challenge_instructions_label">
+ <property name="label">SET DYNAMICALLY BY PROGRAM</property>
+ <attributes>
+ <attribute name="style" value="italic"></attribute>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Enter the code:</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_c_code_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="width-chars">24</property>
+ <property name="text">A-</property>
+ <property name="primary-icon-name">dialog-password</property>
+ <property name="placeholder-text" translatable="0">A-</property>
+ <signal name="changed" handler="anastasis_gtk_c_code_dialog_answer_entry_changed_cb" swapped="no"/>
+ <signal name="insert-text" handler="anastasis_gtk_pin_autocomplete_insert_text" swapped="no"/>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_c_code_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_c_code_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <object class="GtkLabel" id="anastasis_gtk_c_code_dialog_label">
+ <property name="label" translatable="1">Security token challenge</property>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_c_code_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_c_code_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="can-focus">0</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_c_code_dialog_btn_cancel">
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-cancel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Cancel</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_c_code_dialog_btn_cancel</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_c_code_dialog_btn_ok">
+ <property name="sensitive">0</property>
+ <property name="receives-default">1</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-ok</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_OK</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_c_code_dialog_btn_ok</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_challenge_iban.glade b/contrib/anastasis_gtk_challenge_iban.glade
@@ -1,433 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of anastasis-gtk.
-
-anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Christian Grothoff
-
--->
-<interface>
- <requires lib="gtk+" version="3.12"/>
- <!-- interface-license-type gplv3 -->
- <!-- interface-name anastasis-gtk -->
- <!-- interface-description key backup and recovery -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Christian Grothoff -->
- <object class="GtkDialog" id="anastasis_gtk_c_iban_dialog">
- <property name="can-focus">False</property>
- <property name="type-hint">dialog</property>
- <signal name="response" handler="anastasis_gtk_c_iban_dialog_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="action_area">
- <object class="GtkButtonBox">
- <property name="can-focus">False</property>
- <property name="layout-style">end</property>
- <child>
- <object class="GtkButton" id="anastasis_gtk_c_iban_dialog_btn_close">
- <property name="label">gtk-close</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="can-default">True</property>
- <property name="has-default">True</property>
- <property name="receives-default">False</property>
- <property name="margin-start">20</property>
- <property name="margin-end">20</property>
- <property name="margin-top">20</property>
- <property name="margin-bottom">20</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="GtkLabel" id="anastasis_gtk_c_iban_error_label">
- <property name="can-focus">False</property>
- <property name="label">ERROR MESSAGE (SET DYNAMICALLY BY PROGRAM)</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- <attribute name="foreground" value="#a5a51d1d2d2d"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="instruction_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">To satisfy the IBAN challenge, you must
- pay the indicated amount from the
-specified bank account to the Anastasis
-provider. This serves both to authenticate
-you as the bank account holder as well as
-to pay the Anastasis provider for its service.</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">20</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">10</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="debit_account_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="margin-start">30</property>
- <property name="margin-end">30</property>
- <property name="label">SET DYNAMICALLY BY PROGRAM</property>
- <attributes>
- <attribute name="style" value="italic"/>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack-type">end</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="margin-start">20</property>
- <property name="margin-end">20</property>
- <property name="label" translatable="yes">You must use your bank account identified by the following IBAN:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">20</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="credit_account_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="margin-start">30</property>
- <property name="margin-end">30</property>
- <property name="label">SET DYNAMICALLY BY PROGRAM</property>
- <property name="selectable">True</property>
- <attributes>
- <attribute name="style" value="italic"/>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack-type">end</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="margin-left">20</property>
- <property name="margin-right">20</property>
- <property name="margin-start">20</property>
- <property name="margin-end">20</property>
- <property name="label" translatable="yes">You must wire the funds to the provider's bank account at the IBAN:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">20</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">10</property>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="provider_name_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="margin-start">30</property>
- <property name="margin-end">30</property>
- <property name="label">SET DYNAMICALLY BY PROGRAM</property>
- <property name="selectable">True</property>
- <attributes>
- <attribute name="style" value="italic"/>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack-type">end</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="margin-left">20</property>
- <property name="margin-right">20</property>
- <property name="margin-start">20</property>
- <property name="margin-end">20</property>
- <property name="label" translatable="yes">The name of the provider's business is:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">20</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">4</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="wire_transfer_subject_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="margin-start">30</property>
- <property name="margin-end">30</property>
- <property name="label">SET DYNAMICALLY BY PROGRAM</property>
- <property name="selectable">True</property>
- <attributes>
- <attribute name="style" value="italic"/>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack-type">end</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="margin-left">20</property>
- <property name="margin-right">20</property>
- <property name="margin-start">20</property>
- <property name="margin-end">20</property>
- <property name="label" translatable="yes">You must use the following wire transfer subject to identify the secret share to recover:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">20</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">6</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="amount_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="margin-start">30</property>
- <property name="margin-end">30</property>
- <property name="label">SET DYNAMICALLY BY PROGRAM</property>
- <attributes>
- <attribute name="style" value="italic"/>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="pack-type">end</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="margin-left">20</property>
- <property name="margin-right">20</property>
- <property name="margin-start">20</property>
- <property name="margin-end">20</property>
- <property name="label" translatable="yes">The amount to be paid is:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">20</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">7</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="end_explainer_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">The provider will enable you to recover
-this secret share for a month using this
-program once the amount has
-arrived. "Save" the recovery state and
-open the resulting file later to continue.</property>
- <attributes>
- <attribute name="weight" value="medium"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">9</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-7">anastasis_gtk_c_iban_dialog_btn_close</action-widget>
- </action-widgets>
- <child type="titlebar">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Instructions for IBAN challenge</property>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-7">anastasis_gtk_c_iban_dialog_btn_close</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_challenge_iban.ui b/contrib/anastasis_gtk_challenge_iban.ui
@@ -0,0 +1,329 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of anastasis-gtk.
+
+anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Christian Grothoff-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkDialog" id="anastasis_gtk_c_iban_dialog">
+ <property name="default-widget">anastasis_gtk_c_iban_dialog_btn_close</property>
+ <signal name="response" handler="anastasis_gtk_c_iban_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_c_iban_error_label">
+ <property name="visible">0</property>
+ <property name="label">ERROR MESSAGE (SET DYNAMICALLY BY PROGRAM)</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ <attribute name="foreground" value="#a5a51d1d2d2d"></attribute>
+ </attributes>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="instruction_label">
+ <property name="label" translatable="1">To satisfy the IBAN challenge, you must
+ pay the indicated amount from the
+specified bank account to the Anastasis
+provider. This serves both to authenticate
+you as the bank account holder as well as
+to pay the Anastasis provider for its service.</property>
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">20</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator">
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCenterBox">
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="start-widget">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="halign">start</property>
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="label" translatable="1">You must use your bank account identified by the following IBAN:</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ <property name="end-widget">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="debit_account_label">
+ <property name="halign">start</property>
+ <property name="margin-start">30</property>
+ <property name="margin-end">30</property>
+ <property name="label">SET DYNAMICALLY BY PROGRAM</property>
+ <attributes>
+ <attribute name="style" value="italic"></attribute>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCenterBox">
+ <property name="orientation">vertical</property>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ <property name="start-widget">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="halign">start</property>
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="label" translatable="1">You must wire the funds to the provider's bank account at the IBAN:</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ <property name="end-widget">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="credit_account_label">
+ <property name="halign">start</property>
+ <property name="margin-start">30</property>
+ <property name="margin-end">30</property>
+ <property name="label">SET DYNAMICALLY BY PROGRAM</property>
+ <property name="selectable">1</property>
+ <attributes>
+ <attribute name="style" value="italic"></attribute>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCenterBox">
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="start-widget">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="halign">start</property>
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="label" translatable="1">The name of the provider's business is:</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ <property name="end-widget">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="provider_name_label">
+ <property name="halign">start</property>
+ <property name="margin-start">30</property>
+ <property name="margin-end">30</property>
+ <property name="label">SET DYNAMICALLY BY PROGRAM</property>
+ <property name="selectable">1</property>
+ <attributes>
+ <attribute name="style" value="italic"></attribute>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ <child>
+ <object class="GtkCenterBox">
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="start-widget">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="halign">start</property>
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="label" translatable="1">You must use the following wire transfer subject to identify the secret share to recover:</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ <property name="end-widget">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="wire_transfer_subject_label">
+ <property name="halign">start</property>
+ <property name="margin-start">30</property>
+ <property name="margin-end">30</property>
+ <property name="label">SET DYNAMICALLY BY PROGRAM</property>
+ <property name="selectable">1</property>
+ <attributes>
+ <attribute name="style" value="italic"></attribute>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCenterBox">
+ <property name="orientation">vertical</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="start-widget">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="halign">start</property>
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="label" translatable="1">The amount to be paid is:</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ <property name="end-widget">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="amount_label">
+ <property name="halign">start</property>
+ <property name="margin-start">30</property>
+ <property name="margin-end">30</property>
+ <property name="label">SET DYNAMICALLY BY PROGRAM</property>
+ <attributes>
+ <attribute name="style" value="italic"></attribute>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="end_explainer_label">
+ <property name="label" translatable="1">The provider will enable you to recover
+this secret share for a month using this
+program once the amount has
+arrived. "Save" the recovery state and
+open the resulting file later to continue.</property>
+ <attributes>
+ <attribute name="weight" value="medium"></attribute>
+ </attributes>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-7">anastasis_gtk_c_iban_dialog_btn_close</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Instructions for IBAN challenge</property>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-7">anastasis_gtk_c_iban_dialog_btn_close</action-widget>
+ </action-widgets>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="can-focus">0</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_c_iban_dialog_btn_close">
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">20</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">window-close</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Close</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_c_iban_dialog_btn_close</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_challenge_question.glade b/contrib/anastasis_gtk_challenge_question.glade
@@ -1,234 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of anastasis-gtk.
-
-anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Christian Grothoff
-
--->
-<interface>
- <requires lib="gtk+" version="3.6"/>
- <!-- interface-license-type gplv3 -->
- <!-- interface-name anastasis-gtk -->
- <!-- interface-description key backup and recovery -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Christian Grothoff -->
- <object class="GtkDialog" id="anastasis_gtk_c_question_dialog">
- <property name="can-focus">False</property>
- <property name="type-hint">dialog</property>
- <signal name="response" handler="anastasis_gtk_c_question_dialog_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="action_area">
- <object class="GtkButtonBox">
- <property name="can-focus">False</property>
- <property name="layout-style">end</property>
- <child>
- <object class="GtkButton" id="anastasis_gtk_b_question_dialog_btn_cancel">
- <property name="label">gtk-cancel</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">False</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="anastasis_gtk_c_question_dialog_btn_ok">
- <property name="label">gtk-ok</property>
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can-focus">False</property>
- <property name="can-default">True</property>
- <property name="has-default">True</property>
- <property name="receives-default">False</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="GtkLabel" id="anastasis_gtk_c_question_error_label">
- <property name="can-focus">False</property>
- <property name="label">ERROR MESSAGE (SET DYNAMICALLY BY PROGRAM)</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- <attribute name="foreground" value="#a5a51d1d2d2d"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Security question:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="security_question_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label">SET DYNAMICALLY BY PROGRAM</property>
- <attributes>
- <attribute name="style" value="italic"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Answer:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_c_question_dialog_answer_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="hexpand">True</property>
- <property name="activates-default">True</property>
- <property name="width-chars">60</property>
- <property name="primary-icon-stock">gtk-dialog-authentication</property>
- <signal name="changed" handler="anastasis_gtk_c_question_dialog_answer_entry_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">3</property>
- </packing>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_b_question_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_c_question_dialog_btn_ok</action-widget>
- </action-widgets>
- <child type="titlebar">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Solve secuity question challenge</property>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_b_question_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_c_question_dialog_btn_ok</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_challenge_question.ui b/contrib/anastasis_gtk_challenge_question.ui
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of anastasis-gtk.
+
+anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Christian Grothoff-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkDialog" id="anastasis_gtk_c_question_dialog">
+ <property name="default-widget">anastasis_gtk_c_question_dialog_btn_ok</property>
+ <signal name="response" handler="anastasis_gtk_c_question_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_c_question_error_label">
+ <property name="visible">0</property>
+ <property name="label">ERROR MESSAGE (SET DYNAMICALLY BY PROGRAM)</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ <attribute name="foreground" value="#a5a51d1d2d2d"></attribute>
+ </attributes>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Security question:</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="security_question_label">
+ <property name="label">SET DYNAMICALLY BY PROGRAM</property>
+ <attributes>
+ <attribute name="style" value="italic"></attribute>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Answer:</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_c_question_dialog_answer_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="activates-default">1</property>
+ <property name="width-chars">60</property>
+ <property name="primary-icon-name">dialog-password</property>
+ <signal name="changed" handler="anastasis_gtk_c_question_dialog_answer_entry_changed_cb" swapped="no"/>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_b_question_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_c_question_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Solve secuity question challenge</property>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_b_question_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_c_question_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="can-focus">0</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_b_question_dialog_btn_cancel">
+ <property name="focusable">1</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-cancel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Cancel</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_b_question_dialog_btn_cancel</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_c_question_dialog_btn_ok">
+ <property name="sensitive">0</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-ok</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_OK</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_c_question_dialog_btn_ok</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_challenge_template.glade b/contrib/anastasis_gtk_challenge_template.glade
@@ -1,187 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.22.2 -->
-<interface>
- <requires lib="gtk+" version="3.24"/>
- <object class="GtkImage" id="run_image">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="stock">gtk-execute</property>
- </object>
- <object class="GtkWindow" id="challenge_template_window">
- <property name="can_focus">False</property>
- <child type="titlebar">
- <placeholder/>
- </child>
- <child>
- <object class="GtkBox" id="challenge_hbox">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="margin_top">5</property>
- <property name="margin_bottom">5</property>
- <property name="spacing">15</property>
- <child>
- <object class="GtkImage" id="challenge_category_totp_image">
- <property name="can_focus">False</property>
- <property name="pixbuf">outline_totp_24dp.png</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">15</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="challenge_category_email_image">
- <property name="can_focus">False</property>
- <property name="pixbuf">outline_email_black_24dp.png</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">15</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="challenge_category_post_image">
- <property name="can_focus">False</property>
- <property name="pixbuf">home_work_black_24dp.svg</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">15</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="challenge_category_sms_image">
- <property name="can_focus">False</property>
- <property name="pixbuf">outline_stay_current_portrait_black_24dp.png</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">15</property>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="challenge_category_iban_image">
- <property name="can_focus">False</property>
- <property name="pixbuf">outline_iban_24dp.png</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">15</property>
- <property name="position">4</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="challenge_category_question_image">
- <property name="can_focus">False</property>
- <property name="pixbuf">outline_contact_support_black_24dp.png</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">15</property>
- <property name="position">5</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="solve_challenge_button">
- <property name="label">Solve</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">True</property>
- <property name="tooltip_text" translatable="yes">Try to solve this challenge.</property>
- <property name="image">run_image</property>
- <property name="always_show_image">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">15</property>
- <property name="position">6</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="challenge_solved_image">
- <property name="name">challenge_solved_image</property>
- <property name="can_focus">False</property>
- <property name="tooltip_text" translatable="yes">This challenge was solved.</property>
- <property name="pixbuf">checkmark.svgz</property>
- <property name="icon_size">1</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">15</property>
- <property name="position">7</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="challenge_info_box">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="challenge_label">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="halign">start</property>
- <property name="valign">center</property>
- <property name="label">DYNAMICALLY GENERATED</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="hint_label">
- <property name="can_focus">False</property>
- <property name="halign">start</property>
- <property name="margin_start">10</property>
- <property name="label">DYNAMICALLY GENERATED</property>
- <attributes>
- <attribute name="scale" value="0.80000000000000004"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="error_label">
- <property name="can_focus">False</property>
- <property name="halign">start</property>
- <property name="label">DYNAMICALLY GENERATED</property>
- <attributes>
- <attribute name="foreground" value="#eded33333b3b"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">15</property>
- <property name="position">8</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_challenge_template.ui b/contrib/anastasis_gtk_challenge_template.ui
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkWindow" id="challenge_template_window">
+ <child type="titlebar">
+ <placeholder/>
+ </child>
+ <property name="child">
+ <object class="GtkBox" id="challenge_hbox">
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="spacing">15</property>
+ <property name="hexpand">0</property>
+ <child>
+ <object class="GtkPicture" id="challenge_category_totp_image">
+ <property name="halign">center</property>
+ <property name="visible">0</property>
+ <property name="file">outline_totp_24dp.png</property>
+ <property name="margin-start">15</property>
+ <property name="margin-end">15</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkPicture" id="challenge_category_email_image">
+ <property name="halign">center</property>
+ <property name="visible">0</property>
+ <property name="file">outline_email_black_24dp.png</property>
+ <property name="margin-start">15</property>
+ <property name="margin-end">15</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkPicture" id="challenge_category_post_image">
+ <property name="halign">center</property>
+ <property name="visible">0</property>
+ <property name="file">home_work_black_24dp.svg</property>
+ <property name="margin-start">15</property>
+ <property name="margin-end">15</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkPicture" id="challenge_category_sms_image">
+ <property name="halign">center</property>
+ <property name="visible">0</property>
+ <property name="file">outline_stay_current_portrait_black_24dp.png</property>
+ <property name="margin-start">15</property>
+ <property name="margin-end">15</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkPicture" id="challenge_category_iban_image">
+ <property name="halign">center</property>
+ <property name="visible">0</property>
+ <property name="file">outline_iban_24dp.png</property>
+ <property name="margin-start">15</property>
+ <property name="margin-end">15</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkPicture" id="challenge_category_question_image">
+ <property name="halign">center</property>
+ <property name="visible">0</property>
+ <property name="file">outline_contact_support_black_24dp.png</property>
+ <property name="margin-start">15</property>
+ <property name="margin-end">15</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="solve_challenge_button">
+ <property name="halign">center</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="tooltip-text" translatable="1">Try to solve this challenge.</property>
+ <property name="margin-start">15</property>
+ <property name="margin-end">15</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage" id="run_image">
+ <property name="icon-name">system-run</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label">Solve</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkPicture" id="challenge_solved_image">
+ <property name="halign">center</property>
+ <property name="visible">0</property>
+ <property name="name">challenge_solved_image</property>
+ <property name="tooltip-text" translatable="1">This challenge was solved.</property>
+ <property name="file">checkmark.svgz</property>
+ <property name="margin-start">15</property>
+ <property name="margin-end">15</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="challenge_info_box">
+ <property name="hexpand">1</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-start">15</property>
+ <property name="margin-end">15</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkLabel" id="challenge_label">
+ <property name="vexpand">1</property>
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="label">DYNAMICALLY GENERATED</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="hint_label">
+ <property name="visible">0</property>
+ <property name="halign">start</property>
+ <property name="margin-start">10</property>
+ <property name="label">DYNAMICALLY GENERATED</property>
+ <attributes>
+ <attribute name="scale" value="0.80000000000000004"></attribute>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="error_label">
+ <property name="visible">0</property>
+ <property name="halign">start</property>
+ <property name="label">DYNAMICALLY GENERATED</property>
+ <attributes>
+ <attribute name="foreground" value="#eded33333b3b"></attribute>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_challenge_totp.glade b/contrib/anastasis_gtk_challenge_totp.glade
@@ -1,231 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of anastasis-gtk.
-
-anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Christian Grothoff
-
--->
-<interface>
- <requires lib="gtk+" version="3.6"/>
- <!-- interface-license-type gplv3 -->
- <!-- interface-name anastasis-gtk -->
- <!-- interface-description key backup and recovery -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Christian Grothoff -->
- <object class="GtkDialog" id="anastasis_gtk_c_totp_dialog">
- <property name="can-focus">False</property>
- <property name="type-hint">dialog</property>
- <signal name="response" handler="anastasis_gtk_c_totp_dialog_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="action_area">
- <object class="GtkButtonBox">
- <property name="can-focus">False</property>
- <property name="layout-style">end</property>
- <child>
- <object class="GtkButton" id="anastasis_gtk_c_totp_dialog_btn_cancel">
- <property name="label">gtk-cancel</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="anastasis_gtk_c_totp_dialog_btn_ok">
- <property name="label">gtk-ok</property>
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can-focus">False</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="GtkLabel" id="anastasis_gtk_c_totp_error_label">
- <property name="can-focus">False</property>
- <property name="label">ERROR MESSAGE (SET DYNAMICALLY BY PROGRAM)</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- <attribute name="foreground" value="#a5a51d1d2d2d"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Please look up TOTP under:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="challenge_instructions_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label">SET DYNAMICALLY BY PROGRAM</property>
- <attributes>
- <attribute name="style" value="italic"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Enter the PIN:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_c_totp_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="hexpand">True</property>
- <property name="width-chars">24</property>
- <property name="primary-icon-stock">gtk-dialog-authentication</property>
- <signal name="changed" handler="anastasis_gtk_c_totp_dialog_answer_entry_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">3</property>
- </packing>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_c_totp_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_c_totp_dialog_btn_ok</action-widget>
- </action-widgets>
- <child type="titlebar">
- <object class="GtkLabel" id="anastasis_gtk_c_totp_dialog_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">TOTP challenge</property>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_c_totp_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_c_totp_dialog_btn_ok</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_challenge_totp.ui b/contrib/anastasis_gtk_challenge_totp.ui
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of anastasis-gtk.
+
+anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Christian Grothoff-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkDialog" id="anastasis_gtk_c_totp_dialog">
+ <signal name="response" handler="anastasis_gtk_c_totp_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_c_totp_error_label">
+ <property name="visible">0</property>
+ <property name="label">ERROR MESSAGE (SET DYNAMICALLY BY PROGRAM)</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ <attribute name="foreground" value="#a5a51d1d2d2d"></attribute>
+ </attributes>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Please look up TOTP under:</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="challenge_instructions_label">
+ <property name="label">SET DYNAMICALLY BY PROGRAM</property>
+ <attributes>
+ <attribute name="style" value="italic"></attribute>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Enter the PIN:</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_c_totp_entry">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="width-chars">24</property>
+ <property name="primary-icon-name">dialog-password</property>
+ <signal name="changed" handler="anastasis_gtk_c_totp_dialog_answer_entry_changed_cb" swapped="no"/>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_c_totp_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_c_totp_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <object class="GtkLabel" id="anastasis_gtk_c_totp_dialog_label">
+ <property name="label" translatable="1">TOTP challenge</property>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_c_totp_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_c_totp_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="can-focus">0</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_c_totp_dialog_btn_cancel">
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-cancel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Cancel</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_c_totp_dialog_btn_cancel</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_c_totp_dialog_btn_ok">
+ <property name="sensitive">0</property>
+ <property name="receives-default">1</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-ok</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_OK</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_c_totp_dialog_btn_ok</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_deny_singlefactor.glade b/contrib/anastasis_gtk_deny_singlefactor.glade
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2 -->
-<interface>
- <requires lib="gtk+" version="3.24"/>
- <object class="GtkMessageDialog" id="anastasis_gtk_deny_singlefactor_dialog">
- <property name="can-focus">False</property>
- <property name="title" translatable="yes">Single-factor authentication is not allowed!</property>
- <property name="modal">True</property>
- <property name="window-position">center</property>
- <property name="type-hint">dialog</property>
- <property name="message-type">warning</property>
- <property name="text" translatable="yes">To keep your secret secure, we require at least two authentication options, and recommend you specify at least three authentication options before proceeding.</property>
- <property name="secondary-text" translatable="yes">Select "back" to add additional authentication options.</property>
- <signal name="response" handler="anastasis_gtk_deny_singlefactor_dialog_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="action_area">
- <object class="GtkButtonBox">
- <property name="can-focus">False</property>
- <property name="homogeneous">True</property>
- <property name="layout-style">end</property>
- <child>
- <object class="GtkButton" id="back_button">
- <property name="label">gtk-go-back</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="tooltip-text" translatable="yes">Go back to the previous dialog to add more authentication options.</property>
- <property name="use-stock">True</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">back_button</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_deny_singlefactor.ui b/contrib/anastasis_gtk_deny_singlefactor.ui
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkMessageDialog" id="anastasis_gtk_deny_singlefactor_dialog">
+ <property name="title" translatable="1">Single-factor authentication is not allowed!</property>
+ <property name="modal">1</property>
+ <property name="message-type">warning</property>
+ <property name="text" translatable="1">To keep your secret secure, we require at least two authentication options, and recommend you specify at least three authentication options before proceeding.</property>
+ <property name="secondary-text" translatable="1">Select "back" to add additional authentication options.</property>
+ <signal name="response" handler="anastasis_gtk_deny_singlefactor_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="valign">center</property>
+ <property name="can-focus">0</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkButton" id="back_button">
+ <property name="label" translatable="1">_Back</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="tooltip-text" translatable="1">Go back to the previous dialog to add more authentication options.</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="use-underline">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">back_button</action-widget>
+ </action-widgets>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_edit_policy.glade b/contrib/anastasis_gtk_edit_policy.glade
@@ -1,222 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of anastasis-gtk.
-
-anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Christian Grothoff
-
--->
-<interface>
- <requires lib="gtk+" version="3.24"/>
- <!-- interface-license-type gplv3 -->
- <!-- interface-name anastasis-gtk -->
- <!-- interface-description key backup and recovery -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Christian Grothoff -->
- <object class="GtkAdjustment" id="adjustment_h">
- <property name="upper">100</property>
- <property name="step-increment">1</property>
- <property name="page-increment">10</property>
- </object>
- <object class="GtkAdjustment" id="adjustment_v">
- <property name="upper">100</property>
- <property name="step-increment">1</property>
- <property name="page-increment">10</property>
- </object>
- <object class="GtkDialog" id="anastasis_gtk_policy_edit_dialog">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="title" translatable="yes">Edit policy</property>
- <property name="modal">True</property>
- <property name="window-position">center</property>
- <property name="type-hint">dialog</property>
- <property name="gravity">center</property>
- <signal name="response" handler="anastasis_gtk_policy_edit_dialog_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="action_area">
- <object class="GtkButtonBox">
- <property name="can-focus">False</property>
- <property name="layout-style">end</property>
- <child>
- <object class="GtkButton" id="cancel_button">
- <property name="label">gtk-cancel</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="ok_button">
- <property name="label">gtk-ok</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-stock">True</property>
- <property name="always-show-image">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="GtkBox" id="edit_dialog_vbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="hexpand">True</property>
- <property name="vexpand">True</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="edit_frame_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Map challenges to providers to select them!</property>
- <property name="justify">center</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">15</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkScrolledWindow" id="policy_scrolled_window">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="hadjustment">adjustment_h</property>
- <property name="vadjustment">adjustment_v</property>
- <property name="shadow-type">in</property>
- <property name="propagate-natural-width">True</property>
- <property name="propagate-natural-height">True</property>
- <child>
- <object class="GtkViewport" id="grid_viewport">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="hadjustment">adjustment_h</property>
- <property name="vadjustment">adjustment_v</property>
- <child>
- <!-- n-columns=3 n-rows=3 -->
- <object class="GtkGrid" id="policy_grid">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-top">5</property>
- <property name="margin-bottom">5</property>
- <property name="row-spacing">10</property>
- <property name="column-spacing">5</property>
- <property name="row-homogeneous">True</property>
- <child>
- <object class="GtkLabel" id="methods_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">5</property>
- <property name="margin-right">5</property>
- <property name="label" translatable="yes">Authentication method</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- <packing>
- <property name="left-attach">0</property>
- <property name="top-attach">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="provider_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Anastasis provider</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- <packing>
- <property name="left-attach">1</property>
- <property name="top-attach">0</property>
- </packing>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">cancel_button</action-widget>
- <action-widget response="-5">ok_button</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_edit_policy.ui b/contrib/anastasis_gtk_edit_policy.ui
@@ -0,0 +1,197 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of anastasis-gtk.
+
+anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Christian Grothoff-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkAdjustment" id="adjustment_h">
+ <property name="upper">100</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="adjustment_v">
+ <property name="upper">100</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkDialog" id="anastasis_gtk_policy_edit_dialog">
+ <property name="visible">1</property>
+ <property name="title" translatable="1">Edit policy</property>
+ <property name="modal">1</property>
+ <signal name="response" handler="anastasis_gtk_policy_edit_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkBox" id="edit_dialog_vbox">
+ <property name="hexpand">1</property>
+ <property name="vexpand">1</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkLabel" id="edit_frame_label">
+ <property name="label" translatable="1">Map challenges to providers to select them!</property>
+ <property name="justify">center</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ <property name="margin-top">15</property>
+ <property name="margin-bottom">15</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="policy_scrolled_window">
+ <property name="focusable">1</property>
+ <property name="hadjustment">adjustment_h</property>
+ <property name="vadjustment">adjustment_v</property>
+ <property name="propagate-natural-width">1</property>
+ <property name="propagate-natural-height">1</property>
+ <property name="child">
+ <object class="GtkViewport" id="grid_viewport">
+ <property name="hadjustment">adjustment_h</property>
+ <property name="vadjustment">adjustment_v</property>
+ <property name="child">
+ <object class="GtkGrid" id="policy_grid">
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="row-spacing">10</property>
+ <property name="column-spacing">5</property>
+ <property name="row-homogeneous">1</property>
+ <child>
+ <object class="GtkLabel" id="methods_label">
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="label" translatable="1">Authentication method</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="provider_label">
+ <property name="label" translatable="1">Anastasis provider</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </property>
+ </object>
+ </property>
+ <property name="has-frame">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">cancel_button</action-widget>
+ <action-widget response="-5">ok_button</action-widget>
+ </action-widgets>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="can-focus">0</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkButton" id="cancel_button">
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-cancel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Cancel</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">cancel_button</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="ok_button">
+ <property name="sensitive">0</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-ok</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_OK</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">ok_button</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_edit_providers.glade b/contrib/anastasis_gtk_edit_providers.glade
@@ -1,325 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of Anastasis-gtk.
-
-Anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU Lesser General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-Anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Lesser General Public License for more details.
-
-You should have received a copy of the GNU Lesser General Public License
-along with Anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Christian Grothoff
-
--->
-<interface>
- <requires lib="gtk+" version="3.8"/>
- <!-- interface-license-type lgplv3 -->
- <!-- interface-name Anastasis-gtk -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Christian Grothoff -->
- <object class="GtkListStore" id="provider_liststore">
- <columns>
- <!-- column-name url -->
- <column type="gchararray"/>
- <!-- column-name status -->
- <column type="gchararray"/>
- <!-- column-name status_color -->
- <column type="gchararray"/>
- <!-- column-name liability_limit -->
- <column type="gchararray"/>
- <!-- column-name enabled -->
- <column type="gboolean"/>
- <!-- column-name sensitive -->
- <column type="gboolean"/>
- <!-- column-name not_sensitive -->
- <column type="gboolean"/>
- <!-- column-name business_name -->
- <column type="gchararray"/>
- </columns>
- </object>
- <object class="GtkDialog" id="edit_provider_dialog">
- <property name="can-focus">False</property>
- <property name="modal">True</property>
- <property name="window-position">center</property>
- <property name="type-hint">dialog</property>
- <signal name="response" handler="edit_provider_dialog_response_cb" swapped="no"/>
- <child internal-child="vbox">
- <object class="GtkBox">
- <property name="visible">True</property>
- <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="visible">True</property>
- <property name="can-focus">False</property>
- <property name="layout-style">end</property>
- <child>
- <object class="GtkButton" id="cancel_button">
- <property name="label">gtk-cancel</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="receives-default">False</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="close_button">
- <property name="label">gtk-apply</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="receives-default">False</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">10</property>
- <property name="label" translatable="yes">Provider URL:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="url_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="has-focus">True</property>
- <property name="is-focus">True</property>
- <property name="activates-default">True</property>
- <property name="width-chars">54</property>
- <property name="primary-icon-stock">gtk-edit</property>
- <property name="secondary-icon-activatable">False</property>
- <property name="secondary-icon-sensitive">False</property>
- <property name="placeholder-text" translatable="yes">https://</property>
- <signal name="changed" handler="url_entry_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="add_button">
- <property name="label">gtk-add</property>
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can-focus">False</property>
- <property name="can-default">True</property>
- <property name="has-default">True</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <signal name="clicked" handler="url_add_button_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkFrame">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-top">10</property>
- <property name="label-xalign">0</property>
- <property name="shadow-type">none</property>
- <child>
- <object class="GtkAlignment">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="left-padding">12</property>
- <child>
- <object class="GtkViewport">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkTreeView" id="provider_tree_view">
- <property name="height-request">300</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="model">provider_liststore</property>
- <signal name="button-press-event" handler="provider_tree_view_button_press_event_cb" swapped="no"/>
- <child internal-child="selection">
- <object class="GtkTreeSelection">
- <property name="mode">browse</property>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="enabled_column">
- <property name="spacing">5</property>
- <property name="title" translatable="yes">Use</property>
- <property name="reorderable">True</property>
- <property name="sort-indicator">True</property>
- <property name="sort-column-id">6</property>
- <child>
- <object class="GtkCellRendererToggle" id="use_toggle">
- <signal name="toggled" handler="provider_toggle_callback" swapped="no"/>
- </object>
- <attributes>
- <attribute name="sensitive">5</attribute>
- <attribute name="activatable">5</attribute>
- <attribute name="active">4</attribute>
- <attribute name="inconsistent">6</attribute>
- </attributes>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="url_column">
- <property name="spacing">5</property>
- <property name="sizing">autosize</property>
- <property name="title" translatable="yes">Provider</property>
- <child>
- <object class="GtkCellRendererText" id="url_renderer"/>
- <attributes>
- <attribute name="text">7</attribute>
- </attributes>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="liability_column">
- <property name="spacing">5</property>
- <property name="sizing">autosize</property>
- <property name="title" translatable="yes">Liability limit</property>
- <child>
- <object class="GtkCellRendererText" id="liability_limit_text"/>
- <attributes>
- <attribute name="visible">5</attribute>
- <attribute name="text">3</attribute>
- </attributes>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn">
- <property name="spacing">5</property>
- <property name="title" translatable="yes">Status</property>
- <property name="reorderable">True</property>
- <property name="sort-indicator">True</property>
- <property name="sort-column-id">6</property>
- <child>
- <object class="GtkCellRendererText" id="status"/>
- <attributes>
- <attribute name="foreground">2</attribute>
- <attribute name="text">1</attribute>
- </attributes>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Known providers</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">cancel_button</action-widget>
- <action-widget response="-10">close_button</action-widget>
- </action-widgets>
- <child type="titlebar">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Add Anastasis provider</property>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">cancel_button</action-widget>
- <action-widget response="-10">close_button</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_edit_providers.ui b/contrib/anastasis_gtk_edit_providers.ui
@@ -0,0 +1,271 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of Anastasis-gtk.
+
+Anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Lesser General Public License for more details.
+
+You should have received a copy of the GNU Lesser General Public License
+along with Anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Christian Grothoff-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkListStore" id="provider_liststore">
+ <columns>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ <column type="gboolean"/>
+ <column type="gboolean"/>
+ <column type="gboolean"/>
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkDialog" id="edit_provider_dialog">
+ <property name="modal">1</property>
+ <property name="focus-widget">url_entry</property>
+ <property name="default-widget">add_button</property>
+ <signal name="response" handler="edit_provider_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkBox">
+ <property name="vexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox">
+ <property name="valign">center</property>
+ <property name="focusable">1</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="hexpand">0</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Provider URL:</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="url_entry">
+ <property name="hexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="activates-default">1</property>
+ <property name="width-chars">54</property>
+ <property name="primary-icon-name">gtk-edit</property>
+ <property name="secondary-icon-activatable">0</property>
+ <property name="secondary-icon-sensitive">0</property>
+ <property name="placeholder-text" translatable="1">https://</property>
+ <signal name="changed" handler="url_entry_changed_cb" swapped="no"/>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="add_button">
+ <property name="halign">center</property>
+ <property name="label" translatable="1">_Add</property>
+ <property name="sensitive">0</property>
+ <property name="receives-default">1</property>
+ <property name="use-underline">1</property>
+ <signal name="clicked" handler="url_add_button_clicked_cb" swapped="no"/>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="vexpand">1</property>
+ <property name="hexpand">0</property>
+ <child>
+ <object class="GtkFrame">
+ <property name="hexpand">1</property>
+ <property name="margin-top">10</property>
+ <property name="child">
+ <object class="GtkViewport">
+ <property name="child">
+ <object class="GtkTreeView" id="provider_tree_view">
+ <property name="height-request">300</property>
+ <property name="model">provider_liststore</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection">
+ <property name="mode">browse</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="enabled_column">
+ <property name="spacing">5</property>
+ <property name="title" translatable="1">Use</property>
+ <property name="reorderable">1</property>
+ <property name="sort-indicator">1</property>
+ <property name="sort-column-id">6</property>
+ <child>
+ <object class="GtkCellRendererToggle" id="use_toggle">
+ <signal name="toggled" handler="provider_toggle_callback" swapped="no"/>
+ </object>
+ <attributes>
+ <attribute name="sensitive">5</attribute>
+ <attribute name="activatable">5</attribute>
+ <attribute name="active">4</attribute>
+ <attribute name="inconsistent">6</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="url_column">
+ <property name="spacing">5</property>
+ <property name="sizing">autosize</property>
+ <property name="title" translatable="1">Provider</property>
+ <child>
+ <object class="GtkCellRendererText" id="url_renderer"/>
+ <attributes>
+ <attribute name="text">7</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="liability_column">
+ <property name="spacing">5</property>
+ <property name="sizing">autosize</property>
+ <property name="title" translatable="1">Liability limit</property>
+ <child>
+ <object class="GtkCellRendererText" id="liability_limit_text"/>
+ <attributes>
+ <attribute name="visible">5</attribute>
+ <attribute name="text">3</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn">
+ <property name="spacing">5</property>
+ <property name="title" translatable="1">Status</property>
+ <property name="reorderable">1</property>
+ <property name="sort-indicator">1</property>
+ <property name="sort-column-id">6</property>
+ <child>
+ <object class="GtkCellRendererText" id="status"/>
+ <attributes>
+ <attribute name="foreground">2</attribute>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkGestureClick">
+ <property name="button">3</property>
+ <signal name="pressed" handler="provider_tree_view_pressed_cb"/>
+ </object>
+ </child>
+ </object>
+ </property>
+ <property name="margin-start">12</property>
+ </object>
+ </property>
+ <child type="label">
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Known providers</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ <style>
+ <class name="flat"/>
+ </style>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">cancel_button</action-widget>
+ <action-widget response="-10">close_button</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Add Anastasis provider</property>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">cancel_button</action-widget>
+ <action-widget response="-10">close_button</action-widget>
+ </action-widgets>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="can-focus">0</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkButton" id="cancel_button">
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-cancel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Cancel</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">cancel_button</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="close_button">
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-apply</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Apply</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">close_button</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_main_window.glade b/contrib/anastasis_gtk_main_window.glade
@@ -1,3759 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of anastasis-gtk.
-
-anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Christian Grothoff, Dennis Neufeld
-
--->
-<interface domain="">
- <requires lib="gtk+" version="3.22"/>
- <!-- interface-license-type gplv3 -->
- <!-- interface-name anastasis-gtk -->
- <!-- interface-description Key backup and recovery -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Christian Grothoff, Dennis Neufeld -->
- <object class="GtkImage" id="add_image">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="stock">gtk-add</property>
- </object>
- <object class="GtkListStore" id="anastasis_gtk_backup_progress_liststore">
- <columns>
- <!-- column-name description -->
- <column type="gchararray"/>
- <!-- column-name state_name -->
- <column type="gchararray"/>
- <!-- column-name tooltip -->
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0" translatable="yes">1. Location & currency</col>
- <col id="1">^(CONTINENT|COUNTRY)_SELECTING$</col>
- <col id="2" translatable="yes">Where you live will determine which personal information can be used to identify your backup.</col>
- </row>
- <row>
- <col id="0" translatable="yes">2. Personal information</col>
- <col id="1">^USER_ATTRIBUTES_COLLECTING$</col>
- <col id="2" translatable="yes">Your personal information will not be shared with anyone. But you must provide the same information during recovery.\</col>
- </row>
- <row>
- <col id="0" translatable="yes">3. Authorization methods</col>
- <col id="1">^AUTHENTICATIONS_EDITING$</col>
- <col id="2" translatable="yes">Specify which methods could be used to authenticate you during recovery.</col>
- </row>
- <row>
- <col id="0" translatable="yes">4. Recovery policies</col>
- <col id="1">^POLICIES_REVIEWING$</col>
- <col id="2" translatable="yes">These are possible ways how the secret could be recovered. Please review and possibly edit the policies.</col>
- </row>
- <row>
- <col id="0" translatable="yes">5. Enter secret</col>
- <col id="1">^SECRET_EDITING$</col>
- <col id="2" translatable="yes">Please specify the secret to be backed up.</col>
- </row>
- <row>
- <col id="0" translatable="yes">6. Payment (optional)</col>
- <col id="1">^.*_PAYING$</col>
- <col id="2" translatable="yes">Some Anastasis providers require payment for their service. Please pay.</col>
- </row>
- <row>
- <col id="0" translatable="yes">7. Backup completed</col>
- <col id="1">BACKUP_FINISHED</col>
- <col id="2" translatable="yes">Your backup is complete. Please do test the recovery on occasion.</col>
- </row>
- </data>
- </object>
- <object class="GtkAdjustment" id="anastasis_gtk_enter_secret_hadjustment">
- <property name="upper">100</property>
- <property name="step-increment">1</property>
- <property name="page-increment">10</property>
- </object>
- <object class="GtkTextBuffer" id="anastasis_gtk_enter_secret_textbuffer">
- <signal name="changed" handler="anastasis_gtk_enter_secret_textbuffer_changed_cb" swapped="no"/>
- </object>
- <object class="GtkAdjustment" id="anastasis_gtk_enter_secret_vadjustment">
- <property name="upper">100</property>
- <property name="step-increment">1</property>
- <property name="page-increment">10</property>
- </object>
- <object class="GtkAdjustment" id="anastasis_gtk_policy_box_adjustment_h">
- <property name="upper">100</property>
- <property name="step-increment">1</property>
- <property name="page-increment">10</property>
- </object>
- <object class="GtkAdjustment" id="anastasis_gtk_policy_box_adjustment_v">
- <property name="upper">100</property>
- <property name="step-increment">1</property>
- <property name="page-increment">10</property>
- </object>
- <object class="GtkListStore" id="anastasis_gtk_recovery_progress_liststore">
- <columns>
- <!-- column-name description -->
- <column type="gchararray"/>
- <!-- column-name state_name -->
- <column type="gchararray"/>
- <!-- column-name tooltip -->
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0" translatable="yes">1. Location & currency</col>
- <col id="1">^(CONTINENT|COUNTRY)_SELECTING$</col>
- <col id="2" translatable="yes">Where you live will determine which personal information can be used to identify your backup.</col>
- </row>
- <row>
- <col id="0" translatable="yes">2. Personal information</col>
- <col id="1">^USER_ATTRIBUTES_COLLECTING$</col>
- <col id="2" translatable="yes">Your personal information will not be shared with anyone. But you must provide the same information during recovery.</col>
- </row>
- <row>
- <col id="0" translatable="yes">3. Select secret</col>
- <col id="1">^SECRET_SELECTING$</col>
- <col id="2" translatable="yes">Please select which secret to recover. You may switch to a different version or provider.</col>
- </row>
- <row>
- <col id="0" translatable="yes">4. Solve challenges</col>
- <col id="1">^CHALLENGE_SELECTING$</col>
- <col id="2" translatable="yes">Please select an authentication challenge to pass to recover the secret.</col>
- </row>
- <row>
- <col id="0" translatable="yes">5. Secret recovered</col>
- <col id="1">^RECOVERY_FINISHED$</col>
- <col id="2" translatable="yes">Your secret was successfully recovered.</col>
- </row>
- </data>
- </object>
- <object class="GtkListStore" id="authentication_methods_liststore">
- <columns>
- <!-- column-name type -->
- <column type="gchararray"/>
- <!-- column-name visualization -->
- <column type="gchararray"/>
- <!-- column-name index -->
- <column type="guint"/>
- </columns>
- </object>
- <object class="GtkAdjustment" id="backup_adjustmenth">
- <property name="upper">100</property>
- <property name="step-increment">1</property>
- <property name="page-increment">10</property>
- </object>
- <object class="GtkAdjustment" id="backup_adjustmentv">
- <property name="upper">100</property>
- <property name="step-increment">1</property>
- <property name="page-increment">10</property>
- </object>
- <object class="GtkImage" id="backup_image">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">5</property>
- <property name="margin-right">5</property>
- <property name="stock">gtk-go-up</property>
- </object>
- <object class="GtkListStore" id="backup_provider_liststore">
- <columns>
- <!-- column-name provider_url -->
- <column type="gchararray"/>
- <!-- column-name policy_version -->
- <column type="guint64"/>
- <!-- column-name expiration_time_str -->
- <column type="gchararray"/>
- <!-- column-name success_flag -->
- <column type="gboolean"/>
- <!-- column-name provider_name -->
- <column type="gchararray"/>
- </columns>
- </object>
- <object class="GtkListStore" id="challenge_status_liststore">
- <columns>
- <!-- column-name challenge_offset -->
- <column type="guint"/>
- <!-- column-name challenge_uuid -->
- <column type="gchararray"/>
- <!-- column-name solved -->
- <column type="gboolean"/>
- <!-- column-name challenge_status -->
- <column type="gchararray"/>
- <!-- column-name payment_qr_code -->
- <column type="GdkPixbuf"/>
- <!-- column-name error_message -->
- <column type="gchararray"/>
- <!-- column-name payto_uri -->
- <column type="gchararray"/>
- <!-- column-name paying -->
- <column type="gboolean"/>
- <!-- column-name has_error -->
- <column type="gboolean"/>
- <!-- column-name cost -->
- <column type="gchararray"/>
- <!-- column-name redirect_url -->
- <column type="gchararray"/>
- <!-- column-name have_redirect -->
- <column type="gboolean"/>
- <!-- column-name not_solved -->
- <column type="gboolean"/>
- <!-- column-name type -->
- <column type="gchararray"/>
- <!-- column-name instructions -->
- <column type="gchararray"/>
- <!-- column-name provider_url -->
- <column type="gchararray"/>
- </columns>
- </object>
- <object class="GtkListStore" id="continent_liststore">
- <columns>
- <!-- column-name continent_name -->
- <column type="gchararray"/>
- <!-- column-name continent_i18n_name -->
- <column type="gchararray"/>
- </columns>
- </object>
- <object class="GtkListStore" id="country_liststore">
- <columns>
- <!-- column-name country_name -->
- <column type="gchararray"/>
- <!-- column-name country_code -->
- <column type="gchararray"/>
- </columns>
- </object>
- <object class="GtkImage" id="edit_image">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="stock">gtk-edit</property>
- </object>
- <object class="GtkImage" id="email_image">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-right">5</property>
- <property name="margin-end">5</property>
- <property name="pixbuf">outline_email_black_24dp.png</property>
- </object>
- <object class="GtkAdjustment" id="expiration_year_adjustment">
- <property name="upper">9999</property>
- <property name="step-increment">1</property>
- <property name="page-increment">10</property>
- </object>
- <object class="GtkImage" id="image_freeotp">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="pixbuf">outline_totp_24dp.png</property>
- </object>
- <object class="GtkImage" id="image_iban">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="pixbuf">outline_iban_24dp.png</property>
- </object>
- <object class="GtkImage" id="image_sms">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-right">5</property>
- <property name="margin-end">5</property>
- <property name="pixbuf">outline_stay_current_portrait_black_24dp.png</property>
- </object>
- <object class="GtkImage" id="image_sms1">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-right">5</property>
- <property name="margin-end">5</property>
- <property name="pixbuf">outline_stay_current_portrait_black_24dp.png</property>
- </object>
- <object class="GtkImage" id="open_file_image">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="stock">gtk-open</property>
- </object>
- <object class="GtkImage" id="open_image">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">5</property>
- <property name="margin-right">5</property>
- <property name="stock">gtk-open</property>
- </object>
- <object class="GtkTreeStore" id="policy_review_treestore">
- <columns>
- <!-- column-name policy_name -->
- <column type="gchararray"/>
- <!-- column-name method_type -->
- <column type="gchararray"/>
- <!-- column-name cost -->
- <column type="gchararray"/>
- <!-- column-name provider_url -->
- <column type="gchararray"/>
- <!-- column-name expiration_time_str -->
- <column type="gchararray"/>
- <!-- column-name policy_index -->
- <column type="guint"/>
- <!-- column-name is_challenge -->
- <column type="gboolean"/>
- <!-- column-name method_index -->
- <column type="guint"/>
- <!-- column-name was_solved -->
- <column type="gboolean"/>
- <!-- column-name provider_name -->
- <column type="gchararray"/>
- </columns>
- </object>
- <object class="GtkAdjustment" id="policy_version_adjustment">
- <property name="upper">4294967295</property>
- <property name="step-increment">1</property>
- <property name="page-increment">10</property>
- </object>
- <object class="GtkImage" id="postal_image">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-right">5</property>
- <property name="margin-end">5</property>
- <property name="pixbuf">outline_home_work_black_24dp.png</property>
- </object>
- <object class="GtkEntryBuffer" id="provider_url_entrybuffer">
- <property name="text" translatable="yes">https://</property>
- </object>
- <object class="GtkImage" id="question_image">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-right">5</property>
- <property name="margin-end">5</property>
- <property name="pixbuf">outline_contact_support_black_24dp.png</property>
- </object>
- <object class="GtkAdjustment" id="recovery_adjustmenth">
- <property name="upper">100</property>
- <property name="step-increment">1</property>
- <property name="page-increment">10</property>
- </object>
- <object class="GtkAdjustment" id="recovery_adjustmentv">
- <property name="upper">100</property>
- <property name="step-increment">1</property>
- <property name="page-increment">10</property>
- </object>
- <object class="GtkImage" id="restart_image">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="stock">gtk-goto-first</property>
- </object>
- <object class="GtkImage" id="restore_image">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">5</property>
- <property name="margin-right">4</property>
- <property name="stock">gtk-go-down</property>
- </object>
- <object class="GtkAdjustment" id="secret_box_adjustmenth">
- <property name="upper">100</property>
- <property name="step-increment">1</property>
- <property name="page-increment">10</property>
- </object>
- <object class="GtkAdjustment" id="secret_box_adjustmentv">
- <property name="upper">100</property>
- <property name="step-increment">1</property>
- <property name="page-increment">10</property>
- </object>
- <object class="GtkAdjustment" id="secret_selection_h_adjustment">
- <property name="upper">100</property>
- <property name="step-increment">1</property>
- <property name="page-increment">10</property>
- </object>
- <object class="GtkListStore" id="secret_selection_liststore">
- <columns>
- <!-- column-name provider_url -->
- <column type="gchararray"/>
- <!-- column-name version -->
- <column type="gint"/>
- <!-- column-name attribute_mask -->
- <column type="gint"/>
- <!-- column-name secret_name -->
- <column type="gchararray"/>
- <!-- column-name secret_date_string -->
- <column type="gchararray"/>
- <!-- column-name secret_date_numeric -->
- <column type="guint64"/>
- <!-- column-name providers_json -->
- <column type="gpointer"/>
- </columns>
- </object>
- <object class="GtkAdjustment" id="secret_selection_v_adjustment">
- <property name="upper">100</property>
- <property name="step-increment">1</property>
- <property name="page-increment">10</property>
- </object>
- <object class="GtkListStore" id="unpaid_qrcodes_liststore">
- <columns>
- <!-- column-name qr -->
- <column type="GdkPixbuf"/>
- <!-- column-name url -->
- <column type="gchararray"/>
- <!-- column-name provider -->
- <column type="gchararray"/>
- </columns>
- </object>
- <object class="GtkWindow" id="anastasis_gtk_main_window">
- <property name="can-focus">False</property>
- <property name="events">GDK_BUTTON_PRESS_MASK | GDK_STRUCTURE_MASK</property>
- <property name="window-position">center</property>
- <property name="default-width">700</property>
- <property name="default-height">500</property>
- <signal name="delete-event" handler="anastasis_gtk_quit_cb" swapped="no"/>
- <child>
- <object class="GtkBox" id="anastasis_gtk_main_vbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkBox" id="anastasis_gtk_progress_vbox">
- <property name="can-focus">False</property>
- <property name="margin-right">5</property>
- <property name="orientation">vertical</property>
- <property name="spacing">5</property>
- <child>
- <object class="GtkScrolledWindow" id="anastasis_gtk_backup_progress_scrolled_window">
- <property name="can-focus">False</property>
- <property name="hadjustment">backup_adjustmenth</property>
- <property name="vadjustment">backup_adjustmentv</property>
- <property name="window-placement-set">False</property>
- <property name="shadow-type">in</property>
- <property name="propagate-natural-width">True</property>
- <child>
- <object class="GtkTreeView" id="anastasis_gtk_backup_progress_treeview">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="hadjustment">backup_adjustmenth</property>
- <property name="vadjustment">backup_adjustmentv</property>
- <property name="model">anastasis_gtk_backup_progress_liststore</property>
- <property name="headers-clickable">False</property>
- <property name="enable-search">False</property>
- <property name="search-column">0</property>
- <property name="show-expanders">False</property>
- <property name="tooltip-column">2</property>
- <signal name="button-press-event" handler="anastasis_gtk_backup_progress_treeview_button_press_event_cb" swapped="no"/>
- <child internal-child="selection">
- <object class="GtkTreeSelection" id="anastasis_gtk_backup_progress_tree_selection"/>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="anastasis_gtk_backup_progress_description_column">
- <property name="spacing">5</property>
- <property name="sizing">autosize</property>
- <property name="title" translatable="yes">Back up a secret</property>
- <child>
- <object class="GtkCellRendererText" id="anastasis_gtk_backup_progress_description">
- <property name="ypad">15</property>
- </object>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkScrolledWindow" id="anastasis_gtk_recovery_progress_scrolled_window">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="hadjustment">recovery_adjustmenth</property>
- <property name="vadjustment">recovery_adjustmentv</property>
- <property name="window-placement-set">False</property>
- <property name="shadow-type">in</property>
- <property name="propagate-natural-width">True</property>
- <child>
- <object class="GtkTreeView" id="anastasis_gtk_recovery_progress_treeview">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="hadjustment">recovery_adjustmenth</property>
- <property name="vadjustment">recovery_adjustmentv</property>
- <property name="model">anastasis_gtk_recovery_progress_liststore</property>
- <property name="headers-clickable">False</property>
- <property name="enable-search">False</property>
- <property name="search-column">0</property>
- <property name="show-expanders">False</property>
- <property name="tooltip-column">2</property>
- <signal name="button-press-event" handler="anastasis_gtk_recovery_progress_treeview_button_press_event_cb" swapped="no"/>
- <child internal-child="selection">
- <object class="GtkTreeSelection" id="anastasis_gtk_recovery_progress_tree_selection"/>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="anastasis_gtk_recovery_progress_description_colum">
- <property name="spacing">5</property>
- <property name="sizing">autosize</property>
- <property name="title" translatable="yes">Recover a secret</property>
- <child>
- <object class="GtkCellRendererText" id="anastasis_gtk_recovery_progress_description">
- <property name="ypad">15</property>
- </object>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_main_window_save_as_button">
- <property name="label">gtk-save-as</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="can-default">True</property>
- <property name="receives-default">True</property>
- <property name="tooltip-text" translatable="yes">Save the current state of Anastasis to a file. Useful if you want to resume the operation later.</property>
- <property name="margin-start">15</property>
- <property name="margin-end">15</property>
- <property name="margin-top">20</property>
- <property name="margin-bottom">20</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">True</property>
- <signal name="clicked" handler="anastasis_gtk_main_window_save_as_button_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkScrolledWindow" id="anastasis_gtk_scrolledwindow">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="hexpand">True</property>
- <property name="vexpand">True</property>
- <property name="hadjustment">recovery_adjustmentv</property>
- <property name="shadow-type">in</property>
- <child>
- <object class="GtkViewport" id="anastasis_gtk_viewport">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="hexpand">True</property>
- <property name="vexpand">True</property>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkBox" id="anastasis_gtk_super_vbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_error_label">
- <property name="can-focus">False</property>
- <property name="label">DYNAMIC ERROR MESSAGE</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- <attribute name="foreground" value="#a5a51d1d2d2d"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkAlignment" id="anastasis_gtk_start_frame">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">10</property>
- <property name="left-padding">12</property>
- <child>
- <object class="GtkBox" id="anastasis_gtk_primary_action_hbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">center</property>
- <property name="margin-left">10</property>
- <property name="margin-right">10</property>
- <property name="margin-start">10</property>
- <property name="margin-end">10</property>
- <property name="margin-top">10</property>
- <property name="margin-bottom">10</property>
- <property name="orientation">vertical</property>
- <property name="spacing">20</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">center</property>
- <property name="label" translatable="yes">What do you want to do?</property>
- <property name="justify">center</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- <attribute name="scale" value="1.5"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">15</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_backup_button">
- <property name="label" translatable="yes">_Back up a secret</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="tooltip-text" translatable="yes">Begin fresh backup process</property>
- <property name="image">backup_image</property>
- <property name="use-underline">True</property>
- <property name="always-show-image">True</property>
- <signal name="clicked" handler="anastasis_gtk_backup_button_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_recovery_button">
- <property name="label" translatable="yes">_Recover a secret</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="tooltip-text" translatable="yes">Begin secret recovery process</property>
- <property name="image">restore_image</property>
- <property name="use-underline">True</property>
- <property name="always-show-image">True</property>
- <signal name="clicked" handler="anastasis_gtk_recovery_button_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_open_state">
- <property name="label">_Open a saved action</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="tooltip-text" translatable="yes">Continue from file with saved Anastasis state</property>
- <property name="image">open_image</property>
- <property name="use-underline">True</property>
- <property name="always-show-image">True</property>
- <signal name="clicked" handler="anastasis_gtk_open_state_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">3</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="anastasis_gtk_continent_frame">
- <property name="can-focus">False</property>
- <property name="label-xalign">0</property>
- <property name="shadow-type">none</property>
- <child>
- <object class="GtkAlignment">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="left-padding">12</property>
- <child>
- <object class="GtkBox" id="anastasis_gtk_continent_vbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkScrolledWindow">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="shadow-type">in</property>
- <child>
- <object class="GtkTreeView" id="anastasis_gtk_continent_treeview">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="model">continent_liststore</property>
- <property name="enable-search">False</property>
- <property name="search-column">0</property>
- <property name="activate-on-single-click">True</property>
- <child internal-child="selection">
- <object class="GtkTreeSelection" id="anastasis_gtk_continent_selection">
- <signal name="changed" handler="anastasis_gtk_continent_selection_changed_cb" swapped="no"/>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="continent_column">
- <property name="title" translatable="yes">Continent</property>
- <child>
- <object class="GtkCellRendererText" id="continent_name_cell_renderer"/>
- <attributes>
- <attribute name="text">1</attribute>
- </attributes>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkScrolledWindow">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="shadow-type">in</property>
- <child>
- <object class="GtkTreeView" id="anastasis_gtk_country_treeview">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="model">country_liststore</property>
- <property name="enable-search">False</property>
- <property name="search-column">0</property>
- <property name="activate-on-single-click">True</property>
- <child internal-child="selection">
- <object class="GtkTreeSelection" id="anastasis_gtk_country_selection">
- <signal name="changed" handler="anastasis_gtk_country_selection_changed_cb" swapped="no"/>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="country_column">
- <property name="title" translatable="yes">Country</property>
- <child>
- <object class="GtkCellRendererText" id="country_name_cell_renderer"/>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="tooltip-text" translatable="yes">These questions determine which personal attributes we can ask you for, and which backup providers could be used.</property>
- <property name="margin-start">5</property>
- <property name="margin-end">5</property>
- <property name="margin-top">5</property>
- <property name="margin-bottom">5</property>
- <property name="label" translatable="yes">Where do you live? In which currencies do you want to pay?</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="anastasis_gtk_identity_frame">
- <property name="can-focus">False</property>
- <property name="label-xalign">0</property>
- <property name="shadow-type">none</property>
- <child>
- <object class="GtkAlignment">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkBox" id="who_are_you_hbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="spacing">10</property>
- <property name="homogeneous">True</property>
- <child>
- <object class="GtkBox" id="anastasis_gtk_identity_vbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <property name="spacing">15</property>
- <child>
- <object class="GtkBox" id="anastasis_gtk_ia_full_name_box">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkBox" id="anastasis_gtk_ia_full_name_hbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_ia_full_name_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="valign">center</property>
- <property name="margin-left">20</property>
- <property name="margin-start">20</property>
- <property name="label" translatable="yes">Full name:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_ia_full_name_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="hexpand">True</property>
- <property name="placeholder-text" translatable="yes" comments="Change to a common "dummy" name in the target language, using the suggested canonical format for that name in that language.">DOE, John</property>
- <signal name="changed" handler="AG_identity_changed" swapped="no"/>
- <signal name="focus-in-event" handler="anastasis_gtk_show_on_focus_in_event_cb" object="anastasis_gtk_name_casewarning_label" swapped="yes"/>
- <signal name="focus-out-event" handler="anastasis_gtk_hide_on_focus_out_event_cb" object="anastasis_gtk_name_casewarning_label" swapped="yes"/>
- <signal name="style-updated" handler="gtk_widget_queue_draw" swapped="no"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_ia_name_format_hint_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes" comments="You may completely change the recommended format if the given format is inappropriate for the target language or culture.">If possible, use "LASTNAME, Firstname(s)" without abbreviations.</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </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="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="private_hbox1">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">40</property>
- <child>
- <object class="GtkLabel" id="privacy_label1">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">40</property>
- <property name="label" translatable="yes">This stays private</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="blindfold_image1">
- <property name="width-request">24</property>
- <property name="height-request">24</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="pixbuf">noun_blindfold_3574196.svg</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">1</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_name_casewarning_label">
- <property name="can-focus">False</property>
- <property name="label" translatable="yes" comments="If the user's language does not have cases (like in Kanji), you may choose to leave out the text about case-sensitivity to avoid confusing the reader.">This field is case-sensitive. You must enter
-exactly the same value during recovery.</property>
- <attributes>
- <attribute name="foreground" value="#81813d3d9c9c"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="pack-type">end</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="anastasis_gtk_ia_birthdate_box">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkBox" id="anastasis_gtk_ia_birthdate_hbox">
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_ia_birthdate_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="margin-left">20</property>
- <property name="margin-start">20</property>
- <property name="label" translatable="yes">Birthdate:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkCalendar" id="anastasis_gtk_ia_birthdate_cal">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="year">1980</property>
- <property name="month">8</property>
- <property name="day">22</property>
- <property name="show-week-numbers">True</property>
- <signal name="day-selected" handler="AG_identity_changed" swapped="no"/>
- <signal name="style-updated" handler="gtk_widget_queue_draw" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="private_hbox2">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">40</property>
- <child>
- <object class="GtkLabel" id="privacy_label2">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">40</property>
- <property name="label" translatable="yes">This stays private</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="blindfold_image2">
- <property name="width-request">24</property>
- <property name="height-request">24</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="pixbuf">noun_blindfold_3574196.svg</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">1</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="anastasis_gtk_ia_birthplace_box">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkBox" id="anastasis_gtk_ia_birthplace_hbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_ia_birthplace_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="valign">center</property>
- <property name="margin-left">20</property>
- <property name="margin-start">20</property>
- <property name="label" translatable="yes">Birthplace:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_ia_birthplace_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="hexpand">True</property>
- <property name="placeholder-text" translatable="yes" comments="Example for Birthplace in suitable language- and culture-specific format with good details.">Lafayette, Indiana, USA</property>
- <signal name="changed" handler="AG_identity_changed" swapped="no"/>
- <signal name="focus-in-event" handler="anastasis_gtk_show_on_focus_in_event_cb" object="anastasis_gtk_birthplace_casewarning_label" swapped="yes"/>
- <signal name="focus-out-event" handler="anastasis_gtk_hide_on_focus_out_event_cb" object="anastasis_gtk_birthplace_casewarning_label" swapped="no"/>
- <signal name="style-updated" handler="gtk_widget_queue_draw" swapped="no"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_ia_birthplace_format_hint_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes" comments="You may completely change the recommendation if for the target language/culture the recommendation is not applicable.">If possible, use "Location, Region, Country".</property>
- <attributes>
- <attribute name="scale" value="0.90000000000000002"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </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="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="private_hbox3">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">40</property>
- <child>
- <object class="GtkLabel" id="privacy_label3">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">40</property>
- <property name="label" translatable="yes">This stays private</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="blindfold_image3">
- <property name="width-request">24</property>
- <property name="height-request">24</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="pixbuf">noun_blindfold_3574196.svg</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">1</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_birthplace_casewarning_label">
- <property name="can-focus">False</property>
- <property name="label" translatable="yes" comments="If the user's language does not have cases (like in Kanji), you may choose to leave out the text about case-sensitivity to avoid confusing the reader.">This field is case-sensitive. You must enter
-exactly the same value during recovery.</property>
- <attributes>
- <attribute name="foreground" value="#81813d3d9c9c"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="anastasis_gtk_ia_ahv_box">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkBox" id="anastasis_gtk_ia_ahv_hbox">
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_ia_ahv_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="valign">center</property>
- <property name="margin-left">20</property>
- <property name="margin-start">20</property>
- <property name="label" translatable="yes">AHV number:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_ia_ahv_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="max-length">16</property>
- <property name="width-chars">17</property>
- <property name="max-width-chars">16</property>
- <property name="caps-lock-warning">False</property>
- <property name="placeholder-text" translatable="yes">756.1222.3425.89</property>
- <property name="input-purpose">number</property>
- <signal name="changed" handler="AG_identity_changed" swapped="no"/>
- <signal name="delete-text" handler="anastasis_gtk_autocomplete_delete_text" swapped="no"/>
- <signal name="insert-text" handler="anastasis_gtk_autocomplete_insert_text" swapped="no"/>
- <signal name="style-updated" handler="gtk_widget_queue_draw" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="private_hbox4">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">40</property>
- <child>
- <object class="GtkLabel" id="privacy_label4">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">40</property>
- <property name="label" translatable="yes">This stays private</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="blindfold_image4">
- <property name="width-request">24</property>
- <property name="height-request">24</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="pixbuf">noun_blindfold_3574196.svg</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">1</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="anastasis_gtk_ia_tin_de_box">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkBox" id="anastasis_gtk_ia_tin_de_hbox">
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_ia_tin_de_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="valign">center</property>
- <property name="margin-left">20</property>
- <property name="margin-start">20</property>
- <property name="label" translatable="yes">Steuerliche Identifikationsnummer:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_ia_tin_de_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="max-length">11</property>
- <property name="width-chars">11</property>
- <property name="max-width-chars">11</property>
- <property name="placeholder-text" translatable="yes">12345678912</property>
- <property name="input-purpose">number</property>
- <signal name="changed" handler="AG_identity_changed" swapped="no"/>
- <signal name="style-updated" handler="gtk_widget_queue_draw" swapped="no"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="private_hbox5">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">40</property>
- <child>
- <object class="GtkLabel" id="privacy_label5">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">40</property>
- <property name="label" translatable="yes">This stays private</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="blindfold_image5">
- <property name="width-request">24</property>
- <property name="height-request">24</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="pixbuf">noun_blindfold_3574196.svg</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">1</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">4</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="anastasis_gtk_ia_ssn_de_box">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkBox" id="anastasis_gtk_ia_ssn_de_hbox">
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_ia_ssn_de_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="tooltip-text" translatable="yes">Falls vorhanden sollte diese Nummer auf jeden Fall angegeben werden. Nur Beamte, Selbstständige und andere Personen die keine Rentenversicherungsnummer haben sollten dieses Feld leer lassen.</property>
- <property name="halign">start</property>
- <property name="valign">center</property>
- <property name="margin-left">20</property>
- <property name="margin-start">20</property>
- <property name="label" translatable="yes">Sozialversicherungsnummer (optional):</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_ia_ssn_de_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="max-length">12</property>
- <property name="width-chars">13</property>
- <property name="max-width-chars">12</property>
- <property name="placeholder-text" translatable="yes">14230460S534</property>
- <property name="input-purpose">alpha</property>
- <signal name="changed" handler="AG_identity_changed" swapped="no"/>
- <signal name="style-updated" handler="gtk_widget_queue_draw" swapped="no"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="private_hbox6">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">40</property>
- <child>
- <object class="GtkLabel" id="privacy_label6">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">40</property>
- <property name="label" translatable="yes">This stays private</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="blindfold_image6">
- <property name="width-request">24</property>
- <property name="height-request">24</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="pixbuf">noun_blindfold_3574196.svg</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">1</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">5</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="anastasis_gtk_ia_ssn_us_box">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkBox" id="anastasis_gtk_ia_ssn_us_hbox">
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_ia_ssn_us_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="valign">center</property>
- <property name="margin-left">20</property>
- <property name="margin-start">20</property>
- <property name="label" translatable="yes">Social security number:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_ia_ssn_us_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="max-length">11</property>
- <property name="width-chars">12</property>
- <property name="max-width-chars">11</property>
- <property name="placeholder-text" translatable="yes">000-00-0000</property>
- <signal name="changed" handler="AG_identity_changed" swapped="no"/>
- <signal name="delete-text" handler="anastasis_gtk_autocomplete_delete_text" swapped="no"/>
- <signal name="insert-text" handler="anastasis_gtk_autocomplete_insert_text" swapped="no"/>
- <signal name="style-updated" handler="gtk_widget_queue_draw" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="private_hbox7">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">40</property>
- <child>
- <object class="GtkLabel" id="privacy_label7">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">40</property>
- <property name="label" translatable="yes">This stays private</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="blindfold_image7">
- <property name="width-request">24</property>
- <property name="height-request">24</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="pixbuf">noun_blindfold_3574196.svg</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">1</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">6</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="anastasis_gtk_private_explainer_vbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <property name="spacing">20</property>
- <property name="baseline-position">top</property>
- <child>
- <object class="GtkBox" id="private_hbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel" id="privacy_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-top">5</property>
- <property name="margin-bottom">5</property>
- <property name="label" translatable="yes">This stays private</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- <attribute name="scale" value="1.5"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="blindfold_image">
- <property name="width-request">24</property>
- <property name="height-request">24</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="pixbuf">noun_blindfold_3574196.svg</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">1</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="GtkLabel" id="explainer_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-top">5</property>
- <property name="margin-bottom">15</property>
- <property name="label" translatable="yes">The information you have entered here:
-• Will be hashed, and therefore unreadable
-• The non-hashed version is not shared</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="encrypt_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes"><a href="https://taler.net/papers/thesis-anastasis-2020.pdf">How Anastasis encrypts your data</a></property>
- <property name="use-markup">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="free_software_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Anastasis is <a href="https://www.gnu.org/philosophy/free-sw.html">Free Software</a></property>
- <property name="use-markup">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="funding_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-top">10</property>
- <property name="label" translatable="yes">Anastasis is developed by <a href="https://anastasis.lu/en/about.html#team">privacy advocates</a>
-with <a href="https://www.ngi.eu/ngi-projects/ledger/">funding</a> from the European Commission.</property>
- <property name="use-markup">True</property>
- <property name="justify">center</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">4</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="ec_image">
- <property name="width-request">128</property>
- <property name="height-request">128</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">center</property>
- <property name="margin-left">10</property>
- <property name="margin-right">10</property>
- <property name="margin-top">10</property>
- <property name="margin-bottom">10</property>
- <property name="pixbuf">bandiera_stelle.png</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">5</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">5</property>
- <property name="margin-end">5</property>
- <property name="margin-top">5</property>
- <property name="margin-bottom">5</property>
- <property name="label" translatable="yes">Who are you?</property>
- <attributes>
- <attribute name="style" value="normal"/>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="anastasis_gtk_b_authentication_frame">
- <property name="can-focus">False</property>
- <property name="label-xalign">0</property>
- <property name="shadow-type">none</property>
- <child>
- <object class="GtkAlignment">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="left-padding">12</property>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkFrame">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-right">50</property>
- <property name="margin-end">50</property>
- <property name="hexpand">True</property>
- <property name="label-xalign">0</property>
- <property name="shadow-type">none</property>
- <child>
- <!-- n-columns=3 n-rows=3 -->
- <object class="GtkGrid" id="anastasis_gtk_auth_button_grid">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="row-spacing">5</property>
- <property name="column-spacing">5</property>
- <property name="row-homogeneous">True</property>
- <property name="column-homogeneous">True</property>
- <child>
- <object class="GtkButton" id="anastasis_gtk_btn_add_auth_sms">
- <property name="label" translatable="yes">SMS</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="tooltip-text" translatable="yes">Add authentication using a transaction number send to a mobile phone number.</property>
- <property name="image">image_sms</property>
- <signal name="clicked" handler="anastasis_gtk_btn_add_auth_sms_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="left-attach">0</property>
- <property name="top-attach">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_btn_add_auth_email">
- <property name="label" translatable="yes">Email</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="tooltip-text" translatable="yes">Add authentication using a transaction number send to an e-mail address.</property>
- <property name="image">email_image</property>
- <signal name="clicked" handler="anastasis_gtk_btn_add_auth_email_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="left-attach">1</property>
- <property name="top-attach">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_btn_add_auth_question">
- <property name="label" translatable="yes">Question</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="tooltip-text" translatable="yes">Add authentication using security question and answer.</property>
- <property name="image">question_image</property>
- <signal name="clicked" handler="anastasis_gtk_btn_add_auth_question_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="left-attach">2</property>
- <property name="top-attach">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_btn_add_auth_post">
- <property name="label" translatable="yes">Post</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="tooltip-text" translatable="yes">Add authentication using a transaction number send to a postal address.</property>
- <property name="image">postal_image</property>
- <signal name="clicked" handler="anastasis_gtk_btn_add_auth_post_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="left-attach">0</property>
- <property name="top-attach">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_btn_add_auth_iban">
- <property name="label" translatable="yes">IBAN</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="tooltip-text" translatable="yes">Add authentication using a payment of from a designated IBAN account.</property>
- <property name="image">image_iban</property>
- <signal name="clicked" handler="anastasis_gtk_btn_add_auth_iban_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="left-attach">2</property>
- <property name="top-attach">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_btn_add_auth_totp">
- <property name="label" translatable="yes">TOTP</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="tooltip-text" translatable="yes">Add Time-Based One-Time Password authentication (RFC 6238)</property>
- <property name="image">image_freeotp</property>
- <signal name="clicked" handler="anastasis_gtk_btn_add_auth_totp_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="left-attach">1</property>
- <property name="top-attach">1</property>
- </packing>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Which authorization method should be added?</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">30</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="anastasis_gtk_b_authentication_hbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkFrame">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label-xalign">0</property>
- <property name="shadow-type">none</property>
- <child>
- <object class="GtkAlignment">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="left-padding">12</property>
- <child>
- <object class="GtkScrolledWindow">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="shadow-type">in</property>
- <child>
- <object class="GtkTreeView" id="anastasis_gtk_authentication_methods_list">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="model">authentication_methods_liststore</property>
- <property name="enable-search">False</property>
- <property name="search-column">0</property>
- <child internal-child="selection">
- <object class="GtkTreeSelection" id="anastasis_gtk_authentication_methods_selection">
- <signal name="changed" handler="auth_method_selection_changed_cb" swapped="no"/>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="auth_method_type">
- <property name="sizing">autosize</property>
- <property name="title" translatable="yes">Type</property>
- <property name="clickable">True</property>
- <property name="reorderable">True</property>
- <property name="sort-indicator">True</property>
- <property name="sort-column-id">0</property>
- <child>
- <object class="GtkCellRendererText" id="type"/>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="auth_method_visual">
- <property name="sizing">autosize</property>
- <property name="title" translatable="yes">Details</property>
- <property name="expand">True</property>
- <child>
- <object class="GtkCellRendererText" id="visualization"/>
- <attributes>
- <attribute name="text">1</attribute>
- </attributes>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="anastasis_gtk_authorization_methods_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Authorization methods configured so far:</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="anastasis_gtk_authorization_meta_button_box">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkButton" id="anastasis_gtk_edit_provider_list">
- <property name="label" translatable="yes">_Edit providers</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="image">edit_image</property>
- <property name="use-underline">True</property>
- <property name="always-show-image">True</property>
- <signal name="clicked" handler="anastasis_gtk_edit_provider_list_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_authentication_method_delete_button">
- <property name="label">gtk-delete</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-stock">True</property>
- <property name="always-show-image">True</property>
- <signal name="clicked" handler="anastasis_gtk_authentication_method_delete_button_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">5</property>
- <property name="margin-end">5</property>
- <property name="margin-top">5</property>
- <property name="margin-bottom">5</property>
- <property name="label" translatable="yes">Configure authorization methods!</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">4</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="anastasis_gtk_b_policy_frame">
- <property name="can-focus">False</property>
- <property name="label-xalign">0</property>
- <property name="shadow-type">none</property>
- <child>
- <object class="GtkAlignment">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="top-padding">10</property>
- <property name="bottom-padding">10</property>
- <property name="left-padding">12</property>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <property name="spacing">10</property>
- <child>
- <object class="GtkLabel" id="review_policies_explainer_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="margin-start">15</property>
- <property name="margin-end">15</property>
- <property name="margin-top">10</property>
- <property name="margin-bottom">10</property>
- <property name="label" translatable="yes">Each recovery policy specifies a combination of authentication methods sufficient to recover the secret.
-Please review the recovery policies for the secret you are about to back up.
-If the automatically generated recovery policies are inadequate for your use case, use right-click to add, edit or delete policies.
-You can also use "back" to add additional authentication methods.</property>
- <property name="wrap">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkScrolledWindow">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="shadow-type">in</property>
- <child>
- <object class="GtkTreeView" id="anastasis_gtk_review_policy_treeview">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="model">policy_review_treestore</property>
- <property name="search-column">0</property>
- <signal name="button-press-event" handler="anastasis_gtk_review_policy_treeview_button_press_event_cb" swapped="no"/>
- <signal name="key-press-event" handler="anastasis_gtk_review_policy_treeview_key_press_event_cb" swapped="no"/>
- <signal name="row-activated" handler="anastasis_gtk_review_policy_treeview_row_activated_cb" swapped="no"/>
- <child internal-child="selection">
- <object class="GtkTreeSelection"/>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="policy_name_column0">
- <property name="spacing">5</property>
- <property name="sizing">autosize</property>
- <property name="title" translatable="yes">Policy</property>
- <child>
- <object class="GtkCellRendererText" id="policy_name_column"/>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="challenge_type_column">
- <property name="spacing">5</property>
- <property name="sizing">autosize</property>
- <property name="title" translatable="yes">Type</property>
- <child>
- <object class="GtkCellRendererText" id="challenge_type_column1"/>
- <attributes>
- <attribute name="text">1</attribute>
- </attributes>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="cost_column">
- <property name="spacing">5</property>
- <property name="sizing">autosize</property>
- <property name="title" translatable="yes">Cost</property>
- <child>
- <object class="GtkCellRendererText" id="cost_text_column"/>
- <attributes>
- <attribute name="text">2</attribute>
- </attributes>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="provider_column">
- <property name="spacing">5</property>
- <property name="sizing">autosize</property>
- <property name="title" translatable="yes">Provider</property>
- <child>
- <object class="GtkCellRendererText" id="provider_url_column"/>
- <attributes>
- <attribute name="text">9</attribute>
- </attributes>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="expiration_column">
- <property name="visible">False</property>
- <property name="spacing">5</property>
- <property name="sizing">autosize</property>
- <property name="title" translatable="yes">Expiration</property>
- <child>
- <object class="GtkCellRendererText" id="expiration_time_str"/>
- <attributes>
- <attribute name="text">4</attribute>
- </attributes>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">5</property>
- <property name="margin-end">5</property>
- <property name="margin-top">5</property>
- <property name="margin-bottom">5</property>
- <property name="label" translatable="yes">Review recovery policies</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">5</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="anastasis_gtk_challenge_frame">
- <property name="name">anastasis_gtk_challenge_frame</property>
- <property name="can-focus">False</property>
- <property name="label-xalign">0</property>
- <property name="shadow-type">none</property>
- <child>
- <object class="GtkAlignment">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="left-padding">12</property>
- <child>
- <object class="GtkScrolledWindow">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="hadjustment">anastasis_gtk_policy_box_adjustment_h</property>
- <property name="vadjustment">anastasis_gtk_policy_box_adjustment_v</property>
- <property name="shadow-type">in</property>
- <child>
- <object class="GtkViewport">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="hadjustment">anastasis_gtk_policy_box_adjustment_h</property>
- <property name="vadjustment">anastasis_gtk_policy_box_adjustment_v</property>
- <child>
- <object class="GtkBox" id="anastasis_gtk_policy_vbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <placeholder/>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">5</property>
- <property name="margin-end">5</property>
- <property name="margin-top">5</property>
- <property name="margin-bottom">5</property>
- <property name="label" translatable="yes">Select challenge to recover secret:</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">6</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="anastasis_gtk_enter_secret_frame">
- <property name="height-request">1500</property>
- <property name="can-focus">False</property>
- <property name="label-xalign">0</property>
- <property name="shadow-type">none</property>
- <child>
- <object class="GtkScrolledWindow" id="secret_frame_scrolled_window">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="vexpand">True</property>
- <property name="hadjustment">secret_box_adjustmenth</property>
- <property name="vadjustment">secret_box_adjustmentv</property>
- <property name="shadow-type">in</property>
- <property name="propagate-natural-width">True</property>
- <property name="propagate-natural-height">True</property>
- <child>
- <object class="GtkViewport" id="secret_frame_viewport">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="hexpand">True</property>
- <property name="hadjustment">secret_box_adjustmenth</property>
- <property name="vadjustment">secret_box_adjustmentv</property>
- <child>
- <object class="GtkBox" id="secret_frame_main_vbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="valign">start</property>
- <property name="margin-start">10</property>
- <property name="margin-end">10</property>
- <property name="margin-top">5</property>
- <property name="margin-bottom">5</property>
- <property name="orientation">vertical</property>
- <property name="spacing">5</property>
- <property name="baseline-position">top</property>
- <child>
- <object class="GtkBox" id="secret_name_vbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <property name="spacing">5</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="valign">start</property>
- <property name="label" translatable="yes">Secret's name</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="anastasis_gtk_secret_name_entry">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="has-focus">True</property>
- <property name="tooltip-text" translatable="yes">This allows you to uniquely identify a secret if you have made multiple back ups. The value entered here will NOT be protected by the authentication checks!</property>
- <property name="primary-icon-tooltip-text" translatable="yes">If you make multiple backups using Anastasis, the secret's name will allow you to distinguish the different backups.</property>
- <property name="placeholder-text" translatable="yes">Do NOT enter the actual secret here!</property>
- <signal name="changed" handler="anastasis_gtk_enter_secret_name_entry_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="secret_name_explanation_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="label" translatable="yes">Names should be unique, so that you can easily
-identify your secret later.</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">20</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="secret_entry_vbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel" id="secret_text_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="label" translatable="yes">Provide secret as text</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkScrolledWindow" id="enter_secret_scrolled_window">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="tooltip-text" translatable="yes">Enter the secret you want to back up here.</property>
- <property name="margin-start">10</property>
- <property name="margin-end">10</property>
- <property name="hexpand">True</property>
- <property name="vexpand">True</property>
- <property name="hadjustment">anastasis_gtk_enter_secret_hadjustment</property>
- <property name="vadjustment">anastasis_gtk_enter_secret_vadjustment</property>
- <property name="shadow-type">in</property>
- <child>
- <object class="GtkTextView" id="anastasis_gtk_enter_secret_textview">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="hexpand">True</property>
- <property name="vexpand">True</property>
- <property name="hadjustment">anastasis_gtk_enter_secret_hadjustment</property>
- <property name="hscroll-policy">natural</property>
- <property name="vadjustment">anastasis_gtk_enter_secret_vadjustment</property>
- <property name="vscroll-policy">natural</property>
- <property name="buffer">anastasis_gtk_enter_secret_textbuffer</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_secret_clear_text_button">
- <property name="label">gtk-clear</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">True</property>
- <signal name="clicked" handler="anastasis_gtk_secret_clear_button_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="pack-type">end</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="name">anastasis_gtk_enter_secret_file_box</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-top">5</property>
- <property name="margin-bottom">5</property>
- <property name="spacing">10</property>
- <child>
- <object class="GtkBox" id="anastasis_gtk_secret_file_chooser_hbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="spacing">5</property>
- <child>
- <object class="GtkLabel" id="secret_by_file_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Or provide secret as a file:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_enter_secret_open_button">
- <property name="label">Choose file</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="can-default">True</property>
- <property name="receives-default">True</property>
- <property name="image">open_file_image</property>
- <property name="always-show-image">True</property>
- <signal name="clicked" handler="anastasis_gtk_enter_secret_open_button_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="anastasis_gtk_secret_file_name_hbox">
- <property name="can-focus">False</property>
- <property name="spacing">5</property>
- <child>
- <object class="GtkLabel" id="secret_file_name_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Your secret file:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_secret_file_name_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label">DYNAMICALLY GENERATED</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_secret_clear_file_button">
- <property name="label">gtk-clear</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">True</property>
- <signal name="clicked" handler="anastasis_gtk_secret_clear_button_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="pack-type">end</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">20</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="expiration_vbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="orientation">vertical</property>
- <property name="spacing">5</property>
- <property name="baseline-position">top</property>
- <child>
- <object class="GtkLabel" id="recovery_expiration_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Your secret's recovery data expires on:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="expiration_hbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel" id="expiration_date_without_year_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label">DYNAMICALLY SET</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkSpinButton" id="expiration_year_spin_button">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="max-length">4</property>
- <property name="width-chars">4</property>
- <property name="max-width-chars">4</property>
- <property name="input-purpose">digits</property>
- <property name="adjustment">expiration_year_adjustment</property>
- <property name="numeric">True</property>
- <property name="value">9999</property>
- <signal name="value-changed" handler="expiration_year_spin_button_value_changed_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</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="padding">20</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="payment_info_vbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <property name="spacing">10</property>
- <child>
- <object class="GtkBox" id="backup_free_hbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="spacing">10</property>
- <child>
- <object class="GtkLabel" id="backup_fee_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Backup fee:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="backup_fee_value_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label">DYNAMICALLY SET</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="backup_fee_explainer_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="label" translatable="yes">You pay this fee to back up your secret.
-The fee may increase with the expiry
-date of your secret's recovery data.</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">20</property>
- <property name="position">3</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">5</property>
- <property name="margin-end">5</property>
- <property name="margin-top">10</property>
- <property name="margin-bottom">10</property>
- <property name="label" translatable="yes">Provide secret to backup:</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">7</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="anastasis_gtk_pay_frame">
- <property name="can-focus">False</property>
- <property name="label-xalign">0</property>
- <property name="shadow-type">none</property>
- <child>
- <object class="GtkAlignment">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-top">5</property>
- <property name="left-padding">12</property>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="spacing">5</property>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Please pay with GNU Taler:</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="anastasis_gtk_main_window_unpaid_box">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">5</property>
- <property name="margin-right">5</property>
- <property name="margin-start">5</property>
- <property name="margin-end">5</property>
- <property name="margin-top">5</property>
- <property name="margin-bottom">5</property>
- <property name="orientation">vertical</property>
- <property name="spacing">5</property>
- <child>
- <object class="GtkTreeView" id="unpaid_qr_treeview">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="model">unpaid_qrcodes_liststore</property>
- <property name="enable-search">False</property>
- <property name="search-column">1</property>
- <child internal-child="selection">
- <object class="GtkTreeSelection" id="unpaid_qr_tree_selection">
- <signal name="changed" handler="unpaid_qr_tree_selection_changed_cb" swapped="no"/>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn">
- <property name="spacing">10</property>
- <property name="sizing">autosize</property>
- <property name="title" translatable="yes">Payment QR Code</property>
- <property name="expand">True</property>
- <child>
- <object class="GtkCellRendererPixbuf" id="unpaid_pixbuf"/>
- <attributes>
- <attribute name="pixbuf">0</attribute>
- </attributes>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="Pay URI">
- <property name="sizing">autosize</property>
- <property name="title" translatable="yes">Taler Pay URI</property>
- <child>
- <object class="GtkCellRendererText" id="pay_uri"/>
- <attributes>
- <attribute name="text">1</attribute>
- </attributes>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">5</property>
- <property name="margin-end">5</property>
- <property name="margin-top">10</property>
- <property name="margin-bottom">5</property>
- <property name="label" translatable="yes">Payment required:</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">8</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="anastasis_gtk_completed_frame">
- <property name="can-focus">False</property>
- <property name="label-xalign">0</property>
- <property name="shadow-type">none</property>
- <child>
- <object class="GtkAlignment">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">10</property>
- <property name="margin-end">10</property>
- <property name="margin-top">10</property>
- <property name="margin-bottom">10</property>
- <property name="left-padding">12</property>
- <child>
- <object class="GtkBox" id="anastasis_gtk_success_box">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkBox" id="anastasis_gtk_backup_complete_box">
- <property name="name">anastasis_gtk_backup_complete_box</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_success_backup_label">
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="label" translatable="yes">Your backup is complete.</property>
- <property name="justify">center</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="recovery_expiration_box">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="spacing">5</property>
- <child>
- <object class="GtkLabel" id="backup_expiration_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="label" translatable="yes">Your backup is valid until:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="backup_expiration_date_label">
- <property name="can-focus">False</property>
- <property name="label">DYNAMICALLY GENERATED</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">20</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_success_backup_version_label">
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="label" translatable="yes">Backups were made at the following providers:</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkScrolledWindow">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="shadow-type">in</property>
- <child>
- <object class="GtkTreeView" id="anastasis_gtk_backup_complete_treeview">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="model">backup_provider_liststore</property>
- <property name="search-column">0</property>
- <child internal-child="selection">
- <object class="GtkTreeSelection"/>
- </child>
- <child>
- <object class="GtkTreeViewColumn">
- <property name="sizing">autosize</property>
- <property name="title" translatable="yes">Provider</property>
- <child>
- <object class="GtkCellRendererText" id="provider_url"/>
- <attributes>
- <attribute name="text">4</attribute>
- </attributes>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn">
- <property name="spacing">5</property>
- <property name="sizing">autosize</property>
- <property name="title" translatable="yes">Version</property>
- <child>
- <object class="GtkCellRendererText" id="policy_version"/>
- <attributes>
- <attribute name="visible">3</attribute>
- <attribute name="text">1</attribute>
- </attributes>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn">
- <property name="visible">False</property>
- <property name="title" translatable="yes">Expiration time</property>
- <child>
- <object class="GtkCellRendererText" id="expiration"/>
- <attributes>
- <attribute name="visible">3</attribute>
- <attribute name="text">2</attribute>
- </attributes>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">10</property>
- <property name="position">3</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="anastasis_gtk_success_recovery_box">
- <property name="name">anastasis_gtk_success_recovery_box</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_success_recovery_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="label" translatable="yes">Your secret was recovered.</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">15</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="recovery_secret_name_hbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Secret name:</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="recovery_secret_name_value_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label">DYNAMICALLY GENERATED</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">10</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_secret_value_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="tooltip-text" translatable="yes">The secret is shown here. You can also copy it to the clipboard or save it to a file.</property>
- <property name="label">THE SECRET TEXT</property>
- <property name="wrap">True</property>
- <property name="wrap-mode">word-char</property>
- <property name="ellipsize">end</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_secret_copy_button">
- <property name="label">gtk-copy</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="can-default">True</property>
- <property name="receives-default">True</property>
- <property name="tooltip-text" translatable="yes">Copy secret to clipboard</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">True</property>
- <signal name="clicked" handler="anastasis_gtk_secret_copy_button_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">10</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_secret_save_as_button">
- <property name="label">gtk-save-as</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="tooltip-text" translatable="yes">Save secret to file</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">True</property>
- <signal name="clicked" handler="anastasis_gtk_secret_save_as_button_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">10</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkViewport">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="hexpand">True</property>
- <property name="vexpand">True</property>
- <child>
- <object class="GtkImage" id="anastasis_gtk_secret_qr_image">
- <property name="width-request">400</property>
- <property name="height-request">400</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">10</property>
- <property name="margin-right">10</property>
- <property name="margin-start">10</property>
- <property name="margin-end">10</property>
- <property name="margin-top">10</property>
- <property name="margin-bottom">10</property>
- <property name="hexpand">True</property>
- <property name="vexpand">True</property>
- <property name="stock">gtk-missing-image</property>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <placeholder/>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">4</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="anastasis_gtk_backup_success_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-start">10</property>
- <property name="margin-end">10</property>
- <property name="margin-top">10</property>
- <property name="margin-bottom">10</property>
- <property name="label" translatable="yes">Success!</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">9</property>
- </packing>
- </child>
- <child>
- <object class="GtkFrame" id="anastasis_gtk_select_secret_frame">
- <property name="can-focus">False</property>
- <property name="label-xalign">0</property>
- <property name="shadow-type">none</property>
- <child>
- <object class="GtkAlignment">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="left-padding">12</property>
- <child>
- <object class="GtkBox" id="anastasis_gtk_secret_select_vbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <property name="spacing">10</property>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel" id="select_secret_hint_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="halign">start</property>
- <property name="label" translatable="yes">Select a secret to recover from the list below. If no secrets are listed,
-you need to either go back and correct your personal information or
-explicitly add the provider which you used before for the backup.</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_add_provider_button">
- <property name="label" translatable="yes">Add provider</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="image">add_image</property>
- <signal name="clicked" handler="anastasis_gtk_add_provider_button_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkScrolledWindow" id="anastasis_secret_selection_scrolled_window">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="hadjustment">secret_selection_h_adjustment</property>
- <property name="vadjustment">secret_selection_v_adjustment</property>
- <property name="shadow-type">in</property>
- <child>
- <object class="GtkViewport" id="anastasis_secret_selection_viewport">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="hadjustment">secret_selection_h_adjustment</property>
- <property name="vadjustment">secret_selection_v_adjustment</property>
- <child>
- <object class="GtkTreeView" id="anastasis_secret_selection_treeview">
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="hadjustment">secret_selection_h_adjustment</property>
- <property name="vadjustment">secret_selection_v_adjustment</property>
- <property name="model">secret_selection_liststore</property>
- <child internal-child="selection">
- <object class="GtkTreeSelection" id="anastasis_gtk_secret_selection_treeselection">
- <signal name="changed" handler="anastasis_gtk_secret_selection_treeselection_changed_cb" swapped="no"/>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="secret_name_column">
- <property name="resizable">True</property>
- <property name="sizing">autosize</property>
- <property name="title" translatable="yes">Secret name</property>
- <property name="clickable">True</property>
- <property name="sort-indicator">True</property>
- <property name="sort-column-id">3</property>
- <child>
- <object class="GtkCellRendererText" id="backup_name_renderer"/>
- <attributes>
- <attribute name="text">3</attribute>
- </attributes>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="backup_time_column">
- <property name="sizing">fixed</property>
- <property name="title" translatable="yes">Backup time</property>
- <property name="clickable">True</property>
- <property name="sort-indicator">True</property>
- <property name="sort-column-id">5</property>
- <child>
- <object class="GtkCellRendererText" id="backup_time_renderer"/>
- <attributes>
- <attribute name="text">4</attribute>
- </attributes>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="backup_version_column">
- <property name="visible">False</property>
- <property name="title" translatable="yes">Version</property>
- <property name="clickable">True</property>
- <property name="sort-indicator">True</property>
- <property name="sort-order">descending</property>
- <property name="sort-column-id">1</property>
- <child>
- <object class="GtkCellRendererText" id="backup_version_renderer">
- <property name="visible">False</property>
- </object>
- <attributes>
- <attribute name="text">1</attribute>
- </attributes>
- </child>
- </object>
- </child>
- <child>
- <object class="GtkTreeViewColumn" id="provider_url_column1">
- <property name="visible">False</property>
- <property name="resizable">True</property>
- <property name="title" translatable="yes">Provider</property>
- <property name="clickable">True</property>
- <child>
- <object class="GtkCellRendererText" id="provider_url_renderer">
- <property name="visible">False</property>
- </object>
- <attributes>
- <attribute name="text">0</attribute>
- </attributes>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Select secret to recover</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- </attributes>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">10</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="anastasis_gtk_main_control_vbox">
- <property name="can-focus">False</property>
- <child>
- <object class="GtkButton" id="anastasis_gtk_main_window_prev_button">
- <property name="label">gtk-go-back</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="can-default">True</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">True</property>
- <signal name="clicked" handler="anastasis_gtk_main_window_back_clicked" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_restart_button">
- <property name="label" translatable="yes">_Restart</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="tooltip-text" translatable="yes">Go back to the beginning.</property>
- <property name="image">restart_image</property>
- <property name="use-underline">True</property>
- <property name="always-show-image">True</property>
- <signal name="clicked" handler="anastasis_gtk_restart_button_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_main_window_quit_button">
- <property name="label">gtk-quit</property>
- <property name="can-focus">True</property>
- <property name="can-default">True</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">True</property>
- <signal name="clicked" handler="anastasis_gtk_main_window_quit_button_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">4</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_main_window_forward_button">
- <property name="label">gtk-media-next</property>
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="can-focus">False</property>
- <property name="can-default">True</property>
- <property name="has-default">True</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">True</property>
- <signal name="clicked" handler="anastasis_gtk_main_window_forward_clicked" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">10</property>
- <property name="position">6</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkStatusbar" id="anastasis_gtk_statusbar">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <property name="spacing">8</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">4</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_main_window.ui b/contrib/anastasis_gtk_main_window.ui
@@ -0,0 +1,2840 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of anastasis-gtk.
+
+anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Christian Grothoff, Dennis Neufeld-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkListStore" id="anastasis_gtk_backup_progress_liststore">
+ <columns>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">1. Location & currency</col>
+ <col id="1">^(CONTINENT|COUNTRY)_SELECTING$</col>
+ <col id="2" translatable="yes">Where you live will determine which personal information can be used to identify your backup.</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">2. Personal information</col>
+ <col id="1">^USER_ATTRIBUTES_COLLECTING$</col>
+ <col id="2" translatable="yes">Your personal information will not be shared with anyone. But you must provide the same information during recovery.\</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">3. Authorization methods</col>
+ <col id="1">^AUTHENTICATIONS_EDITING$</col>
+ <col id="2" translatable="yes">Specify which methods could be used to authenticate you during recovery.</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">4. Recovery policies</col>
+ <col id="1">^POLICIES_REVIEWING$</col>
+ <col id="2" translatable="yes">These are possible ways how the secret could be recovered. Please review and possibly edit the policies.</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">5. Enter secret</col>
+ <col id="1">^SECRET_EDITING$</col>
+ <col id="2" translatable="yes">Please specify the secret to be backed up.</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">6. Payment (optional)</col>
+ <col id="1">^.*_PAYING$</col>
+ <col id="2" translatable="yes">Some Anastasis providers require payment for their service. Please pay.</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">7. Backup completed</col>
+ <col id="1">BACKUP_FINISHED</col>
+ <col id="2" translatable="yes">Your backup is complete. Please do test the recovery on occasion.</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkAdjustment" id="anastasis_gtk_enter_secret_hadjustment">
+ <property name="upper">100</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkTextBuffer" id="anastasis_gtk_enter_secret_textbuffer">
+ <signal name="changed" handler="anastasis_gtk_enter_secret_textbuffer_changed_cb" swapped="no"/>
+ </object>
+ <object class="GtkAdjustment" id="anastasis_gtk_enter_secret_vadjustment">
+ <property name="upper">100</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="anastasis_gtk_policy_box_adjustment_h">
+ <property name="upper">100</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="anastasis_gtk_policy_box_adjustment_v">
+ <property name="upper">100</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkListStore" id="anastasis_gtk_recovery_progress_liststore">
+ <columns>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">1. Location & currency</col>
+ <col id="1">^(CONTINENT|COUNTRY)_SELECTING$</col>
+ <col id="2" translatable="yes">Where you live will determine which personal information can be used to identify your backup.</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">2. Personal information</col>
+ <col id="1">^USER_ATTRIBUTES_COLLECTING$</col>
+ <col id="2" translatable="yes">Your personal information will not be shared with anyone. But you must provide the same information during recovery.</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">3. Select secret</col>
+ <col id="1">^SECRET_SELECTING$</col>
+ <col id="2" translatable="yes">Please select which secret to recover. You may switch to a different version or provider.</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">4. Solve challenges</col>
+ <col id="1">^CHALLENGE_SELECTING$</col>
+ <col id="2" translatable="yes">Please select an authentication challenge to pass to recover the secret.</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">5. Secret recovered</col>
+ <col id="1">^RECOVERY_FINISHED$</col>
+ <col id="2" translatable="yes">Your secret was successfully recovered.</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="authentication_methods_liststore">
+ <columns>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ <column type="guint"/>
+ </columns>
+ </object>
+ <object class="GtkAdjustment" id="backup_adjustmenth">
+ <property name="upper">100</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="backup_adjustmentv">
+ <property name="upper">100</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkListStore" id="backup_provider_liststore">
+ <columns>
+ <column type="gchararray"/>
+ <column type="guint64"/>
+ <column type="gchararray"/>
+ <column type="gboolean"/>
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkListStore" id="challenge_status_liststore">
+ <columns>
+ <column type="guint"/>
+ <column type="gchararray"/>
+ <column type="gboolean"/>
+ <column type="gchararray"/>
+ <column type="GdkPixbuf"/>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ <column type="gboolean"/>
+ <column type="gboolean"/>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ <column type="gboolean"/>
+ <column type="gboolean"/>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkListStore" id="continent_liststore">
+ <columns>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkListStore" id="country_liststore">
+ <columns>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkAdjustment" id="expiration_year_adjustment">
+ <property name="upper">9999</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkPicture" id="image_sms1">
+ <property name="margin-end">5</property>
+ <property name="file">outline_stay_current_portrait_black_24dp.png</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ <object class="GtkTreeStore" id="policy_review_treestore">
+ <columns>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ <column type="guint"/>
+ <column type="gboolean"/>
+ <column type="guint"/>
+ <column type="gboolean"/>
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkAdjustment" id="policy_version_adjustment">
+ <property name="upper">4294967295</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkEntryBuffer" id="provider_url_entrybuffer">
+ <property name="text" translatable="1">https://</property>
+ </object>
+ <object class="GtkAdjustment" id="recovery_adjustmenth">
+ <property name="upper">100</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="recovery_adjustmentv">
+ <property name="upper">100</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="secret_box_adjustmenth">
+ <property name="upper">100</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="secret_box_adjustmentv">
+ <property name="upper">100</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkAdjustment" id="secret_selection_h_adjustment">
+ <property name="upper">100</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkListStore" id="secret_selection_liststore">
+ <columns>
+ <column type="gchararray"/>
+ <column type="gint"/>
+ <column type="gint"/>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ <column type="guint64"/>
+ <column type="gpointer"/>
+ </columns>
+ </object>
+ <object class="GtkAdjustment" id="secret_selection_v_adjustment">
+ <property name="upper">100</property>
+ <property name="step-increment">1</property>
+ <property name="page-increment">10</property>
+ </object>
+ <object class="GtkListStore" id="unpaid_qrcodes_liststore">
+ <columns>
+ <column type="GdkPixbuf"/>
+ <column type="gchararray"/>
+ <column type="gchararray"/>
+ </columns>
+ </object>
+ <object class="GtkWindow" id="anastasis_gtk_main_window">
+ <property name="default-width">700</property>
+ <property name="default-height">500</property>
+ <signal name="close-request" handler="anastasis_gtk_quit_cb" swapped="no"/>
+ <property name="child">
+ <object class="GtkBox" id="anastasis_gtk_main_vbox">
+ <property name="orientation">vertical</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkBox">
+ <property name="vexpand">1</property>
+ <property name="hexpand">0</property>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_progress_vbox">
+ <property name="halign">center</property>
+ <property name="visible">0</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkScrolledWindow" id="anastasis_gtk_backup_progress_scrolled_window">
+ <property name="vexpand">1</property>
+ <property name="visible">0</property>
+ <property name="hadjustment">backup_adjustmenth</property>
+ <property name="vadjustment">backup_adjustmentv</property>
+ <property name="propagate-natural-width">1</property>
+ <property name="child">
+ <object class="GtkTreeView" id="anastasis_gtk_backup_progress_treeview">
+ <property name="hadjustment">backup_adjustmenth</property>
+ <property name="vadjustment">backup_adjustmentv</property>
+ <property name="model">anastasis_gtk_backup_progress_liststore</property>
+ <property name="headers-clickable">0</property>
+ <property name="enable-search">0</property>
+ <property name="search-column">0</property>
+ <property name="show-expanders">0</property>
+ <property name="tooltip-column">2</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="anastasis_gtk_backup_progress_tree_selection"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="anastasis_gtk_backup_progress_description_column">
+ <property name="spacing">5</property>
+ <property name="sizing">autosize</property>
+ <property name="title" translatable="1">Back up a secret</property>
+ <child>
+ <object class="GtkCellRendererText" id="anastasis_gtk_backup_progress_description">
+ <property name="ypad">15</property>
+ </object>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkGestureClick">
+ <property name="propagation-phase">capture</property>
+ <signal name="pressed" handler="anastasis_gtk_progress_treeview_pressed_cb"/>
+ </object>
+ </child>
+ </object>
+ </property>
+ <property name="has-frame">1</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="anastasis_gtk_recovery_progress_scrolled_window">
+ <property name="vexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="hadjustment">recovery_adjustmenth</property>
+ <property name="vadjustment">recovery_adjustmentv</property>
+ <property name="propagate-natural-width">1</property>
+ <property name="child">
+ <object class="GtkTreeView" id="anastasis_gtk_recovery_progress_treeview">
+ <property name="hadjustment">recovery_adjustmenth</property>
+ <property name="vadjustment">recovery_adjustmentv</property>
+ <property name="model">anastasis_gtk_recovery_progress_liststore</property>
+ <property name="headers-clickable">0</property>
+ <property name="enable-search">0</property>
+ <property name="search-column">0</property>
+ <property name="show-expanders">0</property>
+ <property name="tooltip-column">2</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="anastasis_gtk_recovery_progress_tree_selection"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="anastasis_gtk_recovery_progress_description_colum">
+ <property name="spacing">5</property>
+ <property name="sizing">autosize</property>
+ <property name="title" translatable="1">Recover a secret</property>
+ <child>
+ <object class="GtkCellRendererText" id="anastasis_gtk_recovery_progress_description">
+ <property name="ypad">15</property>
+ </object>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkGestureClick">
+ <property name="propagation-phase">capture</property>
+ <signal name="pressed" handler="anastasis_gtk_progress_treeview_pressed_cb"/>
+ </object>
+ </child>
+ </object>
+ </property>
+ <property name="has-frame">1</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_main_window_save_as_button">
+ <property name="valign">center</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="tooltip-text" translatable="1">Save the current state of Anastasis to a file. Useful if you want to resume the operation later.</property>
+ <property name="margin-start">15</property>
+ <property name="margin-end">15</property>
+ <property name="margin-top">25</property>
+ <property name="margin-bottom">25</property>
+ <signal name="clicked" handler="anastasis_gtk_main_window_save_as_button_clicked_cb" swapped="no"/>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">document-save-as</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Save _As</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_main_window_save_as_button</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="anastasis_gtk_scrolledwindow">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="vexpand">1</property>
+ <property name="hadjustment">recovery_adjustmentv</property>
+ <property name="child">
+ <object class="GtkViewport" id="anastasis_gtk_viewport">
+ <property name="hexpand">1</property>
+ <property name="vexpand">1</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="hexpand">0</property>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_super_vbox">
+ <property name="hexpand">1</property>
+ <property name="orientation">vertical</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_error_label">
+ <property name="visible">0</property>
+ <property name="label">DYNAMIC ERROR MESSAGE</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ <attribute name="foreground" value="#a5a51d1d2d2d"></attribute>
+ </attributes>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_start_frame">
+ <property name="margin-start">10</property>
+ <property name="homogeneous">1</property>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_primary_action_hbox">
+ <property name="halign">center</property>
+ <property name="margin-start">22</property>
+ <property name="margin-end">10</property>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">20</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="halign">center</property>
+ <property name="label" translatable="1">What do you want to do?</property>
+ <property name="justify">center</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ <attribute name="scale" value="1.5"></attribute>
+ </attributes>
+ <property name="margin-top">15</property>
+ <property name="margin-bottom">15</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_backup_button">
+ <property name="valign">center</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="tooltip-text" translatable="1">Begin fresh backup process</property>
+ <signal name="clicked" handler="anastasis_gtk_backup_button_clicked_cb" swapped="no"/>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage" id="backup_image">
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="icon-name">go-up</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Back up a secret</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_backup_button</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_recovery_button">
+ <property name="valign">center</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="tooltip-text" translatable="1">Begin secret recovery process</property>
+ <signal name="clicked" handler="anastasis_gtk_recovery_button_clicked_cb" swapped="no"/>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage" id="restore_image">
+ <property name="margin-start">5</property>
+ <property name="margin-end">4</property>
+ <property name="icon-name">go-down</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Recover a secret</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_recovery_button</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_open_state">
+ <property name="valign">center</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="tooltip-text" translatable="1">Continue from file with saved Anastasis state</property>
+ <signal name="clicked" handler="anastasis_gtk_open_state_clicked_cb" swapped="no"/>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage" id="open_image">
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="icon-name">document-open</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label">_Open a saved action</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_open_state</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFrame" id="anastasis_gtk_continent_frame">
+ <property name="vexpand">1</property>
+ <property name="visible">0</property>
+ <property name="child">
+ <object class="GtkBox" id="anastasis_gtk_continent_vbox">
+ <property name="margin-start">12</property>
+ <property name="hexpand">0</property>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="hexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="child">
+ <object class="GtkTreeView" id="anastasis_gtk_continent_treeview">
+ <property name="focusable">1</property>
+ <property name="model">continent_liststore</property>
+ <property name="enable-search">0</property>
+ <property name="search-column">0</property>
+ <property name="activate-on-single-click">1</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="anastasis_gtk_continent_selection">
+ <signal name="changed" handler="anastasis_gtk_continent_selection_changed_cb" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="continent_column">
+ <property name="title" translatable="1">Continent</property>
+ <child>
+ <object class="GtkCellRendererText" id="continent_name_cell_renderer"/>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ <property name="has-frame">1</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="hexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="child">
+ <object class="GtkTreeView" id="anastasis_gtk_country_treeview">
+ <property name="focusable">1</property>
+ <property name="model">country_liststore</property>
+ <property name="enable-search">0</property>
+ <property name="search-column">0</property>
+ <property name="activate-on-single-click">1</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="anastasis_gtk_country_selection">
+ <signal name="changed" handler="anastasis_gtk_country_selection_changed_cb" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="country_column">
+ <property name="title" translatable="1">Country</property>
+ <child>
+ <object class="GtkCellRendererText" id="country_name_cell_renderer"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ <property name="has-frame">1</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ <child type="label">
+ <object class="GtkLabel">
+ <property name="tooltip-text" translatable="1">These questions determine which personal attributes we can ask you for, and which backup providers could be used.</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="label" translatable="1">Where do you live? In which currencies do you want to pay?</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ <style>
+ <class name="flat"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFrame" id="anastasis_gtk_identity_frame">
+ <property name="vexpand">1</property>
+ <property name="visible">0</property>
+ <property name="child">
+ <object class="GtkBox" id="who_are_you_hbox">
+ <property name="spacing">10</property>
+ <property name="homogeneous">1</property>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_identity_vbox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">15</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_ia_full_name_box">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_ia_full_name_hbox">
+ <property name="valign">center</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="hexpand">0</property>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_ia_full_name_label">
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="margin-start">25</property>
+ <property name="label" translatable="1">Full name:</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="hexpand">1</property>
+ <property name="orientation">vertical</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_ia_full_name_entry">
+ <property name="vexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="placeholder-text" translatable="1" comments="Change to a common "dummy" name in the target language, using the suggested canonical format for that name in that language.">DOE, John</property>
+ <signal name="changed" handler="AG_identity_changed" swapped="no"/>
+ <child>
+ <object class="GtkEventControllerFocus">
+ <signal name="enter" handler="anastasis_gtk_show_on_focus_enter_cb" object="anastasis_gtk_name_casewarning_label" swapped="yes"/>
+ <signal name="leave" handler="anastasis_gtk_hide_on_focus_leave_cb" object="anastasis_gtk_name_casewarning_label" swapped="yes"/>
+ </object>
+ </child>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_ia_name_format_hint_label">
+ <property name="label" translatable="1" comments="You may completely change the recommended format if the given format is inappropriate for the target language or culture.">If possible, use "LASTNAME, Firstname(s)" without abbreviations.</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCenterBox" id="private_hbox1">
+ <property name="margin-start">40</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="hexpand">0</property>
+ <property name="start-widget">
+ <object class="GtkBox">
+ <child>
+ <object class="GtkLabel" id="privacy_label1">
+ <property name="halign">center</property>
+ <property name="label" translatable="1">This stays private</property>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkPicture" id="blindfold_image1">
+ <property name="halign">center</property>
+ <property name="width-request">24</property>
+ <property name="height-request">24</property>
+ <property name="file">noun_blindfold_3574196.svg</property>
+ <property name="margin-start">1</property>
+ <property name="margin-end">1</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ <property name="end-widget">
+ <object class="GtkBox">
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_name_casewarning_label">
+ <property name="hexpand">1</property>
+ <property name="visible">0</property>
+ <property name="label" translatable="1" comments="If the user's language does not have cases (like in Kanji), you may choose to leave out the text about case-sensitivity to avoid confusing the reader.">This field is case-sensitive. You must enter
+exactly the same value during recovery.</property>
+ <attributes>
+ <attribute name="foreground" value="#81813d3d9c9c"></attribute>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_ia_birthdate_box">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_ia_birthdate_hbox">
+ <property name="visible">0</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_ia_birthdate_label">
+ <property name="halign">start</property>
+ <property name="margin-start">25</property>
+ <property name="label" translatable="1">Birthdate:</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCalendar" id="anastasis_gtk_ia_birthdate_cal">
+ <property name="halign">center</property>
+ <property name="focusable">1</property>
+ <property name="year">1980</property>
+ <property name="month">8</property>
+ <property name="day">22</property>
+ <property name="show-week-numbers">1</property>
+ <signal name="day-selected" handler="AG_identity_changed" swapped="no"/>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="private_hbox2">
+ <property name="margin-start">40</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel" id="privacy_label2">
+ <property name="halign">center</property>
+ <property name="label" translatable="1">This stays private</property>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkPicture" id="blindfold_image2">
+ <property name="halign">center</property>
+ <property name="width-request">24</property>
+ <property name="height-request">24</property>
+ <property name="file">noun_blindfold_3574196.svg</property>
+ <property name="margin-start">1</property>
+ <property name="margin-end">1</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_ia_birthplace_box">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_ia_birthplace_hbox">
+ <property name="valign">center</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="hexpand">0</property>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_ia_birthplace_label">
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="margin-start">25</property>
+ <property name="label" translatable="1">Birthplace:</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="hexpand">1</property>
+ <property name="orientation">vertical</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_ia_birthplace_entry">
+ <property name="vexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="placeholder-text" translatable="1" comments="Example for Birthplace in suitable language- and culture-specific format with good details.">Lafayette, Indiana, USA</property>
+ <signal name="changed" handler="AG_identity_changed" swapped="no"/>
+ <child>
+ <object class="GtkEventControllerFocus">
+ <signal name="enter" handler="anastasis_gtk_show_on_focus_enter_cb" object="anastasis_gtk_birthplace_casewarning_label" swapped="yes"/>
+ <signal name="leave" handler="anastasis_gtk_hide_on_focus_leave_cb" object="anastasis_gtk_birthplace_casewarning_label" swapped="yes"/>
+ </object>
+ </child>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_ia_birthplace_format_hint_label">
+ <property name="label" translatable="1" comments="You may completely change the recommendation if for the target language/culture the recommendation is not applicable.">If possible, use "Location, Region, Country".</property>
+ <attributes>
+ <attribute name="scale" value="0.90000000000000002"></attribute>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="private_hbox3">
+ <property name="margin-start">40</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel" id="privacy_label3">
+ <property name="halign">center</property>
+ <property name="label" translatable="1">This stays private</property>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkPicture" id="blindfold_image3">
+ <property name="halign">center</property>
+ <property name="width-request">24</property>
+ <property name="height-request">24</property>
+ <property name="file">noun_blindfold_3574196.svg</property>
+ <property name="margin-start">1</property>
+ <property name="margin-end">1</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_birthplace_casewarning_label">
+ <property name="visible">0</property>
+ <property name="label" translatable="1" comments="If the user's language does not have cases (like in Kanji), you may choose to leave out the text about case-sensitivity to avoid confusing the reader.">This field is case-sensitive. You must enter
+exactly the same value during recovery.</property>
+ <attributes>
+ <attribute name="foreground" value="#81813d3d9c9c"></attribute>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_ia_ahv_box">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_ia_ahv_hbox">
+ <property name="visible">0</property>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_ia_ahv_label">
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="margin-start">25</property>
+ <property name="label" translatable="1">AHV number:</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_ia_ahv_entry">
+ <property name="halign">center</property>
+ <property name="focusable">1</property>
+ <property name="max-length">16</property>
+ <property name="width-chars">17</property>
+ <property name="max-width-chars">16</property>
+ <property name="placeholder-text" translatable="1">756.1222.3425.89</property>
+ <property name="input-purpose">number</property>
+ <signal name="changed" handler="AG_identity_changed" swapped="no"/>
+ <signal name="delete-text" handler="anastasis_gtk_autocomplete_delete_text" swapped="no"/>
+ <signal name="insert-text" handler="anastasis_gtk_autocomplete_insert_text" swapped="no"/>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="private_hbox4">
+ <property name="margin-start">40</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel" id="privacy_label4">
+ <property name="halign">center</property>
+ <property name="label" translatable="1">This stays private</property>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkPicture" id="blindfold_image4">
+ <property name="halign">center</property>
+ <property name="width-request">24</property>
+ <property name="height-request">24</property>
+ <property name="file">noun_blindfold_3574196.svg</property>
+ <property name="margin-start">1</property>
+ <property name="margin-end">1</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_ia_tin_de_box">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_ia_tin_de_hbox">
+ <property name="visible">0</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="hexpand">0</property>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_ia_tin_de_label">
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="margin-start">25</property>
+ <property name="label" translatable="1">Steuerliche Identifikationsnummer:</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_ia_tin_de_entry">
+ <property name="hexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="max-length">11</property>
+ <property name="width-chars">11</property>
+ <property name="max-width-chars">11</property>
+ <property name="placeholder-text" translatable="1">12345678912</property>
+ <property name="input-purpose">number</property>
+ <signal name="changed" handler="AG_identity_changed" swapped="no"/>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="private_hbox5">
+ <property name="margin-start">40</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel" id="privacy_label5">
+ <property name="halign">center</property>
+ <property name="label" translatable="1">This stays private</property>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkPicture" id="blindfold_image5">
+ <property name="halign">center</property>
+ <property name="width-request">24</property>
+ <property name="height-request">24</property>
+ <property name="file">noun_blindfold_3574196.svg</property>
+ <property name="margin-start">1</property>
+ <property name="margin-end">1</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_ia_ssn_de_box">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_ia_ssn_de_hbox">
+ <property name="visible">0</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="hexpand">0</property>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_ia_ssn_de_label">
+ <property name="tooltip-text" translatable="1">Falls vorhanden sollte diese Nummer auf jeden Fall angegeben werden. Nur Beamte, Selbstständige und andere Personen die keine Rentenversicherungsnummer haben sollten dieses Feld leer lassen.</property>
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="margin-start">25</property>
+ <property name="label" translatable="1">Sozialversicherungsnummer (optional):</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_ia_ssn_de_entry">
+ <property name="hexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="max-length">12</property>
+ <property name="width-chars">13</property>
+ <property name="max-width-chars">12</property>
+ <property name="placeholder-text" translatable="1">14230460S534</property>
+ <property name="input-purpose">alpha</property>
+ <signal name="changed" handler="AG_identity_changed" swapped="no"/>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="private_hbox6">
+ <property name="margin-start">40</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel" id="privacy_label6">
+ <property name="halign">center</property>
+ <property name="label" translatable="1">This stays private</property>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkPicture" id="blindfold_image6">
+ <property name="halign">center</property>
+ <property name="width-request">24</property>
+ <property name="height-request">24</property>
+ <property name="file">noun_blindfold_3574196.svg</property>
+ <property name="margin-start">1</property>
+ <property name="margin-end">1</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_ia_ssn_us_box">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_ia_ssn_us_hbox">
+ <property name="visible">0</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_ia_ssn_us_label">
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="margin-start">25</property>
+ <property name="label" translatable="1">Social security number:</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_ia_ssn_us_entry">
+ <property name="focusable">1</property>
+ <property name="max-length">11</property>
+ <property name="width-chars">12</property>
+ <property name="max-width-chars">11</property>
+ <property name="placeholder-text" translatable="1">000-00-0000</property>
+ <signal name="changed" handler="AG_identity_changed" swapped="no"/>
+ <signal name="delete-text" handler="anastasis_gtk_autocomplete_delete_text" swapped="no"/>
+ <signal name="insert-text" handler="anastasis_gtk_autocomplete_insert_text" swapped="no"/>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="private_hbox7">
+ <property name="margin-start">40</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel" id="privacy_label7">
+ <property name="halign">center</property>
+ <property name="label" translatable="1">This stays private</property>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkPicture" id="blindfold_image7">
+ <property name="halign">center</property>
+ <property name="width-request">24</property>
+ <property name="height-request">24</property>
+ <property name="file">noun_blindfold_3574196.svg</property>
+ <property name="margin-start">1</property>
+ <property name="margin-end">1</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_private_explainer_vbox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">20</property>
+ <property name="baseline-position">top</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <child>
+ <object class="GtkBox" id="private_hbox">
+ <property name="valign">center</property>
+ <child>
+ <object class="GtkLabel" id="privacy_label">
+ <property name="halign">center</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="label" translatable="1">This stays private</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ <attribute name="scale" value="1.5"></attribute>
+ </attributes>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkPicture" id="blindfold_image">
+ <property name="halign">center</property>
+ <property name="width-request">24</property>
+ <property name="height-request">24</property>
+ <property name="file">noun_blindfold_3574196.svg</property>
+ <property name="margin-start">1</property>
+ <property name="margin-end">1</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="explainer_label">
+ <property name="valign">center</property>
+ <property name="margin-top">15</property>
+ <property name="margin-bottom">25</property>
+ <property name="label" translatable="1">The information you have entered here:
+• Will be hashed, and therefore unreadable
+• The non-hashed version is not shared</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="encrypt_label">
+ <property name="label" translatable="1"><a href="https://taler.net/papers/thesis-anastasis-2020.pdf">How Anastasis encrypts your data</a></property>
+ <property name="use-markup">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="free_software_label">
+ <property name="label" translatable="1">Anastasis is <a href="https://www.gnu.org/philosophy/free-sw.html">Free Software</a></property>
+ <property name="use-markup">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="funding_label">
+ <property name="valign">center</property>
+ <property name="margin-top">20</property>
+ <property name="label" translatable="1">Anastasis is developed by <a href="https://anastasis.lu/en/about.html#team">privacy advocates</a>
+with <a href="https://www.ngi.eu/ngi-projects/ledger/">funding</a> from the European Commission.</property>
+ <property name="use-markup">1</property>
+ <property name="justify">center</property>
+ <property name="margin-bottom">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkPicture" id="ec_image">
+ <property name="valign">center</property>
+ <property name="width-request">128</property>
+ <property name="height-request">128</property>
+ <property name="halign">center</property>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ <property name="margin-top">15</property>
+ <property name="margin-bottom">15</property>
+ <property name="file">bandiera_stelle.png</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ <child type="label">
+ <object class="GtkLabel">
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="label" translatable="1">Who are you?</property>
+ <attributes>
+ <attribute name="style" value="normal"></attribute>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ <style>
+ <class name="flat"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFrame" id="anastasis_gtk_b_authentication_frame">
+ <property name="vexpand">1</property>
+ <property name="visible">0</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="margin-start">12</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkFrame">
+ <property name="valign">center</property>
+ <property name="margin-end">50</property>
+ <property name="hexpand">1</property>
+ <property name="child">
+ <object class="GtkGrid" id="anastasis_gtk_auth_button_grid">
+ <property name="row-spacing">5</property>
+ <property name="column-spacing">5</property>
+ <property name="row-homogeneous">1</property>
+ <property name="column-homogeneous">1</property>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_btn_add_auth_sms">
+ <property name="label" translatable="1">SMS</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="tooltip-text" translatable="1">Add authentication using a transaction number send to a mobile phone number.</property>
+ <signal name="clicked" handler="anastasis_gtk_btn_add_auth_sms_clicked_cb" swapped="no"/>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_btn_add_auth_email">
+ <property name="label" translatable="1">Email</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="tooltip-text" translatable="1">Add authentication using a transaction number send to an e-mail address.</property>
+ <signal name="clicked" handler="anastasis_gtk_btn_add_auth_email_clicked_cb" swapped="no"/>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_btn_add_auth_question">
+ <property name="label" translatable="1">Question</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="tooltip-text" translatable="1">Add authentication using security question and answer.</property>
+ <signal name="clicked" handler="anastasis_gtk_btn_add_auth_question_clicked_cb" swapped="no"/>
+ <layout>
+ <property name="column">2</property>
+ <property name="row">0</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_btn_add_auth_post">
+ <property name="label" translatable="1">Post</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="tooltip-text" translatable="1">Add authentication using a transaction number send to a postal address.</property>
+ <signal name="clicked" handler="anastasis_gtk_btn_add_auth_post_clicked_cb" swapped="no"/>
+ <layout>
+ <property name="column">0</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_btn_add_auth_iban">
+ <property name="label" translatable="1">IBAN</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="tooltip-text" translatable="1">Add authentication using a payment of from a designated IBAN account.</property>
+ <signal name="clicked" handler="anastasis_gtk_btn_add_auth_iban_clicked_cb" swapped="no"/>
+ <layout>
+ <property name="column">2</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_btn_add_auth_totp">
+ <property name="label" translatable="1">TOTP</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="tooltip-text" translatable="1">Add Time-Based One-Time Password authentication (RFC 6238)</property>
+ <signal name="clicked" handler="anastasis_gtk_btn_add_auth_totp_clicked_cb" swapped="no"/>
+ <layout>
+ <property name="column">1</property>
+ <property name="row">1</property>
+ </layout>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </property>
+ <child type="label">
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Which authorization method should be added?</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ <style>
+ <class name="flat"/>
+ </style>
+ <property name="margin-top">30</property>
+ <property name="margin-bottom">30</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_b_authentication_hbox">
+ <property name="vexpand">1</property>
+ <property name="hexpand">0</property>
+ <child>
+ <object class="GtkFrame">
+ <property name="hexpand">1</property>
+ <property name="child">
+ <object class="GtkScrolledWindow">
+ <property name="focusable">1</property>
+ <property name="child">
+ <object class="GtkTreeView" id="anastasis_gtk_authentication_methods_list">
+ <property name="focusable">1</property>
+ <property name="model">authentication_methods_liststore</property>
+ <property name="enable-search">0</property>
+ <property name="search-column">0</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="anastasis_gtk_authentication_methods_selection">
+ <signal name="changed" handler="auth_method_selection_changed_cb" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="auth_method_type">
+ <property name="sizing">autosize</property>
+ <property name="title" translatable="1">Type</property>
+ <property name="clickable">1</property>
+ <property name="reorderable">1</property>
+ <property name="sort-indicator">1</property>
+ <property name="sort-column-id">0</property>
+ <child>
+ <object class="GtkCellRendererText" id="type"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="auth_method_visual">
+ <property name="sizing">autosize</property>
+ <property name="title" translatable="1">Details</property>
+ <property name="expand">1</property>
+ <child>
+ <object class="GtkCellRendererText" id="visualization"/>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ <property name="margin-start">12</property>
+ <property name="has-frame">1</property>
+ </object>
+ </property>
+ <child type="label">
+ <object class="GtkLabel" id="anastasis_gtk_authorization_methods_label">
+ <property name="label" translatable="1">Authorization methods configured so far:</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ <style>
+ <class name="flat"/>
+ </style>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_authorization_meta_button_box">
+ <property name="halign">center</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_edit_provider_list">
+ <property name="valign">center</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <signal name="clicked" handler="anastasis_gtk_edit_provider_list_clicked_cb" swapped="no"/>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage" id="edit_image">
+ <property name="icon-name">gtk-edit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Edit providers</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_edit_provider_list</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_authentication_method_delete_button">
+ <property name="valign">center</property>
+ <property name="sensitive">0</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <signal name="clicked" handler="anastasis_gtk_authentication_method_delete_button_clicked_cb" swapped="no"/>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">edit-delete</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Delete</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_authentication_method_delete_button</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ </object>
+ </property>
+ <child type="label">
+ <object class="GtkLabel">
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="label" translatable="1">Configure authorization methods!</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ <style>
+ <class name="flat"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFrame" id="anastasis_gtk_b_policy_frame">
+ <property name="vexpand">1</property>
+ <property name="visible">0</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">10</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkLabel" id="review_policies_explainer_label">
+ <property name="halign">start</property>
+ <property name="margin-start">15</property>
+ <property name="margin-end">15</property>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ <property name="label" translatable="1">Each recovery policy specifies a combination of authentication methods sufficient to recover the secret.
+Please review the recovery policies for the secret you are about to back up.
+If the automatically generated recovery policies are inadequate for your use case, use right-click to add, edit or delete policies.
+You can also use "back" to add additional authentication methods.</property>
+ <property name="wrap">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="vexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="child">
+ <object class="GtkTreeView" id="anastasis_gtk_review_policy_treeview">
+ <property name="focusable">1</property>
+ <property name="model">policy_review_treestore</property>
+ <property name="search-column">0</property>
+ <signal name="row-activated" handler="anastasis_gtk_review_policy_treeview_row_activated_cb" swapped="no"/>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="policy_name_column0">
+ <property name="spacing">5</property>
+ <property name="sizing">autosize</property>
+ <property name="title" translatable="1">Policy</property>
+ <child>
+ <object class="GtkCellRendererText" id="policy_name_column"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="challenge_type_column">
+ <property name="spacing">5</property>
+ <property name="sizing">autosize</property>
+ <property name="title" translatable="1">Type</property>
+ <child>
+ <object class="GtkCellRendererText" id="challenge_type_column1"/>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="cost_column">
+ <property name="spacing">5</property>
+ <property name="sizing">autosize</property>
+ <property name="title" translatable="1">Cost</property>
+ <child>
+ <object class="GtkCellRendererText" id="cost_text_column"/>
+ <attributes>
+ <attribute name="text">2</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="provider_column">
+ <property name="spacing">5</property>
+ <property name="sizing">autosize</property>
+ <property name="title" translatable="1">Provider</property>
+ <child>
+ <object class="GtkCellRendererText" id="provider_url_column"/>
+ <attributes>
+ <attribute name="text">9</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="expiration_column">
+ <property name="visible">0</property>
+ <property name="spacing">5</property>
+ <property name="sizing">autosize</property>
+ <property name="title" translatable="1">Expiration</property>
+ <child>
+ <object class="GtkCellRendererText" id="expiration_time_str"/>
+ <attributes>
+ <attribute name="text">4</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkGestureClick">
+ <property name="button">3</property>
+ <signal name="pressed" handler="anastasis_gtk_review_policy_treeview_pressed_cb"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEventControllerKey">
+ <signal name="key-pressed" handler="anastasis_gtk_review_policy_treeview_key_pressed_cb"/>
+ </object>
+ </child>
+ </object>
+ </property>
+ <property name="has-frame">1</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ <child type="label">
+ <object class="GtkLabel">
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="label" translatable="1">Review recovery policies</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ <style>
+ <class name="flat"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFrame" id="anastasis_gtk_challenge_frame">
+ <property name="vexpand">1</property>
+ <property name="visible">0</property>
+ <property name="name">anastasis_gtk_challenge_frame</property>
+ <property name="child">
+ <object class="GtkScrolledWindow">
+ <property name="focusable">1</property>
+ <property name="hadjustment">anastasis_gtk_policy_box_adjustment_h</property>
+ <property name="vadjustment">anastasis_gtk_policy_box_adjustment_v</property>
+ <property name="child">
+ <object class="GtkViewport">
+ <property name="hadjustment">anastasis_gtk_policy_box_adjustment_h</property>
+ <property name="vadjustment">anastasis_gtk_policy_box_adjustment_v</property>
+ <property name="child">
+ <object class="GtkBox" id="anastasis_gtk_policy_vbox">
+ <property name="orientation">vertical</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </property>
+ </object>
+ </property>
+ <property name="margin-start">12</property>
+ <property name="has-frame">1</property>
+ </object>
+ </property>
+ <child type="label">
+ <object class="GtkLabel">
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="label" translatable="1">Select challenge to recover secret:</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ <style>
+ <class name="flat"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFrame" id="anastasis_gtk_enter_secret_frame">
+ <property name="vexpand">1</property>
+ <property name="visible">0</property>
+ <property name="height-request">1500</property>
+ <property name="child">
+ <object class="GtkScrolledWindow" id="secret_frame_scrolled_window">
+ <property name="focusable">1</property>
+ <property name="vexpand">1</property>
+ <property name="hadjustment">secret_box_adjustmenth</property>
+ <property name="vadjustment">secret_box_adjustmentv</property>
+ <property name="propagate-natural-width">1</property>
+ <property name="propagate-natural-height">1</property>
+ <property name="child">
+ <object class="GtkViewport" id="secret_frame_viewport">
+ <property name="hexpand">1</property>
+ <property name="hadjustment">secret_box_adjustmenth</property>
+ <property name="vadjustment">secret_box_adjustmentv</property>
+ <property name="child">
+ <object class="GtkBox" id="secret_frame_main_vbox">
+ <property name="valign">start</property>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <property name="baseline-position">top</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkBox" id="secret_name_vbox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">20</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="halign">start</property>
+ <property name="valign">start</property>
+ <property name="label" translatable="1">Secret's name</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkEntry" id="anastasis_gtk_secret_name_entry">
+ <property name="vexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="tooltip-text" translatable="1">This allows you to uniquely identify a secret if you have made multiple back ups. The value entered here will NOT be protected by the authentication checks!</property>
+ <property name="primary-icon-tooltip-text" translatable="1">If you make multiple backups using Anastasis, the secret's name will allow you to distinguish the different backups.</property>
+ <property name="placeholder-text" translatable="1">Do NOT enter the actual secret here!</property>
+ <signal name="changed" handler="anastasis_gtk_enter_secret_name_entry_changed_cb" swapped="no"/>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="secret_name_explanation_label">
+ <property name="halign">start</property>
+ <property name="label" translatable="1">Names should be unique, so that you can easily
+identify your secret later.</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="secret_entry_vbox">
+ <property name="vexpand">1</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">20</property>
+ <child>
+ <object class="GtkBox">
+ <property name="vexpand">1</property>
+ <child>
+ <object class="GtkLabel" id="secret_text_label">
+ <property name="halign">center</property>
+ <property name="label" translatable="1">Provide secret as text</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCenterBox">
+ <property name="vexpand">1</property>
+ <property name="hexpand">0</property>
+ <property name="start-widget">
+ <object class="GtkBox">
+ <child>
+ <object class="GtkScrolledWindow" id="enter_secret_scrolled_window">
+ <property name="focusable">1</property>
+ <property name="tooltip-text" translatable="1">Enter the secret you want to back up here.</property>
+ <property name="margin-start">15</property>
+ <property name="margin-end">15</property>
+ <property name="hexpand">1</property>
+ <property name="vexpand">1</property>
+ <property name="hadjustment">anastasis_gtk_enter_secret_hadjustment</property>
+ <property name="vadjustment">anastasis_gtk_enter_secret_vadjustment</property>
+ <property name="child">
+ <object class="GtkTextView" id="anastasis_gtk_enter_secret_textview">
+ <property name="focusable">1</property>
+ <property name="hexpand">1</property>
+ <property name="vexpand">1</property>
+ <property name="hadjustment">anastasis_gtk_enter_secret_hadjustment</property>
+ <property name="hscroll-policy">natural</property>
+ <property name="vadjustment">anastasis_gtk_enter_secret_vadjustment</property>
+ <property name="vscroll-policy">natural</property>
+ <property name="buffer">anastasis_gtk_enter_secret_textbuffer</property>
+ </object>
+ </property>
+ <property name="has-frame">1</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ <property name="end-widget">
+ <object class="GtkBox">
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_secret_clear_text_button">
+ <property name="visible">0</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <signal name="clicked" handler="anastasis_gtk_secret_clear_button_clicked_cb" swapped="no"/>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">edit-clear</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Clear</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_secret_clear_text_button</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="name">anastasis_gtk_enter_secret_file_box</property>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_secret_file_chooser_hbox">
+ <property name="spacing">5</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <child>
+ <object class="GtkLabel" id="secret_by_file_label">
+ <property name="label" translatable="1">Or provide secret as a file:</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_enter_secret_open_button">
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <signal name="clicked" handler="anastasis_gtk_enter_secret_open_button_clicked_cb" swapped="no"/>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage" id="open_file_image">
+ <property name="icon-name">document-open</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label">Choose file</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkCenterBox" id="anastasis_gtk_secret_file_name_hbox">
+ <property name="visible">0</property>
+ <property name="start-widget">
+ <object class="GtkBox">
+ <child>
+ <object class="GtkLabel" id="secret_file_name_label">
+ <property name="label" translatable="1">Your secret file:</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_secret_file_name_label">
+ <property name="label">DYNAMICALLY GENERATED</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </property>
+ <property name="end-widget">
+ <object class="GtkBox">
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_secret_clear_file_button">
+ <property name="visible">0</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <signal name="clicked" handler="anastasis_gtk_secret_clear_button_clicked_cb" swapped="no"/>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">edit-clear</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Clear</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_secret_clear_file_button</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="expiration_vbox">
+ <property name="valign">center</property>
+ <property name="halign">start</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <property name="baseline-position">top</property>
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">20</property>
+ <child>
+ <object class="GtkLabel" id="recovery_expiration_label">
+ <property name="label" translatable="1">Your secret's recovery data expires on:</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="expiration_hbox">
+ <child>
+ <object class="GtkLabel" id="expiration_date_without_year_label">
+ <property name="label">DYNAMICALLY SET</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="expiration_year_spin_button">
+ <property name="focusable">1</property>
+ <property name="width-chars">4</property>
+ <property name="max-width-chars">4</property>
+ <property name="adjustment">expiration_year_adjustment</property>
+ <property name="numeric">1</property>
+ <property name="value">9999</property>
+ <signal name="value-changed" handler="expiration_year_spin_button_value_changed_cb" swapped="no"/>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="payment_info_vbox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">10</property>
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">20</property>
+ <child>
+ <object class="GtkBox" id="backup_free_hbox">
+ <property name="spacing">10</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel" id="backup_fee_label">
+ <property name="label" translatable="1">Backup fee:</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="backup_fee_value_label">
+ <property name="label">DYNAMICALLY SET</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="backup_fee_explainer_label">
+ <property name="halign">start</property>
+ <property name="label" translatable="1">You pay this fee to back up your secret.
+The fee may increase with the expiry
+date of your secret's recovery data.</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </property>
+ <property name="has-frame">1</property>
+ </object>
+ </property>
+ <child type="label">
+ <object class="GtkLabel">
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ <property name="label" translatable="1">Provide secret to backup:</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ <style>
+ <class name="flat"/>
+ </style>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFrame" id="anastasis_gtk_pay_frame">
+ <property name="visible">0</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">5</property>
+ <property name="margin-start">12</property>
+ <property name="margin-top">5</property>
+ <property name="hexpand">0</property>
+ <child>
+ <object class="GtkBox">
+ <property name="hexpand">1</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="vexpand">1</property>
+ <property name="label" translatable="1">Please pay with GNU Taler:</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_main_window_unpaid_box">
+ <property name="vexpand">1</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">5</property>
+ <child>
+ <object class="GtkTreeView" id="unpaid_qr_treeview">
+ <property name="vexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="model">unpaid_qrcodes_liststore</property>
+ <property name="enable-search">0</property>
+ <property name="search-column">1</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="unpaid_qr_tree_selection">
+ <signal name="changed" handler="unpaid_qr_tree_selection_changed_cb" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn">
+ <property name="spacing">10</property>
+ <property name="sizing">autosize</property>
+ <property name="title" translatable="1">Payment QR Code</property>
+ <property name="expand">1</property>
+ <child>
+ <object class="GtkCellRendererPixbuf" id="unpaid_pixbuf"/>
+ <attributes>
+ <attribute name="pixbuf">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="Pay URI">
+ <property name="sizing">autosize</property>
+ <property name="title" translatable="1">Taler Pay URI</property>
+ <child>
+ <object class="GtkCellRendererText" id="pay_uri"/>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ <child type="label">
+ <object class="GtkLabel">
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">5</property>
+ <property name="label" translatable="1">Payment required:</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ <style>
+ <class name="flat"/>
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFrame" id="anastasis_gtk_completed_frame">
+ <property name="vexpand">1</property>
+ <property name="visible">0</property>
+ <property name="child">
+ <object class="GtkBox" id="anastasis_gtk_success_box">
+ <property name="margin-start">22</property>
+ <property name="margin-end">10</property>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ <property name="hexpand">0</property>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_backup_complete_box">
+ <property name="hexpand">1</property>
+ <property name="visible">0</property>
+ <property name="name">anastasis_gtk_backup_complete_box</property>
+ <property name="orientation">vertical</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_success_backup_label">
+ <property name="valign">center</property>
+ <property name="visible">0</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="1">Your backup is complete.</property>
+ <property name="justify">center</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="recovery_expiration_box">
+ <property name="spacing">5</property>
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">20</property>
+ <child>
+ <object class="GtkLabel" id="backup_expiration_label">
+ <property name="halign">start</property>
+ <property name="label" translatable="1">Your backup is valid until:</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="backup_expiration_date_label">
+ <property name="visible">0</property>
+ <property name="label">DYNAMICALLY GENERATED</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="vexpand">1</property>
+ <property name="orientation">vertical</property>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_success_backup_version_label">
+ <property name="visible">0</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="1">Backups were made at the following providers:</property>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow">
+ <property name="vexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="child">
+ <object class="GtkTreeView" id="anastasis_gtk_backup_complete_treeview">
+ <property name="focusable">1</property>
+ <property name="model">backup_provider_liststore</property>
+ <property name="search-column">0</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection"/>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn">
+ <property name="sizing">autosize</property>
+ <property name="title" translatable="1">Provider</property>
+ <child>
+ <object class="GtkCellRendererText" id="provider_url"/>
+ <attributes>
+ <attribute name="text">4</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn">
+ <property name="spacing">5</property>
+ <property name="sizing">autosize</property>
+ <property name="title" translatable="1">Version</property>
+ <child>
+ <object class="GtkCellRendererText" id="policy_version"/>
+ <attributes>
+ <attribute name="visible">3</attribute>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn">
+ <property name="visible">0</property>
+ <property name="title" translatable="1">Expiration time</property>
+ <child>
+ <object class="GtkCellRendererText" id="expiration"/>
+ <attributes>
+ <attribute name="visible">3</attribute>
+ <attribute name="text">2</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ <property name="has-frame">1</property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_success_recovery_box">
+ <property name="hexpand">1</property>
+ <property name="visible">0</property>
+ <property name="name">anastasis_gtk_success_recovery_box</property>
+ <property name="orientation">vertical</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_success_recovery_label">
+ <property name="vexpand">1</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="1">Your secret was recovered.</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ <property name="margin-top">15</property>
+ <property name="margin-bottom">15</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="recovery_secret_name_hbox">
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Secret name:</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="recovery_secret_name_value_label">
+ <property name="label">DYNAMICALLY GENERATED</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_secret_value_label">
+ <property name="tooltip-text" translatable="1">The secret is shown here. You can also copy it to the clipboard or save it to a file.</property>
+ <property name="label">THE SECRET TEXT</property>
+ <property name="wrap">1</property>
+ <property name="wrap-mode">word-char</property>
+ <property name="ellipsize">end</property>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_secret_copy_button">
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="tooltip-text" translatable="1">Copy secret to clipboard</property>
+ <signal name="clicked" handler="anastasis_gtk_secret_copy_button_clicked_cb" swapped="no"/>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">edit-copy</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Copy</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_secret_copy_button</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_secret_save_as_button">
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="tooltip-text" translatable="1">Save secret to file</property>
+ <signal name="clicked" handler="anastasis_gtk_secret_save_as_button_clicked_cb" swapped="no"/>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">document-save-as</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Save _As</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_secret_save_as_button</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkViewport">
+ <property name="hexpand">1</property>
+ <property name="vexpand">1</property>
+ <property name="child">
+ <object class="GtkImage" id="anastasis_gtk_secret_qr_image">
+ <property name="width-request">400</property>
+ <property name="height-request">400</property>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ <property name="hexpand">1</property>
+ <property name="vexpand">1</property>
+ <property name="icon-name">image-missing</property>
+ </object>
+ </property>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ <child type="label">
+ <object class="GtkLabel" id="anastasis_gtk_backup_success_label">
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ <property name="margin-top">10</property>
+ <property name="margin-bottom">10</property>
+ <property name="label" translatable="1">Success!</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ <style>
+ <class name="flat"/>
+ </style>
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkFrame" id="anastasis_gtk_select_secret_frame">
+ <property name="vexpand">1</property>
+ <property name="visible">0</property>
+ <property name="child">
+ <object class="GtkBox" id="anastasis_gtk_secret_select_vbox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">10</property>
+ <property name="margin-start">12</property>
+ <property name="vexpand">0</property>
+ <child>
+ <object class="GtkBox">
+ <property name="vexpand">1</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkBox">
+ <property name="margin-top">5</property>
+ <property name="margin-bottom">5</property>
+ <property name="hexpand">0</property>
+ <child>
+ <object class="GtkLabel" id="select_secret_hint_label">
+ <property name="hexpand">1</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="1">Select a secret to recover from the list below. If no secrets are listed,
+you need to either go back and correct your personal information or
+explicitly add the provider which you used before for the backup.</property>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_add_provider_button">
+ <property name="label" translatable="1">Add provider</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <signal name="clicked" handler="anastasis_gtk_add_provider_button_clicked_cb" swapped="no"/>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkScrolledWindow" id="anastasis_secret_selection_scrolled_window">
+ <property name="vexpand">1</property>
+ <property name="focusable">1</property>
+ <property name="hadjustment">secret_selection_h_adjustment</property>
+ <property name="vadjustment">secret_selection_v_adjustment</property>
+ <property name="child">
+ <object class="GtkViewport" id="anastasis_secret_selection_viewport">
+ <property name="hadjustment">secret_selection_h_adjustment</property>
+ <property name="vadjustment">secret_selection_v_adjustment</property>
+ <property name="child">
+ <object class="GtkTreeView" id="anastasis_secret_selection_treeview">
+ <property name="focusable">1</property>
+ <property name="hadjustment">secret_selection_h_adjustment</property>
+ <property name="vadjustment">secret_selection_v_adjustment</property>
+ <property name="model">secret_selection_liststore</property>
+ <child internal-child="selection">
+ <object class="GtkTreeSelection" id="anastasis_gtk_secret_selection_treeselection">
+ <signal name="changed" handler="anastasis_gtk_secret_selection_treeselection_changed_cb" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="secret_name_column">
+ <property name="resizable">1</property>
+ <property name="sizing">autosize</property>
+ <property name="title" translatable="1">Secret name</property>
+ <property name="clickable">1</property>
+ <property name="sort-indicator">1</property>
+ <property name="sort-column-id">3</property>
+ <child>
+ <object class="GtkCellRendererText" id="backup_name_renderer"/>
+ <attributes>
+ <attribute name="text">3</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="backup_time_column">
+ <property name="sizing">fixed</property>
+ <property name="title" translatable="1">Backup time</property>
+ <property name="clickable">1</property>
+ <property name="sort-indicator">1</property>
+ <property name="sort-column-id">5</property>
+ <child>
+ <object class="GtkCellRendererText" id="backup_time_renderer"/>
+ <attributes>
+ <attribute name="text">4</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="backup_version_column">
+ <property name="visible">0</property>
+ <property name="title" translatable="1">Version</property>
+ <property name="clickable">1</property>
+ <property name="sort-indicator">1</property>
+ <property name="sort-order">descending</property>
+ <property name="sort-column-id">1</property>
+ <child>
+ <object class="GtkCellRendererText" id="backup_version_renderer">
+ <property name="visible">0</property>
+ </object>
+ <attributes>
+ <attribute name="text">1</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkTreeViewColumn" id="provider_url_column1">
+ <property name="visible">0</property>
+ <property name="resizable">1</property>
+ <property name="title" translatable="1">Provider</property>
+ <property name="clickable">1</property>
+ <child>
+ <object class="GtkCellRendererText" id="provider_url_renderer">
+ <property name="visible">0</property>
+ </object>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </property>
+ <property name="has-frame">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ <child type="label">
+ <object class="GtkLabel">
+ <property name="label" translatable="1">Select secret to recover</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ </attributes>
+ </object>
+ </child>
+ <style>
+ <class name="flat"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </property>
+ <property name="has-frame">1</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_main_control_vbox">
+ <property name="visible">0</property>
+ <property name="hexpand">0</property>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_main_window_prev_button">
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <signal name="clicked" handler="anastasis_gtk_main_window_back_clicked" swapped="no"/>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">go-previous</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Back</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_main_window_prev_button</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_restart_button">
+ <property name="visible">0</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="tooltip-text" translatable="1">Go back to the beginning.</property>
+ <signal name="clicked" handler="anastasis_gtk_restart_button_clicked_cb" swapped="no"/>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage" id="restart_image">
+ <property name="icon-name">go-first</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Restart</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_restart_button</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator">
+ <property name="hexpand">1</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_main_window_quit_button">
+ <property name="visible">0</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <signal name="clicked" handler="anastasis_gtk_main_window_quit_button_clicked_cb" swapped="no"/>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">application-exit</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Quit</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_main_window_quit_button</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator">
+ <property name="hexpand">1</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_main_window_forward_button">
+ <property name="sensitive">0</property>
+ <property name="receives-default">1</property>
+ <signal name="clicked" handler="anastasis_gtk_main_window_forward_clicked" swapped="no"/>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">media-skip-forward</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Next</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">anastasis_gtk_main_window_forward_button</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkStatusbar" id="anastasis_gtk_statusbar">
+ <property name="valign">center</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ <property name="focus-widget">anastasis_gtk_secret_name_entry</property>
+ <property name="default-widget">anastasis_gtk_main_window_forward_button</property>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_open_file_dialog.glade b/contrib/anastasis_gtk_open_file_dialog.glade
@@ -1,103 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of anastasis-gtk.
-
-anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Christian Grothoff
-
--->
-<interface>
- <requires lib="gtk+" version="3.6"/>
- <!-- interface-license-type gplv3 -->
- <!-- interface-name anastasis-gtk -->
- <!-- interface-description key backup and recovery -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Christian Grothoff -->
- <object class="GtkFileFilter" id="anastasis_file_filter">
- <patterns>
- <pattern>*.ana</pattern>
- </patterns>
- </object>
- <object class="GtkFileChooserDialog" id="open_file_dialog">
- <property name="can-focus">False</property>
- <property name="can-default">True</property>
- <property name="modal">True</property>
- <property name="window-position">center</property>
- <property name="destroy-with-parent">True</property>
- <property name="type-hint">dialog</property>
- <property name="filter">anastasis_file_filter</property>
- <signal name="response" handler="open_directory_dialog_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="action_area">
- <object class="GtkButtonBox">
- <property name="can-focus">False</property>
- <property name="layout-style">end</property>
- <child>
- <object class="GtkButton" id="button2">
- <property name="label">gtk-cancel</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="button1">
- <property name="label">gtk-open</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="can-default">True</property>
- <property name="has-default">True</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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>
- <placeholder/>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">button2</action-widget>
- <action-widget response="-5">button1</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_open_file_dialog.ui b/contrib/anastasis_gtk_open_file_dialog.ui
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of anastasis-gtk.
+
+anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Christian Grothoff-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkFileFilter" id="anastasis_file_filter">
+ <patterns>
+ <pattern>*.ana</pattern>
+ </patterns>
+ </object>
+ <object class="GtkFileChooserDialog" id="open_file_dialog">
+ <property name="modal">1</property>
+ <property name="destroy-with-parent">1</property>
+ <property name="filter">anastasis_file_filter</property>
+ <property name="default-widget">button1</property>
+ <signal name="response" handler="open_directory_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="valign">center</property>
+ <property name="can-focus">0</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkButton" id="button2">
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-cancel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Cancel</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">button2</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button1">
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">document-open</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Open</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">button1</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">button2</action-widget>
+ <action-widget response="-5">button1</action-widget>
+ </action-widgets>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_open_secret_dialog.glade b/contrib/anastasis_gtk_open_secret_dialog.glade
@@ -1,97 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of anastasis-gtk.
-
-anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Christian Grothoff
-
--->
-<interface>
- <requires lib="gtk+" version="3.6"/>
- <!-- interface-license-type gplv3 -->
- <!-- interface-name anastasis-gtk -->
- <!-- interface-description Key backup and recovery -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Christian Grothoff -->
- <object class="GtkFileChooserDialog" id="open_file_dialog">
- <property name="can-focus">False</property>
- <property name="can-default">True</property>
- <property name="modal">True</property>
- <property name="window-position">center</property>
- <property name="destroy-with-parent">True</property>
- <property name="type-hint">dialog</property>
- <signal name="response" handler="open_secret_dialog_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="action_area">
- <object class="GtkButtonBox">
- <property name="can-focus">False</property>
- <property name="layout-style">end</property>
- <child>
- <object class="GtkButton" id="button2">
- <property name="label">gtk-cancel</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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="button1">
- <property name="label">gtk-open</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="can-default">True</property>
- <property name="has-default">True</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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>
- <placeholder/>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">button2</action-widget>
- <action-widget response="-5">button1</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_open_secret_dialog.ui b/contrib/anastasis_gtk_open_secret_dialog.ui
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of anastasis-gtk.
+
+anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Christian Grothoff-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkFileChooserDialog" id="open_file_dialog">
+ <property name="modal">1</property>
+ <property name="destroy-with-parent">1</property>
+ <property name="default-widget">button1</property>
+ <signal name="response" handler="open_secret_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="valign">center</property>
+ <property name="can-focus">0</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkButton" id="button2">
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-cancel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Cancel</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">button2</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button1">
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">document-open</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Open</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">button1</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">button2</action-widget>
+ <action-widget response="-5">button1</action-widget>
+ </action-widgets>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_policy_template.glade b/contrib/anastasis_gtk_policy_template.glade
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2 -->
-<interface>
- <requires lib="gtk+" version="3.24"/>
- <object class="GtkWindow" id="policy_template_window">
- <property name="can-focus">False</property>
- <child>
- <object class="GtkFrame" id="policy_frame">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="valign">start</property>
- <property name="label-xalign">0</property>
- <property name="shadow-type">none</property>
- <child>
- <object class="GtkAlignment">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="left-padding">12</property>
- <child>
- <object class="GtkBox" id="policy_vbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <property name="homogeneous">True</property>
- <child>
- <placeholder/>
- </child>
- </object>
- </child>
- </object>
- </child>
- <child type="label">
- <object class="GtkLabel" id="policy_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label">DYNAMICALLY GENERATED</property>
- </object>
- </child>
- </object>
- </child>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_policy_template.ui b/contrib/anastasis_gtk_policy_template.ui
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkWindow" id="policy_template_window">
+ <property name="child">
+ <object class="GtkFrame" id="policy_frame">
+ <property name="valign">start</property>
+ <property name="child">
+ <object class="GtkBox" id="policy_vbox">
+ <property name="orientation">vertical</property>
+ <property name="homogeneous">1</property>
+ <property name="margin-start">12</property>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </property>
+ <child type="label">
+ <object class="GtkLabel" id="policy_label">
+ <property name="label">DYNAMICALLY GENERATED</property>
+ </object>
+ </child>
+ <style>
+ <class name="flat"/>
+ </style>
+ </object>
+ </property>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_save_file_dialog.glade b/contrib/anastasis_gtk_save_file_dialog.glade
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of anastasis-gtk.
-
-anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Christian Grothoff
-
--->
-<interface>
- <requires lib="gtk+" version="3.6"/>
- <!-- interface-license-type gplv3 -->
- <!-- interface-name anastasis-gtk -->
- <!-- interface-description key backup and recovery -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Christian Grothoff -->
- <object class="GtkFileFilter" id="anastasis_file_filter">
- <patterns>
- <pattern>*.ana</pattern>
- </patterns>
- </object>
- <object class="GtkFileChooserDialog" id="save_file_dialog">
- <property name="can-focus">False</property>
- <property name="window-position">center</property>
- <property name="type-hint">dialog</property>
- <property name="action">save</property>
- <property name="filter">anastasis_file_filter</property>
- <signal name="response" handler="save_directory_dialog_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="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">gtk-cancel</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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">gtk-save</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="can-default">True</property>
- <property name="has-default">True</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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>
- <placeholder/>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">button1</action-widget>
- <action-widget response="-3">button2</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_save_file_dialog.ui b/contrib/anastasis_gtk_save_file_dialog.ui
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of anastasis-gtk.
+
+anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Christian Grothoff-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkFileFilter" id="anastasis_file_filter">
+ <patterns>
+ <pattern>*.ana</pattern>
+ </patterns>
+ </object>
+ <object class="GtkFileChooserDialog" id="save_file_dialog">
+ <property name="action">save</property>
+ <property name="filter">anastasis_file_filter</property>
+ <property name="default-widget">button2</property>
+ <signal name="response" handler="save_directory_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="valign">center</property>
+ <property name="can-focus">0</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkButton" id="button1">
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-cancel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Cancel</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">button1</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button2">
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">document-save</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Save</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">button2</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">button1</action-widget>
+ <action-widget response="-3">button2</action-widget>
+ </action-widgets>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_save_secret_dialog.glade b/contrib/anastasis_gtk_save_secret_dialog.glade
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of anastasis-gtk.
-
-anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Christian Grothoff
-
--->
-<interface>
- <requires lib="gtk+" version="3.6"/>
- <!-- interface-license-type gplv3 -->
- <!-- interface-name anastasis-gtk -->
- <!-- interface-description key backup and recovery -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Christian Grothoff -->
- <object class="GtkFileFilter" id="anastasis_file_filter">
- <patterns>
- <pattern>*.secret</pattern>
- </patterns>
- </object>
- <object class="GtkFileChooserDialog" id="save_file_dialog">
- <property name="can-focus">False</property>
- <property name="window-position">center</property>
- <property name="type-hint">dialog</property>
- <property name="action">save</property>
- <property name="filter">anastasis_file_filter</property>
- <signal name="response" handler="save_secret_dialog_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="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">gtk-cancel</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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">gtk-save</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="can-default">True</property>
- <property name="has-default">True</property>
- <property name="receives-default">True</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">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>
- <placeholder/>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">button1</action-widget>
- <action-widget response="-3">button2</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_save_secret_dialog.ui b/contrib/anastasis_gtk_save_secret_dialog.ui
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of anastasis-gtk.
+
+anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Christian Grothoff-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkFileFilter" id="anastasis_file_filter">
+ <patterns>
+ <pattern>*.secret</pattern>
+ </patterns>
+ </object>
+ <object class="GtkFileChooserDialog" id="save_file_dialog">
+ <property name="action">save</property>
+ <property name="filter">anastasis_file_filter</property>
+ <property name="default-widget">button2</property>
+ <signal name="response" handler="save_secret_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="valign">center</property>
+ <property name="can-focus">0</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkButton" id="button1">
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">gtk-cancel</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Cancel</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">button1</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button2">
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">document-save</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Save</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">button2</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">button1</action-widget>
+ <action-widget response="-3">button2</action-widget>
+ </action-widgets>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_user_sure.glade b/contrib/anastasis_gtk_user_sure.glade
@@ -1,255 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2019-2021 Anastasis SARL
-
-This file is part of anastasis-gtk.
-
-anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Christian Grothoff
-
--->
-<interface>
- <requires lib="gtk+" version="3.8"/>
- <!-- interface-license-type gplv3 -->
- <!-- interface-name anastasis-gtk -->
- <!-- interface-description key backup and recovery -->
- <!-- interface-copyright 2019-2021 Anastasis SARL -->
- <!-- interface-authors Christian Grothoff -->
- <object class="GtkImage" id="image1">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="stock">gtk-go-back</property>
- </object>
- <object class="GtkImage" id="image2">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="stock">gtk-ok</property>
- </object>
- <object class="GtkImage" id="image3">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="stock">gtk-save-as</property>
- </object>
- <object class="GtkDialog" id="anastasis_gtk_user_sure_dialog">
- <property name="can-focus">False</property>
- <property name="type-hint">dialog</property>
- <signal name="response" handler="anastasis_gtk_user_sure_dialog_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="action_area">
- <object class="GtkButtonBox">
- <property name="can-focus">False</property>
- <property name="hexpand">True</property>
- <property name="layout-style">expand</property>
- <child>
- <object class="GtkButton" id="anastasis_gtk_c_code_dialog_btn_cancel">
- <property name="label">Go back, I want to check something</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="image">image1</property>
- <property name="always-show-image">True</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="opacity">0</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_print_details_button">
- <property name="label">Save as PDF</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="tooltip-text" translatable="yes">Save entered personal details to a PDF file</property>
- <property name="image">image3</property>
- <signal name="clicked" handler="anastasis_gtk_print_details_button_clicked_cb" swapped="no"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="position">2</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="opacity">0</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">3</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="anastasis_gtk_c_code_dialog_btn_ok">
- <property name="label">I am sure!</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="has-focus">True</property>
- <property name="has-default">True</property>
- <property name="receives-default">True</property>
- <property name="image">image2</property>
- <property name="always-show-image">True</property>
- <accelerator key="Return" signal="clicked"/>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">4</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">20</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox" id="anastasis_gtk_c_challenge_box">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_sure_title_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">You must not forget the exact information you have entered!</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- <attribute name="scale" value="1.2"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">20</property>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">20</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="orientation">vertical</property>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkBox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <child>
- <object class="GtkLabel" id="anastasis_gtk_sure_instructions_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Your personal information is used to define the location where
-recovery information about your secret will be safely stored.
-
-If you forget what you have entered or if there is any spelling
-mistake, you will be unable to recover your secret.</property>
- <attributes>
- <attribute name="scale" value="1.1000000000000001"/>
- </attributes>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">20</property>
- <property name="position">0</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="padding">20</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkSeparator">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">2</property>
- </packing>
- </child>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_c_code_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_c_code_dialog_btn_ok</action-widget>
- </action-widgets>
- <child type="titlebar">
- <object class="GtkLabel" id="anastasis_gtk_c_code_dialog_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">Are you sure?</property>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">anastasis_gtk_c_code_dialog_btn_cancel</action-widget>
- <action-widget response="-5">anastasis_gtk_c_code_dialog_btn_ok</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_user_sure.ui b/contrib/anastasis_gtk_user_sure.ui
@@ -0,0 +1,171 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2019-2021 Anastasis SARL
+
+This file is part of anastasis-gtk.
+
+anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Christian Grothoff-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkDialog" id="anastasis_gtk_user_sure_dialog">
+ <property name="default-widget">anastasis_gtk_c_code_dialog_btn_ok</property>
+ <property name="focus-widget">anastasis_gtk_c_code_dialog_btn_ok</property>
+ <signal name="response" handler="anastasis_gtk_user_sure_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkBox" id="anastasis_gtk_c_challenge_box">
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">20</property>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_sure_title_label">
+ <property name="halign">center</property>
+ <property name="label" translatable="1">You must not forget the exact information you have entered!</property>
+ <attributes>
+ <attribute name="weight" value="bold"></attribute>
+ <attribute name="scale" value="1.2"></attribute>
+ </attributes>
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ <child>
+ <object class="GtkBox">
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">20</property>
+ <child>
+ <object class="GtkLabel" id="anastasis_gtk_sure_instructions_label">
+ <property name="label" translatable="1">Your personal information is used to define the location where
+recovery information about your secret will be safely stored.
+
+If you forget what you have entered or if there is any spelling
+mistake, you will be unable to recover your secret.</property>
+ <attributes>
+ <attribute name="scale" value="1.1000000000000001"></attribute>
+ </attributes>
+ <property name="margin-start">20</property>
+ <property name="margin-end">20</property>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator"/>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_c_code_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_c_code_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child type="titlebar">
+ <object class="GtkLabel" id="anastasis_gtk_c_code_dialog_label">
+ <property name="label" translatable="1">Are you sure?</property>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">anastasis_gtk_c_code_dialog_btn_cancel</action-widget>
+ <action-widget response="-5">anastasis_gtk_c_code_dialog_btn_ok</action-widget>
+ </action-widgets>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="can-focus">0</property>
+ <property name="hexpand">1</property>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_c_code_dialog_btn_cancel">
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="icon-name">go-previous</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label">Go back, I want to check something</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator">
+ <property name="opacity">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_print_details_button">
+ <property name="label">Save as PDF</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="tooltip-text" translatable="1">Save entered personal details to a PDF file</property>
+ <signal name="clicked" handler="anastasis_gtk_print_details_button_clicked_cb" swapped="no"/>
+ </object>
+ </child>
+ <child>
+ <object class="GtkSeparator">
+ <property name="opacity">0</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="anastasis_gtk_c_code_dialog_btn_ok">
+ <property name="receives-default">1</property>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage" id="image2">
+ <property name="icon-name">gtk-ok</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label">I am sure!</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ <property name="margin-top">20</property>
+ <property name="margin-bottom">20</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ </object>
+ </child>
+ </object>
+</interface>
+
diff --git a/contrib/anastasis_gtk_warn_multifactor.glade b/contrib/anastasis_gtk_warn_multifactor.glade
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2 -->
-<interface>
- <requires lib="gtk+" version="3.24"/>
- <object class="GtkMessageDialog" id="anastasis_gtk_confirm_multifactor_dialog">
- <property name="can-focus">False</property>
- <property name="title" translatable="yes">Confirm use of few authentication methods.</property>
- <property name="modal">True</property>
- <property name="window-position">center</property>
- <property name="type-hint">dialog</property>
- <property name="message-type">warning</property>
- <property name="text" translatable="yes">To keep your secret secure, we recommend you specify at least three authentication options before proceeding.</property>
- <property name="secondary-text" translatable="yes">Select "back" to add additional authentication options.</property>
- <signal name="response" handler="anastasis_gtk_confirm_multifactor_dialog_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="action_area">
- <object class="GtkButtonBox">
- <property name="can-focus">False</property>
- <property name="homogeneous">True</property>
- <property name="layout-style">end</property>
- <child>
- <object class="GtkButton" id="back_button">
- <property name="label">gtk-go-back</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="receives-default">True</property>
- <property name="tooltip-text" translatable="yes">Go back to the previous dialog to add more authentication options.</property>
- <property name="use-stock">True</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkButton" id="next_button">
- <property name="label">gtk-media-next</property>
- <property name="visible">True</property>
- <property name="can-focus">True</property>
- <property name="has-focus">True</property>
- <property name="tooltip-text" translatable="yes">Proceed without adding additional authentication options.</property>
- <property name="use-stock">True</property>
- <property name="always-show-image">True</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="padding">5</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>
- </object>
- </child>
- <action-widgets>
- <action-widget response="-6">back_button</action-widget>
- <action-widget response="-5">next_button</action-widget>
- </action-widgets>
- </object>
-</interface>
diff --git a/contrib/anastasis_gtk_warn_multifactor.ui b/contrib/anastasis_gtk_warn_multifactor.ui
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkMessageDialog" id="anastasis_gtk_confirm_multifactor_dialog">
+ <property name="title" translatable="1">Confirm use of few authentication methods.</property>
+ <property name="modal">1</property>
+ <property name="message-type">warning</property>
+ <property name="text" translatable="1">To keep your secret secure, we recommend you specify at least three authentication options before proceeding.</property>
+ <property name="secondary-text" translatable="1">Select "back" to add additional authentication options.</property>
+ <property name="focus-widget">next_button</property>
+ <signal name="response" handler="anastasis_gtk_confirm_multifactor_dialog_response_cb" swapped="no"/>
+ <child internal-child="content_area">
+ <object class="GtkBox">
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkBox">
+ <property name="valign">center</property>
+ <property name="can-focus">0</property>
+ <property name="homogeneous">1</property>
+ <property name="spacing">6</property>
+ <property name="halign">end</property>
+ <child>
+ <object class="GtkButton" id="back_button">
+ <property name="label" translatable="1">_Back</property>
+ <property name="focusable">1</property>
+ <property name="receives-default">1</property>
+ <property name="tooltip-text" translatable="1">Go back to the previous dialog to add more authentication options.</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="use-underline">1</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="next_button">
+ <property name="focusable">1</property>
+ <property name="tooltip-text" translatable="1">Proceed without adding additional authentication options.</property>
+ <property name="margin-start">5</property>
+ <property name="margin-end">5</property>
+ <property name="child">
+ <object class="GtkBox">
+ <property name="spacing">2</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage">
+ <property name="icon-name">media-skip-forward</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel">
+ <property name="label" translatable="1">_Next</property>
+ <property name="use-underline">1</property>
+ <property name="mnemonic-widget">next_button</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">back_button</action-widget>
+ <action-widget response="-5">next_button</action-widget>
+ </action-widgets>
+ </object>
+</interface>
+
diff --git a/contrib/meson.build b/contrib/meson.build
@@ -1,31 +1,32 @@
# This file is in the public domain
install_data(
- 'this_stays_private.glade',
- 'anastasis_gtk_add_provider.glade',
- 'anastasis_gtk_auth_add_email.glade',
- 'anastasis_gtk_auth_add_iban.glade',
- 'anastasis_gtk_auth_add_post.glade',
- 'anastasis_gtk_auth_add_question.glade',
- 'anastasis_gtk_auth_add_sms.glade',
- 'anastasis_gtk_auth_add_totp.glade',
- 'anastasis_gtk_auth_add_video.glade',
- 'anastasis_gtk_challenge_code.glade',
- 'anastasis_gtk_challenge_iban.glade',
- 'anastasis_gtk_challenge_question.glade',
- 'anastasis_gtk_challenge_template.glade',
- 'anastasis_gtk_challenge_totp.glade',
- 'anastasis_gtk_deny_singlefactor.glade',
- 'anastasis_gtk_edit_providers.glade',
- 'anastasis_gtk_edit_policy.glade',
- 'anastasis_gtk_main_window.glade',
- 'anastasis_gtk_open_file_dialog.glade',
- 'anastasis_gtk_open_secret_dialog.glade',
- 'anastasis_gtk_policy_template.glade',
- 'anastasis_gtk_save_file_dialog.glade',
- 'anastasis_gtk_save_secret_dialog.glade',
- 'anastasis_gtk_user_sure.glade',
- 'anastasis_gtk_warn_multifactor.glade',
+ 'anastasis-gtk.css',
+ 'this_stays_private.ui',
+ 'anastasis_gtk_add_provider.ui',
+ 'anastasis_gtk_auth_add_email.ui',
+ 'anastasis_gtk_auth_add_iban.ui',
+ 'anastasis_gtk_auth_add_post.ui',
+ 'anastasis_gtk_auth_add_question.ui',
+ 'anastasis_gtk_auth_add_sms.ui',
+ 'anastasis_gtk_auth_add_totp.ui',
+ 'anastasis_gtk_auth_add_video.ui',
+ 'anastasis_gtk_challenge_code.ui',
+ 'anastasis_gtk_challenge_iban.ui',
+ 'anastasis_gtk_challenge_question.ui',
+ 'anastasis_gtk_challenge_template.ui',
+ 'anastasis_gtk_challenge_totp.ui',
+ 'anastasis_gtk_deny_singlefactor.ui',
+ 'anastasis_gtk_edit_providers.ui',
+ 'anastasis_gtk_edit_policy.ui',
+ 'anastasis_gtk_main_window.ui',
+ 'anastasis_gtk_open_file_dialog.ui',
+ 'anastasis_gtk_open_secret_dialog.ui',
+ 'anastasis_gtk_policy_template.ui',
+ 'anastasis_gtk_save_file_dialog.ui',
+ 'anastasis_gtk_save_secret_dialog.ui',
+ 'anastasis_gtk_user_sure.ui',
+ 'anastasis_gtk_warn_multifactor.ui',
'bandiera_stelle.png',
'checkmark.svgz',
'freeotp.png',
diff --git a/contrib/pogen.sh b/contrib/pogen.sh
@@ -1,4 +1,4 @@
#!/bin/sh
# This file is in the public domain.
find src -name "*.c" | sort > po/POTFILES.in
-find contrib -name "*.glade" | sort >> po/POTFILES.in
+find contrib -name "*.ui" | sort >> po/POTFILES.in
diff --git a/contrib/this_stays_private.glade b/contrib/this_stays_private.glade
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.38.2
-
-Copyright (C) 2020-2021 Anastasis SARL
-
-This file is part of anastasis-gtk.
-
-anastasis-gtk is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-anastasis-gtk is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
-
-Author: Belen Pena
-
--->
-<interface>
- <requires lib="gtk+" version="3.20"/>
- <!-- interface-license-type gplv3 -->
- <!-- interface-name anastasis-gtk -->
- <!-- interface-description Key backup and recovery -->
- <!-- interface-copyright 2020-2021 Anastasis SARL -->
- <!-- interface-authors Belen Pena -->
- <object class="GtkWindow" id="private_dummy_window">
- <property name="can-focus">False</property>
- <child>
- <object class="GtkBox" id="private_hbox">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="margin-left">10</property>
- <property name="margin-right">10</property>
- <child>
- <object class="GtkLabel" id="privacy_label">
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="label" translatable="yes">This stays private</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">10</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkImage" id="blindfold_image">
- <property name="width-request">24</property>
- <property name="height-request">24</property>
- <property name="visible">True</property>
- <property name="can-focus">False</property>
- <property name="pixbuf">noun_blindfold_3574196.svg</property>
- </object>
- <packing>
- <property name="expand">False</property>
- <property name="fill">False</property>
- <property name="padding">1</property>
- <property name="position">1</property>
- </packing>
- </child>
- </object>
- </child>
- </object>
-</interface>
diff --git a/contrib/this_stays_private.ui b/contrib/this_stays_private.ui
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (C) 2020-2021 Anastasis SARL
+
+This file is part of anastasis-gtk.
+
+anastasis-gtk is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+anastasis-gtk is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with anastasis-gtk. If not, see <http://www.gnu.org/licenses/>.
+
+Author: Belen Pena-->
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <object class="GtkWindow" id="private_dummy_window">
+ <property name="child">
+ <object class="GtkBox" id="private_hbox">
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ <child>
+ <object class="GtkLabel" id="privacy_label">
+ <property name="halign">center</property>
+ <property name="label" translatable="1">This stays private</property>
+ <property name="margin-start">10</property>
+ <property name="margin-end">10</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkPicture" id="blindfold_image">
+ <property name="halign">center</property>
+ <property name="width-request">24</property>
+ <property name="height-request">24</property>
+ <property name="file">noun_blindfold_3574196.svg</property>
+ <property name="margin-start">1</property>
+ <property name="margin-end">1</property>
+ <property name="can-shrink">0</property>
+ <property name="content-fit">scale-down</property>
+ </object>
+ </child>
+ </object>
+ </property>
+ </object>
+</interface>
+
diff --git a/debian/control b/debian/control
@@ -8,8 +8,7 @@ Build-Depends:
debhelper-compat (= 12),
libgnunet-dev (>= 0.27.0),
libanastasis-dev (>= 0.7.0),
- libgladeui-dev (>=3.10.0),
- libgtk-3-dev (>=3.22.0),
+ libgtk-4-dev (>=4.10.0),
libmagic-dev,
libqrencode-dev
Standards-Version: 4.5.0
@@ -27,5 +26,5 @@ Description: Anastasis is a distributed key recovery and backup service.
GNU Anastasis allows users to make backups of their
private key material to multiple providers while ensuring that
individual providers cannot learn the secret key material.
- This package contains the graphical client, using the GTK+ toolkit. In order
+ This package contains the graphical client, using the GTK toolkit. In order
use GNU Anastasis, you may also need a GNU Taler wallet to pay for the service.
diff --git a/flake.nix b/flake.nix
@@ -68,9 +68,8 @@
pkgs.curlWithGnuTls
pkgs.qrencode
pkgs.libharu
- pkgs.glade
pkgs.glib
- pkgs.gtk3
+ pkgs.gtk4
gnunetpkgs.gnunet
exchangepkgs.exchange
donaupkgs.donau
@@ -115,9 +114,8 @@
pkgs.uncrustify
pkgs.qrencode
pkgs.libharu
- pkgs.glade
pkgs.glib
- pkgs.gtk3
+ pkgs.gtk4
exchangepkgs.exchange
donaupkgs.donau
merchantpkgs.merchant
diff --git a/meson.build b/meson.build
@@ -13,10 +13,9 @@ incdir = include_directories('.', 'src/include')
private_config = configuration_data()
-plugindir = get_option('libdir') / 'anastasis-gtk'
pkgdatadir = get_option('datadir') / 'anastasis-gtk'
-pkgcfgdir = pkgdatadir / 'config.d'
docdir = get_option('datadir') / 'doc' / 'anastasis-gtk'
+desktopdir = get_option('datadir') / 'applications'
if get_option('install-rpath')
rpath_option = get_option('prefix') / get_option('libdir')
@@ -27,7 +26,17 @@ endif
install_emptydir(docdir)
install_data('README', 'COPYING', install_dir: docdir)
-gnunet_user = false
+# The .desktop file has no substitutions; it is installed verbatim
+# (autotools generated it via AC_CONFIG_FILES and installed it to
+# $(datadir)/applications).
+configure_file(
+ input: 'anastasis-gtk.desktop.in',
+ output: 'anastasis-gtk.desktop',
+ copy: true,
+ install: true,
+ install_dir: desktopdir,
+)
+
dpkg_architecture_bin = find_program(
'dpkg-architecture',
'/usr/bin/dpkg-architecture',
@@ -40,21 +49,12 @@ if dpkg_architecture_bin.found()
)
endif
-TALER_PLUGIN_LDFLAGS = [
- '-export-dynamic',
- '-avoid-version',
- '-module',
- '--no-undefined',
-]
-
-cdata = configuration_data()
if not get_option('only-doc')
add_project_arguments(
'-Wall',
'-Wno-address-of-packed-member',
language: 'c',
)
- taler_lib_ldflags = '-export-dynamic -no-undefined'
check_headers = ['errno.h', 'stdio.h', 'unistd.h', 'locale.h', 'sys/stat.h', 'sys/types.h', 'langinfo.h', 'libintl.h', 'stddef.h', 'argz.h', 'sys/socket.h', 'netinet/in.h', 'stdarg.h']
@@ -186,14 +186,9 @@ if not get_option('only-doc')
private_config.set10('HAVE_TALERUTIL', talerutil_dep.found())
- gtk_dep = dependency('gtk+-3.0', required: false)
+ gtk_dep = dependency('gtk4', version: '>=4.10', required: false)
if not gtk_dep.found()
- gtk_dep = cc.find_library('gtk+-3.0', required: true)
- endif
-
- glade_dep = dependency('gladeui-2.0', required: false)
- if not glade_dep.found()
- glade_dep = cc.find_library('glade-2.0', required: true)
+ gtk_dep = cc.find_library('gtk-4', required: true)
endif
curl_dep = dependency('libcurl', version: '>=7.34.0', required: false)
@@ -271,12 +266,12 @@ if not get_option('only-doc')
configure_file(output: 'anastasis_gtk_config.h', configuration: private_config)
configuration_inc = include_directories('.')
- cdata.merge_from(private_config)
add_project_arguments('-DHAVE_CONFIG_H', language: 'c')
pkg = import('pkgconfig')
subdir('contrib')
subdir('src')
+ subdir('po')
if not get_option('disable-doc')
subdir('doc')
endif
diff --git a/po/POTFILES.in b/po/POTFILES.in
@@ -46,32 +46,32 @@ src/anastasis/anastasis-gtk_pe-edit-policy.c
src/anastasis/anastasis-gtk_progress.c
src/anastasis/print.c
src/anastasis/test-print.c
+src/util/builder.c
src/util/eventloop.c
-src/util/glade.c
src/util/nls.c
src/util/os_installation.c
-contrib/anastasis_gtk_add_provider.glade
-contrib/anastasis_gtk_auth_add_email.glade
-contrib/anastasis_gtk_auth_add_iban.glade
-contrib/anastasis_gtk_auth_add_post.glade
-contrib/anastasis_gtk_auth_add_question.glade
-contrib/anastasis_gtk_auth_add_sms.glade
-contrib/anastasis_gtk_auth_add_totp.glade
-contrib/anastasis_gtk_auth_add_video.glade
-contrib/anastasis_gtk_challenge_code.glade
-contrib/anastasis_gtk_challenge_iban.glade
-contrib/anastasis_gtk_challenge_question.glade
-contrib/anastasis_gtk_challenge_template.glade
-contrib/anastasis_gtk_challenge_totp.glade
-contrib/anastasis_gtk_deny_singlefactor.glade
-contrib/anastasis_gtk_edit_policy.glade
-contrib/anastasis_gtk_edit_providers.glade
-contrib/anastasis_gtk_main_window.glade
-contrib/anastasis_gtk_open_file_dialog.glade
-contrib/anastasis_gtk_open_secret_dialog.glade
-contrib/anastasis_gtk_policy_template.glade
-contrib/anastasis_gtk_save_file_dialog.glade
-contrib/anastasis_gtk_save_secret_dialog.glade
-contrib/anastasis_gtk_user_sure.glade
-contrib/anastasis_gtk_warn_multifactor.glade
-contrib/this_stays_private.glade
+contrib/anastasis_gtk_add_provider.ui
+contrib/anastasis_gtk_auth_add_email.ui
+contrib/anastasis_gtk_auth_add_iban.ui
+contrib/anastasis_gtk_auth_add_post.ui
+contrib/anastasis_gtk_auth_add_question.ui
+contrib/anastasis_gtk_auth_add_sms.ui
+contrib/anastasis_gtk_auth_add_totp.ui
+contrib/anastasis_gtk_auth_add_video.ui
+contrib/anastasis_gtk_challenge_code.ui
+contrib/anastasis_gtk_challenge_iban.ui
+contrib/anastasis_gtk_challenge_question.ui
+contrib/anastasis_gtk_challenge_template.ui
+contrib/anastasis_gtk_challenge_totp.ui
+contrib/anastasis_gtk_deny_singlefactor.ui
+contrib/anastasis_gtk_edit_policy.ui
+contrib/anastasis_gtk_edit_providers.ui
+contrib/anastasis_gtk_main_window.ui
+contrib/anastasis_gtk_open_file_dialog.ui
+contrib/anastasis_gtk_open_secret_dialog.ui
+contrib/anastasis_gtk_policy_template.ui
+contrib/anastasis_gtk_save_file_dialog.ui
+contrib/anastasis_gtk_save_secret_dialog.ui
+contrib/anastasis_gtk_user_sure.ui
+contrib/anastasis_gtk_warn_multifactor.ui
+contrib/this_stays_private.ui
diff --git a/scripts/doxygen.meson.sh b/scripts/doxygen.meson.sh
@@ -1,4 +1,5 @@
#!/bin/sh
+set -e
# This is more portable than `which' but comes with
# the caveat of not(?) properly working on busybox's ash:
@@ -12,7 +13,9 @@ if ! existence doxygen; then
exit 1
fi
cd "${MESON_SOURCE_ROOT}/doc/doxygen"
-echo "PROJECT_NUMBER = ${PACKAGE_VERSION}" > version.doxy
+
+# PACKAGE_VERSION is set by the 'doxygen' run_target in meson.build; the
+# makefile falls back to scripts/get_version.sh when it is not set.
make all
-echo "Doxygen files generated into ${MESON_SOURCE_ROOT}/doc/doxygen!"
+echo "Doxygen files generated into ${MESON_SOURCE_ROOT}/doc/doxygen/html!"
diff --git a/src/anastasis/anastasis-gtk.c b/src/anastasis/anastasis-gtk.c
@@ -149,16 +149,21 @@ shutdown_task (void *cls)
/**
- * Callback invoked if the application is supposed to exit.
+ * Callback invoked if the application is supposed to exit, i.e. the user
+ * closed the main window.
*
- * @param object
+ * @param window the main window
* @param user_data unused
+ * @return TRUE, as our own shutdown sequence takes the window down
*/
-void
-anastasis_gtk_quit_cb (GObject *object,
+gboolean
+anastasis_gtk_quit_cb (GtkWindow *window,
gpointer user_data)
{
+ (void) window;
+ (void) user_data;
GNUNET_SCHEDULER_shutdown ();
+ return TRUE;
}
@@ -203,7 +208,7 @@ AG_load (const char *filename)
/**
* Actual main function run right after GNUnet's scheduler
- * is initialized. Initializes up GTK and Glade.
+ * is initialized. Initializes GTK and builds the main window.
*
* @param cls NULL
*/
@@ -233,7 +238,6 @@ run (void *cls)
gtk_window_maximize (GTK_WINDOW (main_window));
AG_insensitive ("anastasis_gtk_main_window_forward_button");
/* make GUI visible */
- gtk_widget_show (main_window);
gtk_window_present (GTK_WINDOW (main_window));
GNUNET_SCHEDULER_add_shutdown (&shutdown_task,
NULL);
@@ -276,7 +280,7 @@ main (int argc,
argc,
argv,
options,
- "anastasis_gtk_main_window.glade",
+ "anastasis_gtk_main_window.ui",
&run))
ret = 1;
else
diff --git a/src/anastasis/anastasis-gtk_action.c b/src/anastasis/anastasis-gtk_action.c
@@ -62,6 +62,37 @@ bool AG_in_secret_name_editing;
/**
+ * Add space on both sides of @a child along the orientation of the box it is
+ * about to be appended to. This is what the `padding` argument of GTK3's
+ * gtk_box_pack_start() used to do; GTK4 boxes only know margins.
+ *
+ * @param orientation orientation of the box @a child goes into
+ * @param child widget to pad
+ * @param padding number of pixels to add on either side
+ */
+static void
+pad_along (GtkOrientation orientation,
+ GtkWidget *child,
+ int padding)
+{
+ if (GTK_ORIENTATION_HORIZONTAL == orientation)
+ {
+ gtk_widget_set_margin_start (child,
+ padding);
+ gtk_widget_set_margin_end (child,
+ padding);
+ }
+ else
+ {
+ gtk_widget_set_margin_top (child,
+ padding);
+ gtk_widget_set_margin_bottom (child,
+ padding);
+ }
+}
+
+
+/**
* Lookup provider name by provider URL in our state.
*
* @param provider_url URL to lookup name for
@@ -375,11 +406,14 @@ create_attribute_widget (const struct GNUNET_HashCode *uh,
{
GtkWidget *p;
- gtk_widget_show (w);
+ gtk_widget_set_visible (w,
+ TRUE);
p = gtk_widget_get_parent (w);
- gtk_widget_show (p);
+ gtk_widget_set_visible (p,
+ TRUE);
p = gtk_widget_get_parent (p);
- gtk_widget_show (p);
+ gtk_widget_set_visible (p,
+ TRUE);
return w;
}
for (unsigned int i = 0; NULL != type_map[i].type; i++)
@@ -392,7 +426,6 @@ create_attribute_widget (const struct GNUNET_HashCode *uh,
continue;
w = type_map[i].ctor (id_attr);
GNUNET_assert (NULL != w);
- gtk_widget_show (w);
box = GTK_BOX (gtk_box_new (GTK_ORIENTATION_HORIZONTAL,
5 /* spacing in pixels */));
vbox = GTK_BOX (gtk_box_new (GTK_ORIENTATION_VERTICAL,
@@ -401,65 +434,58 @@ create_attribute_widget (const struct GNUNET_HashCode *uh,
GtkWidget *glabel;
glabel = gtk_label_new (label);
- gtk_box_pack_start (box, /* parent */
- glabel, /* child */
- false, /* expand */
- false, /* fill */
- 5); /* padding */
- gtk_widget_show (glabel);
+ pad_along (GTK_ORIENTATION_HORIZONTAL,
+ glabel,
+ 5);
+ gtk_box_append (box,
+ glabel);
}
GNUNET_assert (0 <
g_signal_connect (w,
"changed",
G_CALLBACK (&AG_identity_changed),
NULL));
- GNUNET_assert (0 <
- g_signal_connect (w,
- "style-updated",
- G_CALLBACK (>k_widget_queue_draw),
- NULL));
gtk_widget_set_tooltip_text (w,
tooltip);
- gtk_box_pack_start (box, /* parent */
- w, /* child */
- false, /* expand */
- false, /* fill */
- 5); /* padding */
- gtk_widget_show (GTK_WIDGET (box));
- gtk_box_pack_start (vbox, /* parent */
- GTK_WIDGET (box), /* child */
- false, /* expand */
- false, /* fill */
- 5); /* padding */
+ pad_along (GTK_ORIENTATION_HORIZONTAL,
+ w,
+ 5);
+ gtk_box_append (box,
+ w);
+ pad_along (GTK_ORIENTATION_VERTICAL,
+ GTK_WIDGET (box),
+ 5);
+ gtk_box_append (vbox,
+ GTK_WIDGET (box));
{
GtkWidget *private_widget;
GtkBuilder *builder;
- GtkBin *bin;
+ GtkWindow *window;
builder =
ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "this_stays_private.glade",
+ "this_stays_private.ui",
NULL);
GNUNET_break (NULL != builder);
/* load frame */
- bin = GTK_BIN (gtk_builder_get_object (builder,
- "private_dummy_window"));
- GNUNET_break (NULL != bin);
- private_widget = gtk_bin_get_child (bin);
+ window = GTK_WINDOW (gtk_builder_get_object (builder,
+ "private_dummy_window"));
+ GNUNET_break (NULL != window);
+ private_widget = gtk_window_get_child (window);
GNUNET_break (NULL != private_widget);
g_object_ref (private_widget);
- gtk_container_remove (GTK_CONTAINER (bin),
- private_widget);
- gtk_widget_destroy (GTK_WIDGET (bin));
+ gtk_window_set_child (window,
+ NULL);
+ gtk_window_destroy (window);
g_object_unref (G_OBJECT (builder));
- gtk_box_pack_start (vbox, /* parent */
- private_widget, /* child */
- false, /* expand */
- false, /* fill */
- 5); /* padding */
+ pad_along (GTK_ORIENTATION_VERTICAL,
+ private_widget,
+ 5);
+ gtk_box_append (vbox,
+ private_widget);
+ g_object_unref (private_widget);
}
- gtk_widget_show (GTK_WIDGET (vbox));
GNUNET_assert (GNUNET_OK ==
GNUNET_CONTAINER_multihashmap_put (AG_entry_attributes,
uh,
@@ -470,12 +496,11 @@ create_attribute_widget (const struct GNUNET_HashCode *uh,
pbox = GTK_BOX (GCG_get_main_window_object (
"anastasis_gtk_identity_vbox"));
- gtk_box_pack_start (pbox, /* parent */
- GTK_WIDGET (vbox), /* child */
- false, /* expand */
- false, /* fill */
- 5); /* padding */
-
+ pad_along (GTK_ORIENTATION_VERTICAL,
+ GTK_WIDGET (vbox),
+ 5);
+ gtk_box_append (pbox,
+ GTK_WIDGET (vbox));
}
return w;
}
@@ -490,7 +515,7 @@ create_attribute_widget (const struct GNUNET_HashCode *uh,
/**
* Update GtkLabel @a name, setting text to @a value.
*
- * @param name Glade-name of widget to update
+ * @param name name of the widget to update
* @param value value to set
*/
static void
@@ -504,13 +529,15 @@ update_label (const char *name,
return;
if (NULL == value)
{
- gtk_widget_hide (GTK_WIDGET (label));
+ gtk_widget_set_visible (GTK_WIDGET (label),
+ FALSE);
}
else
{
gtk_label_set_text (label,
value);
- gtk_widget_show (GTK_WIDGET (label));
+ gtk_widget_set_visible (GTK_WIDGET (label),
+ TRUE);
}
}
@@ -658,7 +685,8 @@ action_user_attributes_collecting (void)
AG_import_attribute_data (w,
attr_type,
val);
- gtk_widget_show (w);
+ gtk_widget_set_visible (w,
+ TRUE);
}
GNUNET_JSON_parse_free (spec);
}
@@ -1226,7 +1254,7 @@ action_policies_reviewing (void)
/**
* Update GtkEntry @a name, setting text to @a value.
*
- * @param name Glade-name of widget to update
+ * @param name name of the widget to update
* @param value value to set
*/
static void
@@ -1246,13 +1274,13 @@ update_entry (const char *name,
name);
return;
}
- old = gtk_entry_get_text (entry);
+ old = gtk_editable_get_text (GTK_EDITABLE (entry));
if (NULL == old)
old = "";
if (0 != strcmp (old,
value))
- gtk_entry_set_text (entry,
- value);
+ gtk_editable_set_text (GTK_EDITABLE (entry),
+ value);
}
@@ -1372,9 +1400,11 @@ action_secret_editing (void)
sb = GTK_SPIN_BUTTON (GCG_get_main_window_object (
"expiration_year_spin_button"));
if (is_free)
- gtk_widget_hide (GTK_WIDGET (sb));
+ gtk_widget_set_visible (GTK_WIDGET (sb),
+ FALSE);
else
- gtk_widget_show (GTK_WIDGET (sb));
+ gtk_widget_set_visible (GTK_WIDGET (sb),
+ TRUE);
this_year = GNUNET_TIME_get_current_year ();
/* We allow at most 5 years into the future */
gtk_spin_button_set_range (sb,
@@ -1908,7 +1938,8 @@ show_challenge_feedback (const char *uuid,
gtk_label_set_text (l,
msg);
GNUNET_free (msg);
- gtk_widget_show (GTK_WIDGET (l));
+ gtk_widget_set_visible (GTK_WIDGET (l),
+ TRUE);
}
if (NULL != hint)
{
@@ -1918,7 +1949,8 @@ show_challenge_feedback (const char *uuid,
"hint_label"));
gtk_label_set_text (l,
hint);
- gtk_widget_show (GTK_WIDGET (l));
+ gtk_widget_set_visible (GTK_WIDGET (l),
+ TRUE);
}
GNUNET_JSON_parse_free (spec);
}
@@ -2408,7 +2440,7 @@ add_challenge (GtkBox *challenge_box,
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_challenge_template.glade",
+ "anastasis_gtk_challenge_template.ui",
NULL);
window = GTK_WINDOW (gtk_builder_get_object (builder,
"challenge_template_window"));
@@ -2423,12 +2455,14 @@ add_challenge (GtkBox *challenge_box,
false);
if (solved)
{
- GtkImage *solved_img;
+ GtkWidget *solved_img;
- solved_img = GTK_IMAGE (gtk_builder_get_object (builder,
- "challenge_solved_image"));
- gtk_widget_show (GTK_WIDGET (solved_img));
- gtk_widget_hide (GTK_WIDGET (button));
+ solved_img = GTK_WIDGET (gtk_builder_get_object (builder,
+ "challenge_solved_image"));
+ gtk_widget_set_visible (solved_img,
+ TRUE);
+ gtk_widget_set_visible (GTK_WIDGET (button),
+ FALSE);
}
else
{
@@ -2444,17 +2478,18 @@ add_challenge (GtkBox *challenge_box,
_ ("unknown"));
}
{
- GtkImage *icon;
+ GtkWidget *icon;
char *lab;
GNUNET_asprintf (&lab,
"challenge_category_%s_image",
type);
- icon = GTK_IMAGE (gtk_builder_get_object (builder,
- lab));
+ icon = GTK_WIDGET (gtk_builder_get_object (builder,
+ lab));
GNUNET_free (lab);
if (NULL != icon)
- gtk_widget_show (GTK_WIDGET (icon));
+ gtk_widget_set_visible (icon,
+ TRUE);
}
show_challenge_feedback (uuid,
builder);
@@ -2465,14 +2500,15 @@ add_challenge (GtkBox *challenge_box,
gtk_label_set_text (label,
_ ("provider down"));
g_object_ref (hbox);
- gtk_container_remove (GTK_CONTAINER (window),
- hbox);
+ gtk_window_set_child (window,
+ NULL);
g_object_unref (builder);
- gtk_box_pack_start (challenge_box,
- hbox,
- false,
- false,
- 15);
+ pad_along (GTK_ORIENTATION_VERTICAL,
+ hbox,
+ 15);
+ gtk_box_append (challenge_box,
+ hbox);
+ g_object_unref (hbox);
if (! ok)
return GNUNET_NO;
return GNUNET_OK;
@@ -2514,7 +2550,7 @@ add_policy (GtkBox *policy_box,
}
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_policy_template.glade",
+ "anastasis_gtk_policy_template.ui",
NULL);
window = GTK_WINDOW (gtk_builder_get_object (builder,
"policy_template_window"));
@@ -2573,14 +2609,15 @@ add_policy (GtkBox *policy_box,
txt);
GNUNET_free (txt);
g_object_ref (widget);
- gtk_container_remove (GTK_CONTAINER (window),
- widget);
+ gtk_window_set_child (window,
+ NULL);
g_object_unref (builder);
- gtk_box_pack_start (policy_box,
- widget,
- false,
- false,
- 15);
+ pad_along (GTK_ORIENTATION_VERTICAL,
+ widget,
+ 15);
+ gtk_box_append (policy_box,
+ widget);
+ g_object_unref (widget);
return ! ok;
}
@@ -2608,15 +2645,12 @@ action_challenge_selecting (void)
"anastasis_gtk_policy_vbox"));
/* remove all existing entries from the box */
{
- GtkContainer *pb;
- GList *children;
+ GtkWidget *child;
- pb = GTK_CONTAINER (policy_box);
- children = gtk_container_get_children (pb);
- for (GList *iter = children; iter != NULL; iter = g_list_next (iter))
- gtk_container_remove (pb,
- GTK_WIDGET (iter->data));
- g_list_free (children);
+ while (NULL != (child = gtk_widget_get_first_child (
+ GTK_WIDGET (policy_box))))
+ gtk_box_remove (policy_box,
+ child);
}
{
size_t pindex;
@@ -2901,7 +2935,8 @@ render_feedback (GtkBuilder *builder,
GNUNET_break (0);
gtk_label_set_text (elabel,
_ ("INTERNAL ERROR: could not parse state"));
- gtk_widget_show (GTK_WIDGET (elabel));
+ gtk_widget_set_visible (GTK_WIDGET (elabel),
+ TRUE);
return;
}
if ( (0 == strcmp (state,
@@ -3011,9 +3046,11 @@ render_feedback (GtkBuilder *builder,
msg);
GNUNET_free (msg);
if (hide)
- gtk_widget_hide (GTK_WIDGET (elabel));
+ gtk_widget_set_visible (GTK_WIDGET (elabel),
+ FALSE);
else
- gtk_widget_show (GTK_WIDGET (elabel));
+ gtk_widget_set_visible (GTK_WIDGET (elabel),
+ TRUE);
GNUNET_JSON_parse_free (spec);
}
@@ -3032,7 +3069,7 @@ diag_question (const json_t *details)
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_challenge_question.glade",
+ "anastasis_gtk_challenge_question.ui",
NULL);
if (NULL == builder)
{
@@ -3099,7 +3136,7 @@ diag_code (const json_t *details)
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_challenge_code.glade",
+ "anastasis_gtk_challenge_code.ui",
NULL);
if (NULL == builder)
{
@@ -3165,7 +3202,7 @@ diag_totp (const json_t *details)
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_challenge_totp.glade",
+ "anastasis_gtk_challenge_totp.ui",
NULL);
if (NULL == builder)
{
@@ -3263,7 +3300,7 @@ diag_iban (const json_t *details)
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_challenge_iban.glade",
+ "anastasis_gtk_challenge_iban.ui",
NULL);
if (NULL == builder)
{
@@ -3374,12 +3411,12 @@ action_challenge_solving (void)
}
/* show dialog */
{
- GtkWidget *toplevel;
+ GtkRoot *toplevel;
GtkWidget *box;
box = GTK_WIDGET (GCG_get_main_window_object (
"anastasis_gtk_policy_vbox"));
- toplevel = gtk_widget_get_toplevel (box);
+ toplevel = gtk_widget_get_root (box);
gtk_window_set_transient_for (GTK_WINDOW (diag),
GTK_WINDOW (toplevel));
gtk_window_present (GTK_WINDOW (diag));
@@ -3469,8 +3506,8 @@ action_recovery_finished (void)
}
if (NULL != pb)
{
- gtk_image_set_from_pixbuf (img,
- pb);
+ AG_image_set_from_pixbuf (img,
+ pb);
g_object_unref (pb);
}
else
diff --git a/src/anastasis/anastasis-gtk_attributes.c b/src/anastasis/anastasis-gtk_attributes.c
@@ -35,7 +35,7 @@ extract_entry (GtkWidget *entry)
{
const gchar *txt;
- txt = gtk_entry_get_text (GTK_ENTRY (entry));
+ txt = gtk_editable_get_text (GTK_EDITABLE (entry));
if ( (NULL == txt) ||
(0 == strlen (txt)) )
return NULL;
@@ -46,21 +46,22 @@ extract_entry (GtkWidget *entry)
static json_t *
extract_cal (GtkWidget *cal)
{
- guint day = 0;
- guint month = 0;
- guint year = 0;
+ GDateTime *date;
char txt[12];
- gtk_calendar_get_date (GTK_CALENDAR (cal),
- &year,
- &month,
- &day);
+ date = gtk_calendar_get_date (GTK_CALENDAR (cal));
+ if (NULL == date)
+ {
+ GNUNET_break (0);
+ return NULL;
+ }
GNUNET_snprintf (txt,
sizeof (txt),
"%04u-%02u-%02u",
- (unsigned int) year,
- (unsigned int) month + 1,
- (unsigned int) day);
+ (unsigned int) g_date_time_get_year (date),
+ (unsigned int) g_date_time_get_month (date),
+ (unsigned int) g_date_time_get_day_of_month (date));
+ g_date_time_unref (date);
return json_string (txt);
}
@@ -173,8 +174,8 @@ import_entry (GtkWidget *w,
const json_t *value)
{
GNUNET_break (json_is_string (value));
- gtk_entry_set_text (GTK_ENTRY (w),
- json_string_value (value));
+ gtk_editable_set_text (GTK_EDITABLE (w),
+ json_string_value (value));
}
@@ -193,6 +194,7 @@ import_cal (GtkWidget *w,
guint month;
guint year;
char dummy;
+ GDateTime *date;
s = json_string_value (value);
if (NULL == s)
@@ -211,11 +213,20 @@ import_cal (GtkWidget *w,
GNUNET_break (0);
return;
}
+ date = g_date_time_new_local ((gint) year,
+ (gint) month,
+ (gint) day,
+ 0,
+ 0,
+ 0.0);
+ if (NULL == date)
+ {
+ GNUNET_break (0);
+ return;
+ }
gtk_calendar_select_day (GTK_CALENDAR (w),
- day);
- gtk_calendar_select_month (GTK_CALENDAR (w),
- month - 1,
- year);
+ date);
+ g_date_time_unref (date);
}
diff --git a/src/anastasis/anastasis-gtk_handle-add-provider.c b/src/anastasis/anastasis-gtk_handle-add-provider.c
@@ -73,7 +73,8 @@ config_cb (void *cls,
GNUNET_asprintf (&msg,
"Provider URL invalid (HTTP status %u)",
acfg->http_status);
- gtk_widget_show (GTK_WIDGET (l));
+ gtk_widget_set_visible (GTK_WIDGET (l),
+ TRUE);
gtk_label_set_text (l,
msg);
free (msg);
@@ -120,7 +121,8 @@ config_cb (void *cls,
"add_button"));
gtk_widget_set_sensitive (button,
true);
- gtk_widget_hide (GTK_WIDGET (l));
+ gtk_widget_set_visible (GTK_WIDGET (l),
+ FALSE);
}
@@ -150,7 +152,7 @@ add_provider_url_entry_changed_cb (GtkEntry *entry,
"add_button"));
gtk_widget_set_sensitive (button,
false);
- url = gtk_entry_get_text (entry);
+ url = gtk_editable_get_text (GTK_EDITABLE (entry));
if ( (0 == strncasecmp (url,
"http://",
strlen ("http://"))) ||
@@ -191,7 +193,7 @@ add_provider_dialog_response_cb (GtkDialog *dialog,
}
if (GTK_RESPONSE_APPLY != response_id)
{
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
json_decref (pstate);
pstate = NULL;
@@ -211,7 +213,7 @@ add_provider_dialog_response_cb (GtkDialog *dialog,
}
entry = GTK_ENTRY (gtk_builder_get_object (builder,
"url_entry"));
- url = gtk_entry_get_text (entry);
+ url = gtk_editable_get_text (GTK_EDITABLE (entry));
ANASTASIS_policy_discovery_more (AG_pd,
url,
pstate);
@@ -220,7 +222,7 @@ add_provider_dialog_response_cb (GtkDialog *dialog,
url,
pstate));
pstate = NULL;
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
}
@@ -237,7 +239,7 @@ anastasis_gtk_add_provider_button_clicked_cb (GtkButton *object,
{
GtkWidget *ad;
GtkBuilder *builder;
- GtkWidget *toplevel;
+ GtkRoot *toplevel;
if (NULL == AG_pd)
{
@@ -246,7 +248,7 @@ anastasis_gtk_add_provider_button_clicked_cb (GtkButton *object,
}
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_add_provider.glade",
+ "anastasis_gtk_add_provider.ui",
NULL);
if (NULL == builder)
{
@@ -255,7 +257,7 @@ anastasis_gtk_add_provider_button_clicked_cb (GtkButton *object,
}
ad = GTK_WIDGET (gtk_builder_get_object (builder,
"add_provider_dialog"));
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (object));
+ toplevel = gtk_widget_get_root (GTK_WIDGET (object));
gtk_window_set_transient_for (GTK_WINDOW (ad),
GTK_WINDOW (toplevel));
gtk_window_present (GTK_WINDOW (ad));
diff --git a/src/anastasis/anastasis-gtk_handle-auth-edit-provider-clicked.c b/src/anastasis/anastasis-gtk_handle-auth-edit-provider-clicked.c
@@ -49,18 +49,16 @@ struct MenuContext
/**
- * An item was selected from the context menu; destroy the menu shell.
+ * Free a `struct MenuContext`. Called when the action group holding it goes
+ * away, which happens on the next right-click at the latest.
*
- * @param menushell menu to destroy
- * @param user_data the 'struct MenuContext' of the menu
+ * @param cls the `struct MenuContext` to free
*/
static void
-context_popup_selection_done (GtkMenuShell *menushell,
- gpointer user_data)
+free_menu_context (gpointer cls)
{
- struct MenuContext *ctx = user_data;
+ struct MenuContext *ctx = cls;
- gtk_widget_destroy (GTK_WIDGET (menushell));
GNUNET_free (ctx->url);
GNUNET_free (ctx);
}
@@ -111,18 +109,41 @@ xdg_open (const char *url)
/**
- * The user selected the 'view pp' menu.
+ * Return the provider the user right-clicked on.
*
- * @param menuitem the selected menu
- * @param user_data a `struct MenuContext`
+ * @param tree_view the tree view the context menu belongs to
+ * @return the context, NULL if there is none
+ */
+static struct MenuContext *
+current_context (gpointer tree_view)
+{
+ return g_object_get_data (G_OBJECT (tree_view),
+ "anastasis-menu-context");
+}
+
+
+/**
+ * The user selected the 'view terms of service' menu item.
+ *
+ * @param action the activated action
+ * @param parameter unused
+ * @param user_data the tree view holding the `struct MenuContext`
*/
static void
-view_terms_of_service (GtkMenuItem *menuitem,
+view_terms_of_service (GSimpleAction *action,
+ GVariant *parameter,
gpointer user_data)
{
- struct MenuContext *ctx = user_data;
+ struct MenuContext *ctx = current_context (user_data);
char *tos;
+ (void) action;
+ (void) parameter;
+ if (NULL == ctx)
+ {
+ GNUNET_break (0);
+ return;
+ }
GNUNET_asprintf (&tos,
"%sterms",
ctx->url);
@@ -132,18 +153,27 @@ view_terms_of_service (GtkMenuItem *menuitem,
/**
- * The user selected the 'view tos' menu.
+ * The user selected the 'view privacy policy' menu item.
*
- * @param menuitem the selected menu
- * @param user_data a `struct MenuContext`
+ * @param action the activated action
+ * @param parameter unused
+ * @param user_data the tree view holding the `struct MenuContext`
*/
static void
-view_privacy_policy (GtkMenuItem *menuitem,
+view_privacy_policy (GSimpleAction *action,
+ GVariant *parameter,
gpointer user_data)
{
- struct MenuContext *ctx = user_data;
+ struct MenuContext *ctx = current_context (user_data);
char *pp;
+ (void) action;
+ (void) parameter;
+ if (NULL == ctx)
+ {
+ GNUNET_break (0);
+ return;
+ }
GNUNET_asprintf (&pp,
"%sprivacy",
ctx->url);
@@ -192,49 +222,117 @@ provider_toggle_callback (GtkCellRendererToggle *cell,
/**
- * User clicked on the tree view. If it was a right-click, show
- * context menu to allow user to view PP or TOS.
+ * Return the context menu of @a tv, creating it on first use. A single
+ * popover is reused for the lifetime of the tree view.
*
- * @param widget the tree view
- * @param event the event
+ * @param tv the tree view
+ * @return the popover to show
+ */
+static GtkPopover *
+get_popover (GtkWidget *tv)
+{
+ static const GActionEntry entries[] = {
+ { .name = "privacy",
+ .activate = &view_privacy_policy },
+ { .name = "terms",
+ .activate = &view_terms_of_service }
+ };
+ GtkWidget *popover;
+
+ popover = g_object_get_data (G_OBJECT (tv),
+ "anastasis-context-menu");
+ if (NULL != popover)
+ return GTK_POPOVER (popover);
+ {
+ GMenu *menu = g_menu_new ();
+
+ g_menu_append (menu,
+ _ ("View _privacy policy..."),
+ "provider.privacy");
+ g_menu_append (menu,
+ _ ("View _terms of service..."),
+ "provider.terms");
+ popover = gtk_popover_menu_new_from_model (G_MENU_MODEL (menu));
+ g_object_unref (menu);
+ }
+ gtk_popover_set_has_arrow (GTK_POPOVER (popover),
+ FALSE);
+ gtk_widget_set_halign (popover,
+ GTK_ALIGN_START);
+ gtk_widget_set_parent (popover,
+ tv);
+ g_object_set_data_full (G_OBJECT (tv),
+ "anastasis-context-menu",
+ popover,
+ (GDestroyNotify) & gtk_widget_unparent);
+ {
+ GSimpleActionGroup *actions;
+
+ actions = g_simple_action_group_new ();
+ g_action_map_add_action_entries (G_ACTION_MAP (actions),
+ entries,
+ G_N_ELEMENTS (entries),
+ tv);
+ gtk_widget_insert_action_group (tv,
+ "provider",
+ G_ACTION_GROUP (actions));
+ g_object_unref (actions);
+ }
+ return GTK_POPOVER (popover);
+}
+
+
+/**
+ * User right-clicked on the tree view: show the context menu that lets them
+ * view the provider's privacy policy or terms of service.
+ *
+ * @param gesture the click gesture, restricted to button 3 by the UI file
+ * @param n_press number of presses
+ * @param x horizontal position of the click, in widget coordinates
+ * @param y vertical position of the click, in widget coordinates
* @param user_data the builder
*/
-gboolean
-provider_tree_view_button_press_event_cb (GtkWidget *widget,
- GdkEvent *event,
- gpointer user_data)
+void
+provider_tree_view_pressed_cb (GtkGestureClick *gesture,
+ gint n_press,
+ gdouble x,
+ gdouble y,
+ gpointer user_data)
{
GtkBuilder *builder = GTK_BUILDER (user_data);
- GdkEventButton *event_button = (GdkEventButton *) event;
- GtkTreeView *tv;
+ GtkWidget *widget
+ = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
+ GtkTreeView *tv = GTK_TREE_VIEW (widget);
GtkTreeModel *tm;
GtkTreePath *path;
GtkTreeIter iter;
struct MenuContext *ctx;
- GtkMenu *menu;
+ int bx;
+ int by;
- if ((GDK_BUTTON_PRESS != event->type) ||
- (3 != event_button->button))
- return FALSE; /* not a right-click */
+ (void) n_press;
tm = GTK_TREE_MODEL (gtk_builder_get_object (builder,
"provider_liststore"));
if (NULL == tm)
{
GNUNET_break (0);
- return FALSE;
+ return;
}
- tv = GTK_TREE_VIEW (gtk_builder_get_object (builder,
- "provider_tree_view"));
+ gtk_tree_view_convert_widget_to_bin_window_coords (tv,
+ (int) x,
+ (int) y,
+ &bx,
+ &by);
if (! gtk_tree_view_get_path_at_pos (tv,
- event_button->x,
- event_button->y,
+ bx,
+ by,
&path,
NULL,
NULL,
NULL))
{
/* nothing selected */
- return FALSE;
+ return;
}
if (! gtk_tree_model_get_iter (tm,
&iter,
@@ -242,7 +340,8 @@ provider_tree_view_button_press_event_cb (GtkWidget *widget,
{
/* not sure how we got a path but no iter... */
GNUNET_break (0);
- return FALSE;
+ gtk_tree_path_free (path);
+ return;
}
gtk_tree_path_free (path);
ctx = GNUNET_new (struct MenuContext);
@@ -250,47 +349,25 @@ provider_tree_view_button_press_event_cb (GtkWidget *widget,
&iter,
AG_PMC_PROVIDER_URL, &ctx->url,
-1);
- menu = GTK_MENU (gtk_menu_new ());
- {
- GtkWidget *child;
-
- child = gtk_menu_item_new_with_label (_ ("View _privacy policy..."));
- g_signal_connect (child,
- "activate",
- G_CALLBACK (&view_privacy_policy),
- ctx);
- gtk_label_set_use_underline (GTK_LABEL (
- gtk_bin_get_child (GTK_BIN (child))),
- TRUE);
- gtk_widget_show (child);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu),
- child);
- }
+ /* the tree view owns the context of the row currently pointed at; the
+ previous one is released here */
+ g_object_set_data_full (G_OBJECT (widget),
+ "anastasis-menu-context",
+ ctx,
+ &free_menu_context);
{
- GtkWidget *child;
-
- child = gtk_menu_item_new_with_label (_ ("View _terms of service..."));
- g_signal_connect (child,
- "activate",
- G_CALLBACK (&view_terms_of_service),
- ctx);
- gtk_label_set_use_underline (GTK_LABEL (
- gtk_bin_get_child (GTK_BIN (child))),
- TRUE);
- gtk_widget_show (child);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu),
- child);
+ GtkPopover *popover = get_popover (widget);
+ const GdkRectangle at = {
+ .x = (int) x,
+ .y = (int) y,
+ .width = 1,
+ .height = 1
+ };
+
+ gtk_popover_set_pointing_to (popover,
+ &at);
+ gtk_popover_popup (popover);
}
-
- g_signal_connect (menu,
- "selection-done",
- G_CALLBACK (&context_popup_selection_done),
- ctx);
-
- gtk_menu_popup_at_pointer (menu,
- event);
-
- return FALSE;
}
@@ -314,7 +391,7 @@ url_add_button_clicked_cb (GtkButton *button,
GNUNET_assert (NULL != ls);
entry = GTK_ENTRY (gtk_builder_get_object (builder,
"url_entry"));
- url = gtk_entry_get_text (entry);
+ url = gtk_editable_get_text (GTK_EDITABLE (entry));
gtk_list_store_insert_with_values (ls,
NULL,
-1,
@@ -326,8 +403,8 @@ url_add_button_clicked_cb (GtkButton *button,
AG_PMC_PROVIDER_NOT_SENSITIVE, true,
AG_PMC_PROVIDER_NAME, url,
-1);
- gtk_entry_set_text (entry,
- "");
+ gtk_editable_set_text (GTK_EDITABLE (entry),
+ "");
}
@@ -348,7 +425,7 @@ url_entry_changed_cb (GtkEntry *entry,
button = GTK_WIDGET (gtk_builder_get_object (builder,
"add_button"));
- url = gtk_entry_get_text (entry);
+ url = gtk_editable_get_text (GTK_EDITABLE (entry));
gtk_widget_set_sensitive (button,
(0 == strncasecmp (url,
"http://",
@@ -378,7 +455,7 @@ edit_provider_dialog_response_cb (GtkDialog *dialog,
if (GTK_RESPONSE_APPLY != response_id)
{
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
return;
}
@@ -414,7 +491,7 @@ edit_provider_dialog_response_cb (GtkDialog *dialog,
}
while (gtk_tree_model_iter_next (tm,
&iter));
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
AG_freeze ();
AG_ra = ANASTASIS_redux_action (AG_redux_state,
@@ -443,7 +520,7 @@ anastasis_gtk_edit_provider_list_clicked_cb (GtkButton *object,
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_edit_providers.glade",
+ "anastasis_gtk_edit_providers.ui",
NULL);
if (NULL == builder)
{
@@ -567,9 +644,9 @@ anastasis_gtk_edit_provider_list_clicked_cb (GtkButton *object,
ad = GTK_WIDGET (gtk_builder_get_object (builder,
"edit_provider_dialog"));
{
- GtkWidget *toplevel;
+ GtkRoot *toplevel;
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (object));
+ toplevel = gtk_widget_get_root (GTK_WIDGET (object));
gtk_window_set_transient_for (GTK_WINDOW (ad),
GTK_WINDOW (toplevel));
gtk_window_present (GTK_WINDOW (ad));
diff --git a/src/anastasis/anastasis-gtk_handle-challenge-code.c b/src/anastasis/anastasis-gtk_handle-challenge-code.c
@@ -50,7 +50,7 @@ anastasis_gtk_c_code_dialog_response_cb (GtkDialog *dialog,
if (GTK_RESPONSE_OK != response_id)
{
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
GNUNET_assert (NULL == AG_ra);
AG_ra = ANASTASIS_redux_action (AG_redux_state,
@@ -62,7 +62,7 @@ anastasis_gtk_c_code_dialog_response_cb (GtkDialog *dialog,
}
q = GTK_ENTRY (gtk_builder_get_object (builder,
"anastasis_gtk_c_code_entry"));
- qs = gtk_entry_get_text (q);
+ qs = gtk_editable_get_text (GTK_EDITABLE (q));
if (! ANASTASIS_scan_pin (qs,
&pin))
{
@@ -72,7 +72,7 @@ anastasis_gtk_c_code_dialog_response_cb (GtkDialog *dialog,
args = GNUNET_JSON_PACK (
GNUNET_JSON_pack_uint64 ("pin",
(uint64_t) pin));
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
AG_freeze ();
AG_ra = ANASTASIS_redux_action (AG_redux_state,
@@ -96,7 +96,7 @@ anastasis_gtk_c_code_dialog_answer_entry_changed_cb (GtkEntry *entry,
a = GTK_ENTRY (gtk_builder_get_object (builder,
"anastasis_gtk_c_code_entry"));
- as = gtk_entry_get_text (a);
+ as = gtk_editable_get_text (GTK_EDITABLE (a));
ok = ANASTASIS_scan_pin (as,
&pin);
gtk_widget_set_sensitive (
diff --git a/src/anastasis/anastasis-gtk_handle-challenge-iban.c b/src/anastasis/anastasis-gtk_handle-challenge-iban.c
@@ -41,7 +41,7 @@ anastasis_gtk_c_iban_dialog_response_cb (GtkDialog *dialog,
{
GtkBuilder *builder = GTK_BUILDER (user_data);
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
GNUNET_assert (NULL == AG_ra);
AG_ra = ANASTASIS_redux_action (AG_redux_state,
diff --git a/src/anastasis/anastasis-gtk_handle-challenge-question.c b/src/anastasis/anastasis-gtk_handle-challenge-question.c
@@ -49,7 +49,7 @@ anastasis_gtk_c_question_dialog_response_cb (GtkDialog *dialog,
if (GTK_RESPONSE_OK != response_id)
{
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
GNUNET_assert (NULL == AG_ra);
AG_ra = ANASTASIS_redux_action (AG_redux_state,
@@ -61,11 +61,11 @@ anastasis_gtk_c_question_dialog_response_cb (GtkDialog *dialog,
}
q = GTK_ENTRY (gtk_builder_get_object (builder,
"anastasis_gtk_c_question_dialog_answer_entry"));
- qs = gtk_entry_get_text (q);
+ qs = gtk_editable_get_text (GTK_EDITABLE (q));
args = GNUNET_JSON_PACK (
GNUNET_JSON_pack_string ("answer",
qs));
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
AG_freeze ();
GNUNET_assert (NULL == AG_ra);
@@ -88,7 +88,7 @@ anastasis_gtk_c_question_dialog_answer_entry_changed_cb (GtkEntry *entry,
a = GTK_ENTRY (gtk_builder_get_object (builder,
"anastasis_gtk_c_question_dialog_answer_entry"));
- as = gtk_entry_get_text (a);
+ as = gtk_editable_get_text (GTK_EDITABLE (a));
gtk_widget_set_sensitive (
GTK_WIDGET (gtk_builder_get_object (builder,
"anastasis_gtk_c_question_dialog_btn_ok")),
diff --git a/src/anastasis/anastasis-gtk_handle-challenge-totp.c b/src/anastasis/anastasis-gtk_handle-challenge-totp.c
@@ -51,7 +51,7 @@ anastasis_gtk_c_totp_dialog_response_cb (GtkDialog *dialog,
if (GTK_RESPONSE_OK != response_id)
{
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
GNUNET_assert (NULL == AG_ra);
AG_ra = ANASTASIS_redux_action (AG_redux_state,
@@ -63,7 +63,7 @@ anastasis_gtk_c_totp_dialog_response_cb (GtkDialog *dialog,
}
q = GTK_ENTRY (gtk_builder_get_object (builder,
"anastasis_gtk_c_totp_entry"));
- qs = gtk_entry_get_text (q);
+ qs = gtk_editable_get_text (GTK_EDITABLE (q));
if (1 != sscanf (qs,
"%llu%c",
&pin,
@@ -75,7 +75,7 @@ anastasis_gtk_c_totp_dialog_response_cb (GtkDialog *dialog,
args = GNUNET_JSON_PACK (
GNUNET_JSON_pack_uint64 ("pin",
pin));
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
AG_freeze ();
AG_ra = ANASTASIS_redux_action (AG_redux_state,
@@ -100,7 +100,7 @@ anastasis_gtk_c_totp_dialog_answer_entry_changed_cb (GtkEntry *entry,
a = GTK_ENTRY (gtk_builder_get_object (builder,
"anastasis_gtk_c_totp_entry"));
- as = gtk_entry_get_text (a);
+ as = gtk_editable_get_text (GTK_EDITABLE (a));
ok = ( (NULL != as) &&
(8 == strlen (as)) &&
(1 == sscanf (as,
diff --git a/src/anastasis/anastasis-gtk_handle-core-secret-name-changed.c b/src/anastasis/anastasis-gtk_handle-core-secret-name-changed.c
@@ -36,7 +36,7 @@ anastasis_gtk_enter_secret_name_entry_changed_cb (GtkEditable *entry,
gpointer user_data)
{
GtkEntry *ne = GTK_ENTRY (entry);
- const char *name = gtk_entry_get_text (ne);
+ const char *name = gtk_editable_get_text (GTK_EDITABLE (ne));
json_t *arguments;
if (AG_in_action)
diff --git a/src/anastasis/anastasis-gtk_handle-identity-changed.c b/src/anastasis/anastasis-gtk_handle-identity-changed.c
@@ -32,44 +32,29 @@
/**
+ * CSS class our style sheet paints in the "invalid input" colour.
+ */
+#define INVALID_CSS_CLASS "anastasis-invalid"
+
+
+/**
* Enable or disable highlighting of widget @a w as problematic.
*
+ * @param w widget to highlight, NULL is tolerated
* @param on true to enable highlighting, false to disable
*/
static void
highlight (GtkWidget *w,
bool on)
{
- static GtkCssProvider *gcp;
- GtkStyleContext *gsc;
-
- if (NULL == gcp)
- {
- GError *err = NULL;
-
- gcp = gtk_css_provider_new ();
- GNUNET_break (true ==
- gtk_css_provider_load_from_data (gcp,
- "* {background-color: #FF4500;}",
- -1,
- &err));
- if (NULL != err)
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- "Failed to parse CSS: %s\n",
- err->message);
- }
- gsc = gtk_widget_get_style_context (w);
+ if (NULL == w)
+ return;
if (on)
- {
- gtk_style_context_add_provider (gsc,
- GTK_STYLE_PROVIDER (gcp),
- GTK_STYLE_PROVIDER_PRIORITY_USER);
- }
+ gtk_widget_add_css_class (w,
+ INVALID_CSS_CLASS);
else
- {
- gtk_style_context_remove_provider (gsc,
- GTK_STYLE_PROVIDER (gcp));
- }
+ gtk_widget_remove_css_class (w,
+ INVALID_CSS_CLASS);
}
diff --git a/src/anastasis/anastasis-gtk_handle-main-window-forward-clicked.c b/src/anastasis/anastasis-gtk_handle-main-window-forward-clicked.c
@@ -120,7 +120,7 @@ anastasis_gtk_user_sure_dialog_response_cb (
{
GtkBuilder *builder = user_data;
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
if (GTK_RESPONSE_OK != response_id)
{
@@ -143,7 +143,7 @@ question_certainty (void)
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_user_sure.glade",
+ "anastasis_gtk_user_sure.ui",
NULL);
if (NULL == builder)
{
@@ -160,19 +160,19 @@ question_certainty (void)
}
/* show dialog */
{
- GtkWidget *toplevel;
+ GtkRoot *toplevel;
GtkWidget *widget;
#if ! HAVE_HPDF_H
- gtk_widget_hide (
- GTK_WIDGET (
+ gtk_widget_set_visible (GTK_WIDGET (
gtk_builder_get_object (
builder,
- "anastasis_gtk_print_details_button")));
+ "anastasis_gtk_print_details_button")),
+ FALSE);
#endif
widget = GTK_WIDGET (GCG_get_main_window_object (
"anastasis_gtk_auth_button_grid"));
- toplevel = gtk_widget_get_toplevel (widget);
+ toplevel = gtk_widget_get_root (widget);
gtk_window_set_transient_for (GTK_WINDOW (ad),
GTK_WINDOW (toplevel));
gtk_window_present (GTK_WINDOW (ad));
@@ -218,7 +218,7 @@ anastasis_gtk_confirm_multifactor_dialog_response_cb (
{
GtkBuilder *builder = user_data;
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
if (GTK_RESPONSE_OK != response_id)
{
@@ -249,7 +249,7 @@ anastasis_gtk_deny_singlefactor_dialog_response_cb (
{
GtkBuilder *builder = user_data;
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
AG_thaw ();
}
@@ -267,7 +267,7 @@ question_sanity (void)
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_warn_multifactor.glade",
+ "anastasis_gtk_warn_multifactor.ui",
NULL);
if (NULL == builder)
{
@@ -284,12 +284,12 @@ question_sanity (void)
}
/* show dialog */
{
- GtkWidget *toplevel;
+ GtkRoot *toplevel;
GtkWidget *widget;
widget = GTK_WIDGET (GCG_get_main_window_object (
"anastasis_gtk_auth_button_grid"));
- toplevel = gtk_widget_get_toplevel (widget);
+ toplevel = gtk_widget_get_root (widget);
gtk_window_set_transient_for (GTK_WINDOW (ad),
GTK_WINDOW (toplevel));
gtk_window_present (GTK_WINDOW (ad));
@@ -308,7 +308,7 @@ refuse_insanity (void)
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_deny_singlefactor.glade",
+ "anastasis_gtk_deny_singlefactor.ui",
NULL);
if (NULL == builder)
{
@@ -325,12 +325,12 @@ refuse_insanity (void)
}
/* show dialog */
{
- GtkWidget *toplevel;
+ GtkRoot *toplevel;
GtkWidget *widget;
widget = GTK_WIDGET (GCG_get_main_window_object (
"anastasis_gtk_auth_button_grid"));
- toplevel = gtk_widget_get_toplevel (widget);
+ toplevel = gtk_widget_get_root (widget);
gtk_window_set_transient_for (GTK_WINDOW (ad),
GTK_WINDOW (toplevel));
gtk_window_present (GTK_WINDOW (ad));
diff --git a/src/anastasis/anastasis-gtk_handle-method-email.c b/src/anastasis/anastasis-gtk_handle-method-email.c
@@ -170,13 +170,13 @@ anastasis_gtk_b_email_dialog_response_cb (GtkDialog *dialog,
if (GTK_RESPONSE_OK != response_id)
{
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
return;
}
q = GTK_ENTRY (gtk_builder_get_object (builder,
"anastasis_gtk_b_email_dialog_mailaddress_entry"));
- qs = gtk_entry_get_text (q);
+ qs = gtk_editable_get_text (GTK_EDITABLE (q));
pe = mask_email (qs);
GNUNET_asprintf (&ins,
_ ("e-mail address %s"),
@@ -192,7 +192,7 @@ anastasis_gtk_b_email_dialog_response_cb (GtkDialog *dialog,
"instructions",
ins);
GNUNET_free (ins);
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
AG_freeze ();
AG_ra = ANASTASIS_redux_action (AG_redux_state,
@@ -225,7 +225,7 @@ anastasis_gtk_b_email_dialog_mailaddress_entry_changed_cb (GtkEntry *entry,
}
q = GTK_ENTRY (gtk_builder_get_object (builder,
"anastasis_gtk_b_email_dialog_mailaddress_entry"));
- qs = gtk_entry_get_text (q);
+ qs = gtk_editable_get_text (GTK_EDITABLE (q));
regex_result = regexec (®ex,
qs,
0,
@@ -254,7 +254,7 @@ anastasis_gtk_btn_add_auth_email_clicked_cb (GObject *object,
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_auth_add_email.glade",
+ "anastasis_gtk_auth_add_email.ui",
NULL);
if (NULL == builder)
{
@@ -264,9 +264,9 @@ anastasis_gtk_btn_add_auth_email_clicked_cb (GObject *object,
ad = GTK_WIDGET (gtk_builder_get_object (builder,
"anastasis_gtk_b_email_dialog"));
{
- GtkWidget *toplevel;
+ GtkRoot *toplevel;
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (object));
+ toplevel = gtk_widget_get_root (GTK_WIDGET (object));
gtk_window_set_transient_for (GTK_WINDOW (ad),
GTK_WINDOW (toplevel));
gtk_window_present (GTK_WINDOW (ad));
diff --git a/src/anastasis/anastasis-gtk_handle-method-iban.c b/src/anastasis/anastasis-gtk_handle-method-iban.c
@@ -74,13 +74,13 @@ anastasis_gtk_b_iban_dialog_response_cb (GtkDialog *dialog,
if (GTK_RESPONSE_OK != response_id)
{
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
return;
}
q = GTK_ENTRY (gtk_builder_get_object (builder,
"anastasis_gtk_b_iban_dialog_iban_entry"));
- qs = gtk_entry_get_text (q);
+ qs = gtk_editable_get_text (GTK_EDITABLE (q));
pe = mask_iban (qs);
GNUNET_asprintf (&ins,
_ ("IBAN %s"),
@@ -96,7 +96,7 @@ anastasis_gtk_b_iban_dialog_response_cb (GtkDialog *dialog,
"instructions",
ins);
GNUNET_free (ins);
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
AG_freeze ();
AG_ra = ANASTASIS_redux_action (AG_redux_state,
@@ -119,7 +119,7 @@ anastasis_gtk_b_iban_dialog_iban_entry_changed_cb (GtkEntry *entry,
q = GTK_ENTRY (gtk_builder_get_object (builder,
"anastasis_gtk_b_iban_dialog_iban_entry"));
- qs = gtk_entry_get_text (q);
+ qs = gtk_editable_get_text (GTK_EDITABLE (q));
err = TALER_iban_validate (qs);
gtk_widget_set_sensitive (
GTK_WIDGET (gtk_builder_get_object (builder,
@@ -152,7 +152,7 @@ anastasis_gtk_btn_add_auth_iban_clicked_cb (GObject *object,
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_auth_add_iban.glade",
+ "anastasis_gtk_auth_add_iban.ui",
NULL);
if (NULL == builder)
{
@@ -162,9 +162,9 @@ anastasis_gtk_btn_add_auth_iban_clicked_cb (GObject *object,
ad = GTK_WIDGET (gtk_builder_get_object (builder,
"anastasis_gtk_b_iban_dialog"));
{
- GtkWidget *toplevel;
+ GtkRoot *toplevel;
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (object));
+ toplevel = gtk_widget_get_root (GTK_WIDGET (object));
gtk_window_set_transient_for (GTK_WINDOW (ad),
GTK_WINDOW (toplevel));
gtk_window_present (GTK_WINDOW (ad));
diff --git a/src/anastasis/anastasis-gtk_handle-method-post.c b/src/anastasis/anastasis-gtk_handle-method-post.c
@@ -52,7 +52,7 @@ gt (GtkBuilder *b,
"Could not find GtkEntry widget `%s'\n",
widget_name);
}
- return gtk_entry_get_text (q);
+ return gtk_editable_get_text (GTK_EDITABLE (q));
}
@@ -75,7 +75,7 @@ anastasis_gtk_b_post_dialog_response_cb (GtkDialog *dialog,
if (GTK_RESPONSE_OK != response_id)
{
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
return;
}
@@ -119,7 +119,7 @@ anastasis_gtk_b_post_dialog_response_cb (GtkDialog *dialog,
ins);
free (addr_s);
GNUNET_free (ins);
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
AG_freeze ();
AG_ra = ANASTASIS_redux_action (AG_redux_state,
@@ -186,7 +186,7 @@ anastasis_gtk_btn_add_auth_post_clicked_cb (GObject *object,
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_auth_add_post.glade",
+ "anastasis_gtk_auth_add_post.ui",
NULL);
if (NULL == builder)
{
@@ -196,9 +196,9 @@ anastasis_gtk_btn_add_auth_post_clicked_cb (GObject *object,
ad = GTK_WIDGET (gtk_builder_get_object (builder,
"anastasis_gtk_b_post_dialog"));
{
- GtkWidget *toplevel;
+ GtkRoot *toplevel;
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (object));
+ toplevel = gtk_widget_get_root (GTK_WIDGET (object));
gtk_window_set_transient_for (GTK_WINDOW (ad),
GTK_WINDOW (toplevel));
gtk_window_present (GTK_WINDOW (ad));
diff --git a/src/anastasis/anastasis-gtk_handle-method-question.c b/src/anastasis/anastasis-gtk_handle-method-question.c
@@ -52,16 +52,16 @@ anastasis_gtk_b_question_dialog_response_cb (GtkDialog *dialog,
if (GTK_RESPONSE_OK != response_id)
{
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
return;
}
q = GTK_ENTRY (gtk_builder_get_object (builder,
"anastasis_gtk_b_question_dialog_question_entry"));
- qs = gtk_entry_get_text (q);
+ qs = gtk_editable_get_text (GTK_EDITABLE (q));
a = GTK_ENTRY (gtk_builder_get_object (builder,
"anastasis_gtk_b_question_dialog_answer_entry"));
- as = gtk_entry_get_text (a);
+ as = gtk_editable_get_text (GTK_EDITABLE (a));
args = json_pack ("{ s:{s:s, s:o, s:s}}",
"authentication_method",
"type",
@@ -71,7 +71,7 @@ anastasis_gtk_b_question_dialog_response_cb (GtkDialog *dialog,
strlen (as)),
"instructions",
qs);
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
AG_freeze ();
AG_ra = ANASTASIS_redux_action (AG_redux_state,
@@ -93,10 +93,10 @@ update_sensitivity (GtkBuilder *builder)
q = GTK_ENTRY (gtk_builder_get_object (builder,
"anastasis_gtk_b_question_dialog_question_entry"));
- qs = gtk_entry_get_text (q);
+ qs = gtk_editable_get_text (GTK_EDITABLE (q));
a = GTK_ENTRY (gtk_builder_get_object (builder,
"anastasis_gtk_b_question_dialog_answer_entry"));
- as = gtk_entry_get_text (a);
+ as = gtk_editable_get_text (GTK_EDITABLE (a));
gtk_widget_set_sensitive (
GTK_WIDGET (gtk_builder_get_object (builder,
"anastasis_gtk_b_question_dialog_btn_ok")),
@@ -142,7 +142,7 @@ anastasis_gtk_btn_add_auth_question_clicked_cb (GObject *object,
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_auth_add_question.glade",
+ "anastasis_gtk_auth_add_question.ui",
NULL);
if (NULL == builder)
{
@@ -152,9 +152,9 @@ anastasis_gtk_btn_add_auth_question_clicked_cb (GObject *object,
ad = GTK_WIDGET (gtk_builder_get_object (builder,
"anastasis_gtk_b_question_dialog"));
{
- GtkWidget *toplevel;
+ GtkRoot *toplevel;
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (object));
+ toplevel = gtk_widget_get_root (GTK_WIDGET (object));
gtk_window_set_transient_for (GTK_WINDOW (ad),
GTK_WINDOW (toplevel));
gtk_window_present (GTK_WINDOW (ad));
diff --git a/src/anastasis/anastasis-gtk_handle-method-sms.c b/src/anastasis/anastasis-gtk_handle-method-sms.c
@@ -150,13 +150,13 @@ anastasis_gtk_b_sms_dialog_response_cb (GtkDialog *dialog,
if (GTK_RESPONSE_OK != response_id)
{
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
return;
}
q = GTK_ENTRY (gtk_builder_get_object (builder,
"anastasis_gtk_b_sms_dialog_phonenumber_entry"));
- qs = gtk_entry_get_text (q);
+ qs = gtk_editable_get_text (GTK_EDITABLE (q));
mn = mask_number (qs);
GNUNET_asprintf (&ins,
_ ("phone number %s"),
@@ -172,7 +172,7 @@ anastasis_gtk_b_sms_dialog_response_cb (GtkDialog *dialog,
"instructions",
ins);
GNUNET_free (ins);
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
AG_freeze ();
AG_ra = ANASTASIS_redux_action (AG_redux_state,
@@ -205,7 +205,7 @@ anastasis_gtk_b_sms_dialog_phonenumber_entry_changed_cb (GtkEntry *entry,
}
q = GTK_ENTRY (gtk_builder_get_object (builder,
"anastasis_gtk_b_sms_dialog_phonenumber_entry"));
- qs = gtk_entry_get_text (q);
+ qs = gtk_editable_get_text (GTK_EDITABLE (q));
regex_result = regexec (®ex,
qs,
0,
@@ -234,7 +234,7 @@ anastasis_gtk_btn_add_auth_sms_clicked_cb (GObject *object,
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_auth_add_sms.glade",
+ "anastasis_gtk_auth_add_sms.ui",
NULL);
if (NULL == builder)
{
@@ -244,9 +244,9 @@ anastasis_gtk_btn_add_auth_sms_clicked_cb (GObject *object,
ad = GTK_WIDGET (gtk_builder_get_object (builder,
"anastasis_gtk_b_sms_dialog"));
{
- GtkWidget *toplevel;
+ GtkRoot *toplevel;
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (object));
+ toplevel = gtk_widget_get_root (GTK_WIDGET (object));
gtk_window_set_transient_for (GTK_WINDOW (ad),
GTK_WINDOW (toplevel));
gtk_window_present (GTK_WINDOW (ad));
diff --git a/src/anastasis/anastasis-gtk_handle-method-totp.c b/src/anastasis/anastasis-gtk_handle-method-totp.c
@@ -195,7 +195,7 @@ refresh_totp (GtkBuilder *builder)
FALSE);
q = GTK_ENTRY (gtk_builder_get_object (builder,
"anastasis_gtk_b_totp_dialog_name_entry"));
- name = gtk_entry_get_text (q);
+ name = gtk_editable_get_text (GTK_EDITABLE (q));
u_name = TALER_urlencode (name);
base32enc (totp_key,
sizeof (totp_key),
@@ -213,8 +213,8 @@ refresh_totp (GtkBuilder *builder)
GNUNET_free (uri);
if (NULL != pb)
{
- gtk_image_set_from_pixbuf (img,
- pb);
+ AG_image_set_from_pixbuf (img,
+ pb);
g_object_unref (pb);
}
}
@@ -239,13 +239,13 @@ anastasis_gtk_b_totp_dialog_response_cb (GtkDialog *dialog,
if (GTK_RESPONSE_OK != response_id)
{
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
return;
}
q = GTK_ENTRY (gtk_builder_get_object (builder,
"anastasis_gtk_b_totp_dialog_name_entry"));
- name = gtk_entry_get_text (q);
+ name = gtk_editable_get_text (GTK_EDITABLE (q));
args = json_pack ("{ s:{s:s, s:o, s:s}}",
"authentication_method",
"type",
@@ -255,7 +255,7 @@ anastasis_gtk_b_totp_dialog_response_cb (GtkDialog *dialog,
sizeof (totp_key)),
"instructions",
name);
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
memset (totp_key,
0,
@@ -284,7 +284,7 @@ totp_entry_changed_cb (GtkEntry *entry,
q = GTK_ENTRY (gtk_builder_get_object (builder,
"totp_entry"));
- code = gtk_entry_get_text (q);
+ code = gtk_editable_get_text (GTK_EDITABLE (q));
if (1 != sscanf (code,
"%u%c",
&val,
@@ -319,7 +319,7 @@ anastasis_gtk_b_totp_dialog_name_entry_changed_cb (GtkEntry *entry,
/* clear code user already entered, if any */
e = GTK_ENTRY (gtk_builder_get_object (builder,
"totp_entry"));
- gtk_entry_set_text (e, "");
+ gtk_editable_set_text (GTK_EDITABLE (e), "");
refresh_totp (builder);
}
@@ -341,7 +341,7 @@ anastasis_gtk_btn_add_auth_totp_clicked_cb (GObject *object,
sizeof (totp_key));
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_auth_add_totp.glade",
+ "anastasis_gtk_auth_add_totp.ui",
NULL);
if (NULL == builder)
{
@@ -352,9 +352,9 @@ anastasis_gtk_btn_add_auth_totp_clicked_cb (GObject *object,
"anastasis_gtk_b_totp_dialog"));
refresh_totp (builder);
{
- GtkWidget *toplevel;
+ GtkRoot *toplevel;
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (object));
+ toplevel = gtk_widget_get_root (GTK_WIDGET (object));
gtk_window_set_transient_for (GTK_WINDOW (ad),
GTK_WINDOW (toplevel));
gtk_window_present (GTK_WINDOW (ad));
diff --git a/src/anastasis/anastasis-gtk_handle-payqr-selection-changed.c b/src/anastasis/anastasis-gtk_handle-payqr-selection-changed.c
@@ -40,9 +40,16 @@ unpaid_qr_tree_selection_changed_cb (GtkTreeSelection *selection,
{
GtkTreeModel *model;
GtkTreeIter iter;
- GtkClipboard *cb;
+ GdkClipboard *cb;
+ GtkWidget *tv;
- cb = gtk_clipboard_get (GDK_SELECTION_PRIMARY);
+ tv = GTK_WIDGET (GCG_get_main_window_object ("unpaid_qr_treeview"));
+ if (NULL == tv)
+ {
+ GNUNET_break (0);
+ return;
+ }
+ cb = gtk_widget_get_primary_clipboard (tv);
GNUNET_assert (NULL != cb);
if (gtk_tree_selection_get_selected (selection,
&model,
@@ -54,15 +61,13 @@ unpaid_qr_tree_selection_changed_cb (GtkTreeSelection *selection,
&iter,
AG_UQRMC_URL, &uri,
-1);
- gtk_clipboard_set_text (cb,
- uri,
- strlen (uri));
+ gdk_clipboard_set_text (cb,
+ uri);
g_free (uri);
}
else
{
- gtk_clipboard_set_text (cb,
- "",
- 0);
+ gdk_clipboard_set_text (cb,
+ "");
}
}
diff --git a/src/anastasis/anastasis-gtk_handle-policy-button.c b/src/anastasis/anastasis-gtk_handle-policy-button.c
@@ -30,10 +30,23 @@
#include <jansson.h>
+/**
+ * The user pressed a key while the policy treeview had the focus. 'Delete'
+ * removes the selected policy or challenge.
+ *
+ * @param controller the key controller of the tree view
+ * @param keyval the key that was pressed
+ * @param keycode the hardware code of that key
+ * @param state the modifiers that were held
+ * @param user_data NULL
+ * @return TRUE if the key was handled here
+ */
gboolean
-anastasis_gtk_review_policy_treeview_key_press_event_cb (
- GtkWidget *widget,
- GdkEvent *event,
+anastasis_gtk_review_policy_treeview_key_pressed_cb (
+ GtkEventControllerKey *controller,
+ guint keyval,
+ guint keycode,
+ GdkModifierType state,
gpointer user_data)
{
GtkTreeView *tv;
@@ -44,8 +57,11 @@ anastasis_gtk_review_policy_treeview_key_press_event_cb (
gboolean is_challenge;
guint mindex;
- if ( (GDK_KEY_PRESS != event->type) ||
- (GDK_KEY_Delete != ((GdkEventKey *) event)->keyval) )
+ (void) controller;
+ (void) keycode;
+ (void) state;
+ (void) user_data;
+ if (GDK_KEY_Delete != keyval)
return FALSE;
tv = GTK_TREE_VIEW (GCG_get_main_window_object (
"anastasis_gtk_review_policy_treeview"));
diff --git a/src/anastasis/anastasis-gtk_handle-policy-meta.c b/src/anastasis/anastasis-gtk_handle-policy-meta.c
@@ -24,6 +24,7 @@
* @author Christian Grothoff
*/
#include <gnunet/gnunet_util_lib.h>
+#include "anastasis_gtk_util.h"
#include "anastasis-gtk_action.h"
#include "anastasis-gtk_helper.h"
#include "anastasis-gtk_pe.h"
@@ -44,330 +45,356 @@ struct MenuContext
/**
- * The user selected the 'add policy' menu.
+ * Free a `struct MenuContext`. Called when the action group holding it goes
+ * away, which happens on the next right-click at the latest.
*
- * @param menuitem the selected menu
- * @param user_data a `struct MenuContext`
+ * @param cls the `struct MenuContext` to free
*/
static void
-add_from_ctx_menu (GtkMenuItem *menuitem,
- gpointer user_data)
+free_menu_context (gpointer cls)
{
- (void) user_data;
- (void) menuitem;
- AG_add_policy ();
+ struct MenuContext *ctx = cls;
+
+ if (NULL != ctx->rr)
+ gtk_tree_row_reference_free (ctx->rr);
+ GNUNET_free (ctx);
}
/**
- * The user selected the 'delete challenge' menu item.
+ * Resolve the row the user right-clicked into its policy coordinates.
*
- * @param menuitem the selected menu
- * @param user_data a `struct MenuContext`
+ * @param ctx context with the row reference
+ * @param[out] pindex set to the index of the policy
+ * @param[out] is_challenge set to true if the row is a challenge
+ * @param[out] mindex set to the index of the challenge
+ * @return #GNUNET_OK on success
*/
-static void
-delete_challenge_from_ctx_menu (GtkMenuItem *menuitem,
- gpointer user_data)
+static enum GNUNET_GenericReturnValue
+lookup_row (struct MenuContext *ctx,
+ guint *pindex,
+ gboolean *is_challenge,
+ guint *mindex)
{
- struct MenuContext *ctx = user_data;
- GtkTreePath *path = gtk_tree_row_reference_get_path (ctx->rr);
- GtkTreeModel *tm = gtk_tree_row_reference_get_model (ctx->rr);
+ GtkTreePath *path;
+ GtkTreeModel *tm;
GtkTreeIter iter;
- guint pindex;
- gboolean is_challenge;
- guint mindex;
+ if (NULL == ctx->rr)
+ return GNUNET_SYSERR;
+ path = gtk_tree_row_reference_get_path (ctx->rr);
+ tm = gtk_tree_row_reference_get_model (ctx->rr);
if (NULL == path)
- return;
+ return GNUNET_SYSERR;
if (! gtk_tree_model_get_iter (tm,
&iter,
path))
{
+ gtk_tree_path_free (path);
GNUNET_break (0);
- return;
+ return GNUNET_SYSERR;
}
gtk_tree_path_free (path);
gtk_tree_model_get (tm,
&iter,
AG_PRMC_POLICY_INDEX,
- &pindex,
+ pindex,
AG_PRMC_IS_CHALLENGE,
- &is_challenge,
+ is_challenge,
AG_PRMC_METHOD_INDEX,
- &mindex,
+ mindex,
-1);
- if (! is_challenge)
- {
- GNUNET_break (0);
- return;
- }
- AG_delete_challenge (pindex,
- mindex);
+ return GNUNET_OK;
}
/**
- * The user selected the 'delete policy' menu item.
+ * The user selected the 'add policy' menu item.
*
- * @param menuitem the selected menu
+ * @param action the activated action
+ * @param parameter unused
* @param user_data a `struct MenuContext`
*/
static void
-delete_policy_from_ctx_menu (GtkMenuItem *menuitem,
- gpointer user_data)
+add_from_ctx_menu (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
{
- struct MenuContext *ctx = user_data;
- GtkTreePath *path = gtk_tree_row_reference_get_path (ctx->rr);
- GtkTreeModel *tm = gtk_tree_row_reference_get_model (ctx->rr);
- GtkTreeIter iter;
- guint pindex;
-
- if (NULL == path)
- return;
- if (! gtk_tree_model_get_iter (tm,
- &iter,
- path))
- {
- GNUNET_break (0);
- return;
- }
- gtk_tree_path_free (path);
- gtk_tree_model_get (tm,
- &iter,
- AG_PRMC_POLICY_INDEX,
- &pindex,
- -1);
- AG_delete_policy (pindex);
+ (void) action;
+ (void) parameter;
+ (void) user_data;
+ AG_add_policy ();
}
/**
- * The user selected the 'edit policy' menu.
+ * The user selected the 'delete challenge' or 'delete policy' menu item.
*
- * @param menuitem the selected menu
+ * @param action the activated action
+ * @param parameter unused
* @param user_data a `struct MenuContext`
*/
static void
-edit_from_ctx_menu (GtkMenuItem *menuitem,
- gpointer user_data)
+delete_from_ctx_menu (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
{
struct MenuContext *ctx = user_data;
- GtkTreePath *path = gtk_tree_row_reference_get_path (ctx->rr);
- GtkTreeModel *tm = gtk_tree_row_reference_get_model (ctx->rr);
- GtkTreeIter iter;
guint pindex;
+ gboolean is_challenge;
+ guint mindex;
- if (NULL == path)
+ (void) action;
+ (void) parameter;
+ if (GNUNET_OK !=
+ lookup_row (ctx,
+ &pindex,
+ &is_challenge,
+ &mindex))
return;
- if (! gtk_tree_model_get_iter (tm,
- &iter,
- path))
- {
- GNUNET_break (0);
- return;
- }
- gtk_tree_path_free (path);
- gtk_tree_model_get (tm,
- &iter,
- AG_PRMC_POLICY_INDEX,
- &pindex,
- -1);
- AG_edit_policy (pindex);
+ if (is_challenge)
+ AG_delete_challenge (pindex,
+ mindex);
+ else
+ AG_delete_policy (pindex);
}
/**
- * An item was selected from the context menu; destroy the menu shell.
+ * The user selected the 'edit policy' menu item.
*
- * @param menushell menu to destroy
- * @param user_data the 'struct MenuContext' of the menu
+ * @param action the activated action
+ * @param parameter unused
+ * @param user_data a `struct MenuContext`
*/
static void
-context_popup_selection_done (GtkMenuShell *menushell,
- gpointer user_data)
+edit_from_ctx_menu (GSimpleAction *action,
+ GVariant *parameter,
+ gpointer user_data)
{
struct MenuContext *ctx = user_data;
+ guint pindex;
+ gboolean is_challenge;
+ guint mindex;
- gtk_widget_destroy (GTK_WIDGET (menushell));
- if (NULL != ctx->rr)
- {
- gtk_tree_row_reference_free (ctx->rr);
- ctx->rr = NULL;
- }
- GNUNET_free (ctx);
+ (void) action;
+ (void) parameter;
+ if (GNUNET_OK !=
+ lookup_row (ctx,
+ &pindex,
+ &is_challenge,
+ &mindex))
+ return;
+ AG_edit_policy (pindex);
}
/**
- * Context menu was requested for the policy. Compute which menu
- * items are applicable and display an appropriate menu.
+ * Build the menu model applicable to the row that was clicked. The two
+ * sections are rendered with a separator in between.
*
- * @param tm tree model underlying the tree view where the event happened
- * @param iter location in the tree model selected at the time
- * @return NULL if no menu could be created,
- * otherwise the a pop-up menu
+ * @param have_row true if the user clicked on a row
+ * @param is_challenge true if that row represents a challenge
+ * @return the menu model
*/
-static GtkMenu *
-get_popup (GtkTreeModel *tm,
- GtkTreeIter *iter)
+static GMenuModel *
+build_menu (bool have_row,
+ gboolean is_challenge)
{
- GtkMenu *menu;
- struct MenuContext *ctx;
+ GMenu *menu = g_menu_new ();
- ctx = GNUNET_new (struct MenuContext);
- menu = GTK_MENU (gtk_menu_new ());
- if (NULL != iter)
+ if (have_row)
{
- gboolean is_challenge;
+ GMenu *section = g_menu_new ();
- {
- GtkTreePath *path;
-
- path = gtk_tree_model_get_path (tm,
- iter);
- ctx->rr = gtk_tree_row_reference_new (tm,
- path);
- gtk_tree_path_free (path);
- }
- gtk_tree_model_get (tm,
- iter,
- AG_PRMC_IS_CHALLENGE,
- &is_challenge,
- -1);
if (! is_challenge)
{
- GtkWidget *child;
-
- /* only show 'edit' entry for lines that
- are for an entire policy */
- child = gtk_menu_item_new_with_label (_ ("_Edit policy..."));
- g_signal_connect (child,
- "activate",
- G_CALLBACK (&edit_from_ctx_menu),
- ctx);
- gtk_label_set_use_underline (GTK_LABEL (
- gtk_bin_get_child (GTK_BIN (child))),
- TRUE);
- gtk_widget_show (child);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu),
- child);
- }
- {
- GtkWidget *child;
- const char *label;
-
- if (is_challenge)
- label = _ ("Delete challenge");
- else
- label = _ ("Delete policy");
- child = gtk_menu_item_new_with_label (label);
- g_signal_connect (child,
- "activate",
- G_CALLBACK (is_challenge
- ? &delete_challenge_from_ctx_menu
- : &delete_policy_from_ctx_menu),
- ctx);
- gtk_label_set_use_underline (GTK_LABEL (
- gtk_bin_get_child (GTK_BIN (child))),
- TRUE);
- gtk_widget_show (child);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), child);
+ /* only show 'edit' entry for lines that are for an entire policy */
+ g_menu_append (section,
+ _ ("_Edit policy..."),
+ "policy.edit");
}
+ g_menu_append (section,
+ is_challenge
+ ? _ ("Delete challenge")
+ : _ ("Delete policy"),
+ "policy.delete");
+ g_menu_append_section (menu,
+ NULL,
+ G_MENU_MODEL (section));
+ g_object_unref (section);
+ }
+ {
+ GMenu *section = g_menu_new ();
+
+ g_menu_append (section,
+ _ ("_Add policy..."),
+ "policy.add");
+ g_menu_append_section (menu,
+ NULL,
+ G_MENU_MODEL (section));
+ g_object_unref (section);
+ }
+ return G_MENU_MODEL (menu);
+}
- {
- GtkWidget *child;
- /* Insert a separator */
- child = gtk_separator_menu_item_new ();
- gtk_widget_show (child);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu), child);
- }
- }
+/**
+ * Install the actions the context menu of @a tv activates; they operate on the
+ * row referenced by @a ctx.
+ *
+ * @param tv the tree view the menu belongs to
+ * @param ctx context to hand to the actions, ownership is taken
+ */
+static void
+install_actions (GtkWidget *tv,
+ struct MenuContext *ctx)
+{
+ static const GActionEntry entries[] = {
+ { .name = "add",
+ .activate = &add_from_ctx_menu },
+ { .name = "edit",
+ .activate = &edit_from_ctx_menu },
+ { .name = "delete",
+ .activate = &delete_from_ctx_menu }
+ };
+ GSimpleActionGroup *actions;
+
+ actions = g_simple_action_group_new ();
+ g_action_map_add_action_entries (G_ACTION_MAP (actions),
+ entries,
+ G_N_ELEMENTS (entries),
+ ctx);
+ /* the action group owns the context; installing a new group on the next
+ right-click releases the previous one */
+ g_object_set_data_full (G_OBJECT (actions),
+ "anastasis-menu-context",
+ ctx,
+ &free_menu_context);
+ gtk_widget_insert_action_group (tv,
+ "policy",
+ G_ACTION_GROUP (actions));
+ g_object_unref (actions);
+}
+
+/**
+ * Return the context menu of @a tv, creating it on first use. A single
+ * popover is reused for the lifetime of the tree view; only its model and
+ * position change.
+ *
+ * @param tv the tree view
+ * @return the popover to show
+ */
+static GtkPopover *
+get_popover (GtkWidget *tv)
+{
+ GtkWidget *popover;
+
+ popover = g_object_get_data (G_OBJECT (tv),
+ "anastasis-context-menu");
+ if (NULL == popover)
{
- GtkWidget *child;
-
- /* only show 'edit' entry for lines that
- are for an entire policy */
- child = gtk_menu_item_new_with_label (_ ("_Add policy..."));
- g_signal_connect (child,
- "activate",
- G_CALLBACK (&add_from_ctx_menu),
- ctx);
- gtk_label_set_use_underline (GTK_LABEL (
- gtk_bin_get_child (GTK_BIN (child))),
- TRUE);
- gtk_widget_show (child);
- gtk_menu_shell_append (GTK_MENU_SHELL (menu),
- child);
+ popover = gtk_popover_menu_new_from_model (NULL);
+ gtk_popover_set_has_arrow (GTK_POPOVER (popover),
+ FALSE);
+ gtk_widget_set_halign (popover,
+ GTK_ALIGN_START);
+ gtk_widget_set_parent (popover,
+ tv);
+ g_object_set_data_full (G_OBJECT (tv),
+ "anastasis-context-menu",
+ popover,
+ (GDestroyNotify) & gtk_widget_unparent);
}
-
- g_signal_connect (menu,
- "selection-done",
- G_CALLBACK (&context_popup_selection_done),
- ctx);
- return menu;
+ return GTK_POPOVER (popover);
}
/**
- * We got a button-click on the policy treeview. If it was a
- * right-click, display the context menu.
+ * We got a right-click on the policy treeview: compute which menu items are
+ * applicable and display an appropriate menu.
*
- * @param widget the GtkTreeView with the search result list
- * @param event the event, we only care about button events
+ * @param gesture the click gesture, restricted to button 3 by the UI file
+ * @param n_press number of presses
+ * @param x horizontal position of the click, in widget coordinates
+ * @param y vertical position of the click, in widget coordinates
* @param user_data NULL
- * @return FALSE to propagate the event further,
- * TRUE to stop the propagation
*/
-gboolean
-anastasis_gtk_review_policy_treeview_button_press_event_cb (GtkWidget *widget,
- GdkEvent *event,
- gpointer user_data)
+void
+anastasis_gtk_review_policy_treeview_pressed_cb (GtkGestureClick *gesture,
+ gint n_press,
+ gdouble x,
+ gdouble y,
+ gpointer user_data)
{
+ GtkWidget *widget
+ = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
GtkTreeView *tv = GTK_TREE_VIEW (widget);
- GdkEventButton *event_button = (GdkEventButton *) event;
- GtkTreeModel *tm;
+ struct MenuContext *ctx;
GtkTreePath *path;
- GtkTreeIter iter;
- GtkMenu *menu;
-
- if ((GDK_BUTTON_PRESS != event->type) ||
- (3 != event_button->button))
- return FALSE; /* not a right-click */
- if (! gtk_tree_view_get_path_at_pos (tv,
- event_button->x,
- event_button->y,
- &path,
- NULL,
- NULL,
- NULL))
- {
- menu = get_popup (NULL,
- NULL);
- }
- else
+ gboolean is_challenge = FALSE;
+ bool have_row = false;
+ int bx;
+ int by;
+
+ (void) n_press;
+ (void) user_data;
+ ctx = GNUNET_new (struct MenuContext);
+ gtk_tree_view_convert_widget_to_bin_window_coords (tv,
+ (int) x,
+ (int) y,
+ &bx,
+ &by);
+ if (gtk_tree_view_get_path_at_pos (tv,
+ bx,
+ by,
+ &path,
+ NULL,
+ NULL,
+ NULL))
{
- tm = gtk_tree_view_get_model (tv);
- if (! gtk_tree_model_get_iter (tm,
- &iter,
- path))
+ GtkTreeModel *tm = gtk_tree_view_get_model (tv);
+ GtkTreeIter iter;
+
+ if (gtk_tree_model_get_iter (tm,
+ &iter,
+ path))
+ {
+ have_row = true;
+ ctx->rr = gtk_tree_row_reference_new (tm,
+ path);
+ gtk_tree_model_get (tm,
+ &iter,
+ AG_PRMC_IS_CHALLENGE,
+ &is_challenge,
+ -1);
+ }
+ else
{
/* not sure how we got a path but no iter... */
GNUNET_break (0);
- return FALSE;
}
gtk_tree_path_free (path);
-
- menu = get_popup (tm,
- &iter);
}
- if (NULL == menu)
+ install_actions (widget,
+ ctx);
{
- GNUNET_break (0);
- return FALSE;
+ GtkPopover *popover = get_popover (widget);
+ GMenuModel *model = build_menu (have_row,
+ is_challenge);
+ const GdkRectangle at = {
+ .x = (int) x,
+ .y = (int) y,
+ .width = 1,
+ .height = 1
+ };
+
+ gtk_popover_menu_set_menu_model (GTK_POPOVER_MENU (popover),
+ model);
+ g_object_unref (model);
+ gtk_popover_set_pointing_to (popover,
+ &at);
+ gtk_popover_popup (popover);
}
- gtk_menu_popup_at_pointer (menu,
- event);
- return FALSE;
}
diff --git a/src/anastasis/anastasis-gtk_handle-policy-version-changed.c b/src/anastasis/anastasis-gtk_handle-policy-version-changed.c
@@ -59,68 +59,21 @@ change_action_cb (void *cls,
/**
- * The version or provider URL was edited by the user. Try to
- * download the specified version from the specified provider.
+ * Download the version the user selected from the provider they named.
*/
static void
-update_policy (void)
+change_version (void)
{
GtkSpinButton *sb;
GtkEntry *ge;
gint version;
const char *provider_url;
- GtkWidget *toplevel;
-
- if (AG_in_action)
- return;
- toplevel = gtk_widget_get_toplevel (
- GTK_WIDGET (GCG_get_main_window_object (
- "anastasis_gtk_main_window")));
- if (NULL != AG_ra)
- {
- ANASTASIS_redux_action_cancel (AG_ra);
- AG_ra = NULL;
- }
-
- if (NULL !=
- json_object_get (AG_redux_state,
- "challenge_feedback"))
- {
- GtkWidget *diag;
- gint ret;
-
- diag = gtk_message_dialog_new (
- GTK_WINDOW (toplevel),
- GTK_DIALOG_MODAL,
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_OK_CANCEL,
- _ ("This action will reset all of your challenge solving progress!"));
- ret = gtk_dialog_run (GTK_DIALOG (diag));
- gtk_widget_destroy (diag);
- switch (ret)
- {
- case GTK_RESPONSE_OK:
- break;
- default:
- {
- /* call action to reset view */
- json_t *cp = json_incref (AG_redux_state);
-
- AG_action_cb (NULL,
- TALER_EC_NONE,
- cp);
- json_decref (cp);
- }
- /* user aborted */
- return;
- }
- }
sb = GTK_SPIN_BUTTON (GCG_get_main_window_object (
"anastasis_gtk_policy_version_spin_button"));
ge = GTK_ENTRY (GCG_get_main_window_object (
"anastasis_gtk_provider_url_entry"));
- provider_url = gtk_entry_get_text (ge);
+ provider_url = gtk_editable_get_text (GTK_EDITABLE (ge));
if (! ( ( (0 == strncasecmp (provider_url,
"https://",
strlen ("https://"))) &&
@@ -161,6 +114,79 @@ update_policy (void)
}
+/**
+ * The user answered the question whether they accept losing their challenge
+ * solving progress.
+ *
+ * @param dialog the warning dialog
+ * @param response_id #GTK_RESPONSE_OK if the user confirmed
+ * @param user_data unused
+ */
+static void
+reset_warning_response_cb (GtkDialog *dialog,
+ gint response_id,
+ gpointer user_data)
+{
+ (void) user_data;
+ gtk_window_destroy (GTK_WINDOW (dialog));
+ if (GTK_RESPONSE_OK == response_id)
+ {
+ change_version ();
+ return;
+ }
+ /* user aborted: call action to reset view */
+ {
+ json_t *cp = json_incref (AG_redux_state);
+
+ AG_action_cb (NULL,
+ TALER_EC_NONE,
+ cp);
+ json_decref (cp);
+ }
+}
+
+
+/**
+ * The version or provider URL was edited by the user. Try to
+ * download the specified version from the specified provider.
+ */
+static void
+update_policy (void)
+{
+ if (AG_in_action)
+ return;
+ if (NULL != AG_ra)
+ {
+ ANASTASIS_redux_action_cancel (AG_ra);
+ AG_ra = NULL;
+ }
+ if (NULL !=
+ json_object_get (AG_redux_state,
+ "challenge_feedback"))
+ {
+ GtkRoot *toplevel;
+ GtkWidget *diag;
+
+ toplevel = gtk_widget_get_root (
+ GTK_WIDGET (GCG_get_main_window_object (
+ "anastasis_gtk_main_window")));
+ diag = gtk_message_dialog_new (
+ GTK_WINDOW (toplevel),
+ GTK_DIALOG_MODAL,
+ GTK_MESSAGE_QUESTION,
+ GTK_BUTTONS_OK_CANCEL,
+ _ ("This action will reset all of your challenge solving progress!"));
+ g_signal_connect (diag,
+ "response",
+ G_CALLBACK (&reset_warning_response_cb),
+ NULL);
+ gtk_window_present (GTK_WINDOW (diag));
+ return;
+ }
+ change_version ();
+}
+
+
void
anastasis_gtk_policy_version_spin_button_changed_cb (GtkEditable *entry,
gpointer user_data)
diff --git a/src/anastasis/anastasis-gtk_handle-print.c b/src/anastasis/anastasis-gtk_handle-print.c
@@ -24,6 +24,7 @@
* @author Christian Grothoff
*/
#include <gnunet/gnunet_util_lib.h>
+#include "anastasis_gtk_util.h"
#include "anastasis-gtk_attributes.h"
#include "anastasis-gtk_helper.h"
#include <jansson.h>
@@ -134,13 +135,45 @@ print_to_file (GtkWindow *parent_window,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
_ ("Failed to generate PDF file."));
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
+ g_signal_connect (dialog,
+ "response",
+ G_CALLBACK (>k_window_destroy),
+ NULL);
+ gtk_window_present (GTK_WINDOW (dialog));
}
}
/**
+ * Function called once the user picked the file to print to.
+ *
+ * @param dialog the file selection dialog
+ * @param response_id #GTK_RESPONSE_ACCEPT if the user confirmed
+ * @param user_data unused
+ */
+static void
+print_dialog_response_cb (GtkDialog *dialog,
+ gint response_id,
+ gpointer user_data)
+{
+ GtkWindow *parent_window;
+ char *filename = NULL;
+
+ (void) user_data;
+ parent_window = gtk_window_get_transient_for (GTK_WINDOW (dialog));
+ if (GTK_RESPONSE_ACCEPT == response_id)
+ filename = ANASTASIS_GTK_filechooser_get_filename_utf8 (
+ GTK_FILE_CHOOSER (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
+ if (NULL == filename)
+ return;
+ print_to_file (parent_window,
+ filename);
+ GNUNET_free (filename);
+}
+
+
+/**
* The user clicked the 'save as' button to save their personal
* details. Try to save them as a PDF.
*
@@ -154,12 +187,11 @@ anastasis_gtk_print_details_button_clicked_cb (GtkWidget *button,
GtkWidget *dialog;
GtkFileChooser *chooser;
GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SAVE;
- gint res;
GtkWindow *parent_window;
- GtkWidget *top;
+ GtkRoot *top;
(void) user_data;
- top = gtk_widget_get_toplevel (button);
+ top = gtk_widget_get_root (button);
if (GTK_IS_WINDOW (top))
{
parent_window = GTK_WINDOW (top);
@@ -178,20 +210,12 @@ anastasis_gtk_print_details_button_clicked_cb (GtkWidget *button,
GTK_RESPONSE_ACCEPT,
NULL);
chooser = GTK_FILE_CHOOSER (dialog);
- gtk_file_chooser_set_do_overwrite_confirmation (chooser,
- TRUE);
+ /* GTK4 always asks before overwriting, no need to request it */
gtk_file_chooser_set_current_name (chooser,
_ ("anastasis-personal-details.pdf"));
- res = gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_hide (GTK_WIDGET (dialog));
- if (res == GTK_RESPONSE_ACCEPT)
- {
- char *filename;
-
- filename = gtk_file_chooser_get_filename (chooser);
- print_to_file (parent_window,
- filename);
- g_free (filename);
- }
- gtk_widget_destroy (dialog);
+ g_signal_connect (dialog,
+ "response",
+ G_CALLBACK (&print_dialog_response_cb),
+ NULL);
+ gtk_window_present (GTK_WINDOW (dialog));
}
diff --git a/src/anastasis/anastasis-gtk_handle-secret-buttons.c b/src/anastasis/anastasis-gtk_handle-secret-buttons.c
@@ -61,13 +61,13 @@ open_secret_dialog_response_cb (GtkDialog *dialog,
if (GTK_RESPONSE_OK != response_id)
{
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
return;
}
filename =
ANASTASIS_GTK_filechooser_get_filename_utf8 (GTK_FILE_CHOOSER (dialog));
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
fn = strrchr (filename,
'/');
@@ -130,7 +130,7 @@ open_secret_dialog_response_cb (GtkDialog *dialog,
}
entry = GTK_ENTRY (GCG_get_main_window_object (
"anastasis_gtk_secret_name_entry"));
- name = gtk_entry_get_text (entry);
+ name = gtk_editable_get_text (GTK_EDITABLE (entry));
mime = magic_buffer (magic,
data,
data_size);
@@ -189,7 +189,7 @@ anastasis_gtk_enter_secret_open_button_clicked_cb (GtkButton *button,
(void) user_data;
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_open_secret_dialog.glade",
+ "anastasis_gtk_open_secret_dialog.ui",
NULL);
if (NULL == builder)
{
@@ -199,9 +199,9 @@ anastasis_gtk_enter_secret_open_button_clicked_cb (GtkButton *button,
ad = GTK_WIDGET (gtk_builder_get_object (builder,
"open_file_dialog"));
{
- GtkWidget *toplevel;
+ GtkRoot *toplevel;
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (button));
+ toplevel = gtk_widget_get_root (GTK_WIDGET (button));
gtk_window_set_transient_for (GTK_WINDOW (ad),
GTK_WINDOW (toplevel));
gtk_window_present (GTK_WINDOW (ad));
@@ -242,13 +242,13 @@ save_secret_dialog_response_cb (GtkDialog *dialog,
if (GTK_RESPONSE_ACCEPT != response_id)
{
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
return;
}
filename =
ANASTASIS_GTK_filechooser_get_filename_utf8 (GTK_FILE_CHOOSER (dialog));
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
cs = json_object_get (AG_redux_state,
"core_secret");
@@ -359,7 +359,7 @@ anastasis_gtk_secret_save_as_button_clicked_cb (GtkButton *button,
NULL, NULL));
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_save_secret_dialog.glade",
+ "anastasis_gtk_save_secret_dialog.ui",
NULL);
if (NULL == builder)
{
@@ -384,9 +384,9 @@ anastasis_gtk_secret_save_as_button_clicked_cb (GtkButton *button,
gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (ad),
fn);
{
- GtkWidget *toplevel;
+ GtkRoot *toplevel;
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (button));
+ toplevel = gtk_widget_get_root (GTK_WIDGET (button));
gtk_window_set_transient_for (GTK_WINDOW (ad),
GTK_WINDOW (toplevel));
gtk_window_present (GTK_WINDOW (ad));
@@ -425,9 +425,8 @@ anastasis_gtk_secret_copy_button_clicked_cb (GtkButton *button,
NULL),
GNUNET_JSON_spec_end ()
};
- GtkClipboard *cb;
+ GdkClipboard *cb;
- (void) button;
(void) user_data;
cs = json_object_get (AG_redux_state,
"core_secret");
@@ -436,13 +435,12 @@ anastasis_gtk_secret_copy_button_clicked_cb (GtkButton *button,
GNUNET_JSON_parse (cs,
spec,
NULL, NULL));
- cb = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
+ cb = gtk_widget_get_clipboard (GTK_WIDGET (button));
GNUNET_assert (NULL != cb);
if (NULL != text)
{
- gtk_clipboard_set_text (cb,
- text,
- strlen (text));
+ gdk_clipboard_set_text (cb,
+ text);
}
else
{
@@ -450,9 +448,14 @@ anastasis_gtk_secret_copy_button_clicked_cb (GtkButton *button,
"text/",
strlen ("text/")))
{
- gtk_clipboard_set_text (cb,
- data,
- data_len);
+ char *str;
+
+ /* the secret is not necessarily 0-terminated */
+ str = g_strndup (data,
+ data_len);
+ gdk_clipboard_set_text (cb,
+ str);
+ g_free (str);
}
else if (0 == strncasecmp (mime,
"image/",
@@ -473,9 +476,12 @@ anastasis_gtk_secret_copy_button_clicked_cb (GtkButton *button,
pb = gdk_pixbuf_loader_get_pixbuf (loader);
if (NULL != pb)
{
- gtk_clipboard_set_image (cb,
- pb);
- g_object_unref (pb);
+ GdkTexture *texture;
+
+ texture = gdk_texture_new_for_pixbuf (pb);
+ gdk_clipboard_set_texture (cb,
+ texture);
+ g_object_unref (texture);
}
else
{
diff --git a/src/anastasis/anastasis-gtk_helper.c b/src/anastasis/anastasis-gtk_helper.c
@@ -124,7 +124,8 @@ AG_hide (const char *name)
name);
return;
}
- gtk_widget_hide (w);
+ gtk_widget_set_visible (w,
+ FALSE);
}
@@ -141,48 +142,64 @@ AG_show (const char *name)
name);
return;
}
- gtk_widget_show (w);
+ gtk_widget_set_visible (w,
+ TRUE);
+}
+
+
+/**
+ * Look up the widget @a name in the main window and return its first child.
+ *
+ * @param name widget to inspect
+ * @return NULL if the widget does not exist or has no children
+ */
+static GtkWidget *
+first_child (const char *name)
+{
+ GObject *w;
+
+ w = GCG_get_main_window_object (name);
+ if (NULL == w)
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ "Widget `%s' not found, cannot iterate over its children!\n",
+ name);
+ return NULL;
+ }
+ return gtk_widget_get_first_child (GTK_WIDGET (w));
}
void
AG_insensitive_children (const char *name)
{
- GList *children;
-
- children = gtk_container_get_children (GTK_CONTAINER (
- GCG_get_main_window_object (name)));
- for (GList *iter = children; iter != NULL; iter = g_list_next (iter))
- gtk_widget_set_sensitive (GTK_WIDGET (iter->data),
+ for (GtkWidget *child = first_child (name);
+ NULL != child;
+ child = gtk_widget_get_next_sibling (child))
+ gtk_widget_set_sensitive (child,
false);
- g_list_free (children);
}
void
AG_hide_children (const char *name)
{
- GList *children;
-
- children = gtk_container_get_children (GTK_CONTAINER (
- GCG_get_main_window_object (name)));
- for (GList *iter = children; iter != NULL; iter = g_list_next (iter))
- gtk_widget_hide (GTK_WIDGET (iter->data));
- g_list_free (children);
+ for (GtkWidget *child = first_child (name);
+ NULL != child;
+ child = gtk_widget_get_next_sibling (child))
+ gtk_widget_set_visible (child,
+ FALSE);
}
void
AG_show_children (const char *name)
{
- GList *children;
-
- children = gtk_container_get_children (GTK_CONTAINER (
- GCG_get_main_window_object (name)));
- for (GList *iter = children; iter != NULL; iter = g_list_next (iter))
- gtk_widget_show (GTK_WIDGET (iter->data));
- g_list_free (children);
-
+ for (GtkWidget *child = first_child (name);
+ NULL != child;
+ child = gtk_widget_get_next_sibling (child))
+ gtk_widget_set_visible (child,
+ TRUE);
}
@@ -240,10 +257,8 @@ AG_enable_next (void)
AG_sensitive ("anastasis_gtk_main_window_forward_button");
fwd = GTK_WIDGET (GCG_get_main_window_object (
"anastasis_gtk_main_window_forward_button"));
- gtk_widget_set_can_default (fwd,
- true);
- gtk_widget_grab_default (fwd);
-
+ gtk_window_set_default_widget (GTK_WINDOW (gtk_widget_get_root (fwd)),
+ fwd);
}
@@ -284,7 +299,8 @@ AG_error (const char *format,
msg);
free (msg);
AG_have_error = true;
- gtk_widget_show (GTK_WIDGET (l));
+ gtk_widget_set_visible (GTK_WIDGET (l),
+ TRUE);
}
@@ -340,9 +356,8 @@ create_qrcode (unsigned int scale,
QRinput_free (qri);
return NULL;
}
- /* We use a trick to create a pixbuf in a way that works for both Gtk2 and
- Gtk3 by loading a dummy file from disk; all other methods are not portable
- to both Gtk2 and Gtk3. */
+ /* We create the pixbuf by loading a dummy file from disk, which gives us
+ the pixel layout the renderer expects. */
dir = ANASTASIS_GTK_get_data_dir (ANASTASIS_GTK_project_data ());
GNUNET_asprintf (&fn,
"%s%s",
@@ -386,7 +401,6 @@ AG_setup_qrcode (GtkWidget *w,
const char *text,
size_t text_size)
{
- GdkScreen *screen;
GtkSettings *settings;
gint dpi;
int scale;
@@ -397,8 +411,7 @@ AG_setup_qrcode (GtkWidget *w,
return NULL;
}
/* adjust scale to screen resolution */
- screen = gtk_widget_get_screen (w);
- settings = gtk_settings_get_for_screen (screen);
+ settings = gtk_widget_get_settings (w);
g_object_get (G_OBJECT (settings),
"gtk-xft-dpi",
&dpi,
@@ -417,6 +430,19 @@ AG_setup_qrcode (GtkWidget *w,
}
+void
+AG_image_set_from_pixbuf (GtkImage *img,
+ GdkPixbuf *pb)
+{
+ GdkTexture *texture;
+
+ texture = gdk_texture_new_for_pixbuf (pb);
+ gtk_image_set_from_paintable (img,
+ GDK_PAINTABLE (texture));
+ g_object_unref (texture);
+}
+
+
char *
AG_expand_name (const char *name,
const char *type)
@@ -451,36 +477,30 @@ AG_expand_name (const char *name,
/**
- * Show widget on focus-in event.
+ * Show widget when the watched entry takes the focus.
*
- * @param w widget to show (called with 'swapped' true!)
- * @param event the event
- * @param widget the widget being focused on
- * @return FALSE
+ * @param w widget to show (the UI file connects this 'swapped')
+ * @param controller the focus controller of the entry
*/
-bool
-anastasis_gtk_show_on_focus_in_event_cb (GtkWidget *w,
- GdkEvent *event,
- GtkWidget *widget)
+void
+anastasis_gtk_show_on_focus_enter_cb (GtkWidget *w,
+ GtkEventControllerFocus *controller)
{
- gtk_widget_show (w);
- return FALSE;
+ gtk_widget_set_visible (w,
+ TRUE);
}
/**
- * Hide widget on focus-out event.
+ * Hide widget when the watched entry loses the focus.
*
- * @param w widget to show (called with 'swapped' true!)
- * @param event the event
- * @param widget the widget being focused on
- * @return FALSE
+ * @param w widget to hide (the UI file connects this 'swapped')
+ * @param controller the focus controller of the entry
*/
-bool
-anastasis_gtk_hide_on_focus_out_event_cb (GtkWidget *w,
- GdkEvent *event,
- GtkWidget *widget)
+void
+anastasis_gtk_hide_on_focus_leave_cb (GtkWidget *w,
+ GtkEventControllerFocus *controller)
{
- gtk_widget_hide (w);
- return FALSE;
+ gtk_widget_set_visible (w,
+ FALSE);
}
diff --git a/src/anastasis/anastasis-gtk_helper.h b/src/anastasis/anastasis-gtk_helper.h
@@ -577,6 +577,18 @@ AG_setup_qrcode (GtkWidget *w,
/**
+ * Display @a pb in the GtkImage @a img. GTK4 images render paintables,
+ * so the pixbuf is wrapped in a texture first.
+ *
+ * @param img image widget to update
+ * @param pb pixbuf to show
+ */
+void
+AG_image_set_from_pixbuf (GtkImage *img,
+ GdkPixbuf *pb);
+
+
+/**
* Expand base @a name of a widget based on the @a type to
* create the name of the widget with the data.
*
diff --git a/src/anastasis/anastasis-gtk_io.c b/src/anastasis/anastasis-gtk_io.c
@@ -47,13 +47,13 @@ open_directory_dialog_response_cb (GtkDialog *dialog,
if (GTK_RESPONSE_OK != response_id)
{
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
return;
}
filename =
ANASTASIS_GTK_filechooser_get_filename_utf8 (GTK_FILE_CHOOSER (dialog));
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
AG_load (filename);
GNUNET_free (filename);
@@ -75,7 +75,7 @@ anastasis_gtk_open_state_clicked_cb (GtkButton *button,
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_open_file_dialog.glade",
+ "anastasis_gtk_open_file_dialog.ui",
NULL);
if (NULL == builder)
{
@@ -85,9 +85,9 @@ anastasis_gtk_open_state_clicked_cb (GtkButton *button,
ad = GTK_WIDGET (gtk_builder_get_object (builder,
"open_file_dialog"));
{
- GtkWidget *toplevel;
+ GtkRoot *toplevel;
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (button));
+ toplevel = gtk_widget_get_root (GTK_WIDGET (button));
gtk_window_set_transient_for (GTK_WINDOW (ad),
GTK_WINDOW (toplevel));
gtk_window_present (GTK_WINDOW (ad));
@@ -119,9 +119,73 @@ save_user_attributes_collecting (void)
/**
- * Function called from the open-directory dialog upon completion.
+ * Write the current state to @a filename, appending the ".ana" suffix if the
+ * user did not provide it.
*
- * @param dialog the pseudonym selection dialog
+ * @param filename where to write the state to, freed by this function
+ */
+static void
+write_state (char *filename)
+{
+ {
+ const char *ana;
+
+ ana = strstr (filename,
+ ".ana");
+ if ( (NULL == ana) ||
+ (4 != strlen (ana)) )
+ {
+ char *tmp;
+
+ GNUNET_asprintf (&tmp,
+ "%s.ana",
+ filename);
+ GNUNET_free (filename);
+ filename = tmp;
+ }
+ }
+ if (0 !=
+ json_dump_file (AG_redux_state,
+ filename,
+ JSON_COMPACT))
+ {
+ AG_error ("Failed to write state to `%s'\n",
+ filename);
+ }
+ GNUNET_free (filename);
+}
+
+
+/**
+ * The user answered the question whether they really want their secret written
+ * to disk in cleartext.
+ *
+ * @param dialog the warning dialog
+ * @param response_id #GTK_RESPONSE_OK if the user confirmed
+ * @param user_data the file name to write to
+ */
+static void
+cleartext_warning_response_cb (GtkDialog *dialog,
+ gint response_id,
+ gpointer user_data)
+{
+ char *filename = user_data;
+
+ gtk_window_destroy (GTK_WINDOW (dialog));
+ if (GTK_RESPONSE_OK != response_id)
+ {
+ /* user aborted */
+ GNUNET_free (filename);
+ return;
+ }
+ write_state (filename);
+}
+
+
+/**
+ * Function called from the save-file dialog upon completion.
+ *
+ * @param dialog the file selection dialog
* @param response_id response code from the dialog
* @param user_data the builder of the dialog
*/
@@ -141,14 +205,14 @@ save_directory_dialog_response_cb (GtkDialog *dialog,
if (GTK_RESPONSE_ACCEPT != response_id)
{
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
return;
}
(void) AG_dispatch (save_state);
filename =
ANASTASIS_GTK_filechooser_get_filename_utf8 (GTK_FILE_CHOOSER (dialog));
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (builder));
/* check if we should warn the user about writing 'core_secret' to disk */
@@ -161,10 +225,9 @@ save_directory_dialog_response_cb (GtkDialog *dialog,
(! json_is_null (cs)) )
{
GtkWidget *diag;
- gint ret;
- GtkWidget *toplevel;
+ GtkRoot *toplevel;
- toplevel = gtk_widget_get_toplevel (
+ toplevel = gtk_widget_get_root (
GTK_WIDGET (GCG_get_main_window_object (
"anastasis_gtk_main_window")));
diag = gtk_message_dialog_new (
@@ -173,46 +236,17 @@ save_directory_dialog_response_cb (GtkDialog *dialog,
GTK_MESSAGE_QUESTION,
GTK_BUTTONS_OK_CANCEL,
_ ("This will write your secret to disk in cleartext!"));
- ret = gtk_dialog_run (GTK_DIALOG (diag));
- gtk_widget_destroy (diag);
- switch (ret)
- {
- case GTK_RESPONSE_OK:
- break;
- default:
- /* user aborted */
- return;
- }
+ g_signal_connect (diag,
+ "response",
+ G_CALLBACK (&cleartext_warning_response_cb),
+ filename);
+ gtk_window_present (GTK_WINDOW (diag));
+ return;
}
}
/* all good, do writing! */
- {
- const char *ana;
-
- ana = strstr (filename,
- ".ana");
- if ( (NULL == ana) ||
- (4 != strlen (ana)) )
- {
- char *tmp;
-
- GNUNET_asprintf (&tmp,
- "%s.ana",
- filename);
- GNUNET_free (filename);
- filename = tmp;
- }
- }
- if (0 !=
- json_dump_file (AG_redux_state,
- filename,
- JSON_COMPACT))
- {
- AG_error ("Failed to write state to `%s'\n",
- filename);
- }
- GNUNET_free (filename);
+ write_state (filename);
}
@@ -228,12 +262,12 @@ anastasis_gtk_main_window_save_as_button_clicked_cb (GtkButton *button,
{
GtkWidget *ad;
GtkBuilder *builder;
- GtkWidget *toplevel;
+ GtkRoot *toplevel;
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (button));
+ toplevel = gtk_widget_get_root (GTK_WIDGET (button));
builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_save_file_dialog.glade",
+ "anastasis_gtk_save_file_dialog.ui",
NULL);
if (NULL == builder)
{
diff --git a/src/anastasis/anastasis-gtk_pe-edit-policy.c b/src/anastasis/anastasis-gtk_pe-edit-policy.c
@@ -108,11 +108,19 @@ struct EditDialogContext
/**
+ * Key under which the dialog's `struct EditDialogContext` is attached to its
+ * builder. GtkBuilder hands the builder itself to the signal handlers, so
+ * that is where we keep our own state.
+ */
+#define EDC_KEY "anastasis-edit-dialog-context"
+
+
+/**
* Handle the response from the edit dialog.
*
* @param dialog the dialog
* @param response_id what the user's action was
- * @param user_data a `struct EditDialogContext`
+ * @param user_data the builder of the dialog
*/
void
anastasis_gtk_policy_edit_dialog_response_cb (
@@ -120,7 +128,8 @@ anastasis_gtk_policy_edit_dialog_response_cb (
gint response_id,
gpointer user_data)
{
- struct EditDialogContext *edc = user_data;
+ struct EditDialogContext *edc = g_object_get_data (G_OBJECT (user_data),
+ EDC_KEY);
if (GTK_RESPONSE_OK == response_id)
{
@@ -200,7 +209,7 @@ anastasis_gtk_policy_edit_dialog_response_cb (
GNUNET_free (lctx);
}
}
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ gtk_window_destroy (GTK_WINDOW (dialog));
g_object_unref (G_OBJECT (edc->builder));
GNUNET_free (edc);
}
@@ -441,8 +450,8 @@ AG_edit_policy (guint pindex)
edc = GNUNET_new (struct EditDialogContext);
edc->builder = ANASTASIS_GTK_get_new_builder (
ANASTASIS_GTK_project_data (),
- "anastasis_gtk_edit_policy.glade",
- edc);
+ "anastasis_gtk_edit_policy.ui",
+ NULL);
edc->pindex = pindex;
if (NULL == edc->builder)
{
@@ -450,6 +459,9 @@ AG_edit_policy (guint pindex)
GNUNET_free (edc);
return;
}
+ g_object_set_data (G_OBJECT (edc->builder),
+ EDC_KEY,
+ edc);
if (UINT_MAX != pindex)
{
json_t *policies;
@@ -533,18 +545,16 @@ AG_edit_policy (guint pindex)
lctx);
gtk_grid_insert_row (grid,
row);
- gtk_widget_show (label);
gtk_grid_attach (grid,
label,
0,
row,
1,
1);
- g_object_set (cb,
- "expand",
- TRUE,
- NULL);
- gtk_widget_show (cb);
+ gtk_widget_set_hexpand (cb,
+ TRUE);
+ gtk_widget_set_vexpand (cb,
+ TRUE);
gtk_grid_attach (grid,
cb,
1,
@@ -555,23 +565,23 @@ AG_edit_policy (guint pindex)
}
}
{
- GtkWidget *toplevel;
+ GtkRoot *toplevel;
GtkWidget *ad;
GtkWidget *anchor;
GtkRequisition req;
anchor = GTK_WIDGET (GCG_get_main_window_object (
"anastasis_gtk_main_window_quit_button"));
- toplevel = gtk_widget_get_toplevel (anchor);
+ toplevel = gtk_widget_get_root (anchor);
ad = GTK_WIDGET (gtk_builder_get_object (edc->builder,
"anastasis_gtk_policy_edit_dialog")
);
gtk_widget_get_preferred_size (ad,
NULL,
&req);
- gtk_window_resize (GTK_WINDOW (ad),
- req.width,
- req.height);
+ gtk_window_set_default_size (GTK_WINDOW (ad),
+ req.width,
+ req.height);
gtk_window_set_transient_for (GTK_WINDOW (ad),
GTK_WINDOW (toplevel));
gtk_window_present (GTK_WINDOW (ad));
diff --git a/src/anastasis/anastasis-gtk_progress.c b/src/anastasis/anastasis-gtk_progress.c
@@ -28,31 +28,30 @@
/**
- * Ensure signals are ignored where the user
- * clicks in the widget.
- */
-gboolean
-anastasis_gtk_backup_progress_treeview_button_press_event_cb (
- GtkWidget *widget,
- GdkEvent *event,
- gpointer user_data)
-{
- return TRUE;
-}
-
-
-/**
- * Ensure signals are ignored where the user
- * clicks in the widget.
+ * The progress tree views only report where we are in the process; the user
+ * must not be able to change the selection by clicking. The gesture runs in
+ * the capture phase, so claiming the sequence here keeps the click from ever
+ * reaching the tree view.
+ *
+ * @param gesture the click gesture of the tree view
+ * @param n_press number of presses
+ * @param x horizontal position of the click
+ * @param y vertical position of the click
+ * @param user_data NULL
*/
-gboolean
-anastasis_gtk_recovery_progress_treeview_button_press_event_cb (
- GtkWidget *widget,
- GdkEvent *event,
- gpointer
- user_data)
+void
+anastasis_gtk_progress_treeview_pressed_cb (GtkGestureClick *gesture,
+ gint n_press,
+ gdouble x,
+ gdouble y,
+ gpointer user_data)
{
- return TRUE;
+ (void) n_press;
+ (void) x;
+ (void) y;
+ (void) user_data;
+ gtk_gesture_set_state (GTK_GESTURE (gesture),
+ GTK_EVENT_SEQUENCE_CLAIMED);
}
diff --git a/src/anastasis/meson.build b/src/anastasis/meson.build
@@ -57,7 +57,6 @@ executable(
anastasis_gtk_SOURCES,
dependencies: [
libanastasisgtkutil_dep,
- glade_dep,
gtk_dep,
gnunetutil_dep,
gnunetjson_dep,
@@ -75,24 +74,21 @@ executable(
haru_dep,
],
include_directories: [incdir, configuration_inc],
+ # GtkBuilder resolves the signal handler names in the .ui files against
+ # this binary's dynamic symbol table via GModule, so the handlers must be
+ # exported.
+ export_dynamic: true,
install: true,
)
-
-#EXTRA_DIST = \
-# gettext.h
-#
-#if HPDF_ENABLED
-#noinst_PROGRAMS = \
-# test-print
-#
-#test_print_SOURCES = \
-# test-print.c \
-# print.c
-#test_print_LDADD = \
-# $(HPDF_LIBS) \
-# -lgnunetutil \
-# -ljansson
-#test_print_CFLAGS = \
-# $(HPDF_CFLAGS)
-#endif
+# Developer helper for the PDF rendering code; not installed
+# (was noinst_PROGRAMS under HPDF_ENABLED in the autotools build).
+if haru_dep.found()
+ executable(
+ 'test-print',
+ ['test-print.c', 'print.c'],
+ dependencies: [haru_dep, gnunetutil_dep, json_dep],
+ include_directories: [incdir, configuration_inc],
+ install: false,
+ )
+endif
diff --git a/src/include/anastasis_gtk_util.h b/src/include/anastasis_gtk_util.h
@@ -25,16 +25,8 @@
#include <gtk/gtk.h>
-#include <gladeui/glade.h>
#include <gdk/gdkkeysyms.h>
-#ifndef GDK_KEY_Return
-#define GDK_KEY_Return GDK_Return
-#endif
-#ifndef GDK_KEY_Delete
-#define GDK_KEY_Delete GDK_Delete
-#endif
-
#define _(String) dgettext (PACKAGE, String)
#define DIR_SEPARATOR_STR "/"
@@ -94,39 +86,24 @@ ANASTASIS_GTK_installation_get_path (
enum GNUNET_OS_InstallationPathKind dirkind);
-/* **************** Glade/Gtk helpers *************** */
+/* **************** GtkBuilder helpers ************** */
/**
- * Create an initialize a new builder based on the
- * GNUnet-GTK glade file.
+ * Create and initialize a new builder from one of our GtkBuilder UI
+ * files. Signal handlers named in the file are resolved against the
+ * binary's dynamic symbols and connected while the file is parsed.
*
* @param pd project data to use
* @param filename name of the resource file to load
- * @param user_data user_data to pass to signal handlers,
+ * @param user_data object to pass to signal handlers,
* use "NULL" to pass the GtkBuilder itself.
- * @param cb function to call before connecting signals
* @return NULL on error
*/
GtkBuilder *
-ANASTASIS_GTK_get_new_builder2 (
+ANASTASIS_GTK_get_new_builder (
const struct GNUNET_OS_ProjectData *pd,
const char *filename,
- void *user_data,
- GtkBuilderConnectFunc cb);
-
-
-/**
- * Create an initialize a new builder based on the GNUnet-GTK glade
- * file.
- *
- * @param pd project data to use
- * @param filename name of the resource file to load
- * @param user_data user_data to pass to signal handlers,
- * use "NULL" to pass the GtkBuilder itself.
- * @return NULL on error
- */
-#define ANASTASIS_GTK_get_new_builder(pd, filename, user_data) \
- ANASTASIS_GTK_get_new_builder2 (pd, filename, user_data, NULL)
+ GObject *user_data);
/**
@@ -140,7 +117,7 @@ ANASTASIS_GTK_from_loc_to_utf8 (const char *str_loc);
/**
- * Returns filename form filechooser, encoded in UTF-8.
+ * Returns filename from a file chooser, encoded in UTF-8.
*
* @param fc file chooser to inspect
* @return selected filename as UTF-8, NULL on errors
@@ -149,6 +126,14 @@ char *
ANASTASIS_GTK_filechooser_get_filename_utf8 (GtkFileChooser *fc);
+/**
+ * Load the application's style sheet. Called once GTK is up.
+ */
+void
+ANASTASIS_GTK_load_css (
+ const struct GNUNET_OS_ProjectData *pd);
+
+
/* ******************* main loop ***************** */
@@ -161,7 +146,7 @@ ANASTASIS_GTK_filechooser_get_filename_utf8 (GtkFileChooser *fc);
* @param argc number of command line options
* @param argv command line options
* @param options allowed command line options
- * @param main_window_file glade file for the main window
+ * @param main_window_file GtkBuilder UI file for the main window
* @param main_task first task to run, closure will be set to the `struct
* ANASTASIS_GTK_MainLoop`
* @return #GNUNET_OK on success, #GNUNET_SYSERR on error (i.e. bad command-line
@@ -221,13 +206,14 @@ ANASTASIS_GTK_main_loop_get_args (struct ANASTASIS_GTK_MainLoop *ml,
* @param pd project data to use
* @param ml main loop contextual data
* @param data additional argument to pass to #ANASTASIS_GTK_get_new_builder()
+ * (may be NULL to pass the builder itself)
* @return #GNUNET_OK on success, #GNUNET_SYSERR on failure
*/
int
ANASTASIS_GTK_main_loop_build_window (
const struct GNUNET_OS_ProjectData *pd,
struct ANASTASIS_GTK_MainLoop *ml,
- gpointer data);
+ GObject *data);
/**
diff --git a/src/util/builder.c b/src/util/builder.c
@@ -0,0 +1,134 @@
+/*
+ This file is part of GNUnet.
+ Copyright (C) 2010, 2024 GNUnet e.V.
+
+ GNUnet is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation; either version 3, or (at your
+ option) any later version.
+
+ GNUnet is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GNUnet; see the file COPYING. If not, write to the
+ Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
+
+/**
+ * @file src/util/builder.c
+ * @brief code for integration with GtkBuilder
+ * @author Christian Grothoff
+ */
+#include "anastasis_gtk_config.h"
+#include "anastasis_gtk_util.h"
+
+
+void
+ANASTASIS_GTK_set_icon_search_path (const struct GNUNET_OS_ProjectData *pd)
+{
+ char *buf;
+
+ buf = GNUNET_OS_installation_get_path (pd,
+ GNUNET_OS_IPK_ICONDIR);
+ gtk_icon_theme_add_search_path (
+ gtk_icon_theme_get_for_display (gdk_display_get_default ()),
+ buf);
+ GNUNET_free (buf);
+}
+
+
+const char *
+ANASTASIS_GTK_get_data_dir (const struct GNUNET_OS_ProjectData *pd)
+{
+ static char *dd;
+
+ if (NULL == dd)
+ dd = GNUNET_OS_installation_get_path (pd,
+ GNUNET_OS_IPK_DATADIR);
+ return dd;
+}
+
+
+void
+ANASTASIS_GTK_load_css (const struct GNUNET_OS_ProjectData *pd)
+{
+ GtkCssProvider *css;
+ char *path;
+
+ GNUNET_asprintf (&path,
+ "%s%s",
+ ANASTASIS_GTK_get_data_dir (pd),
+ "anastasis-gtk.css");
+ css = gtk_css_provider_new ();
+ gtk_css_provider_load_from_path (css,
+ path);
+ gtk_style_context_add_provider_for_display (
+ gdk_display_get_default (),
+ GTK_STYLE_PROVIDER (css),
+ GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+ GNUNET_free (path);
+ g_object_unref (css);
+}
+
+
+GtkBuilder *
+ANASTASIS_GTK_get_new_builder (const struct GNUNET_OS_ProjectData *pd,
+ const char *filename,
+ GObject *user_data)
+{
+ char *ui_path;
+ GtkBuilder *ret;
+ GError *error;
+
+ ret = gtk_builder_new ();
+ /* GtkBuilder connects the signals named in the file while it parses it, and
+ passes the "current object" to the handlers as their user data, so this
+ has to be set before anything is loaded. */
+ gtk_builder_set_current_object (ret,
+ (NULL != user_data)
+ ? user_data
+ : G_OBJECT (ret));
+ GNUNET_asprintf (&ui_path,
+ "%s%s",
+ ANASTASIS_GTK_get_data_dir (pd),
+ filename);
+ error = NULL;
+ if (0 == gtk_builder_add_from_file (ret,
+ ui_path,
+ &error))
+ {
+ GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+ _ ("Failed to load `%s': %s\n"),
+ ui_path,
+ error->message);
+ g_error_free (error);
+ GNUNET_free (ui_path);
+ g_object_unref (G_OBJECT (ret));
+ return NULL;
+ }
+ GNUNET_free (ui_path);
+ return ret;
+}
+
+
+void
+GNUNET_FS_GTK_remove_treestore_subtree (GtkTreeStore *ts,
+ GtkTreeIter *root)
+{
+ GtkTreeIter child;
+
+ while (gtk_tree_model_iter_children (GTK_TREE_MODEL (ts),
+ &child,
+ root))
+ GNUNET_FS_GTK_remove_treestore_subtree (ts,
+ &child);
+ gtk_tree_store_remove (ts,
+ root);
+}
+
+
+/* end of builder.c */
diff --git a/src/util/eventloop.c b/src/util/eventloop.c
@@ -24,9 +24,6 @@
* @author Christian Grothoff
*/
#include "anastasis_gtk_util.h"
-#if HAVE_GTK_GTKX_H
-#include <gtk/gtkx.h>
-#endif
/**
* Initial size of our poll array cache.
@@ -55,7 +52,7 @@ struct ANASTASIS_GTK_MainLoop
struct GNUNET_CONFIGURATION_Handle *gnunet_cfg;
/**
- * Name of the glade file for the main window
+ * Name of the GtkBuilder UI file for the main window
*/
const char *main_window_file;
@@ -167,12 +164,13 @@ int
ANASTASIS_GTK_main_loop_build_window (
const struct GNUNET_OS_ProjectData *pd,
struct ANASTASIS_GTK_MainLoop *ml,
- gpointer data)
+ GObject *data)
{
ANASTASIS_GTK_set_icon_search_path (pd);
+ ANASTASIS_GTK_load_css (pd);
ml->builder = ANASTASIS_GTK_get_new_builder (pd,
- ml->main_window_file,
- data);
+ ml->main_window_file,
+ data);
if (NULL == ml->builder)
{
ANASTASIS_GTK_main_loop_quit (ml);
@@ -441,7 +439,7 @@ gnunet_gtk_select (void *cls,
/**
* Actual main function run right after GNUnet's scheduler
- * is initialized. Initializes up GTK and Glade and starts the
+ * is initialized. Initializes GTK and starts the
* combined event loop.
*
* @param cls the `struct ANASTASIS_GTK_MainLoop`
@@ -460,11 +458,12 @@ run_main_loop (void *cls,
= GNUNET_OS_project_data_gnunet ();
int argc;
- /* command-line processing for Gtk arguments */
+ /* GTK4 no longer consumes command-line arguments of its own, so whatever
+ GNUnet's option parser left over is ours to interpret */
argc = 0;
while (NULL != args[argc])
argc++;
- gtk_init (&argc, (char ***) &args);
+ gtk_init ();
ml->argc = argc;
ml->argv = args;
diff --git a/src/util/glade.c b/src/util/glade.c
@@ -1,112 +0,0 @@
-/*
- This file is part of GNUnet.
- Copyright (C) 2010, 2024 GNUnet e.V.
-
- GNUnet is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published
- by the Free Software Foundation; either version 3, or (at your
- option) any later version.
-
- GNUnet is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with GNUnet; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-/**
- * @file src/lib/glade.c
- * @brief code for integration with glade
- * @author Christian Grothoff
- */
-#include "anastasis_gtk_config.h"
-#include "anastasis_gtk_util.h"
-
-
-void
-ANASTASIS_GTK_set_icon_search_path (const struct GNUNET_OS_ProjectData *pd)
-{
- char *buf;
-
- buf = GNUNET_OS_installation_get_path (pd,
- GNUNET_OS_IPK_ICONDIR);
- gtk_icon_theme_append_search_path (gtk_icon_theme_get_default (),
- buf);
- GNUNET_free (buf);
-}
-
-
-const char *
-ANASTASIS_GTK_get_data_dir (const struct GNUNET_OS_ProjectData *pd)
-{
- static char *dd;
-
- if (NULL == dd)
- dd = GNUNET_OS_installation_get_path (pd,
- GNUNET_OS_IPK_DATADIR);
- return dd;
-}
-
-
-GtkBuilder *
-ANASTASIS_GTK_get_new_builder2 (const struct GNUNET_OS_ProjectData *pd,
- const char *filename,
- void *user_data,
- GtkBuilderConnectFunc cb)
-{
- char *glade_path;
- GtkBuilder *ret;
- GError *error;
-
- ret = gtk_builder_new ();
- GNUNET_asprintf (&glade_path,
- "%s%s",
- ANASTASIS_GTK_get_data_dir (pd),
- filename);
- error = NULL;
- if (0 == gtk_builder_add_from_file (ret,
- glade_path,
- &error))
- {
- GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
- _ ("Failed to load `%s': %s\n"),
- glade_path,
- error->message);
- g_error_free (error);
- GNUNET_free (glade_path);
- return NULL;
- }
- if (NULL == user_data)
- user_data = ret;
- if (NULL != cb)
- gtk_builder_connect_signals_full (ret,
- cb, user_data);
- else
- gtk_builder_connect_signals (ret,
- user_data);
- GNUNET_free (glade_path);
- return ret;
-}
-
-
-void
-GNUNET_FS_GTK_remove_treestore_subtree (GtkTreeStore *ts,
- GtkTreeIter *root)
-{
- GtkTreeIter child;
-
- while (gtk_tree_model_iter_children (GTK_TREE_MODEL (ts),
- &child,
- root))
- GNUNET_FS_GTK_remove_treestore_subtree (ts,
- &child);
- gtk_tree_store_remove (ts,
- root);
-}
-
-
-/* end of glade.c */
diff --git a/src/util/meson.build b/src/util/meson.build
@@ -1,14 +1,13 @@
# This file is in the public domain
libanastasisgtkutil = library(
'anastasisgtkutil',
- ['eventloop.c','glade.c','nls.c','os_installation.c'],
+ ['eventloop.c', 'builder.c', 'nls.c', 'os_installation.c'],
soversion: solibversions['libanastasisgtkutil']['soversion'],
version: solibversions['libanastasisgtkutil']['soversion'],
install_rpath: rpath_option,
dependencies: [
gnunetutil_dep,
gtk_dep,
- glade_dep,
],
include_directories: [incdir, configuration_inc],
install: true,
diff --git a/src/util/nls.c b/src/util/nls.c
@@ -137,8 +137,14 @@ char *
ANASTASIS_GTK_filechooser_get_filename_utf8 (GtkFileChooser *fc)
{
char *filename_utf8;
- gchar *filename = gtk_file_chooser_get_filename (fc);
+ GFile *file;
+ gchar *filename;
+ file = gtk_file_chooser_get_file (fc);
+ if (NULL == file)
+ return NULL;
+ filename = g_file_get_path (file);
+ g_object_unref (file);
if (NULL == filename)
return NULL;
filename_utf8 = from_filename_to_utf8 (filename);