From ee42338c88b7af54fbf193edb235f30c0b98825b Mon Sep 17 00:00:00 2001 From: Nico Alt <nicoalt@posteo.org> Date: Sat, 14 Dec 2019 22:11:08 +0100 Subject: [PATCH] Delete everything GTK specific Because the two independent Briar projects briar_repl and Briar GTK combine forces, the api wrapper part that used to be part of Briar GTK now becomes a new project on its own: python-briar-wrapper. With this commit, everything specific to GTK and GNOME gets deleted. --- .coveragerc | 7 - CONTRIBUTING.md | 93 ------ app.briar.gtk.json | 117 ------- code-of-conduct.md | 126 -------- data/app.briar.gtk.appdata.xml.in | 19 -- data/app.briar.gtk.desktop.in | 10 - data/app.briar.gtk.gschema.xml | 5 - .../hicolor/16x16/apps/app.briar.gtk.png | Bin 1093 -> 0 bytes .../hicolor/22x22/apps/app.briar.gtk.png | Bin 1271 -> 0 bytes .../hicolor/256x256/apps/app.briar.gtk.png | Bin 7597 -> 0 bytes .../hicolor/32x32/apps/app.briar.gtk.png | Bin 1600 -> 0 bytes .../hicolor/48x48/apps/app.briar.gtk.png | Bin 1996 -> 0 bytes .../hicolor/512x512/apps/app.briar.gtk.png | Bin 15117 -> 0 bytes .../hicolor/scalable/apps/app.briar.gtk.svg | 157 --------- data/icons/meson.build | 8 - data/meson.build | 57 ---- data/ui/add_contact.ui | 266 --------------- data/ui/app.briar.gtk.gresource.xml | 12 - data/ui/application.css | 4 - data/ui/chat.ui | 42 --- data/ui/login.ui | 147 --------- data/ui/main.ui | 22 -- data/ui/registration.ui | 304 ------------------ data/ui/toolbar_start.ui | 52 --- po/LINGUAS | 2 - po/POTFILES | 7 - po/briar-gtk.pot | 111 ------- po/de.po | 128 -------- po/es.po | 124 ------- po/meson.build | 5 - src/briar-gtk.in | 57 ---- src/briar/gtk/application.py | 64 ---- src/briar/gtk/container.py | 12 - src/briar/gtk/containers/add_contact.py | 139 -------- src/briar/gtk/containers/chat.py | 59 ---- src/briar/gtk/containers/login.py | 85 ----- src/briar/gtk/containers/main.py | 62 ---- src/briar/gtk/containers/registration.py | 138 -------- src/briar/gtk/containers/startup.py | 23 -- src/briar/gtk/define.py | 16 - src/briar/gtk/toolbar.py | 51 --- src/briar/gtk/window.py | 109 ------- src/meson_post_install.py | 24 -- tests/briar/gtk/test_application.py | 139 -------- tests/briar/gtk/test_toolbar.py | 50 --- tools/generate_data.sh | 52 --- 46 files changed, 2905 deletions(-) delete mode 100644 .coveragerc delete mode 100644 CONTRIBUTING.md delete mode 100644 app.briar.gtk.json delete mode 100644 code-of-conduct.md delete mode 100644 data/app.briar.gtk.appdata.xml.in delete mode 100644 data/app.briar.gtk.desktop.in delete mode 100644 data/app.briar.gtk.gschema.xml delete mode 100644 data/icons/hicolor/16x16/apps/app.briar.gtk.png delete mode 100644 data/icons/hicolor/22x22/apps/app.briar.gtk.png delete mode 100644 data/icons/hicolor/256x256/apps/app.briar.gtk.png delete mode 100644 data/icons/hicolor/32x32/apps/app.briar.gtk.png delete mode 100644 data/icons/hicolor/48x48/apps/app.briar.gtk.png delete mode 100644 data/icons/hicolor/512x512/apps/app.briar.gtk.png delete mode 100644 data/icons/hicolor/scalable/apps/app.briar.gtk.svg delete mode 100644 data/icons/meson.build delete mode 100644 data/meson.build delete mode 100644 data/ui/add_contact.ui delete mode 100644 data/ui/app.briar.gtk.gresource.xml delete mode 100644 data/ui/application.css delete mode 100644 data/ui/chat.ui delete mode 100644 data/ui/login.ui delete mode 100644 data/ui/main.ui delete mode 100644 data/ui/registration.ui delete mode 100644 data/ui/toolbar_start.ui delete mode 100644 po/LINGUAS delete mode 100644 po/POTFILES delete mode 100644 po/briar-gtk.pot delete mode 100644 po/de.po delete mode 100644 po/es.po delete mode 100644 po/meson.build delete mode 100755 src/briar-gtk.in delete mode 100644 src/briar/gtk/application.py delete mode 100644 src/briar/gtk/container.py delete mode 100644 src/briar/gtk/containers/add_contact.py delete mode 100644 src/briar/gtk/containers/chat.py delete mode 100644 src/briar/gtk/containers/login.py delete mode 100644 src/briar/gtk/containers/main.py delete mode 100644 src/briar/gtk/containers/registration.py delete mode 100644 src/briar/gtk/containers/startup.py delete mode 100644 src/briar/gtk/define.py delete mode 100644 src/briar/gtk/toolbar.py delete mode 100644 src/briar/gtk/window.py delete mode 100755 src/meson_post_install.py delete mode 100644 tests/briar/gtk/test_application.py delete mode 100644 tests/briar/gtk/test_toolbar.py delete mode 100755 tools/generate_data.sh diff --git a/.coveragerc b/.coveragerc deleted file mode 100644 index baf1ca1..0000000 --- a/.coveragerc +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright (c) 2019 Nico Alt -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md - -[run] -omit = - src/meson_post_install.py diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index d246aa7..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,93 +0,0 @@ -## Contributing to Briar GTK - -Thank you for looking in this file! - -When contributing to the development of Briar GTK, please first discuss the change you wish to make via issue, email, or any other method with the maintainers before making a change. - -If you have any questions regarding the use or development of Briar GTK, -want to discuss design or simply hang out, please join us in [Briar's Mattermost chat](https://chat.briarproject.org/), [#briar on freenode.net](irc://freenode.net/#briar) or [the bridge to the Matrix network](https://matrix.to/#/#freenode_#briar:matrix.org). - -Please note we have a [code of conduct](/code-of-conduct.md), please follow it in all your interactions with the project. - -## Source repository - -Briar GTK's main source repository is at [code.briarproject.org/nicoalt/briar-gtk](https://code.briarproject.org/nicoalt/briar-gtk). - -Development happens in the master branch. - -If you need to publish a branch, feel free to do it at any -publically-accessible Git hosting service, although code.briarproject.org -makes things easier for the maintainers. - -## Style - -We use pycodestyle and pylint for code formatting and we enforce it on the GitLab CI server. - -## Running the test suite - -You can run the tests with the script at [tools/run-tests.sh](tools/run-tests.sh). - -# Issues, issues and more issues! - -There are many ways you can contribute to Briar GTK, and all of them involve creating issues -in [Briar GTK's issue tracker](https://code.briarproject.org/nicoalt/briar-gtk/issues). This is the entry point for your contribution. - -To create an effective and high quality ticket, try to put the following information on your -ticket: - - 1. A detailed description of the issue or feature request - - For issues, please add the necessary steps to reproduce the issue. - - For feature requests, add a detailed description of your proposal. - 2. A checklist of Development tasks - 3. A checklist of Design tasks - 4. A checklist of QA tasks - -## Issue template -``` -[Title of the issue or feature request] - -Detailed description of the issue. Put as much information as you can, potentially -with images showing the issue or mockups of the proposed feature. - -If it's an issue, add the steps to reproduce like this: - -Steps to reproduce: - -1. Open Briar GTK -2. Do an Action -3. ... - -## Design Tasks - -* [ ] design tasks - -## Development Tasks - -* [ ] development tasks - -## QA Tasks - -* [ ] qa (quality assurance) tasks -``` - -## Merge Request Process - -1. Ensure your code compiles. -2. Ensure the test suit passes. Run `tools/run-tests.sh`. -3. If you're adding new API, it must be properly documented. -4. The commit message has to be formatted as follows: - ``` - component: <summary> - - A paragraph explaining the problem and its context. - - Another one explaining how you solved that. - - <link to the bug ticket> - ``` -5. You may merge the merge request once you have the sign-off of the maintainers, or if you - do not have permission to do that, you may request the second reviewer to merge it for you. - -## Code of Conduct - -We follow the [GNOME Foundation Code of Conduct](/code-of-conduct.md). diff --git a/app.briar.gtk.json b/app.briar.gtk.json deleted file mode 100644 index 343bb08..0000000 --- a/app.briar.gtk.json +++ /dev/null @@ -1,117 +0,0 @@ -{ - "app-id": "app.briar.gtk", - "runtime": "org.gnome.Platform", - "runtime-version": "3.32", - "sdk": "org.gnome.Sdk", - "sdk-extensions": [ - "org.freedesktop.Sdk.Extension.openjdk11" - ], - "command": "briar-gtk", - "finish-args": [ - "--share=network", - "--share=ipc", - "--socket=x11", - "--socket=wayland", - "--filesystem=xdg-run/dconf", - "--filesystem=~/.config/dconf:ro", - "--filesystem=~/.briar", - "--talk-name=ca.desrt.dconf", - "--env=DCONF_USER_CONFIG_DIR=.config/dconf", - "--env=PATH=/app/bin:/usr/bin:/app/jre/bin" - ], - "build-options": { - "cflags": "-O2 -g", - "cxxflags": "-O2 -g", - "env": { - "V": "1" - } - }, - "cleanup": [ - "/include", - "/lib/pkgconfig", - "/man", - "/share/doc", - "/share/gtk-doc", - "/share/man", - "/share/pkgconfig", - "*.la", - "*.a" - ], - "modules": [ - { - "name": "openjdk", - "buildsystem": "simple", - "build-commands": [ - "/usr/lib/sdk/openjdk11/install.sh" - ] - }, - { - "name": "python-dependencies", - "buildsystem": "simple", - "build-commands": [ - "pip3 install --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} requests2 websockets" - ], - "sources": [ - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/18/b0/8146a4f8dd402f60744fa380bc73ca47303cccf8b9190fd16a827281eac2/certifi-2019.9.11-py2.py3-none-any.whl", - "sha256": "fd7c7c74727ddcf00e9acd26bba8da604ffec95bf1c2144e67aff7a8b50e6cef" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/24/53/f397db567de0aa0e81b211d81c13c41a779f14893e42189cf5bdb97611b2/urllib3-1.21.1-py2.py3-none-any.whl", - "sha256": "8ed6d5c1ff9d6ba84677310060d6a3a78ca3072ce0684cb3c645023009c114b1" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl", - "sha256": "fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/89/f0/7cd1a25af31a5d4971d2eac794b0bc31eb445b28cadd621d4ad04be5ae4c/requests2-2.16.0-py2.py3-none-any.whl", - "sha256": "141d4f8ad6c1b68932d54f71f303c2aef681556b519c490ec83da193761a9f91" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/11/7d/9bbbd7bb35f34b0169542487d2a8859e44306bb2e6a4455d491800a5621f/idna-2.5-py2.py3-none-any.whl", - "sha256": "cc19709fd6d0cbfed39ea875d29ba6d4e22c0cebc510a76d6302a28385e8bb70" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/79/78/17e97a159dc55308b1468a638c7267f19765281f6205ec9c15253c154022/websockets-8.0.2.tar.gz", - "sha256": "882a7266fa867a2ebb2c0baaa0f9159cabf131cf18c1b4270d79ad42f9208dc5" - } - ] - }, - { - "name": "briar-headless", - "buildsystem": "simple", - "build-commands": [ - "mkdir -p /app/briar", - "install -Dm644 briar-headless.jar /app/briar/briar-headless.jar" - ], - "sources": [ - { - "type": "file", - "url": "https://media.dorfbrunnen.eu/briar/jars/007/briar-headless.jar", - "sha256": "3dea594a88be91d2b40a61adcfdf03432dc9e3c2865317ccd7799e13321200ec" - } - ] - }, - { - "name": "briar-gtk", - "buildsystem": "meson", - "config-opts": [ - "--libdir=lib" - ], - "builddir": true, - "sources": [ - { - "type": "dir", - "path": "." - } - ] - } - ] -} diff --git a/code-of-conduct.md b/code-of-conduct.md deleted file mode 100644 index c17d4d5..0000000 --- a/code-of-conduct.md +++ /dev/null @@ -1,126 +0,0 @@ -# GNOME Code of Conduct - -Thank you for being a part of the GNOME project. We value your participation and want everyone to have an enjoyable and fulfilling experience. Accordingly, all participants are expected to follow this Code of Conduct, and to show respect, understanding, and consideration to one another. Thank you for helping make this a welcoming, friendly community for everyone. - -## Scope - -This Code of Conduct applies to all online GNOME community spaces, including, but not limited to: - - * Issue tracking systems - bugzilla.gnome.org - * Documentation and tutorials - developer.gnome.org - * Code repositories - code.briarproject.org/nicoalt/briar-gtk, git.gnome.org and gitlab.gnome.org - * Mailing lists - mail.gnome.org - * Wikis - wiki.gnome.org - * Chat and forums - irc.gnome.org, discourse.gnome.org, GNOME Telegram channels, and GNOME groups and channels on Matrix.org (including bridges to GNOME IRC channels) - * Community spaces hosted on gnome.org infrastructure - * Any other channels or groups which exist in order to discuss GNOME project activities - -Communication channels and private conversations that are normally out of scope may be considered in scope if a GNOME participant is being stalked or harassed. Social media conversations may be considered in-scope if the incident occurred under a GNOME event hashtag, or when an official GNOME account on social media is tagged, or within any other discussion about GNOME. The GNOME Foundation reserves the right to take actions against behaviors that happen in any context, if they are deemed to be relevant to the GNOME project and its participants. - -All participants in GNOME online community spaces are subject to the Code of Conduct. This includes GNOME Foundation board members, corporate sponsors, and paid employees. This also includes volunteers, maintainers, leaders, contributors, contribution reviewers, issue reporters, GNOME users, and anyone participating in discussion in GNOME online spaces. - -## Reporting an Incident - -If you believe that someone is violating the Code of Conduct, or have -any other concerns, please [contact the Code of Conduct committee](https://wiki.gnome.org/Foundation/CodeOfConduct/ReporterGuide). - -## Our Standards - -The GNOME online community is dedicated to providing a positive experience for everyone, regardless of: - - * age - * body size - * caste - * citizenship - * disability - * education - * ethnicity - * familial status - * gender expression - * gender identity - * genetic information - * immigration status - * level of experience - * nationality - * personal appearance - * pregnancy - * race - * religion - * sex characteristics - * sexual orientation - * sexual identity - * socio-economic status - * tribe - * veteran status - -### Community Guidelines - -Examples of behavior that contributes to creating a positive environment include: - - * **Be friendly.** Use welcoming and inclusive language. - * **Be empathetic.** Be respectful of differing viewpoints and experiences. - * **Be respectful.** When we disagree, we do so in a polite and constructive manner. - * **Be considerate.** Remember that decisions are often a difficult choice between competing priorities. Focus on what is best for the community. Keep discussions around technology choices constructive and respectful. - * **Be patient and generous.** If someone asks for help it is because they need it. When documentation is available that answers the question, politely point them to it. If the question is off-topic, suggest a more appropriate online space to seek help. - * **Try to be concise.** Read the discussion before commenting in order to not repeat a point that has been made. - -### Inappropriate Behavior - -Community members asked to stop any inappropriate behavior are expected to comply immediately. - -We want all participants in the GNOME community have the best possible experience they can. In order to be clear what that means, we've provided a list of examples of behaviors that are inappropriate for GNOME community spaces: - - * **Deliberate intimidation, stalking, or following.** - * **Sustained disruption of online discussion, talks, or other events.** Sustained disruption of events, online discussions, or meetings, including talks and presentations, will not be tolerated. This includes 'Talking over' or 'heckling' event speakers or influencing crowd actions that cause hostility in event sessions. Sustained disruption also includes drinking alcohol to excess or using recreational drugs to excess, or pushing others to do so. - * **Harassment of people who don't drink alcohol.** We do not tolerate derogatory comments about those who abstain from alcohol or other substances. We do not tolerate pushing people to drink, talking about their abstinence or preferences to others, or pressuring them to drink - physically or through jeering. - * **Sexist, racist, homophobic, transphobic, ableist language or otherwise exclusionary language.** This includes deliberately referring to someone by a gender that they do not identify with, and/or questioning the legitimacy of an individual's gender identity. If you're unsure if a word is derogatory, don't use it. This also includes repeated subtle and/or indirect discrimination. - * **Unwelcome sexual attention or behavior that contributes to a sexualized environment.** This includes sexualized comments, jokes or imagery in interactions, communications or presentation materials, as well as inappropriate touching, groping, or sexual advances. Sponsors should not use sexualized images, activities, or other material. Meetup organizing staff and other volunteer organizers should not use sexualized clothing/uniforms/costumes, or otherwise create a sexualized environment. - * **Unwelcome physical contact.** This includes touching a person without permission, including sensitive areas such as their hair, pregnant stomach, mobility device (wheelchair, scooter, etc) or tattoos. This also includes physically blocking or intimidating another person. Physical contact or simulated physical contact (such as emojis like "kiss") without affirmative consent is not acceptable. This includes sharing or distribution of sexualized images or text. - * **Violence or threats of violence.** Violence and threats of violence are not acceptable - online or offline. This includes incitement of violence toward any individual, including encouraging a person to commit self-harm. This also includes posting or threatening to post other people's personally identifying information ("doxxing") online. - * **Influencing or encouraging inappropriate behavior.** If you influence or encourage another person to violate the Code of Conduct, you may face the same consequences as if you had violated the Code of Conduct. - * **Possession of an offensive weapon at a GNOME event.** This includes anything deemed to be a weapon by the event organizers. - -The GNOME community prioritizes marginalized people's safety over privileged people's comfort. The committee will not act on complaints regarding: - - * "Reverse"-isms, including "reverse racism," "reverse sexism," and "cisphobia" - * Reasonable communication of boundaries, such as "leave me alone," "go away," or "I'm not discussing this with you." - * Criticizing racist, sexist, cissexist, or otherwise oppressive behavior or assumptions - * Communicating boundaries or criticizing oppressive behavior in a "tone" you don't find congenial - -The examples listed above are not against the Code of Conduct. If you have questions about the above statements, please [read this document](https://github.com/sagesharp/code-of-conduct-template/blob/master/code-of-conduct/example-reversisms.md#supporting-diversity). - -If a participant engages in behavior that violates this code of conduct, the GNOME Code of Conduct committee may take any action they deem appropriate. Examples of consequences are outlined in the [Committee Procedures Guide](https://wiki.gnome.org/Foundation/CodeOfConduct/CommitteeProcedures). - -## Procedure for Handling Incidents - - * [Reporter Guide](https://wiki.gnome.org/Foundation/CodeOfConduct/ReporterGuide) - - * [Moderator Procedures](https://wiki.gnome.org/Foundation/CodeOfConduct/ModeratorProcedures) - - * [Committee Procedures Guide](https://wiki.gnome.org/Foundation/CodeOfConduct/CommitteeProcedures) - -## License - -The GNOME Online Code of Conduct is licensed under a [Creative Commons Attribution Share-Alike 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/) - - - -## Attribution - -The GNOME Online Code of Conduct was forked from the example policy from the [Geek Feminism wiki, created by the Ada Initiative and other volunteers](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy), which is under a Creative Commons Zero license. - -Additional language was incorporated and modified from the following Codes of Conduct: - - * [Citizen Code of Conduct](http://citizencodeofconduct.org/) is licensed [Creative Commons Attribution Share-Alike 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/). - * [Code of Conduct template](https://github.com/sagesharp/code-of-conduct-template/) is licensed [Creative Commons Attribution Share-Alike 3.0 Unported License](http://creativecommons.org/licenses/by-sa/3.0/) by [Otter Tech](https://otter.technology/code-of-conduct-training) - * [Contributor Covenant version 1.4](https://www.contributor-covenant.org/version/1/4/code-of-conduct) (licensed [CC BY 4.0](https://github.com/ContributorCovenant/contributor_covenant/blob/master/LICENSE.md)) - * [Data Carpentry Code of Conduct](https://docs.carpentries.org/topic_folders/policies/index_coc.html) is licensed [Creative Commons Attribution 4.0 License](https://creativecommons.org/licenses/by/4.0/) - * [Django Project Code of Conduct](https://www.djangoproject.com/conduct/) is licensed under a [Creative Commons Attribution 3.0 Unported License](http://creativecommons.org/licenses/by/3.0/) - * [Fedora Code of Conduct](http://fedoraproject.org/code-of-conduct) - * [Geek Feminism Anti-harassment Policy](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy) which is under a [Creative Commons Zero license](https://creativecommons.org/publicdomain/zero/1.0/) - * [Previous GNOME Foundation Code of Conduct](https://wiki.gnome.org/action/recall/Foundation/CodeOfConduct/Old) - * [LGBTQ in Technology Slack Code of Conduct](https://lgbtq.technology/coc.html) licensed [Creative Commons Zero](https://creativecommons.org/publicdomain/zero/1.0/) - * [Mozilla Community Participation Guidelines](https://www.mozilla.org/en-US/about/governance/policies/participation/) is licensed [Creative Commons Attribution-ShareAlike 3.0 Unported License](https://creativecommons.org/licenses/by-sa/3.0/). - * [Python Mentors Code of Conduct](http://pythonmentors.com/) - * [Speak Up! Community Code of Conduct](http://web.archive.org/web/20141109123859/http://speakup.io/coc.html), licensed under a [Creative Commons Attribution 3.0 Unported License](http://creativecommons.org/licenses/by/3.0/) - diff --git a/data/app.briar.gtk.appdata.xml.in b/data/app.briar.gtk.appdata.xml.in deleted file mode 100644 index 7cd381c..0000000 --- a/data/app.briar.gtk.appdata.xml.in +++ /dev/null @@ -1,19 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<component type="desktop"> - <id>app.briar.gtk</id> - <metadata_license>CC-BY-4.0</metadata_license> - <project_license>AGPL-3.0-only</project_license> - <summary>Keeps the information flowing in a crisis</summary> - <description> - <p> - Briar is a messaging app designed for activists, journalists, and anyone - else who needs a safe, easy and robust way to communicate. Unlike - traditional messaging apps, Briar doesn't rely on a central server - - messages are synchronized directly between the users' devices. If the - internet's down, Briar can sync via Bluetooth or Wi-Fi, keeping the - information flowing in a crisis. If the internet's up, Briar can sync via - the Tor network, protecting users and their relationships from - surveillance. - </p> - </description> -</component> diff --git a/data/app.briar.gtk.desktop.in b/data/app.briar.gtk.desktop.in deleted file mode 100644 index 890ff74..0000000 --- a/data/app.briar.gtk.desktop.in +++ /dev/null @@ -1,10 +0,0 @@ -[Desktop Entry] -Name=Briar -Comment=Keeps the information flowing in a crisis -Keywords=Briar; -Icon=app.briar.gtk -Exec=briar-gtk -Terminal=false -Type=Application -Categories=GNOME;GTK; -StartupNotify=true diff --git a/data/app.briar.gtk.gschema.xml b/data/app.briar.gtk.gschema.xml deleted file mode 100644 index acbc4ee..0000000 --- a/data/app.briar.gtk.gschema.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<schemalist gettext-domain="briar_gtk"> - <schema id="app.briar.gtk" path="/app/briar/gtk/"> - </schema> -</schemalist> diff --git a/data/icons/hicolor/16x16/apps/app.briar.gtk.png b/data/icons/hicolor/16x16/apps/app.briar.gtk.png deleted file mode 100644 index 444bf9836e125daa79f21882ff9b6529835d2b13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1093 zcmV-L1iJf)P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0004nX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmKpe$iTWdut4t9{@kfAzR5ET(zv<gM25Nd^19ZW9$5Slb3 zDK3tJYr(;f#j1mgv#t)Vf*|+-;^OM0=prTlFDbN$@!+^0@9sVB-U0r4nW<*SD4=SV zkxnLrY;Hvey`mFA^dO39iJAJWD5l^!zV6}U>s_2@d7t}p^eTCi0X~6vhUtbyyiPp1 zY3ZEzi6g8eDa7Z*BL-cN_>t?f%Ws^E4*Pj##K@%Qh$F;8v5n<6W+g)<o*<4Xsz&+# ztjh}LEzWAW%9{7&FAV3k<t47u97GZeScC`xGOE}>85ZKSYNVJ*(|*FkA9eg9xny!} zfRSS!6{wILKlmT~?$#`fkGV<V1Q2|&?T;ZKv<oz9w*7r<+l><-@C;mOEq|pBOns7G zYiY3~pl=(vxNd3k9&ot>3_R(QAvscjroT`C-p}ZpazOtr(7o#R*4)SG1CXJvQa8ZC zAuwE|>@|;fceVHS@0n(QKXQd~rw*SU+5i9m24YJ`L;(K){{a7>y{D4^000SaNLh0L z01ejw01ejxLMWSf00007bV*G`2jd0>3mXwDNy3)^00KctL_t(I%Z-!WOOs(3#((d- z4<$FVDM;DsAWMA9`U9dUs{@IM4kA1Wp`e5MBRY{z(v&QsgP@M=10f3gP_u+}5R!&V zR=B334n>{Y{Fu7!>SP-^GrHh`hwHho>%O_4`-VJ7s*%(x$uDU!bNrH8BpqTaNGgzY zUs6h2BPpp(lJjrk50bQy7}u-7b%i1ybE=WKF1`M7L-Eycmg>oxm>G{2;3UAv+&la; zPx(6aD3_pr>LEkZ?F8q0vQ#b51Yk(20R|V>r_AwqABkjyrL`HHHW%)KU6_W0Z<Egm zMS7{-cN14(8GGF)C~}mifFpL`Dq#A;jRd2en|f1VE5=0?04vE^`X_HwRdRt--ewzc z#SWYXI8bt)wNwnD4F(Rgh*&%VfXyt#>pDhd$+_(F86?I3Z1X_)vF?1X)XTuN9M?W{ zQMdZaG!TB0|0^*QHl|FbS4kunSWhkUACMvGJ7A5)dkI8du+8w|8*O5LX&uFG4{5D$ zP#73ko_cn>jsp1YKo?*IBF_m%-%wqAIT!pZ`j(VdH>EWVN7mrIkr~gy*xI;lV$nx* zd74k5M)sH1VeLGNlqR-1$$DyuB4;^;_U(Ax$8kF<Qov!;FbqHNpxC(w%TtfjbmdB| z-f;=bQ_tAk7kr^MY-tykryjSX0^puu7{l37c1r4&q{zysI))n*obS%H`sZw?I))n* zO-y8|E=i93eQ-*;n^~BDEmP|zah}mZNzIamGBXm-+?ym>`SHI2>4Lm*^M&OF00000 LNkvXXu0mjf<`?<x diff --git a/data/icons/hicolor/22x22/apps/app.briar.gtk.png b/data/icons/hicolor/22x22/apps/app.briar.gtk.png deleted file mode 100644 index 8e6f76131fa4ac2e75d3cf227fd69b643ed5dec9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1271 zcmV<T1PJ?yP)<h;3K|Lk000e1NJLTq000&M000&U1^@s6#I$TX0004nX+uL$Nkc;* zaB^>EX>4Tx04R}tkv&MmKpe$iTWdut4t9{@5U@H~5EXIMDionYs1;guFuC+YXws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;i>s5Oi<J1kq|hS9gX4a@yZ5+z2l(q{rkWjNfT~$W zI++l%xfLPwicSR4gD8e1X6mz|n1bi{x`&UicX6KOeeTcEtK>}v_ypn^rW+RVI`Pz| zrE}gVj<AxX5T6r|8gxP8N3P2*zi}=)?B|&gBa@yZjt~pQHkR9%l?;`5k~pTQ8s+=5 zE-Re3IIHC<Yu=N;Fr3$xm$*)I5J@ax5h4W0sA2<UScucAkzyiE`w0(!)bWetlF79J zMvi$@ph9x|;D7MDTeC1R?k0s3K=8%3KZb$OF3_mi_V=-EH%@@SGjOG~{FOQ|{YiSQ zrNxebzHQ**x~0i`z~v4w@T5zI<VXRU{z3tGKcjET0sXf?_o~}lb04P<K!&<X-2exN zz(|p@*F4_c)!y5`XPW)}05;8XkKw~YP5=M^24YJ`L;(K){{a7>y{D4^000SaNLh0L z01ejw01ejxLMWSf00007bV*G`2jd0>3mP>JQ5OdQ00Q$#L_t(I%e9qFNK{c2$A9<v zCdbJfbp|wN?88jN#3+J_f&v5EWJa5ERl6XF2#F|yHW3IF)S_**2_h=3MMY5%NJeEA z*@vRz2WDoz8E0rdbmp{Z-s>rjme3y_-1F`^zk3ho-g6ZhBqD`C15giC0{-;W5bzOb z1@0=P4E{zUk|QFgL?k5hD<~o-MI>iFXo-ltlz&%;h%Czl^^3@m>Dlw+kzDJjlh#j% zB$-NBgvn%7?sOfLYaKf!U_7_O2SvnZ@-#DjparldI=)_IIQ*Iqqqi9Q`Ni76NaP)# z#_lm3e#P67>-N3*fx9B&w7@_Uu-@+Fa(KvhE+^l)9A&vdN~UaCCTAwT0XPbv($((+ z^7_M1`E1-qNM)>p&$X5NACCY~>8;1(_7h7QR2A;Ww|Fx^2w15Ddw@KEwy)<f;@xu= z*t@8Dn%y6M#zbO(iNqj#SKR?{1G_a~m+7=*Q3(sx5{J)j*6Y9;)7rW03g4ogh$Jzh zeI$}$0192@I5ZakvB}6ZU~TDnM3NM_*4cko=|Hh*=~@oH#hU<V3tXnxcmlwIb&n~| zT?@cKsBIc}scXZmrO^04O6kBbPyvvX1V+4vEajNyHJOU=J^CI1rKPAXKa)O^UcN`) zqf{1!*%fF?H$#SXpvwe595_s1;xQg)B?`9%9*w@Ey}x<REmq_=u%q;%X?AJpE(Jg+ z9$0Yh!9<_kY|+zKIRv;j7B|r~euG>`38V2|%PTv}jX!rwMyRG7)OZe9YXGgfQfgd8 znt`)rd3BWK)d6tR*!SmBIM-0^ZM1sDgYIJhtjOQS_LZk+u5(T)6*N!91>lu^Rw>Ok z&a%c+sVF0nPDUb~gyI7;p)Y|;0Q&Dh6%&yL;Dz~8)D$%mj0N!Itj6oAup*0cYbYzI zWg<RAO;MvAItc7hO2slY`t}7h`ZpOHy$$XZkrU}>XFeGsa$H2RXL8gW3lspm)8A~5 hX$#PzlnTxk{|nzk`GCglpm6{I002ovPDHLkV1oKONBaN( diff --git a/data/icons/hicolor/256x256/apps/app.briar.gtk.png b/data/icons/hicolor/256x256/apps/app.briar.gtk.png deleted file mode 100644 index b39b6bcd44139511ac347b876f58ec9c27ca7198..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7597 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 diff --git a/data/icons/hicolor/32x32/apps/app.briar.gtk.png b/data/icons/hicolor/32x32/apps/app.briar.gtk.png deleted file mode 100644 index ab51897e28cca7df9d0c0881d3fa238f8f922629..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1600 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 diff --git a/data/icons/hicolor/48x48/apps/app.briar.gtk.png b/data/icons/hicolor/48x48/apps/app.briar.gtk.png deleted file mode 100644 index 0e014d34ee88b7909f74d3af3ccdf141cc0f4372..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1996 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 diff --git a/data/icons/hicolor/512x512/apps/app.briar.gtk.png b/data/icons/hicolor/512x512/apps/app.briar.gtk.png deleted file mode 100644 index ed21404b901537b9044d206633125db15e227f80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15117 zcmXwg2RzjO|M>gvjLR+=A)^ji*^wRj<jj&4LbhZj+1!1S5rwliky&Q;x|B_1WOK4A zLiWDj>ptKA|KZ_rcdzk$Jzvk)^Z9%|*DK<#?j2exHYx~$Xwe$C^&tojzQQ3S1^C$U z899O=*h?ohwYz9FHE#E(ZuU-3>>%h`Y+$US#%C3dcFX(D>OyqPOdef#Glaum$v$R! zb(d#^>VsUe`4NwllZL)I2l?2)FSsHNDOnsIUN$GcwTbxBK8pUPu6bgq?|6RolZW!` zjQ?~qBII$blhG7w_OF_hsLn6X?A2*n-d=`1%b`D&sET@k*34cyXb6ig^S+lkdNiGt zYu0Z{vl;P4vQNzAhu4oHohd?-9)~^o170P5PU&C&eu*|WRtQ>1_kKV~c_f*TewB_f z@{rFcHJM5KwGU4A?PIwmYNu$!uV(4h)+wVK-IlC9zk9XJ3vPzUGM6LIUAY)vfxYtN zw$muOA|~(DgqoPWn$-0!#u*XCv3>2<i?yRqM1ps%k*oEz7F9b2AGr`fgZT6?+sGq* z!=|$+13GgcXu2I}8Co61?P#h+a=;X)@a<k|_xCWpm#qlhF**|oCsHrX>3o!P-Fl$r zT9uXJF|$Cf0(zBK4Vu#sWf)!~vvSO|sWG>{Hh5s<_!vgF`!u-V!<&3?E)>>UcWy&O z(qDFSK^$l~=dSU<6CB|f=^v(gEzJisQa(fLs8cRbkW({@RD|OnLJ&8EzJ1HUXY$XC zcb&Om&e`9M)L}hcTpZ`nwQ~&I&z$rx8j$5t|1dm%o~)hXO5y&B`o#?<A$?)1TesBn zSjfq4<x!t!(7=R*#DwfDqHgjQl+JNUYG5G#?s&zj)~uDAdT>XH;~D1xKZpM7Fmwd7 z&3o8C&{a?6{`xE)=hGlDG03s+)HLnbd$iti>^s>=)B2nj;zQZ7w}^^p`GueGNzC4K znMm33gV<v)@p3W~4%MF?8|ZGPC>6n9i%M`-$|y>{#UN!m*0i*>JBvX*-*DAbpA@Wu z*2iw*&8;kukBV|tDj|&o*-yqxe0ym87q64an5}R*ObVVFtax^+#S@}*C)O4ggHxJ_ zhSiYQn5~XwbY1UuKJ{99g_p#CtPTpi5i;nkfFoBC+`DawctXC`@O|K`ZELXcyca?e zQ{;SlA`~*{Dg_4gjM-Wy980xQmh+d(m(xzft;TaG){kO?;q-`TX!wNc7Qp2+W0Mkg z4EZDcVH*%ds`dj@a)neOGJ0q~jKPRK5}*<;PS+RM5bWmqV=hC+;z~i!AhiPJH2pOB z^nxK0K=_ri$^Mk_^!TZ=ydOuN5!WWl-C=#@jG>LqCYD^KI2|2)hj3bdE|@EO*5D)E zWqe@0g!>)jyuek^D_C}}RY~R>7X=4;PcFbIuphP#xstCx^HO1k1XAM8#0W@&d*$4U z|DWcqBH9BXcS(0o<fHo7E;x6B>kt<m2b@FedBj}Yz5z|MZJBT##ld~#BP^+#DQJj` zJmA{?wl24gprFSkAL!tIDUGoBg$GdHiOvx%J_p}<npY-aa;Xkp*W*tIrnrpfS<-Tl zap>*Ywou%^cgcz0zXiX6nF@T46^4eU^iIqWMDp}-hm8^mVQ$b>rivuqpabxX`A@O< zFweL%3%<8hdyxB0cQ0hlsH`pQt||XnH=ZAJAH&1<_TmFtbMh0Zkj*@gE_k+-_EEKM z*_iUnwcR8ANgeX*h*BD!XRKkuQ1QozU>bK**B@Mut_-mYe`UgE`MJR!KnCX+iP!N( zwxaXfoF_w5t8iENbtI31Ek`9(n9g@f<1Xb+F_E^bF)6l>V1Z;p8IGdVm?2)TA7#A$ zH;7}HZoVr^{lbJR1br?|6g37X^_QMZ>0CN_l=S%`D`uE7We|s|qd3@)L2*RzwF$ek z0mKWP+k&Zy)35N+YDggxG$!XCT#0Ertw^b~a07`Ccs<O<VYoGz(iIUbyLprFO!==? zgb=)y;!HH8yo*GE7QQn+LY1xFy62B1T<ew142Cw%g&1-bcDcV}xMstRTFgDZD+#ad z@cUTm=EvaJKMZ`a)Y<!_umUY;-xf3zh0T!#tzM0=gAGpUoNbT?kv(x^({J}-KF~+b z-^c}!%CZh>c^hqg!ksjjR*eWd3~ki^<V2m%3;MyuZqvl!)6;EP>=Onb_`=%CZo^^A zQ3_qlU<{_6DA>-Rq>(x=;FY-ahNz{WjE86MXrFEH__I{F=%{HncXkJfY|`gyu(ZN8 z#=a<vcO38&uJZ?@Z^|R~J6PQ!#9duEm?6XOUo07IPTUAi1QW*Ck91|}T<*`;^{otL zTj7N#-NF2XBz$Q;Pf^wxZ90dl&&V}%*xf^&6I$_(ZER=y3Gau3%NR<VD3%UZO4cwT zNHD8ASed|rH_GR6y4nxdrRABny9h9@XAJg?`m0aa&^^O#*-{g}vMyvjjfN))L7L-> z!K|B-R_~oO1Y^|k6Feb8QEl+-A-xkDY*w7&3uD}?c|L+9PYC%xk6?G5_=ve(L1P=0 z>3P=9-3b_FHg(@E4$M~i0lRe+3w%ueP)jh@o>0uXz$D(mx8P2$@-pjW4tBz+w-p!9 zQH6~TW#E*cGKS)b5z2s|NCm>8sKBEelxOE{6l6L~>`2rNjw6y0s0a`9c?9M;dp=O~ z-2f9ldc+aMZL_{FEs7R#tdT2l+ME>LtAl6LrX5hilAzAC&^(D<cEUDKh*54iR0v>v zw;kBrk8Q^F%xvSo@q{=;U3qXq#qAqMoX1}UR1o}PgjcIClLU+*$9GmdJ$&p+Mv)et zM<u~<aDV;RzoQ+oG(qGsQQd$sDG7n#2-;?-IapLpY%elnKI)w{LSwMBl+e8RWJ(T3 zRi7`{G&{>6P5HxMj=H&SOZ}cG#QJOTpdN5u8dF~^Da~nQ4|w0rB;bp9Lg)a721kp^ zp=%LAjVYlh*o08l8yX&ADJp7}ce-cyG0F%=Z8e;Qjgq?~a{gTIHM#-Vwb@0YMdjQ+ zAn*|TYu;m(oENX#;CIn+#0b3Q=1~yZPY8icvxzETdr6)>&40#Vqrh??eb?p+Zl|Ug zo3-M~wm3FIZd>;<?PL{W2~#?+g}c!wjqg-LI)mfBdp(YLw~~JQ@A($oM-NW2H%J~~ zX@JcTKT)JB^Oy336iPtU9v&9LV9%<4=0m3v#7~^ThGm@a3Y77|_S;##Nuw|D6TK1M z@T&m#E!T^i`>YFRfM+y@0E4-+i*-q%imXyGW;Rij07vd~am3E9%uQoAHk^U`YrKef zM=lAGo^B!yfvR%sgC_1(E_0n+hfn%F6G&71FpK;IS(X=*r(XyQ;<8cbz9tN{r=PUK z0|rp2qP${^<rh{x8GwX1AJG%Lt)q&&zyq-W7JGDYl`H*7`7nzzU<UOnx7lA{+gP!u z^35e-x2*2sQu1f}HQ#2Y{xNo&I+C8btL8Ea{Vqu>D&g#k35}p}N$&cYfBDi)D|Y&q z2A4aVg&+IBQvaY=)nvohD{ud8bV}1<K(N8j>{q1X>h8*@A#GlMacpWajHa0V^I#~N z#(DZx1!C@&TK`>yXz4~ML(5|tW=w$I8Ik&=7JczMuI86Q)d8FRhXeM=seD8QA=tsD zUyM&`<MWNr(Y8Z_h@zg6hO2_w-j<XDqRj~oNwaO!3G|iu4tD2f%_XCrOui8bZ3+{( z8f|B?V6-0oLsm4z{f)Q@bh2nkab!(DoHUKk-4?Zbv>L}7D6%`MHvVWNY$9;lNow@X z^OgAeL}^bSpV@Y8vw+JFn?HadX*AO>XF4)_!0Ox~g5J810!2ay#?{Q2*O?~+uokBa z<me;^X3O3{&lauT)SD50c7`dY&pCF*_hxp4t}i6!jAn>>ZbTA$Kk|;1?c;)SXaNCR z(t=*P{Nr=UADeMW^&l3YcjMWXGUEXjy*M|tw{o!BSLN%p^dcfCgH~G2ci(=ceBo!b zPhC8=W&E?vw&=oHQcLaZO2ow}`~Hm|c=Vi|<LBGn<~d4_NTOuP`jXr#ke@h=rPjVe z%(MuQ_U@C7TyJ?(>DwO{%GpI((=a}YK?VQbFva%|WRl32)bCvSb>#1Q|JV7;HhLbE z%>RgPeq(4G1+4mWV=-7^(`>tYJ9d1m-O@fF7VOq6u`KxRjI2`KOhOc!SbIi_nCOQ9 z40}P=ZU6ns%79b(s3Rn$%OOG{rz0aJcm_|YhO7lx5&rNIuVS44?zQ-ij!t#Z4(r+O zz4GtzlYd-7;XZOBsp^n{OC#~3Wa3PR&OoNB-dt+s?3@17{e_<{!CEecaq`uW+bw)7 zPskJyi%t7DA`GAP_mh%u)=8P)Z%5|$XU6JJ^bGS8ZE8+4c)4NuBK4VOnewk${e`Uk zJLqTQ7V^#2ygF*L;f|DabUY`YuT?fN5=!ET>v$dAv%^uA#`;G`5loVYYI`M7s|6YO z6T|3+7g~<Gy@4l(hXclai}YgNOP{A@PxHP!tiQ{{Mp7<~Kya=8bO(D9m@5ZTjW}n- zx8GM<?pY?Sx6qZQ?Rl6sGB?C&Sv@%3HkbM1<9FO3=sIP8ohY>5r!<yf&iVp7WfK(# zwxbf|aSdpMq4^j~5|74F2U}K5jm<X4r)4U(>p81`A0F!lM8O^Op4{jF9K3L77yR6T zrNf<&$hyElt<u0xG$pWEIY&pFnAY204^FvvNdGgnaf^pD(?3?eDSSQCi!O31vuMYg z|7`2z(nl{5k1&=FTS5n`O$Ir4MqDrybdG~i5fkj)vMJr*KXt$21AX5qPp`a%djZR* zw(tBt0rPI4(b>=Fz)<DUAIcLx85R>re|ZZ3mlJU)<9T?w&phbP<C@yqvdBh<!?jrJ z0Kt~PjwGSqd9AhEJ3pM0Yk!~j4xA5Q)%ar*a{mEj9hLQk|Cp)o)N{yte=(((*z@mb zbmKO)V@Ktb)>(O>ethQfO2Ax(rO67=W93ku%~r6?retTpqo(qc>&!Juu{|!q?xh2l z1)jA0YLeWK6xsLdc6vlkU=i=wH-!ZKx8|7ZV4K(ta*5p~%lrez-<Ko&iyyu7@!cIU zC@WWJA;{4E+g1!KjTCovgBA952QyYC9ZSo9r_TN0d``4xI_(FU^@P$2_peOT_;rVR zh1#|6uUgi`c_?C=?+rRqtJvwB?b>c^$$S#GkVOaV`Tdow`-+Wm2&@SErRA#aMKRO- zr_W^BWi8T5k`VgQoHIF*38RIX;h1`97~y?lX4yOGP+sX-`hq7KZ01vHCR5P>&rFH4 zdNsd$4tchO(rFeveKGm^Nr9B8aZl>-(^j5j2iViP0ftvABdj*<1MEx>p{Mi*e{Z;` zm*=_20ewXQYijx}uGZy{SyI3TFE93N8OXd=s%0IuQ4YngEGpB~u@!o9u*?Eg9~uKR zc0SLd=aXvr8jJq63d7sGwq-P|uCQxm-K|syhzUkHgLw3S*}UANB}>b-y&=tBI{_W& zEIIAIFl6^5fS}Up`uAWEXI$+qig<f#@zx#hNIkQF{&CaC$o73sf*CVr>tH7s<(_X- zQ`gY^&*7-J2G>IYUk3dgUyBG|)R!^qs7@0Ir+DZ_dy=^J;j-a~3?DVdZG`+<Vjy!- zwU=C}CNI?bbw=kqJO<w#%rKF5O7rx6;`05n@0`)ip)r(!%LfhEB@ZK21lHL)N{1P< zSWh-SDK3Z>jB&wonL)VSUqn`dPiH==2(SA}oYMiO(XpsZS2rRqfEL7Mb+Y!JO-R^1 z1dMozKxI|9a1UpI>c=N61qEZCTEY(4%3EzflkM@n<)ri^7g)IXI#v1tYdk8UtJZTM zy#l)EvBd?Qa29%<pmCac6bFIz7HlS^LJ-Rj-e6qbP#Rgl9Q<y&9`O#0|K>6ZeeUls z)`j!Tm^R%r8?2@5chIuk%eue^S`N>N^?C52HIwI;_F&ads8pi<e#W1FBaYTr4dm`P zI8RM7E^-V8Pm_4jOsj8M7p_sOoSh(9m+EjR-f6L(#l4*fQAoVw6dNs{k3!r12%lE_ zEex@XAIjhqi>}CKg0@8*Nl)NI<>`}u%HmK7DfjTi2hfeRVWKOZ<+2(sPr^$x>Td=! zW;gAmq&xHWy`_U#R6-GryHiv}2YfKt0U<B{9Kdm<+T^8HAu65fk)3slUqu%)0P&Qm zhMJnGF@Bwqs3KJ<xN<qvv|B(#U_WyR;qs_FwWI!?GGn~-&Z_b1Z_cCjUp8=~`N{a4 z$O+n3&YfXkjte4S7QQ*DN3_8bpFh#S2~Nx4w#u{f-a{v%gNt=BD8ss2_*!9TLXRj9 z@0905p#?njqdfeLp~|FxY&qz0dGUqtp!DBxVB}r&DYLnSi<h8`KdQvzm@w0)XRRx& zF{pPV^wv?l{>wT7#*h+v4~InKh8(GQ6(~zl<lG%5^Z_%0qG-)}Pn#&OcL$LrS|2}U zAvzl8ggU=}R>qfyiqKvusOc#&<=ySg#}~yDbnDbfG{@o}tZ(;7*e!a5a--RoSH(Me z)sQ8The?S)gfLau*mXBF4q}A`RE!5Z-J=F--bdhuJ}xih_-T}f25%V@aEbM2P$KG= zGzFr-*cNaZ9YWWWOAGf=w}8cyDLYvRaya^BiOZ9b4!;tlV-XK_$f3D6q>RSJV+=9Y zAE1D4Jt7X({NWRxMer^3g_RPP<&~w08xggP5@$YfwQe_o$<jJL4<<FKVHl}TlP>P) zV(O3CgFgk<e|=^$Bb}94I`Q$@*SEP2Hx&afKijQldo5_{RcMnXJ|`9qPpkg@+`{xU z`b$%0LowFCfz7Fqts|yE#IZE33zK?py->#cpQyhMJRzBt!VvJxb*7^qWHgI3m2W*? zu2#bLy3h~LR*l?^m#a?UqgFXD{5Tlr)LW*x<NT!f(&xH-Z;2Ks<r`c(7R8dZ>vhI1 zbR6X7_n(t<??)|2&V-4T?ZPrG_T-n}x1`OE+i~N_K0a^ls}d?*nqV5!Pjj;VK~NhH zIygsDHuv4V@~dDkJjVHYQINuPWXZ;IMLSDH-6=Y(0@eJow8bdD?0|9D*!;8o3p%UX z*aFG7k2EK3CPX^w^pNvsPlX^$%~ejb(cKIC%_llwy{TMN+;^?TcEezsuf_i3#fQi} z&TZupV_LK)w*#D903xra;_j#uDmP}^AK76t-tN3ac@wxI|BPakGM($OB@P^YCpBTi z9PQ`DJ6wA5p}fDt!FqFS>#6<}`+diPfYhALxOhsJnaDcdz0Tx@1AY~48!{~Xp-$31 z>68&1arw=|6OFITEKXzxYNvmG6GZ!F8T<L#expB_YO4Afspu3%U=;6YvXp!f&V(6& zS36AzIr|yAFT7tc8Qd$pQ-op~^b{&xDD!NM>9}y0K0xjpIk)#hmfkzN=$##}%_J7( z_DbmiKU+=x^L?hi?A`<Nkr#t5gGk96oi!?a1wLGAEkc9KyJ_bpbB*3^czoU!zm}zc zIL!h)CU5wo+@Im7@eV_k{G66so&!5cc^7=2eS6vG(k$wdmN8Za+cE;WRUX>V{>*7I zawbbO-?<vCf)<R`;0jJV=9TkHEO4sYj}%}2v#xOne8TnuBCCJB_u1I5$YxF~&Or5# zqL#1Yy!TMegs=R-by2_*(?6o~cn%8^AATB=9#+^w3BWQRdOVygZIk2akmW`TK}2$z z;++xyBe~>;MSe~XTs&)R7;}(}4!c6~+PVD*0Vqpb?e~Ci>#H}JcARdwcy8*cf~}`h zSDhvo85!>Zbj=X{c{z4x{u4`_PPlj#J>gUJ)EnM&tP6Rl_fY!nJ&SfGm!PSu@7GgT z?(w0|?F{{H1?-IyNn^+8#eW3iSAvax$Ma{!c$#n?^pCRmr+j;=m3re4oKvxWDa1kZ z1o!Is#1Vb87+P~j5U=PoIbDJG*LncG(NpUYlC#YI;Gc6R3B^0!>k>UQT+64E)^yKv zlY#}qx}ZWBltML?pNdBdqc!Vh$Gd;L;UE6keP?<7^ZgwrOfELm;63!-_tRA^Tn~Or zT5{-PJp%Jt^B$yxOAIlS6M=9B%v|Gg4*4!|#F9dw^JFi`a*O<`*%jU^1p0q)^7QHC zjl*o#g>vgsD1fz4SF7P+bBSUxs)**<Ua963-&i@emST1gzL_KSZfa(1{vIzn$V#jD z$3=jgqg9y{@6?^zI|--+>}+z+{;Ky<ORDGr75>}e29GKZ<+NY`3uDQJ0tVmnqBY}p zGt<UOpvA9J(*x<G-}_%!!!AB0C%EfB+iL~)%-hi2Ci#scX3W)o6I|YH)3R;oh;&zb z<^5b%Cf#2zo_c!C8bh-PsgyDlI%0%u%`6=5UO1tNi+AL@b{i)9#T>x>7?edhSO&yt z8a6)iUxSEsRNQtw+&v~m6VT&G+F`#IY8p`BMGI1&rdG|>fHPdhHV>!UdKG%hqV+Eo zc1y9U?#-*X`QNk(HiGsLY(t9K6td~4B97Uzk|xv3tSZWxlT%snn4=|PL-8j%ezaiN z{%Rk$+Rv3~7ue6RPt}YZU@5wdF)xeq#3YhvQ$5MryO_3G<9-c|+ZbE29b>iG?syNa zbsi~;75<=c8~>gINML1hYOChs6*T8>L#^`r^`&ykl)H8exOgis!xyagS~G6#c+v$o z!Z)vP_gavPy?x~WA|~&4u*p;$A*?!RVBXCXkn08Ja=)l^<Sk0}e^I=LfqvyO9|AKT z+C(8_Y{{*-@PY|dhTG?FXrVO=Q?;*}(fGCAYBG{8UkPP~mS_quwdd;uUA=-vOF3;m z8nI=g{qcHlCI((!P~ZH$^s2H05*IJVV^FajexJsAX3vB~=02z~b;|km<LQ(N#F{!T z{=FVC%<q(Fb`dk3KD)t$5y0%<HxCQ!NMGf};^G-bQ~dT=z4C80)qlb-?g~Ku$rBB< zC3C5NLWBCafq2h~Z*9{QUv^_~bJ3$#X~A&>-cb9^#}<N07%c3_7<W1-p!xCVPlXb> zmG`!vr*z6cbm^On#ge<BJZRp##?s0AuUo^l3&o=Xm@uq1isi3;o2wt~npF|Ux3N~N zID^|Mcl)u7*Ps7tCD!!!|8Z-Cmm?<9D1W*<nFt^|etmO{8&%{8KaN(+`m1xyrcNA% zruGV;wI@cWGIryg6V5xv=I3Ja{tezLvnG11RPDylvvnLzO~CJl8{7#<J?+fcSOSWS zdo+cDF4bLNismrp(ZzCT&02TWEsclk$4`+`8>>IEpJVbA9+yu2o6B#}Y5!u@hV`W& zFf0TsWne=TtP^!tJGGl4L@16IRnU_rSehxiQ_(jW&!|7ID#`?2{j+%_4{r$~x4JTD zrORHL<9Cfx=RhFL_4&;g&N9*r=t<}*TfY0w7iZu7apE?Q^5HkKCVPFq(}}aGlzTzi ztOu@2mAf-Q`O6c{pTUIW9N1o=nqSZFPL(fg#s!l3KYBvh7gPl=|8Tgd$Nl-sr?B#N z!i(g&BZh(MY5e<y+Tocods$rkedE!-#Qv~K!|i)ft~*j6;gigDqwu?nSHw!4+&ZNH z^q<+Zetx^hpFDO1MarM)Xsrkvc@13cuy}zp_$!f<daIg|RbM9J-fMYrSG@eCZ({9w z$L&H82y@*ya2~hCyFQVyswJK@wv6jIYzQ_SPySqc=%i7+rn<%+cyCQ?jf{_02_??; z;&(B{y*Q`0rH>g>2+hkE456nEl&&sH?*zzcM?X7SB|p;WiG)e#Ub-te$^Eg$#X5>7 zgkiqg8203qF{FVrC`!dt5Dz!&zXvDV-oT*@Kcbl-G)@>&+2d2ep^BdBJR=96#*i?C zL%k~nngUT?Uk~Peo84r>yW<N)!1oD?4%V>u5222<2o$<VjMJi-F&hNumzGzQ`rj`F zONOV%c{fMrn{Kr62~?01=76NBd%MXy`<c>Q;qOpVi-|X2#Fs%RwB`a8K9~wGyB&iP z2qd?P^3}k_Q>6jO|D=SGAoswz(fUVGWL;laoiRMiJZODEnrLw&ho?H+$)o`>u+V0G z07u_1st3B-cMF$ia4GiF1`%k*v}KyXCv;#BJq*UAm3~p-tvtaph7`w47!>-K<QFEe z@1cU5K)JpEpd`2vQmLdbL&-3<{~$SmI5sf4OTiI=`Hx_mLZk`rcn~9LVB9YuXmlB1 zS8QNL>dq>rxobyS&W#)okj4oC@^zC|Fo-366|j>~DH8{~6Kp1td#IrE{|^!n5rPy+ zfR2p*M{{>_tJgP4BQIad{>%YDTf!V=DA73mcQYhvXi|efF6h1<L=JwL8bhZ2q-{I( zLL&d6BU}qkIbKQRzhxZWk+!h&;1P^OU{eV^)qf-~vd8fLZ*UJ3`QKh2ob*tsWIX^g zshaVX+Q=MA6IV{Ko3<eaRk!7YcM$1>n3!R<-_HOl27j5$9zx9j9YML(AGp|<0>JZS z(tkWNU``F_OIki2E($X!JEh0PqjJ-p6H1Q#YM&Na2|+v|b}Ef2B%U&Q$zXI=04?@O zu%K~*lhkD=_5j+jISO6uC<!ie)C0((QJ5R_4N?D(P0JoK$Dq(mP8pW4KA2qJKe)VC zBUF9CYA__v4s0Mbn$%~C<Z0QWA1xzB<G<P)uw^t0{aRnm7Jbh9V;9)AIW>>7<@2+z zlr%Ik)(V;#7UuE||2#&+sqmA;yQfCPdoL^AdQxngaantG-hcly9j&$UM9$xsZ{2IX zxtnOyInUqtnW|9c`QOHsSvv;J*P*|2q{eh?HD;Kj9#6mYK+JaICp{=^V1?$r-xYd+ zZR*g`W9GPO;mD2CF9QC@WyRhHgL~J86D?^~JZF}lj0RjZli{+v1hNCKy3$AY#k~IN zJs4LSl|?ySHkEVO9#B{Q@l9RXzUtP-qp{d52iwnk6!#b5oA8M+xOD1p$AghGvi;@& zx=8s<2^#e8u{-%n_GJxm6D8}m+qX7svUI+BsB;IKc3b?}=W@2B&_L#}xOYq<X9E9B z%M*znr_@}}wvzH_rTj-T%%vApI4z$F#3~^seDoGe_sqOuUB1)lH~L<Ey=1=Mc2A+| zgr3d>J*fdKdxeji0j`<5;*<V~tX&<xpQl}6U1nydLSuaj=}XR;GBoI(+(Q?7kN&>T z4{DZgejW$*``JZIaLVveO3le**Wh1Len;O~Ls3jBX8WqH>AO749~B?7lAFVPsD9ok zIr9Z(_?Z&X`OCO7xW-g6noH`I+8LXQAD?<vyeT=Ey$h)#Gw{#0{rp8s8zR|SIu9U- z^^{Z#(6|zKDI8pn>Vv~$pIkh3bKZH@JldK2I6Zw<BLqRw$zx__6VhRg%bB;bvQBu5 z3W1%zoph7`8&LGDr`wwiXYa_Z5IY^Z>ps7#NWNkyDnSKs0SOz5Z_3do(AMHNb(YGH z3zvX7av}BGQ|c<C8CM2h3s^G6d#Ng~+OPacXFa6LeLeWl?Ad-b`xi59GyL}Hb*R3P zT+!ZjmGudAi@KXC=a>-MX>76?)0uSA$36RFn7FzD9XuC;+!}0S?6u@G=iiO)15<#v zt2OD2FE-jhFI?tSllXxOk67L_jTSjPXR*bP?j9N)>$%@sDi!Y47_3HxKUImIu=Cmx zUT8P;CQTmPSqk0(nU4`#g^#o3+#%(uUeofjA2QwQBU&7}aCs=x8O5xmsV2-HFHUNn zk1kzQ5MH@Y)cJeQ6wNK%g(vpCA41DHJ?qG`xxlsbU}WAp9K}1K^+ET+p)j<MwJa8P z^dDIY1_t}+!)=q%UED3(T{yj~JCI3X%1mwlS6XA*p4Wh#Y4YQtsinAd$Y7;7IENzT z-R5_miE3zI%D?)W5;{0gKLsD87izS425d&IaeZTGol<Tn-5OknVZa>5N;mh?!X|%q z&IAAxHiY5(CbRbi%@?H>T*pGdNEc$?4`Gnou7E=VM7C_1QV)`4yV;F7&8j*!gY*Mg z(tn;3d5aWg%W^ly@Rxl_dZ++9VK0c*f7{HU>T^8{;1qnr7>&E|C;#k>o}_*Z-vkYe zuHJ{%VMb{mfCc{X)o$J6vN_;kqCY)c7DDS^nc-CZDfk5ttp9&ME0u@~yCRSb{Gq)t z0Q{^XbLIC3V_28sgP#_ji70`4>oh#?uPuTJUdyBb@As#hc*qI=WRH<th7iv0+s8y& zL4cY%IARg7z%-+(iD?uQgmE5<e-ipQED4qH`Pi#abHU!S@sa0LXnpD$PE8P4uKzhP zBSzBiT;dwX@t)f^3IUB0W8S90M{Oy54AA-ynk)-Sp=oAS6Qe!=PdSfwrXw|$(-3Ds zL17RLd>_l|9Af8d0cZ^2;-ulNF>^Z_1R4?jUS@eto>LgJNDClw?7J+a`>w^(Eq>M0 z)8m^l1eI#5wdJyV?*a!agxZ#MrVjXmzPZbU*CJ3YVp~vgK4;f#$V9O%R}1ix&*z#E zV|sM&@>j(A^#>%a4R6&`E8|dhw~W4y)+|4Vn9IoTZ&r|@OnO2N5yn*B@8s1!RvH46 z1G04gMV>sjA;!GE4hXb@4HH!SL(;dH)Nh=RfG2yE-CKM39A-b1!Qz@P%*2@~`|ZoS z?R%e<)=7Ts$A$7Z;4UVuEYNow!|K>f41Y!FU3#tnJPpMml)x>DG1s2FPhoj>o@V2C ze<DjBAfG9A&d~2Si0VA&^muhA4agy9?!cA26&{sVTAq*mP5?vxJc2DgBQ&^&9RXsQ zQO=WT=oiW{`8sFnEoa$HOc;hXDFRkgPl@sIxZ9d<NYitE^w3f9SE=&3<n5u4-NE!c z3UPJtnC)$;HEac9&wAy2*51#!ybF_VeYK9IQwln1>0>u<%#jmJt<Y?HZR@#Tt@<#E z3UJ;cvYJa<Jbd&wN&Yjkj;8`h_Fzh)Ax67!IYuY=)8>(j!Uf)<aFS^nWHX>OWlt0i z8BACNN1p|I=rqn=ZHTyOTV*L(`262Hc_^k&KRX`E`V99LQdK)muIUnnnu25c_qkYA zL1s}v#Q$B9z0@7OrbJ*jlY%K&<wLHTLngp?!!^HxfuL&#z`E+Wb^P-y{K)P+@i3g^ zybUz4q}}*mj)n=h!fqOkg=I^FaOIEO0MAWP!kN^cjE3S{ptEekb7#VK$Wx69Em%0I z%}A+Rmweh05UE|LYeVK8#*ld}4Ia~Bh%w)Nlyp98ejHsZ(cobmZH}HqrqL>37HS$Y z&@bq9JZY4#k8qiH$$4EBqt%#6TKN2%-xGKRKCbPw3N?$?M$cP*#tNfPrHVcHpL6Z< zcF6om+q;&J2)^D3XHfkaDSn1Lu#?+2vs&f3L-H8=%nuzhEzab@t@IDodZI9TRfMrP zMQroo6Xi9=D7VQ@mCCR5JUa;sK$e;CGMK+kGycF+wA-Eso|SA#!?J|u(uY3hK+MZO z_kaB|Ti8sDHwB#3A@%1|Nd9TE>;Xc`fL=1*xF2z5($$)sO*+2IHciNbmg5T)qi-C* zUP=4Sk$GPEq<{PUTDm&P5b;YQ<)7WOzlvO>7;~A|6?%3n?^VPv->4$}_j333bn+uQ zexH{bbNL$65J6Lv7XO{`_-KLhu;uRn`&=-UaEB~IGJ?h<*r;?hKQR4LuPd<C2iDI} zh}90(kUZK7j&Z4wLDR0*JVNwGYM%EL*Z&t(RldHnXc-T<^lEl{pdfn4%=E!~`hIl* zAchHe-gTfeXO9q`$ee3j$&%{Rg<K6(++a}9QEQ<|@PltuDy82}Moxv$Lvj!A0<9 z0)|<uhf1b9K~T4YiqK|#_EKF0z_P2q0Bk*r-BatJBhhv$$aa9-WU(a?bq>=WPq=;f zmIX6i{d%Rbl@|>snAQ6)Uo<RQ|8#JlK#gBs_eQ(rgQS+8NJ|g*(|_oa+nCkp#KL>F zuJHOfTA-;^kU2sf2QCETb$_&*z1JB0OzBwRMc0JW&R=Fs&-QBuRR@8yAKK?+j%x9( zGyA~q_k$k<7M*Q@=sJU{sC&b)B`#jSU}d@O8573*TpeZIH*s#XW{UDlhINr8>Mj&_ zh$L3G^Iwzz?{~;jU^fzIAS6%U+b(Yq$tem60vC+<E;;wg6dv9gf+}k3r))_JVZnvN zV;W&?MA_@WZe1^_XaDg4`u_ChW}%H5&LD>~CnV{Vmvq$~by+a8UcL$v4UAaPFop|~ zoxD!uK()NUOTS?R$%ey+Aij%g&en#j$+7=*e-E+?w}m#V^O_64kTehnA?*zd7<Q1w z&=vqP8z&6Ozmq}gqy7#yGVY)aRJW-j74c}5TAMpKgM2^CeJ$Ts;!|@N5LA>qc7fCg zSY07=ge3{><Ff*n{4bfZt+3gO4#Gx|lrbIQzK<J();|o#JE$U^L1M-jex|#39SiR5 z7g}maZ~jwt`yN!EXlx+nUlbZ$gCVonwyXg>Uw%RMvj@2P>IOm?OogFC5!e_cBUb}b zM_w+-`Ov4n6)6(b`%+d#HrgN*6Nw#27^c2n0wmT1N?((WL-A^m>C*8CS3(zS$fn86 zmwiCf7d?=TkDrSC8t*jj01e22)D-WHjJ5kudUYQ#gX5InyqDcu0fJbux`eCsH@o3? zzgz$+iT#Z-T0i2%8#y2GH1KbV1U=CoKlA1mT0eH?+(})!O!j+fz(({3vgOki*Fb)a z36HM7*#*Dbc0nv_4FP;Y!O;6^NYCEDs}c$2{Hn+?M5~9kCXQ;YayrAQ*CPMl=RGS} zr#CuieXN4|-uyGB9BUF^GRabz{9;W&Ej^%ie}>HIhsX3?*i@K^gXh{*cTF(T%uCyd z+aQ-sFe-hyx36q=Gqm+-P8Pmm*Wn3C!){+LYd5?<>WFkM`tVpHBw#Vw!~DaCuO5bi zD+$B*&-Bfpr!92T>&aeiLg;h6Hat(wQ|>I)F&-H4x|*mn19?i}BDa@+9+{hCU&wR9 zAIU>zUfdsclxnY9D1nTw(oa#_Giq%HiB3USFE$rT*XceF$~zp9#BOUG&m!8e(9V6v z=Y{)|gf=$93!ad72@P1LQ*mDJ=;iyDJ73DYf25`6!yEa}T;6tCfz9gZLLbP&7QAH0 zH`<~wI+3$O&TA6%JD)y!%~~!30%b3t8<*-Lc^0JyGH79r#h3f>4dN8{IFdpbu9xk+ z*6w9Vuq5O3&}Px~%70Vw;<+T!s%qK$k}9W*oR6iNyE)VF3w(;x_@Kc>aLD}bC{lvA zT&D0;KkJs~X};8$+i$C`T=5srb4nju{q`IW2q(`*+Q&6d=p~V7S8C!_309SQ9{R8+ z@;_e0Y_Y>#WVTo-RWl7=n$~aznG{QcFlqTx`HRamFRL%eDuk3@6Jbv;c1}=54tLL9 zuN$t&41TfNDH*iM3E~|yd$~&KzyHiVKFFCxWS2K|XZ|HVOT8iI#Ud2OuuiV~Ws02T z%h$B@<VlygCtZ!r+9fKa`i=958uXvN4cw1~V&oO~r^tCXr>RYY*$=1?cP97D1tnt5 zrJ&o7H_nysABf(BsJutEzW#N{t1`K<v2w2F<?d^SHYTU(O{uxkHFE-0XHZM8A(Q`W zWks*4W~c3zD6Xa?L^g(xUO9dKb=-a9fW1ujMEO?tQg}<o_t$zZKw;e`*b>}8u|xG~ z;e!5d1TSN;?*Q}M^G=o=^OoSDee`fd{?u!Q(7!MCpRKTTG~*-c>+$fIwhM!_0SrEq zHax9argZ5$iV`_|OlFP8<HM{st<1dr&x4iur=sPqGfkOVDkdXtD34`WunuE#pC*MD z82!#Nxu9xtj)OvYE4eG{9wNVd&ffCF!5@y9kBrBzM@-&6=bPPr92Ut=Y!O6)`!JKS z>zgNLNRA7t8mGMTN|nN9a0@ael|8w;OWlA(17C7BKK#^kyyLp9RV-1xzILVf0~>xm zPV}AJedCI$gEtig<-40|GZTkna1IXD&3t!e%ve08$ky%R$YVBNt%T3~mK}xpe}r6n zi&aJL=$^gvJ{5}nrX%nEWzo`LG5247x<D?<Cucg|PtU63n!gP&f*K+d<8waYYa%bk zlK%-BF{E7_|5I9A7$FfNNSAivd4qk+)!Y4?%gr?_y7Ys~g1_?cfO!|XT!Pg33>sf- zmmp-NLfo@J#oKH#*@=iTyvfWe6I5&cu#rDYiAB^15%tbeOy492T#CCN<UE--?i<H= z^Vw>okagSiM_)@Nsint{C1}^jPkvJ<T~w{>yk;RYcj;3@J8LvWDaHFAzLog}FG<Bd zT0&gHy<>AGl2N%ehp&_Dcn72GYCU^BvvNvm6<R-~No>i|&Hlb)Kt90VU1dSA;R#VD zmHq^3;m_gAJl>(AQ}(v-TFQ&qq#%vFvL_b%d<gIPuI^S__fsElYgLgAA8cBFR^Qv2 zt@`3xx%-`sGV)>GQHt%CO)$0Wgm{KFQBb^Cp2JJ1!t?UQT6&tUuat?V_gC&+0%c&* zhOgHY=X=+b_9TNu%_#hi<a`P5xHboTmEXzm9Y>TdP;PV|^9L%w^p+8xTqM>rwCRzc zRqzs?5#VuMWwYb$x!XY<pSOeBK%L1sc`*rXP7ktUw;;L~zdP!ydiuaJ(~8IJq{<o` zD9HchwJ_l@T;(YvwIx!g(!!>CPzs9FwhZB45iPD44#!5PdRi^cnC@GiF_knj$L~}d zIQ&jlIMLW+BdUi=yZ-tr;7M&p>{s&?wd$yp{~0+0D(OD6)mraY6o}i6R0NG#n#|Gg zq&t&J|B^6e&`R2E?AE*Jn?h%wB(+LyzQ1a8S~WHQhz_34R!mX&fh0-g(eF>|QB=dT z%~4KTr7QLCWF&(}N8To2mydK(WOo9!FZl|CV!igu_k8APc>+dRg`t;%FbBkS5vET= zdk!hJzwae__t`!;rkQMDuF7}dooRO2amBOy1nzP_E=esc;p`jyue|XKC~styciex~ zQj%^_(pZ~OU&3kau{taaPSEbM<gec@?@DSDzGjZH8*n=pQ-CZ(_$@D+OOs-;^N1Sj z>Fj35(kv@NyQePlQ)iPIL}dY2qCFuiql?MIwelhyfVL(TwN_~2?_lQ$fpAojfge`y zCBt=6rDlZ|J`6Jllg<a;!6<nEVEhk&@ih(MN{~6ihp3Ade4|UKV`$R>QgzMioDYjT zwHU|=7G+Ojt^zya5-1`S;I)z=Jhv(YFL7>tgt$OCyW>UnfvWNC(L7b3i?R$Rwrsd~ zZ)z+e{X_&pi@@$<n=!w@dcNB<<qpVs4^W7UsweBC*rN#8`-pOBYQzSrB0WiUsC2wm z<n9daFP$`oD2{2}-H|!%pyG7N0N#MngXU09(O2X0Y$NOUzv?Z|Y8i(6_8?!0;cOIO zbu^pjt#CWv8!&NdNMj&0+4`Dz7~V^z3P6(k0KEaVcryS}f)Tui{EX&_JsWO^t*YB% zVZ+cs{l`tH{fQZm_ErBB!e@Xc@h|s8?+FQariXB5_%VD=nil;-!ivbyW}SO&E5MfQ z9jF~=br%?PWW(v(({4^Mw3Pu_i1~h@oY7seyxvJeGa?CN^R)J^al`?WN)fvWQV(i` zc_)YFU96)WpXi>0XFoY-Lcu{3!1Pn{JeuhmPI3R&AVb^J1r7YP4cR$)RcnQdbr&{R zxQm{?hbx^|t@{L!_glSC&O5OU&j)ZM_Jt?Xj(s95+rR=B%pM>myJki4RW`f{RhH0( z`<6FI2h^~+OHHiWhJkWviEr=#zL3p3fbxzDns`UT)5>Vp#5~k7ySpm#QOiA4nk6h= zO{;fSag%}YEPMDiiubO}#GM1qpNkt*7^*5ZG4caMc{A8p_%Hk&HDomVOHlPb{TM%t z=ftbqmX##r={H;$@9&;tf|$Ie38#2B%r{WH-IWOOzhrO~2c_f&C!-j7%tK6?j+*}Y zhm=n?NRV+AZ0^FF_pRzkW$-WYD{9CwHUL@k>tnn${<&>ybX;CjP)ApD?UR-NhBvdh z)3}RgvU58vC{m_hP(27ERiiJKQJ7O}^ZCD1DT~mUgcNPFW^3c(S^<UwqnL+Xvzk7} z!!aXz(TFT69&Kq7E-fW6;+12ooHF<yzAL{(KEfPgnoH+M*c%Q$#+wl2@qhDqoc`2O z5=;s2f&IP!irb$?;?Hac=##D4^nWW-q;snJ;I9p}mqA10N2+y{<0)&OUmB%`$7_lr z3gG^-hmG*;XQdQT@D}oPGJ}+GgTLP)WwI7VRYyrWYK$;E&QqOWG8`lL{R5sw6<PIK zl^JSoK{l}*z{+#MlZXY6%DHWS#n!XWp3u(ZKdfyJZ8t7$qVZMOcUw2uWnn&HajoXC z!K3#SBk(M!C8Cxov8P+VQplGjl;Jz+J<8<Z6*1_5V<PRGbXs`4NlCX7(+*J;Sweab zvQ&bkA=9lwYD8olw6d$3JR&_t8B`|-;TafX(+})mcN<=*NN%bFzwRz$>?`|A?mX`I zke||gyW!b5CafPp4Ihj!18+&hsIgjD>i=foUa3$VKog#1vrbp^XZy&m!-7C$P6|9s ziC>f`r+4Rbmz{M}oxHmbu|Tz<3~x!VX`Twg&0-Yw2)5bZZs*mGl24PJh=pv1|JNl7 zzls@vvdI5Q4d0=N#AG3qsd<DYNbg*n)U%mo;j-jD(KdIj1>G;X+aYs4lOC<G_29qb zBWznaS?#ZA#wOrL@w_0yNZRnbY9tN!G3yUK__6GD!y>iI2b7!6gh>X~M$)6BW>bm| z1Q$$~{D#bVL(Cy~JY*TlV9y4KIAq3xrP)*>_z*O#Fhzw??<ri#O3BWcRews7UL@^` zB6gh<uvamr_wT`Xam}toO~Mg_Y6%JGQW*^m;th}g>by71F#qj^->@^flXG>~L&~Q$ z!1F9BONvl<7)}wpsbWlF@I~*49x(<5@1zC-utSMhdxBV{<#`SyjTF<;H$eg&!Jfd( z_2nuxCcaPNF8Nx5*=1Rd@eYHJFngFctQPJa!q5<Pn;9x<qWWY@;I8Dq&_Z2yZLpyl zz7O|?*S=)Plp*2UBY>#3<uVMgDrH!U;=hn@C<>gevU)U;M|r6i&i$@{K?>%NYevk^ z;)8r79`WiO=t1B~SzNQyT-BZ(EM_N5b@Qt^&-m4S$#L5red<l*gyi1FKwz7jBy%^M zd$)kW7SmmSrQBhC%mvFfjE;9Dq*U{r+`%}gA-_3-*Gutb`gi}|<F_{|albCA3vF_U zy<W?GRsg>r7+(tLqG?Fev1mj|dO>%2Gn0(Hn9+x4zdLBsv{iS1_6R(W)ASQS;$^Ka zh>7p73bkfA-n3$xSpDO$9Asg#y1)If4dlS|-!X^q)c;#9Af~i`{1?w^by4ifew;v+ z&MG2tF^Cx^itzMQ-p1U-Pcx`S=8~TFnR=rOO-qnbP$;~A^}wm`!?h6vt*x7nf!3a2 zXf^d0A!4A*Wqj(G4nYWeJ)72%zY*0cw||^i9c1)=cU36v%sT1UJKJMoblbn{NL^>} Q;1z<<>bkc}RjvO0Kj&vBasU7T diff --git a/data/icons/hicolor/scalable/apps/app.briar.gtk.svg b/data/icons/hicolor/scalable/apps/app.briar.gtk.svg deleted file mode 100644 index 3acaa5e..0000000 --- a/data/icons/hicolor/scalable/apps/app.briar.gtk.svg +++ /dev/null @@ -1,157 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> - -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - version="1.1" - id="Ebene_1" - x="0px" - y="0px" - viewBox="0 0 330.00001 330.00001" - xml:space="preserve" - inkscape:version="0.91 r13725" - sodipodi:docname="logo_circle.svg" - width="330" - height="330"><metadata - id="metadata61"><rdf:RDF><cc:Work - rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs - id="defs59" /><sodipodi:namedview - pagecolor="#000000" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1021" - id="namedview57" - showgrid="false" - inkscape:zoom="1.4333435" - inkscape:cx="137.64067" - inkscape:cy="223.06028" - inkscape:window-x="1440" - inkscape:window-y="23" - inkscape:window-maximized="0" - inkscape:current-layer="Ebene_1" /><style - type="text/css" - id="style3"> - .st0{fill:#FFFFFF;} - .st1{display:none;fill:#87C214;} - .st2{fill:#87C214;} - .st3{display:none;fill:#FFFFFF;} - .st4{fill:#95D220;} - .st5{display:none;fill:#95D220;} -</style><circle - style="fill:#ffffff" - id="circle7" - cy="165" - cx="165" - class="st0" - r="165" /><g - id="g4214" - transform="translate(0.2999939,1.2000061)"><g - id="g9"><g - id="g11"><rect - x="94" - y="93.800003" - class="st1" - width="43.700001" - height="43.700001" - id="rect13" - style="display:none;fill:#87c214" /><path - class="st2" - d="M 94,144.5 94,264 c 0,9.7 7.9,17.7 17.7,17.7 l 8.3,0 c 9.7,0 17.7,-8 17.7,-17.7 l 0,-119.5 -43.7,0 z" - id="path15" - inkscape:connector-curvature="0" - style="fill:#87c214" /><path - class="st2" - d="m 137.7,86.8 0,-22.5 c 0,-9.7 -8,-17.7 -17.7,-17.7 l -8.3,0 C 102,46.6 94,54.6 94,64.3 l 0,22.5 43.7,0 z" - id="path17" - inkscape:connector-curvature="0" - style="fill:#87c214" /></g><path - class="st3" - d="m 120,46.7 c 9.7,0 17.7,8 17.7,17.7 l 0,199.6 c 0,9.7 -8,17.7 -17.7,17.7 l -8.3,0 C 102,281.7 94,273.7 94,264 L 94,64.3 c 0,-9.7 7.9,-17.7 17.7,-17.7 l 8.3,0 m 0,-6.9 -8.3,0 C 98.1,39.7 87,50.7 87,64.3 L 87,264 c 0,13.6 11.1,24.7 24.7,24.7 l 8.3,0 c 13.6,0 24.7,-11.1 24.7,-24.7 l 0,-199.7 C 144.7,50.7 133.6,39.7 120,39.7 l 0,0 z" - id="path19" - inkscape:connector-curvature="0" - style="display:none;fill:#ffffff" /></g><g - id="g21"><g - id="g23"><path - class="st2" - d="m 234.7,183.8 0,-119.5 c 0,-9.7 -7.9,-17.7 -17.7,-17.7 l -8.3,0 c -9.7,0 -17.7,8 -17.7,17.7 l 0,119.5 43.7,0 z" - id="path25" - inkscape:connector-curvature="0" - style="fill:#87c214" /><rect - x="191" - y="190.8" - class="st1" - width="43.700001" - height="43.700001" - id="rect27" - style="display:none;fill:#87c214" /><path - class="st2" - d="m 191,241.5 0,22.5 c 0,9.7 8,17.7 17.7,17.7 l 8.3,0 c 9.7,0 17.7,-8 17.7,-17.7 l 0,-22.5 -43.7,0 z" - id="path29" - inkscape:connector-curvature="0" - style="fill:#87c214" /></g><path - class="st3" - d="m 217,46.7 c 9.7,0 17.7,8 17.7,17.7 l 0,199.6 c 0,9.7 -7.9,17.7 -17.7,17.7 l -8.3,0 c -9.7,0 -17.7,-8 -17.7,-17.7 l 0,-199.7 c 0,-9.7 8,-17.7 17.7,-17.7 l 8.3,0 m 0,-6.9 -8.3,0 C 195.1,39.7 184,50.8 184,64.4 l 0,199.6 c 0,13.6 11.1,24.7 24.7,24.7 l 8.3,0 c 13.6,0 24.7,-11.1 24.7,-24.7 l 0,-199.7 C 241.7,50.7 230.6,39.7 217,39.7 l 0,0 z" - id="path31" - inkscape:connector-curvature="0" - style="display:none;fill:#ffffff" /></g><g - id="g33"><g - id="g35"><path - class="st4" - d="m 87,190.8 -22.5,0 c -9.7,0 -17.7,7.9 -17.7,17.7 l 0,8.3 c 0,9.7 7.9,17.7 17.7,17.7 l 22.5,0 0,-43.7 z" - id="path37" - inkscape:connector-curvature="0" - style="fill:#95d220" /><rect - x="94" - y="190.8" - class="st5" - width="43.700001" - height="43.700001" - id="rect39" - style="display:none;fill:#95d220" /><path - class="st4" - d="m 264.2,190.8 -119.5,0 0,43.7 119.5,0 c 9.7,0 17.7,-8 17.7,-17.7 l 0,-8.3 c -0.1,-9.7 -8,-17.7 -17.7,-17.7 z" - id="path41" - inkscape:connector-curvature="0" - style="fill:#95d220" /></g><path - class="st3" - d="m 264.2,190.8 c 9.7,0 17.7,7.9 17.7,17.7 l 0,8.3 c 0,9.7 -8,17.7 -17.7,17.7 l -199.7,0 c -9.7,0 -17.7,-8 -17.7,-17.7 l 0,-8.3 c 0,-9.7 7.9,-17.7 17.7,-17.7 l 199.7,0 m 0,-7 -199.7,0 c -13.6,0 -24.7,11.1 -24.7,24.7 l 0,8.3 c 0,13.6 11.1,24.7 24.7,24.7 l 199.7,0 c 13.6,0 24.7,-11.1 24.7,-24.7 l 0,-8.3 c -0.1,-13.6 -11.1,-24.7 -24.7,-24.7 l 0,0 z" - id="path43" - inkscape:connector-curvature="0" - style="display:none;fill:#ffffff" /></g><g - id="g45"><g - id="g47"><rect - x="191" - y="93.800003" - class="st5" - width="43.700001" - height="43.700001" - id="rect49" - style="display:none;fill:#95d220" /><path - class="st4" - d="m 184,93.8 -119.5,0 c -9.7,0 -17.7,7.9 -17.7,17.7 l 0,8.3 c 0,9.7 7.9,17.7 17.7,17.7 l 119.5,0 0,-43.7 z" - id="path51" - inkscape:connector-curvature="0" - style="fill:#95d220" /><path - class="st4" - d="m 264.2,93.8 -22.5,0 0,43.7 22.5,0 c 9.7,0 17.7,-7.9 17.7,-17.7 l 0,-8.3 c -0.1,-9.7 -8,-17.7 -17.7,-17.7 z" - id="path53" - inkscape:connector-curvature="0" - style="fill:#95d220" /></g><path - class="st3" - d="m 264.2,93.8 c 9.7,0 17.7,7.9 17.7,17.7 l 0,8.3 c 0,9.7 -8,17.7 -17.7,17.7 l -199.7,0 c -9.7,0 -17.7,-7.9 -17.7,-17.7 l 0,-8.3 c 0,-9.7 7.9,-17.7 17.7,-17.7 l 199.7,0 m 0,-7 -199.7,0 c -13.6,0 -24.7,11.1 -24.7,24.7 l 0,8.3 c 0,13.6 11.1,24.7 24.7,24.7 l 199.7,0 c 13.6,0 24.7,-11.1 24.7,-24.7 l 0,-8.3 C 288.8,97.9 277.8,86.8 264.2,86.8 l 0,0 z" - id="path55" - inkscape:connector-curvature="0" - style="display:none;fill:#ffffff" /></g></g></svg> \ No newline at end of file diff --git a/data/icons/meson.build b/data/icons/meson.build deleted file mode 100644 index 3c5fe25..0000000 --- a/data/icons/meson.build +++ /dev/null @@ -1,8 +0,0 @@ -# Copyright (c) 2019 Nico Alt -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md - -icon_themes = ['hicolor'] -foreach theme : icon_themes - install_subdir(theme, install_dir: 'share/icons/') -endforeach diff --git a/data/meson.build b/data/meson.build deleted file mode 100644 index 00ec5c1..0000000 --- a/data/meson.build +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright (c) 2019 Nico Alt -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md - -desktop_file = i18n.merge_file( - input: 'app.briar.gtk.desktop.in', - output: 'app.briar.gtk.desktop', - type: 'desktop', - po_dir: '../po', - install: true, - install_dir: join_paths(get_option('datadir'), 'applications') -) - -desktop_utils = find_program('desktop-file-validate', required: false) -if desktop_utils.found() - test('Validate desktop file', desktop_utils, - args: [desktop_file] - ) -endif - -appstream_file = i18n.merge_file( - input: 'app.briar.gtk.appdata.xml.in', - output: 'app.briar.gtk.appdata.xml', - po_dir: '../po', - install: true, - install_dir: join_paths(get_option('datadir'), 'appdata') -) - -appstream_util = find_program('appstream-util', required: false) -if appstream_util.found() - test('Validate appstream file', appstream_util, - args: ['validate', appstream_file] - ) -endif - -install_data('app.briar.gtk.gschema.xml', - install_dir: join_paths(get_option('datadir'), 'glib-2.0/schemas') -) - -compile_schemas = find_program('glib-compile-schemas', required: false) -if compile_schemas.found() - test('Validate schema file', compile_schemas, - args: ['--strict', '--dry-run', meson.current_source_dir()] - ) -endif - -pkgdatadir = join_paths(get_option('prefix'), get_option('datadir'), meson.project_name()) -gnome = import('gnome') - -gnome.compile_resources('briar-gtk', - 'ui/app.briar.gtk.gresource.xml', - gresource_bundle: true, - install: true, - install_dir: pkgdatadir, -) - -subdir('icons') diff --git a/data/ui/add_contact.ui b/data/ui/add_contact.ui deleted file mode 100644 index 5ef80c3..0000000 --- a/data/ui/add_contact.ui +++ /dev/null @@ -1,266 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - Copyright (c) 2019 Nico Alt - SPDX-License-Identifier: AGPL-3.0-only - License-Filename: LICENSE.md - - Based on parts of GNOME Fractal - https://gitlab.gnome.org/GNOME/fractal/blob/4.2.2/fractal-gtk/res/ui/login_flow.ui ---> -<interface> - <requires lib="gtk+" version="3.22"/> - <object class="GtkStack" id="add_contact_flow_stack"> - <property name="can_focus">False</property> - <property name="hhomogeneous">True</property> - <property name="transition_type">GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT</property> - <child> - <object class="GtkGrid" id="links_page"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">center</property> - <property name="valign">center</property> - <property name="column_spacing">12</property> - <property name="row_spacing">24</property> - <child> - <object class="GtkLabel"> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes" context="add contact">Give this link to the contact you want to add</property> - <property name="wrap">True</property> - <property name="wrap_mode">PANGO_WRAP_WORD_CHAR</property> - <property name="mnemonic_widget">own_link_entry</property> - <style> - <class name="dim-label"/> - </style> - </object> - <packing> - <property name="top-attach">1</property> - <property name="left-attach">1</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="own_link_entry"> - <property name="visible">True</property> - <property name="max_width_chars">-1</property> - <property name="width_request">232</property> - <property name="can_focus">True</property> - <property name="input_purpose">GTK_INPUT_PURPOSE_URL</property> - </object> - <packing> - <property name="top-attach">2</property> - <property name="left-attach">1</property> - </packing> - </child> - <child> - <object class="GtkLabel"> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes" context="add contact">Enter the link from your contact here</property> - <property name="wrap">True</property> - <property name="wrap_mode">PANGO_WRAP_WORD_CHAR</property> - <property name="mnemonic_widget">their_link_entry</property> - <style> - <class name="dim-label"/> - </style> - </object> - <packing> - <property name="top-attach">3</property> - <property name="left-attach">1</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="their_link_entry"> - <property name="visible">True</property> - <property name="max_width_chars">-1</property> - <property name="width_request">232</property> - <property name="can_focus">True</property> - <property name="placeholder_text" translatable="yes" context="add contact">Contact's link</property> - <property name="input_purpose">GTK_INPUT_PURPOSE_URL</property> - </object> - <packing> - <property name="top-attach">4</property> - <property name="left-attach">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="link_error_label"> - <property name="visible">False</property> - <property name="can_focus">False</property> - <property name="no_show_all">True</property> - <property name="label" translatable="yes" context="add contact">Please enter a link</property> - <property name="wrap">True</property> - <property name="wrap_mode">PANGO_WRAP_WORD_CHAR</property> - <style> - <class name="error-label"/> - </style> - </object> - <packing> - <property name="top-attach">5</property> - <property name="left-attach">1</property> - </packing> - </child> - </object> - <packing> - <property name="name">links</property> - </packing> - </child> - <child> - <object class="GtkGrid" id="alias_page"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">center</property> - <property name="valign">center</property> - <property name="column_spacing">12</property> - <property name="row_spacing">24</property> - <child> - <object class="GtkLabel"> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes" context="add contact">Give your contact a nickname. Only you can see it.</property> - <property name="halign">end</property> - <property name="wrap">True</property> - <property name="wrap_mode">PANGO_WRAP_WORD_CHAR</property> - <property name="mnemonic_widget">own_link_entry</property> - <style> - <class name="dim-label"/> - </style> - </object> - <packing> - <property name="top-attach">1</property> - <property name="left-attach">1</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="alias_entry"> - <property name="visible">True</property> - <property name="max_width_chars">-1</property> - <property name="width_request">232</property> - <property name="can_focus">True</property> - <property name="placeholder_text" translatable="yes" context="add contact">Enter a nickname</property> - </object> - <packing> - <property name="top-attach">2</property> - <property name="left-attach">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="alias_error_label"> - <property name="visible">False</property> - <property name="can_focus">False</property> - <property name="no_show_all">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes" context="add contact">The alias may not be empty</property> - <property name="wrap">True</property> - <property name="wrap_mode">PANGO_WRAP_WORD_CHAR</property> - <style> - <class name="error-label"/> - </style> - </object> - <packing> - <property name="top-attach">3</property> - <property name="left-attach">1</property> - </packing> - </child> - </object> - <packing> - <property name="name">alias</property> - </packing> - </child> - </object> - <object class="GtkStack" id="add_contact_flow_headers"> - <property name="can_focus">False</property> - <property name="hhomogeneous">True</property> - <property name="visible_child_name" bind-source="add_contact_flow_stack" bind-property="visible-child-name" bind-flags="sync-create"/> - <property name="transition_duration" bind-source="add_contact_flow_stack" bind-property="transition-duration" bind-flags="sync-create"/> - <property name="transition_type" bind-source="add_contact_flow_stack" bind-property="transition-type" bind-flags="sync-create"/> - <child> - <object class="GtkHeaderBar"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="show_close_button">True</property> - <property name="width_request">360</property> - <property name="title">Add contact</property> - <child> - <object class="GtkButton"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <signal name="clicked" handler="on_link_back_pressed"/> - <child> - <object class="GtkImage"> - <property name="visible">True</property> - <property name="icon_name">go-previous-symbolic</property> - </object> - </child> - </object> - <packing> - <property name="pack_type">start</property> - </packing> - </child> - <child> - <object class="GtkButton"> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Next</property> - <signal name="clicked" handler="on_links_next_pressed"/> - <style> - <class name="suggested-action"/> - </style> - </object> - <packing> - <property name="pack_type">end</property> - </packing> - </child> - </object> - <packing> - <property name="name">links</property> - </packing> - </child> - <child> - <object class="GtkHeaderBar"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="show_close_button">True</property> - <property name="title" translatable="yes">Add contact</property> - <child> - <object class="GtkButton"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <signal name="clicked" handler="on_alias_back_pressed"/> - <child> - <object class="GtkImage"> - <property name="visible">True</property> - <property name="icon_name">go-previous-symbolic</property> - </object> - </child> - </object> - <packing> - <property name="pack_type">start</property> - </packing> - </child> - <child> - <object class="GtkButton"> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Add contact</property> - <signal name="clicked" handler="on_add_contact_pressed"/> - <style> - <class name="suggested-action"/> - </style> - </object> - <packing> - <property name="pack_type">end</property> - </packing> - </child> - </object> - <packing> - <property name="name">alias</property> - </packing> - </child> - </object> -</interface> - diff --git a/data/ui/app.briar.gtk.gresource.xml b/data/ui/app.briar.gtk.gresource.xml deleted file mode 100644 index 8cd71a2..0000000 --- a/data/ui/app.briar.gtk.gresource.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<gresources> - <gresource prefix="/app/briar/gtk"> - <file compressed="true">ui/application.css</file> - <file compressed="true" preprocess="xml-stripblanks">ui/add_contact.ui</file> - <file compressed="true" preprocess="xml-stripblanks">ui/chat.ui</file> - <file compressed="true" preprocess="xml-stripblanks">ui/login.ui</file> - <file compressed="true" preprocess="xml-stripblanks">ui/main.ui</file> - <file compressed="true" preprocess="xml-stripblanks">ui/registration.ui</file> - <file compressed="true" preprocess="xml-stripblanks">ui/toolbar_start.ui</file> - </gresource> -</gresources> diff --git a/data/ui/application.css b/data/ui/application.css deleted file mode 100644 index 430e318..0000000 --- a/data/ui/application.css +++ /dev/null @@ -1,4 +0,0 @@ -.error-label { - color: @error_color; -} - diff --git a/data/ui/chat.ui b/data/ui/chat.ui deleted file mode 100644 index e779caf..0000000 --- a/data/ui/chat.ui +++ /dev/null @@ -1,42 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - Copyright (c) 2019 Nico Alt - SPDX-License-Identifier: AGPL-3.0-only - License-Filename: LICENSE.md ---> -<interface> - <requires lib="gtk+" version="3.20"/> - <object class="GtkGrid" id="chat"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">center</property> - <property name="valign">center</property> - <property name="margin_left">18</property> - <property name="margin_right">18</property> - <property name="margin_top">18</property> - <property name="margin_bottom">18</property> - <child> - <object class="GtkListBox" id="messages_list"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="hexpand">True</property> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">0</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="chat_entry"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="placeholder_text" translatable="yes" context="chat page: input field">Type Message</property> - <property name="show_emoji_icon">True</property> - </object> - <packing> - <property name="left_attach">0</property> - <property name="top_attach">1</property> - </packing> - </child> - </object> -</interface> diff --git a/data/ui/login.ui b/data/ui/login.ui deleted file mode 100644 index 3ac5a59..0000000 --- a/data/ui/login.ui +++ /dev/null @@ -1,147 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - Copyright (c) 2019 Nico Alt - SPDX-License-Identifier: AGPL-3.0-only - License-Filename: LICENSE.md - - Based on parts of GNOME Fractal - https://gitlab.gnome.org/GNOME/fractal/blob/4.2.2/fractal-gtk/res/ui/login_flow.ui ---> -<interface> - <requires lib="gtk+" version="3.22"/> - <object class="GtkStack" id="login_flow_stack"> - <property name="can_focus">False</property> - <property name="hhomogeneous">True</property> - <property name="transition_type">GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT</property> - <child> - <object class="GtkGrid" id="login_page"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">center</property> - <property name="valign">center</property> - <property name="column_spacing">12</property> - <property name="row_spacing">24</property> - <child> - <object class="GtkLabel"> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">Password</property> - <property name="halign">end</property> - <property name="wrap">True</property> - <property name="wrap_mode">PANGO_WRAP_WORD_CHAR</property> - <property name="mnemonic_widget">password_entry</property> - <style> - <class name="dim-label"/> - </style> - </object> - <packing> - <property name="top-attach">1</property> - <property name="left-attach">0</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="password_entry"> - <property name="visible">True</property> - <property name="max_width_chars">-1</property> - <property name="width_request">232</property> - <property name="can_focus">True</property> - <property name="visibility">False</property> - <property name="input_purpose">GTK_INPUT_PURPOSE_PASSWORD</property> - </object> - <packing> - <property name="top-attach">1</property> - <property name="left-attach">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="error_message"> - <property name="visible">False</property> - <property name="can_focus">False</property> - <property name="no_show_all">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">Couldn't log in</property> - <property name="wrap">True</property> - <property name="wrap_mode">PANGO_WRAP_WORD_CHAR</property> - <style> - <class name="error-label"/> - </style> - </object> - <packing> - <property name="top-attach">2</property> - <property name="left-attach">1</property> - </packing> - </child> - </object> - <packing> - <property name="name">password</property> - </packing> - </child> - <child> - <object class="GtkGrid" id="loading_animation"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">center</property> - <property name="valign">center</property> - <property name="column_spacing">12</property> - <property name="row_spacing">24</property> - <child> - <object class="GtkSpinner"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="active">True</property> - </object> - </child> - </object> - <packing> - <property name="name">loading</property> - </packing> - </child> - </object> - <object class="GtkStack" id="login_flow_headers"> - <property name="can_focus">False</property> - <property name="hhomogeneous">True</property> - <property name="visible_child_name" bind-source="login_flow_stack" bind-property="visible-child-name" bind-flags="sync-create"/> - <property name="transition_duration" bind-source="login_flow_stack" bind-property="transition-duration" bind-flags="sync-create"/> - <property name="transition_type" bind-source="login_flow_stack" bind-property="transition-type" bind-flags="sync-create"/> - <child> - <object class="GtkHeaderBar"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="show_close_button">True</property> - <property name="title">Briar</property> - <child> - <object class="GtkButton"> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Log in</property> - <signal name="clicked" handler="on_login_pressed"/> - <style> - <class name="suggested-action"/> - </style> - </object> - <packing> - <property name="pack_type">end</property> - </packing> - </child> - </object> - <packing> - <property name="name">password</property> - </packing> - </child> - <child> - <object class="GtkHeaderBar" id="loading_header"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="show_close_button">True</property> - <property name="width_request">360</property> - <property name="title" translatable="yes">Logging in</property> - </object> - <packing> - <property name="name">loading</property> - </packing> - </child> - </object> -</interface> - diff --git a/data/ui/main.ui b/data/ui/main.ui deleted file mode 100644 index ab14dc8..0000000 --- a/data/ui/main.ui +++ /dev/null @@ -1,22 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - Copyright (c) 2019 Nico Alt - SPDX-License-Identifier: AGPL-3.0-only - License-Filename: LICENSE.md ---> -<interface> - <requires lib="gtk+" version="3.20"/> - <object class="GtkListBox" id="contacts_list"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">center</property> - <property name="valign">center</property> - <property name="margin_left">18</property> - <property name="margin_right">18</property> - <property name="margin_top">18</property> - <property name="margin_bottom">18</property> - <property name="hexpand">True</property> - </object> -</interface> - - diff --git a/data/ui/registration.ui b/data/ui/registration.ui deleted file mode 100644 index d8458f5..0000000 --- a/data/ui/registration.ui +++ /dev/null @@ -1,304 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - Copyright (c) 2019 Nico Alt - SPDX-License-Identifier: AGPL-3.0-only - License-Filename: LICENSE.md - - Based on parts of GNOME Fractal - https://gitlab.gnome.org/GNOME/fractal/blob/4.2.2/fractal-gtk/res/ui/login_flow.ui ---> -<interface> - <requires lib="gtk+" version="3.22"/> - <object class="GtkStack" id="registration_flow_stack"> - <property name="can_focus">False</property> - <property name="hhomogeneous">True</property> - <property name="transition_type">GTK_STACK_TRANSITION_TYPE_SLIDE_LEFT_RIGHT</property> - <child> - <object class="GtkBox" id="nickname_page"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">center</property> - <property name="valign">center</property> - <property name="orientation">vertical</property> - <property name="spacing">18</property> - <child> - <object class="GtkImage" id="nickname_page_image"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">center</property> - <property name="margin_start">18</property> - <property name="margin_end">18</property> - <property name="margin_top">18</property> - <property name="pixel_size">128</property> - <property name="icon_name">app.briar.gtk</property> - </object> - </child> - <child> - <object class="GtkLabel"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">Welcome to Briar</property> - <property name="margin_bottom">48</property> - <property name="wrap">True</property> - <property name="wrap_mode">PANGO_WRAP_WORD_CHAR</property> - <attributes> - <attribute name="weight" value="ultrabold"/> - <attribute name="scale" value="1.7"/> - </attributes> - </object> - </child> - <child> - <object class="GtkBox"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="orientation">vertical</property> - <property name="spacing">6</property> - <child> - <object class="GtkEntry" id="nickname_entry"> - <property name="visible">True</property> - <property name="halign">center</property> - <property name="max_width_chars">-1</property> - <property name="width_request">300</property> - </object> - </child> - <child> - <object class="GtkLabel"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">Choose your nickname</property> - <property name="wrap">True</property> - <property name="wrap_mode">PANGO_WRAP_WORD_CHAR</property> - <style> - <class name="dim-label"/> - <class name="small-label"/> - </style> - </object> - </child> - <child> - <object class="GtkLabel" id="nickname_error_label"> - <property name="visible">False</property> - <property name="can_focus">False</property> - <property name="no_show_all">True</property> - <property name="label" translatable="yes">The nickname may not be empty.</property> - <property name="wrap">True</property> - <property name="wrap_mode">PANGO_WRAP_WORD_CHAR</property> - <style> - <class name="error-label"/> - </style> - </object> - </child> - </object> - </child> - </object> - <packing> - <property name="name">nickname</property> - </packing> - </child> - <child> - <object class="GtkGrid" id="passwords_page"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">center</property> - <property name="valign">center</property> - <property name="column_spacing">12</property> - <property name="row_spacing">24</property> - <child> - <object class="GtkLabel"> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">Password</property> - <property name="halign">end</property> - <property name="wrap">True</property> - <property name="wrap_mode">PANGO_WRAP_WORD_CHAR</property> - <property name="mnemonic_widget">password_entry</property> - <style> - <class name="dim-label"/> - </style> - </object> - <packing> - <property name="top-attach">1</property> - <property name="left-attach">0</property> - </packing> - </child> - <child> - <object class="GtkLabel"> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="can_focus">False</property> - <property name="label" translatable="yes">Confirm Password</property> - <property name="halign">end</property> - <property name="wrap">True</property> - <property name="wrap_mode">PANGO_WRAP_WORD_CHAR</property> - <property name="mnemonic_widget">password_confirm_entry</property> - <style> - <class name="dim-label"/> - </style> - </object> - <packing> - <property name="top-attach">2</property> - <property name="left-attach">0</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="password_entry"> - <property name="visible">True</property> - <property name="max_width_chars">-1</property> - <property name="width_request">232</property> - <property name="can_focus">True</property> - <property name="visibility">False</property> - <property name="input_purpose">GTK_INPUT_PURPOSE_PASSWORD</property> - </object> - <packing> - <property name="top-attach">1</property> - <property name="left-attach">1</property> - </packing> - </child> - <child> - <object class="GtkEntry" id="password_confirm_entry"> - <property name="visible">True</property> - <property name="max_width_chars">-1</property> - <property name="width_request">232</property> - <property name="can_focus">True</property> - <property name="visibility">False</property> - <property name="input_purpose">GTK_INPUT_PURPOSE_PASSWORD</property> - </object> - <packing> - <property name="top-attach">2</property> - <property name="left-attach">1</property> - </packing> - </child> - <child> - <object class="GtkLabel" id="passwords_error_label"> - <property name="visible">False</property> - <property name="can_focus">False</property> - <property name="no_show_all">True</property> - <property name="xalign">0</property> - <property name="label" translatable="yes">The passwords do not match</property> - <property name="wrap">True</property> - <property name="wrap_mode">PANGO_WRAP_WORD_CHAR</property> - <style> - <class name="error-label"/> - </style> - </object> - <packing> - <property name="top-attach">5</property> - <property name="left-attach">1</property> - </packing> - </child> - </object> - <packing> - <property name="name">passwords</property> - </packing> - </child> - <child> - <object class="GtkGrid" id="loading_animation"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="halign">center</property> - <property name="valign">center</property> - <property name="column_spacing">12</property> - <property name="row_spacing">24</property> - <child> - <object class="GtkSpinner"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="active">True</property> - </object> - </child> - </object> - <packing> - <property name="name">loading</property> - </packing> - </child> - </object> - <object class="GtkStack" id="registration_flow_headers"> - <property name="can_focus">False</property> - <property name="hhomogeneous">True</property> - <property name="visible_child_name" bind-source="registration_flow_stack" bind-property="visible-child-name" bind-flags="sync-create"/> - <property name="transition_duration" bind-source="registration_flow_stack" bind-property="transition-duration" bind-flags="sync-create"/> - <property name="transition_type" bind-source="registration_flow_stack" bind-property="transition-type" bind-flags="sync-create"/> - <child> - <object class="GtkHeaderBar"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="show_close_button">True</property> - <property name="width_request">360</property> - <property name="title">Briar</property> - <child> - <object class="GtkButton"> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Next</property> - <signal name="clicked" handler="on_nickname_next_pressed"/> - <style> - <class name="suggested-action"/> - </style> - </object> - <packing> - <property name="pack_type">end</property> - </packing> - </child> - </object> - <packing> - <property name="name">nickname</property> - </packing> - </child> - <child> - <object class="GtkHeaderBar"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="show_close_button">True</property> - <property name="title" translatable="yes">Password</property> - <child> - <object class="GtkButton"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <signal name="clicked" handler="on_create_account_back_pressed"/> - <child> - <object class="GtkImage"> - <property name="visible">True</property> - <property name="icon_name">go-previous-symbolic</property> - </object> - </child> - </object> - <packing> - <property name="pack_type">start</property> - </packing> - </child> - <child> - <object class="GtkButton"> - <property name="visible">True</property> - <property name="use_underline">True</property> - <property name="can_focus">True</property> - <property name="label" translatable="yes">Create Account</property> - <signal name="clicked" handler="on_create_account_pressed"/> - <style> - <class name="suggested-action"/> - </style> - </object> - <packing> - <property name="pack_type">end</property> - </packing> - </child> - </object> - <packing> - <property name="name">passwords</property> - </packing> - </child> - <child> - <object class="GtkHeaderBar"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="show_close_button">True</property> - <property name="width_request">360</property> - <property name="title" translatable="yes">Creating Account</property> - </object> - <packing> - <property name="name">loading</property> - </packing> - </child> - </object> -</interface> - diff --git a/data/ui/toolbar_start.ui b/data/ui/toolbar_start.ui deleted file mode 100644 index 31a9392..0000000 --- a/data/ui/toolbar_start.ui +++ /dev/null @@ -1,52 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - Copyright (c) 2019 Nico Alt - SPDX-License-Identifier: AGPL-3.0-only - License-Filename: LICENSE.md - - Based on parts of GNOME Lollypop - https://gitlab.gnome.org/World/lollypop/blob/1.0.12/data/ToolbarPlayback.ui ---> -<interface> - <requires lib="gtk+" version="3.10"/> - <object class="GtkImage" id="back_image"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">go-previous-symbolic</property> - </object> - <object class="GtkImage" id="add_contact_image"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="icon_name">list-add-symbolic</property> - </object> - <object class="GtkBox" id="toolbar_start"> - <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="spacing">5</property> - <child> - <object class="GtkButton" id="back_button"> - <property name="visible">False</property> - <property name="valign">center</property> - <property name="image">back_image</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - <child> - <object class="GtkButton" id="add_contact_button"> - <property name="visible">False</property> - <property name="valign">center</property> - <property name="image">add_contact_image</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> - </packing> - </child> - </object> -</interface> - diff --git a/po/LINGUAS b/po/LINGUAS deleted file mode 100644 index 173f978..0000000 --- a/po/LINGUAS +++ /dev/null @@ -1,2 +0,0 @@ -de -es diff --git a/po/POTFILES b/po/POTFILES deleted file mode 100644 index 0963042..0000000 --- a/po/POTFILES +++ /dev/null @@ -1,7 +0,0 @@ -data/app.briar.gtk.desktop.in -data/app.briar.gtk.appdata.xml.in -data/app.briar.gtk.gschema.xml -src/window.ui -src/main.py -src/window.py - diff --git a/po/briar-gtk.pot b/po/briar-gtk.pot deleted file mode 100644 index abb1ba4..0000000 --- a/po/briar-gtk.pot +++ /dev/null @@ -1,111 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-09 01:55+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" -"Language-Team: LANGUAGE <LL@li.org>\n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: ../data/ui/add_contact.ui:28 -msgid "Give this link to the contact you want to add" -msgstr "" - -#: ../data/ui/add_contact.ui:48 -msgid "Enter the link from your contact here" -msgstr "" - -#: ../data/ui/add_contact.ui:58 -msgctxt "link exchange: their link input field" -msgid "Contact's link" -msgstr "" - -#: ../data/ui/add_contact.ui:69 -msgctxt "link exchange: button – initiate pairing" -msgid "Continue" -msgstr "" - -#: ../data/ui/add_contact.ui:89 -msgid "Give your contact a nickname. Only you can see it." -msgstr "" - -#: ../data/ui/add_contact.ui:99 -msgctxt "remote contact adding: alias input field" -msgid "Enter a nickname" -msgstr "" - -#: ../data/ui/add_contact.ui:110 -msgctxt "remote contact adding: button" -msgid "Add Contact" -msgstr "" - -#: ../data/ui/chat.ui:33 -msgctxt "chat page: input field" -msgid "Type Message" -msgstr "" - -#: ../data/ui/login.ui:29 ../data/ui/registration.ui:110 -msgid "Password" -msgstr "" - -#: ../data/ui/login.ui:63 -msgid "Couldn't log in" -msgstr "" - -#: ../data/ui/login.ui:118 -msgid "Log in" -msgstr "" - -#: ../data/ui/login.ui:139 -msgid "Logging in" -msgstr "" - -#: ../data/ui/registration.ui:40 -msgid "Welcome to Briar" -msgstr "" - -#: ../data/ui/registration.ui:68 -msgid "Choose your nickname" -msgstr "" - -#: ../data/ui/registration.ui:82 -msgid "The nickname may not be empty." -msgstr "" - -#: ../data/ui/registration.ui:129 -msgid "Confirm Password" -msgstr "" - -#: ../data/ui/registration.ui:177 -msgid "The passwords do not match" -msgstr "" - -#: ../data/ui/registration.ui:233 -msgid "Next" -msgstr "" - -#: ../data/ui/registration.ui:253 -msgid "Passwords" -msgstr "" - -#: ../data/ui/registration.ui:275 -msgid "Create Account" -msgstr "" - -#: ../data/ui/registration.ui:296 -msgid "Creating Account" -msgstr "" - -#: ../src/briar/gtk/containers/registration.py:137 -msgid "Couldn't register account" -msgstr "" diff --git a/po/de.po b/po/de.po deleted file mode 100644 index 0d74b23..0000000 --- a/po/de.po +++ /dev/null @@ -1,128 +0,0 @@ -msgid "" -msgstr "" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-09 01:55+0100\n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: ../data/ui/add_contact.ui:28 -msgid "Give this link to the contact you want to add" -msgstr "" - -#: ../data/ui/add_contact.ui:48 -msgid "Enter the link from your contact here" -msgstr "" - -#: ../data/ui/add_contact.ui:58 -msgctxt "link exchange: their link input field" -msgid "Contact's link" -msgstr "" - -#: ../data/ui/add_contact.ui:69 -msgctxt "link exchange: button – initiate pairing" -msgid "Continue" -msgstr "" - -#: ../data/ui/add_contact.ui:89 -msgid "Give your contact a nickname. Only you can see it." -msgstr "" - -#: ../data/ui/add_contact.ui:99 -msgctxt "remote contact adding: alias input field" -msgid "Enter a nickname" -msgstr "" - -#: ../data/ui/add_contact.ui:110 -msgctxt "remote contact adding: button" -msgid "Add Contact" -msgstr "" - -#: ../data/ui/chat.ui:33 -msgctxt "chat page: input field" -msgid "Type Message" -msgstr "Nachricht eingeben" - -#: ../data/ui/login.ui:29 ../data/ui/registration.ui:110 -msgid "Password" -msgstr "Passwort" - -#: ../data/ui/login.ui:63 -msgid "Couldn't log in" -msgstr "" - -#: ../data/ui/login.ui:118 -msgid "Log in" -msgstr "" - -#: ../data/ui/login.ui:139 -msgid "Logging in" -msgstr "" - -#: ../data/ui/registration.ui:40 -msgid "Welcome to Briar" -msgstr "Willkommen bei Briar" - -#: ../data/ui/registration.ui:68 -msgid "Choose your nickname" -msgstr "Wähle deinen Benutzernamen aus" - -#: ../data/ui/registration.ui:82 -msgid "The nickname may not be empty." -msgstr "Der Benutzername darf nicht leer sein." - -#: ../data/ui/registration.ui:129 -msgid "Confirm Password" -msgstr "Passwort bestätigen" - -#: ../data/ui/registration.ui:177 -msgid "The passwords do not match" -msgstr "Die Passwörter stimmen nicht überein" - -#: ../data/ui/registration.ui:233 -msgid "Next" -msgstr "Weiter" - -#: ../data/ui/registration.ui:253 -msgid "Passwords" -msgstr "Passwörter" - -#: ../data/ui/registration.ui:275 -msgid "Create Account" -msgstr "Account erstellen" - -#: ../data/ui/registration.ui:296 -msgid "Creating Account" -msgstr "Erstelle Account" - -#: ../src/briar/gtk/containers/registration.py:137 -msgid "Couldn't register account" -msgstr "" - -#~ msgctxt "login page: button" -#~ msgid "Sign in" -#~ msgstr "Login" - -#~ msgctxt "registration page: password input field" -#~ msgid "Choose your password" -#~ msgstr "Wähle Dein Passwort" - -#~ msgctxt "registration page: password input field" -#~ msgid "Confirm your password" -#~ msgstr "Bestätige Dein Passwort" - -#~ msgctxt "registration page: button" -#~ msgid "Create Account" -#~ msgstr "Account erstellen" - -#~ msgid "Nickname" -#~ msgstr "Nutzername" - -#~ msgctxt "registration page: input field" -#~ msgid "Choose your nickname" -#~ msgstr "Wähle Deinen Benutzernamen" - -#~ msgctxt "registration page: button – from username to passwords" -#~ msgid "Next" -#~ msgstr "Weiter" diff --git a/po/es.po b/po/es.po deleted file mode 100644 index 2344a2a..0000000 --- a/po/es.po +++ /dev/null @@ -1,124 +0,0 @@ -msgid "" -msgstr "" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-12-09 01:55+0100\n" -"Language: es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: ../data/ui/add_contact.ui:28 -msgid "Give this link to the contact you want to add" -msgstr "" - -#: ../data/ui/add_contact.ui:48 -msgid "Enter the link from your contact here" -msgstr "" - -#: ../data/ui/add_contact.ui:58 -msgctxt "link exchange: their link input field" -msgid "Contact's link" -msgstr "" - -#: ../data/ui/add_contact.ui:69 -msgctxt "link exchange: button – initiate pairing" -msgid "Continue" -msgstr "" - -#: ../data/ui/add_contact.ui:89 -msgid "Give your contact a nickname. Only you can see it." -msgstr "" - -#: ../data/ui/add_contact.ui:99 -msgctxt "remote contact adding: alias input field" -msgid "Enter a nickname" -msgstr "" - -#: ../data/ui/add_contact.ui:110 -msgctxt "remote contact adding: button" -msgid "Add Contact" -msgstr "" - -#: ../data/ui/chat.ui:33 -msgctxt "chat page: input field" -msgid "Type Message" -msgstr "" - -#: ../data/ui/login.ui:29 ../data/ui/registration.ui:110 -msgid "Password" -msgstr "Contraseña" - -#: ../data/ui/login.ui:63 -msgid "Couldn't log in" -msgstr "" - -#: ../data/ui/login.ui:118 -msgid "Log in" -msgstr "" - -#: ../data/ui/login.ui:139 -msgid "Logging in" -msgstr "" - -#: ../data/ui/registration.ui:40 -msgid "Welcome to Briar" -msgstr "" - -#: ../data/ui/registration.ui:68 -msgid "Choose your nickname" -msgstr "" - -#: ../data/ui/registration.ui:82 -msgid "The nickname may not be empty." -msgstr "" - -#: ../data/ui/registration.ui:129 -msgid "Confirm Password" -msgstr "" - -#: ../data/ui/registration.ui:177 -msgid "The passwords do not match" -msgstr "" - -#: ../data/ui/registration.ui:233 -msgid "Next" -msgstr "" - -#: ../data/ui/registration.ui:253 -msgid "Passwords" -msgstr "" - -#: ../data/ui/registration.ui:275 -msgid "Create Account" -msgstr "" - -#: ../data/ui/registration.ui:296 -msgid "Creating Account" -msgstr "" - -#: ../src/briar/gtk/containers/registration.py:137 -msgid "Couldn't register account" -msgstr "" - -#~ msgctxt "registration page: password input field" -#~ msgid "Choose your password" -#~ msgstr "Elegir tu contraseña" - -#~ msgctxt "registration page: password input field" -#~ msgid "Confirm your password" -#~ msgstr "Confirmar tu contraseña" - -#~ msgctxt "registration page: button" -#~ msgid "Create Account" -#~ msgstr "Crear cuenta" - -#~ msgid "Nickname" -#~ msgstr "Nombre" - -#~ msgctxt "registration page: input field" -#~ msgid "Choose your nickname" -#~ msgstr "Elegir tu nombre" - -#~ msgctxt "registration page: button – from username to passwords" -#~ msgid "Next" -#~ msgstr "Seguir" diff --git a/po/meson.build b/po/meson.build deleted file mode 100644 index 4f1ee28..0000000 --- a/po/meson.build +++ /dev/null @@ -1,5 +0,0 @@ -# Copyright (c) 2019 Nico Alt -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md - -i18n.gettext('briar-gtk', preset: 'glib') diff --git a/src/briar-gtk.in b/src/briar-gtk.in deleted file mode 100755 index a0ab663..0000000 --- a/src/briar-gtk.in +++ /dev/null @@ -1,57 +0,0 @@ -#!@PYTHON@ -# -# Copyright (c) 2019 Nico Alt -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md -# -# Initial version based on GNOME Lollypop -# https://gitlab.gnome.org/World/lollypop/blob/1.0.2/lollypop.in - -import gettext -import locale -import os -import signal -import sys - -import gi -gi.require_version('Gtk', '3.0') -from gi.repository import Gio - -PACKAGE_DATA_DIR = '@PACKAGE_DATA_DIR@' -LOCALE_DIR = '@LOCALE_DIR@' - -def add_package_to_sys_path(): - sys.path.insert(1, PACKAGE_DATA_DIR) - -def handle_sigint_default_way(): - signal.signal(signal.SIGINT, signal.SIG_DFL) - -def prepare_locale(): - locale.bindtextdomain('briar-gtk', LOCALE_DIR) - locale.textdomain('briar-gtk') - -def prepare_gettext(): - gettext.bindtextdomain('briar-gtk', LOCALE_DIR) - gettext.textdomain('briar-gtk') - -def prepare_localization(): - prepare_locale() - prepare_gettext() - -def prepare_resource(): - resource = Gio.Resource.load(os.path.join(PACKAGE_DATA_DIR, 'briar-gtk.gresource')) - resource._register() - -def prepare(): - add_package_to_sys_path() - handle_sigint_default_way() - prepare_localization() - prepare_resource() - -def start_application(): - from briar.gtk.application import Application - sys.exit(Application().run(sys.argv)) - -if __name__ == '__main__': - prepare() - start_application() diff --git a/src/briar/gtk/application.py b/src/briar/gtk/application.py deleted file mode 100644 index 6aa73db..0000000 --- a/src/briar/gtk/application.py +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright (c) 2019 Nico Alt -# Copyright (c) 2014-2018 Cedric Bellegarde <cedric.bellegarde@adishatz.org> -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md -# -# Initial version based on GNOME Lollypop -# https://gitlab.gnome.org/World/lollypop/blob/1.0.2/lollypop/application.py - -from gi.repository import Gdk, Gio, GLib, Gtk - -from briar.api.api import Api - -from briar.gtk.define import APPLICATION_ID, APPLICATION_NAME -from briar.gtk.define import APPLICATION_STYLING_PATH, BRIAR_HEADLESS_JAR -from briar.gtk.window import Window - - -class Application(Gtk.Application): - - def __init__(self): - Application._set_application_name(APPLICATION_NAME) - super().__init__(application_id=APPLICATION_ID) - - # pylint: disable=arguments-differ - def do_startup(self): - Gtk.Application.do_startup(self) - Application._setup_styling(APPLICATION_STYLING_PATH) - self._setup_api() - - # pylint: disable=arguments-differ - def do_activate(self): - self._setup_window() - - # pylint: disable=arguments-differ - def quit(self): - self.api.stop() - self._window.hide() - Gio.Application.quit(self) - - @staticmethod - def _set_application_name(name): - GLib.set_application_name(name) - GLib.set_prgname(name) - - @staticmethod - def _setup_styling(styling_path): - css_provider_file = Gio.File.new_for_uri(styling_path) - css_provider = Gtk.CssProvider() - css_provider.load_from_file(css_provider_file) - - screen = Gdk.Screen.get_default() - style_context = Gtk.StyleContext() - style_context.add_provider_for_screen(screen, css_provider, - Gtk.STYLE_PROVIDER_PRIORITY_USER) - - def _setup_api(self): - self.api = Api(BRIAR_HEADLESS_JAR) - - # pylint: disable=access-member-before-definition - def _setup_window(self): - if not hasattr(self, "_window") or self._window is None: - self._window = Window() - self._window.show() - self._window.present() diff --git a/src/briar/gtk/container.py b/src/briar/gtk/container.py deleted file mode 100644 index af5b6fa..0000000 --- a/src/briar/gtk/container.py +++ /dev/null @@ -1,12 +0,0 @@ -# Copyright (c) 2019 Nico Alt -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md - -from gi.repository.Gtk import Builder, Overlay - - -class Container(Overlay): - - def __init__(self): - super().__init__() - self.builder = Builder() diff --git a/src/briar/gtk/containers/add_contact.py b/src/briar/gtk/containers/add_contact.py deleted file mode 100644 index f0a946a..0000000 --- a/src/briar/gtk/containers/add_contact.py +++ /dev/null @@ -1,139 +0,0 @@ -# Copyright (c) 2019 Nico Alt -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md - -from gettext import gettext as _ - -from gi.repository import GLib - -from briar.api.models.contacts import Contacts -from briar.gtk.container import Container -from briar.gtk.define import APP - - -class AddContactContainer(Container): - - ADD_CONTACT_UI = "/app/briar/gtk/ui/add_contact.ui" - STACK_NAME = "add_contact_flow_stack" - HEADERS_NAME = "add_contact_flow_headers" - - def __init__(self, window): - super().__init__() - self._window = window - self._setup_view() - self._load_content() - - def _setup_view(self): - self.builder.add_from_resource(self.ADD_CONTACT_UI) - self.builder.connect_signals(self) - - self._setup_add_contact_flow_stack() - self._setup_add_contact_flow_headers() - self._setup_link_keystroke_listener() - - def _load_content(self): - contacts = Contacts(APP().api) - own_link = contacts.get_link() - self.builder.get_object("own_link_entry").set_text(own_link) - - def _setup_add_contact_flow_stack(self): - self.add_contact_flow_stack = self.builder.get_object(self.STACK_NAME) - self.add_contact_flow_stack.show_all() - self.add(self.add_contact_flow_stack) - - def _setup_add_contact_flow_headers(self): - add_contact_flow_headers = self.builder.get_object(self.HEADERS_NAME) - add_contact_flow_headers.show_all() - self._window.set_titlebar(add_contact_flow_headers) - - def _setup_link_keystroke_listener(self): - their_link_entry = self.builder.get_object("their_link_entry") - their_link_entry.connect("key-press-event", - self._link_keystroke) - - # pylint: disable=unused-argument - def _link_keystroke(self, widget, event): - if event.hardware_keycode != 36 and event.hardware_keycode != 104: - return - self.on_links_next_pressed(None) - - # pylint: disable=unused-argument - def on_link_back_pressed(self, button): - self._back_to_main_window() - - # pylint: disable=unused-argument - def on_links_next_pressed(self, button): - link_error_label = self.builder.get_object("link_error_label") - if self._link_is_empty(): - link_error_label.set_label(_("Please enter a link")) - link_error_label.show() - return - if self._their_link_is_ours(): - link_error_label.show() - link_error_label.set_label( - _("Enter your contact's link, not your own")) - return - link_error_label.hide() - self._show_alias_page() - - def _their_link_is_ours(self): - their_link = self.builder.get_object("their_link_entry").get_text() - own_link = self.builder.get_object("own_link_entry").get_text() - return their_link == own_link - - def _link_is_empty(self): - their_link = self.builder.get_object("their_link_entry").get_text() - return len(their_link) == 0 - - def _show_alias_page(self): - alias_page = self.builder.get_object("alias_page") - self.add_contact_flow_stack.set_visible_child(alias_page) - - self._focus_alias_entry() - self._setup_alias_keystroke_listener() - - def _focus_alias_entry(self): - alias_entry = self.builder.get_object("alias_entry") - alias_entry.grab_focus() - - def _setup_alias_keystroke_listener(self): - alias_entry = self.builder.get_object("alias_entry") - alias_entry.connect("key-press-event", self._alias_keystroke) - - # pylint: disable=unused-argument - def _alias_keystroke(self, widget, event): - if event.hardware_keycode != 36 and event.hardware_keycode != 104: - return - self.on_add_contact_pressed(None) - - # pylint: disable=unused-argument - def on_alias_back_pressed(self, button): - self._show_links_page() - - def _show_links_page(self): - links_page = self.builder.get_object("links_page") - self.add_contact_flow_stack.set_visible_child(links_page) - - # pylint: disable=unused-argument - def on_add_contact_pressed(self, button): - alias_error_label = self.builder.get_object( - "alias_error_label") - if self._alias_is_empty(): - alias_error_label.show() - return - alias_error_label.hide() - self._add_contact() - self._back_to_main_window() - - def _alias_is_empty(self): - alias = self.builder.get_object("alias_entry").get_text() - return len(alias) == 0 - - def _add_contact(self): - contacts = Contacts(APP().api) - their_link = self.builder.get_object("their_link_entry").get_text() - alias = self.builder.get_object("alias_entry").get_text() - contacts.add_pending(their_link, alias) - - def _back_to_main_window(self): - GLib.idle_add(self._window.back_to_main, None) diff --git a/src/briar/gtk/containers/chat.py b/src/briar/gtk/containers/chat.py deleted file mode 100644 index b2e00b0..0000000 --- a/src/briar/gtk/containers/chat.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright (c) 2019 Nico Alt -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md - -from gi.repository import GLib, Gtk - -from briar.api.models.private_chat import PrivateChat -from briar.gtk.container import Container -from briar.gtk.define import APP - - -class ChatContainer(Container): - - CONTAINER_UI = "/app/briar/gtk/ui/chat.ui" - - def __init__(self, contact_id): - super().__init__() - self._api = APP().api - self._contact_id = contact_id - self._setup_view() - self._load_content() - - def _setup_view(self): - self.builder.add_from_resource(self.CONTAINER_UI) - self.add(self.builder.get_object("chat")) - self.builder.connect_signals(self) - chat_entry = self.builder.get_object("chat_entry") - chat_entry.connect("key-press-event", self._key_pressed) - - def _load_content(self): - private_chat = PrivateChat(self._api, self._contact_id) - messages_list = private_chat.get() - self._messages_list_box = self.builder.get_object("messages_list") - for message in messages_list: - self._add_message(message["text"], message["local"]) - private_chat.watch_messages(self._add_message_async) - - def _add_message(self, message, local): - message_label = Gtk.Label(message) - message_label.set_halign(Gtk.Align.START) - if local: - message_label.set_halign(Gtk.Align.END) - message_label.show() - self._messages_list_box.add(message_label) - - def _add_message_async(self, message): - GLib.idle_add(self._add_message, message["text"], False) - - # pylint: disable=unused-argument - def _key_pressed(self, widget, event): - if event.hardware_keycode != 36 and event.hardware_keycode != 104: - return - chat_entry = self.builder.get_object("chat_entry") - message = chat_entry.get_text() - private_chat = PrivateChat(self._api, self._contact_id) - private_chat.send(message) - - self._add_message(message, True) - chat_entry.set_text("") diff --git a/src/briar/gtk/containers/login.py b/src/briar/gtk/containers/login.py deleted file mode 100644 index 51b900a..0000000 --- a/src/briar/gtk/containers/login.py +++ /dev/null @@ -1,85 +0,0 @@ -# Copyright (c) 2019 Nico Alt -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md - -from gi.repository import GLib - -from briar.gtk.container import Container -from briar.gtk.define import APP - - -class LoginContainer(Container): - - LOGIN_UI = "/app/briar/gtk/ui/login.ui" - STACK_NAME = "login_flow_stack" - HEADERS_NAME = "login_flow_headers" - - def __init__(self, window): - super().__init__() - self._window = window - self._setup_view() - - def _setup_view(self, ): - self.builder.add_from_resource(self.LOGIN_UI) - self.builder.connect_signals(self) - - self._setup_login_flow_stack() - self._setup_login_flow_headers() - self._setup_keystroke_listener() - - def _setup_login_flow_stack(self): - self.login_flow_stack = self.builder.get_object(self.STACK_NAME) - self.login_flow_stack.show_all() - self.add(self.login_flow_stack) - - def _setup_login_flow_headers(self): - login_flow_headers = self.builder.get_object(self.HEADERS_NAME) - login_flow_headers.show_all() - self._window.set_titlebar(login_flow_headers) - - def _setup_keystroke_listener(self): - password_entry = self.builder.get_object("password_entry") - password_entry.connect("key-press-event", - self._password_keystroke) - - # pylint: disable=unused-argument - def _password_keystroke(self, widget, event): - if event.hardware_keycode != 36 and event.hardware_keycode != 104: - return - self.on_login_pressed(None) - - # pylint: disable=unused-argument - def on_login_pressed(self, button): - self._show_loading_animation() - self._login() - - def _show_loading_animation(self): - loading_animation = self.builder.get_object("loading_animation") - self.login_flow_stack.set_visible_child(loading_animation) - - def _login(self): - password = self.builder.get_object("password_entry").get_text() - APP().api.login(password, self._login_completed) - - def _login_completed(self, succeeded): - function = self._login_failed - if succeeded: - function = self._window.on_startup_completed - GLib.idle_add(function) - - def _login_failed(self): - self._show_error_message() - self._focus_password_entry() - self._show_login_page() - - def _show_error_message(self): - error_message = self.builder.get_object("error_message") - error_message.show() - - def _focus_password_entry(self): - password_entry = self.builder.get_object("password_entry") - password_entry.grab_focus() - - def _show_login_page(self): - login_page = self.builder.get_object("login_page") - self.login_flow_stack.set_visible_child(login_page) diff --git a/src/briar/gtk/containers/main.py b/src/briar/gtk/containers/main.py deleted file mode 100644 index e6b03e0..0000000 --- a/src/briar/gtk/containers/main.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright (c) 2019 Nico Alt -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md - -from gi.repository import GLib, Gtk - -from briar.api.models.contacts import Contacts -from briar.gtk.container import Container -from briar.gtk.define import APP - - -class MainContainer(Container): - - CONTAINER_UI = "/app/briar/gtk/ui/main.ui" - - def __init__(self): - super().__init__() - self._api = APP().api - self._setup_view() - self._load_content() - - def _setup_view(self): - self.builder.add_from_resource(self.CONTAINER_UI) - self.add(self.builder.get_object("contacts_list")) - self.builder.connect_signals(self) - - def _load_content(self): - self._contacts = Contacts(self._api) - self._load_contacts() - self._contacts.watch_contacts(self._refresh_contacts_async) - - def _load_contacts(self): - contacts_list = self._contacts.get() - contacts_list_box = self.builder.get_object("contacts_list") - for contact in contacts_list: - name = contact["author"]["name"] - if "alias" in contact: - name = contact["alias"] - contact_button = Gtk.Button(name) - contact_button.connect("clicked", MainContainer._contact_clicked, - contact["contactId"]) - contact_button.show() - contacts_list_box.add(contact_button) - - def _refresh_contacts_async(self): - GLib.idle_add(self._refresh_contacts) - - def _refresh_contacts(self): - self._clear_contact_list() - self._load_contacts() - - def _clear_contact_list(self): - contacts_list_box = self.builder.get_object("contacts_list") - contacts_list_box_children = contacts_list_box.get_children() - for child in contacts_list_box_children: - contacts_list_box.remove(child) - - # pylint: disable=unused-argument - @staticmethod - def _contact_clicked(widget, contact_id): - GLib.idle_add(APP().get_property("active_window"). - open_private_chat, contact_id) diff --git a/src/briar/gtk/containers/registration.py b/src/briar/gtk/containers/registration.py deleted file mode 100644 index 68a50f6..0000000 --- a/src/briar/gtk/containers/registration.py +++ /dev/null @@ -1,138 +0,0 @@ -# Copyright (c) 2019 Nico Alt -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md - -from gettext import gettext as _ - -from gi.repository import GLib - -from briar.gtk.container import Container -from briar.gtk.define import APP - - -class RegistrationContainer(Container): - - REGISTRATION_UI = "/app/briar/gtk/ui/registration.ui" - STACK_NAME = "registration_flow_stack" - HEADERS_NAME = "registration_flow_headers" - - def __init__(self, window): - super().__init__() - self._window = window - self._setup_view() - - def _setup_view(self, ): - self.builder.add_from_resource(self.REGISTRATION_UI) - self.builder.connect_signals(self) - - self._setup_registration_flow_stack() - self._setup_registration_flow_headers() - self._setup_nickname_keystroke_listener() - - def _setup_registration_flow_stack(self): - self.registration_flow_stack = self.builder.get_object(self.STACK_NAME) - self.registration_flow_stack.show_all() - self.add(self.registration_flow_stack) - - def _setup_registration_flow_headers(self): - registration_flow_headers = self.builder.get_object(self.HEADERS_NAME) - registration_flow_headers.show_all() - self._window.set_titlebar(registration_flow_headers) - - def _setup_nickname_keystroke_listener(self): - nickname_entry = self.builder.get_object("nickname_entry") - nickname_entry.connect("key-press-event", - self._nickname_keystroke) - - # pylint: disable=unused-argument - def _nickname_keystroke(self, widget, event): - if event.hardware_keycode != 36 and event.hardware_keycode != 104: - return - self.on_nickname_next_pressed(None) - - # pylint: disable=unused-argument - def on_nickname_next_pressed(self, button): - nickname_error_label = self.builder.get_object("nickname_error_label") - if self._nickname_is_empty(): - nickname_error_label.show() - return - nickname_error_label.hide() - self._show_passwords_page() - - def _nickname_is_empty(self): - nickname = self.builder.get_object("nickname_entry").get_text() - return len(nickname) == 0 - - def _show_passwords_page(self): - passwords_page = self.builder.get_object("passwords_page") - self.registration_flow_stack.set_visible_child(passwords_page) - - self._focus_password_entry() - self._setup_passwords_keystroke_listener() - - def _focus_password_entry(self): - password_entry = self.builder.get_object("password_entry") - password_entry.grab_focus() - - def _setup_passwords_keystroke_listener(self): - password_confirm_entry = self.builder.get_object( - "password_confirm_entry") - password_confirm_entry.connect( - "key-press-event", self._passwords_keystroke) - - # pylint: disable=unused-argument - def _passwords_keystroke(self, widget, event): - if event.hardware_keycode != 36 and event.hardware_keycode != 104: - return - self.on_create_account_pressed(None) - - # pylint: disable=unused-argument - def on_create_account_back_pressed(self, button): - self._show_nickname_page() - - def _show_nickname_page(self): - nickname_page = self.builder.get_object("nickname_page") - self.registration_flow_stack.set_visible_child(nickname_page) - - # pylint: disable=unused-argument - def on_create_account_pressed(self, button): - passwords_error_label = self.builder.get_object( - "passwords_error_label") - if not self._passwords_match(): - passwords_error_label.show() - return - passwords_error_label.hide() - self._show_loading_animation() - self._register() - - def _passwords_match(self): - password = self.builder.get_object("password_entry").get_text() - password_confirm = self.builder.get_object( - "password_confirm_entry").get_text() - return password == password_confirm - - def _show_loading_animation(self): - loading_animation = self.builder.get_object("loading_animation") - self.registration_flow_stack.set_visible_child(loading_animation) - - def _register(self): - nickname = self.builder.get_object("nickname_entry").get_text() - password = self.builder.get_object("password_entry").get_text() - APP().api.register((nickname, password), - self._registration_completed) - - def _registration_completed(self, succeeded): - function = self._registration_failed - if succeeded: - function = self._window.on_startup_completed - GLib.idle_add(function) - - def _registration_failed(self): - self._show_error_message() - self._show_passwords_page() - - def _show_error_message(self): - passwords_error_label = self.builder.get_object( - "passwords_error_label") - passwords_error_label.set_label(_("Couldn't register account")) - passwords_error_label.show() diff --git a/src/briar/gtk/containers/startup.py b/src/briar/gtk/containers/startup.py deleted file mode 100644 index c6a1817..0000000 --- a/src/briar/gtk/containers/startup.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 2019 Nico Alt -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md - -from briar.gtk.container import Container -from briar.gtk.containers.login import LoginContainer -from briar.gtk.containers.registration import RegistrationContainer -from briar.gtk.define import APP - - -class StartupContainer(Container): - - def __init__(self, window): - super().__init__() - self._setup_view(window) - - def _setup_view(self, window): - container = RegistrationContainer(window) - if APP().api.has_account(): - container = LoginContainer(window) - - container.show() - self.add(container) diff --git a/src/briar/gtk/define.py b/src/briar/gtk/define.py deleted file mode 100644 index 4e893da..0000000 --- a/src/briar/gtk/define.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) 2019 Nico Alt -# Copyright (c) 2014-2018 Cedric Bellegarde <cedric.bellegarde@adishatz.org> -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md -# -# Initial version based on GNOME Lollypop -# https://gitlab.gnome.org/World/lollypop/blob/1.0.2/lollypop/define.py - -from gi.repository import Gio - -APPLICATION_ID = "app.briar.gtk" -APPLICATION_NAME = "Briar" -APPLICATION_STYLING_PATH = "resource:///app/briar/gtk/ui/application.css" -BRIAR_HEADLESS_JAR = "/app/briar/briar-headless.jar" - -APP = Gio.Application.get_default diff --git a/src/briar/gtk/toolbar.py b/src/briar/gtk/toolbar.py deleted file mode 100644 index 64784d8..0000000 --- a/src/briar/gtk/toolbar.py +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright (c) 2019 Nico Alt -# Copyright (c) 2014-2019 Cedric Bellegarde <cedric.bellegarde@adishatz.org> -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md -# -# Initial version based on GNOME Lollypop -# https://gitlab.gnome.org/World/lollypop/blob/1.0.12/lollypop/toolbar.py - -from gi.repository import Gtk - -from briar.gtk.define import APPLICATION_NAME - - -class Toolbar(Gtk.HeaderBar): - - TOOLBAR_UI = "/app/briar/gtk/ui/toolbar_start.ui" - - def __init__(self): - super().__init__() - self._setup_builder() - self._setup_toolbar() - - def show_add_contact_button(self, show, callback=None): - add_contact_button = self._builder.get_object("add_contact_button") - if not show: - add_contact_button.hide() - return - if callback is None: - raise Exception("Callback needed when showing add contact button") - add_contact_button.show() - add_contact_button.connect("clicked", callback) - - def show_back_button(self, show, callback=None): - back_button = self._builder.get_object("back_button") - if not show: - back_button.hide() - return - if callback is None: - raise Exception("Callback needed when showing back button") - back_button.show() - back_button.connect("clicked", callback) - - def _setup_builder(self): - self._builder = Gtk.Builder() - - def _setup_toolbar(self): - self.set_title(APPLICATION_NAME) - - self._builder.add_from_resource(self.TOOLBAR_UI) - toolbar_start = self._builder.get_object("toolbar_start") - self.pack_start(toolbar_start) diff --git a/src/briar/gtk/window.py b/src/briar/gtk/window.py deleted file mode 100644 index 665d006..0000000 --- a/src/briar/gtk/window.py +++ /dev/null @@ -1,109 +0,0 @@ -# Copyright (c) 2019 Nico Alt -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md - -from gi.repository.Gtk import ApplicationWindow, Grid - -from briar.gtk.containers.add_contact import AddContactContainer -from briar.gtk.containers.chat import ChatContainer -from briar.gtk.containers.main import MainContainer -from briar.gtk.containers.startup import StartupContainer -from briar.gtk.define import APP, APPLICATION_ID, APPLICATION_NAME -from briar.gtk.toolbar import Toolbar - - -class Window(ApplicationWindow): - - DEFAULT_WINDOW_SIZE = (600, 400) - - def __init__(self): - self._initialize_gtk_application_window() - self._setup_content() - - @property - def container(self): - return self._container - - @property - def toolbar(self): - return self._toolbar - - def _initialize_gtk_application_window(self): - ApplicationWindow.__init__(self, application=APP(), - title=APPLICATION_NAME, - icon_name=APPLICATION_ID) - - def _setup_content(self): - self._setup_size(self.DEFAULT_WINDOW_SIZE) - self._setup_startup_container() - - def _setup_size(self, size): - if Window._size_is_valid(size): - self.resize(size[0], size[1]) - - @staticmethod - def _size_is_valid(size): - return len(size) == 2 and\ - isinstance(size[0], int) and\ - isinstance(size[1], int) - - def _setup_startup_container(self): - self._container = StartupContainer(self) - self._container.show() - self.add(self._container) - - def on_startup_completed(self): - self._container.destroy() - self._setup_grid() - self._setup_toolbar() - self._setup_main_container() - - def _setup_grid(self): - self._grid = Grid() - self._grid.show() - self.add(self._grid) - - def _reset_window(self): - self._container.destroy() - self._grid.destroy() - self._setup_grid() - self._setup_toolbar() - - def _setup_toolbar(self): - self._toolbar = Toolbar() - self._toolbar.show() - self._toolbar.set_show_close_button(True) - self.set_titlebar(self._toolbar) - - def _setup_main_container(self): - self._container = MainContainer() - self._container.show() - self._grid.add(self._container) - self._toolbar.show_add_contact_button(True, self.show_add_contact) - - # pylint: disable=unused-argument - def show_add_contact(self, widget): - self._setup_add_contact() - - def _setup_add_contact(self): - self._grid.destroy() - self._container = AddContactContainer(self) - self._container.show() - self.add(self._container) - - def open_private_chat(self, contact_id): - self._reset_window() - self._setup_private_chat(contact_id) - - def _setup_private_chat(self, contact_id): - self._container = ChatContainer(contact_id) - self._container.show() - self._grid.add(self._container) - self._toolbar.show_back_button(True, self.back_to_main) - self._toolbar.show_add_contact_button(False) - - # pylint: disable=unused-argument - def back_to_main(self, widget): - self._reset_window() - self._toolbar.show_back_button(False) - self._setup_main_container() diff --git a/src/meson_post_install.py b/src/meson_post_install.py deleted file mode 100755 index 1eae062..0000000 --- a/src/meson_post_install.py +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) 2019 Nico Alt -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md - -from os import environ, path -from subprocess import call - -PREFIX = environ.get('MESON_INSTALL_PREFIX', '/usr/local') -DATA_DIR = path.join(PREFIX, 'share') -DESTINATION_DIR = environ.get('DESTDIR', '') - -# Package managers set this so we don't need to run -if not DESTINATION_DIR: - print('Updating icon cache...') - call(['gtk-update-icon-cache', '-qtf', - path.join(DATA_DIR, 'icons', 'hicolor')]) - - print('Updating desktop database...') - call(['update-desktop-database', '-q', - path.join(DATA_DIR, 'applications')]) - - print('Compiling GSettings schemas...') - call(['glib-compile-schemas', path.join(DATA_DIR, 'glib-2.0', 'schemas')]) diff --git a/tests/briar/gtk/test_application.py b/tests/briar/gtk/test_application.py deleted file mode 100644 index f3c375f..0000000 --- a/tests/briar/gtk/test_application.py +++ /dev/null @@ -1,139 +0,0 @@ -# Copyright (c) 2019 Nico Alt -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md - -from unittest.mock import Mock - -from briar.api.api import Api -from briar.gtk.application import Application -from briar.gtk.define import APPLICATION_NAME, APPLICATION_STYLING_PATH -from briar.gtk.define import BRIAR_HEADLESS_JAR -from briar.gtk.window import Window - - -def test_do_startup(mocker): - do_startup_mock = mocker.patch("gi.repository.Gtk.Application.do_startup") - _setup_styling_mock = mocker.patch( - "briar.gtk.application.Application._setup_styling") - _setup_api_mock = mocker.patch( - "briar.gtk.application.Application._setup_api") - - Application().do_startup() - - do_startup_mock.assert_called_once() - _setup_styling_mock.assert_called_once_with(APPLICATION_STYLING_PATH) - _setup_api_mock.assert_called_once() - - -def test_do_activate(mocker): - _setup_window_mock = mocker.patch( - "briar.gtk.application.Application._setup_window") - - Application().do_activate() - - _setup_window_mock.assert_called_once() - - -def test_quit(mocker): - api_mock = mocker.patch("briar.api.api.Api") - api_stop_mock = mocker.patch("briar.api.api.Api.stop") - window_mock = mocker.patch("briar.gtk.window.Window") - window_hide_mock = mocker.patch("briar.gtk.window.Window.hide") - quit_mock = mocker.patch("gi.repository.Gio.Application.quit") - - application = Application() - application.api = api_mock - application._window = window_mock - - application.quit() - - api_stop_mock.assert_called_once() - window_hide_mock.assert_called_once() - quit_mock.assert_called_once() - - -def test_set_application_name(mocker): - set_application_name_mock = mocker.patch( - "gi.repository.GLib.set_application_name") - set_prgname_mock = mocker.patch("gi.repository.GLib.set_prgname") - name_mock = "Mock" - - Application._set_application_name(name_mock) - - set_application_name_mock.assert_called_once_with(name_mock) - set_prgname_mock.assert_called_once_with(name_mock) - - -def test_set_application_name_implicit(mocker): - set_application_name_mock = mocker.patch( - "gi.repository.GLib.set_application_name") - set_prgname_mock = mocker.patch("gi.repository.GLib.set_prgname") - - Application() - - set_application_name_mock.assert_called_once_with(APPLICATION_NAME) - set_prgname_mock.assert_called_once_with(APPLICATION_NAME) - - -def test_setup_styling(mocker): - new_for_uri_mock = mocker.patch("gi.repository.Gio.File.new_for_uri") - load_from_file_mock = mocker.patch( - "gi.repository.Gtk.CssProvider.load_from_file") - get_default_mock = mocker.patch("gi.repository.Gdk.Screen.get_default") - add_provider_for_screen_mock = mocker.patch( - "gi.repository.Gtk.StyleContext.add_provider_for_screen") - - Application._setup_styling(APPLICATION_STYLING_PATH) - - new_for_uri_mock.assert_called_with(APPLICATION_STYLING_PATH) - load_from_file_mock.assert_called_once() - get_default_mock.assert_called_once() - add_provider_for_screen_mock.assert_called_once() - - -def test_setup_api(mocker): - application = Application() - - assert not hasattr(application, "api") - - application._setup_api() - - assert isinstance(application.api, Api) - assert application.api._command == ["java", "-jar", BRIAR_HEADLESS_JAR] - - -def test_setup_window(mocker): - mocker.patch("briar.gtk.window.Window.__init__").return_value = None - window_show_mock = mocker.patch("briar.gtk.window.Window.show") - window_present_mock = mocker.patch("briar.gtk.window.Window.present") - - Application()._setup_window() - - window_show_mock.assert_called_once() - window_present_mock.assert_called_once() - - -def test_setup_window_has_attribute(mocker): - mocker.patch("briar.gtk.window.Window.__init__").return_value = None - window_mock = Mock() - - application = Application() - application._window = window_mock - - application._setup_window() - - window_mock.show.assert_not_called() - window_mock.present.assert_called_once() - - -def test_setup_window_has_none_attribute(mocker): - mocker.patch("briar.gtk.window.Window.__init__").return_value = None - window_show_mock = mocker.patch("briar.gtk.window.Window.show") - window_present_mock = mocker.patch("briar.gtk.window.Window.present") - - application = Application() - - application._setup_window() - - window_show_mock.assert_called_once() - window_present_mock.assert_called_once() diff --git a/tests/briar/gtk/test_toolbar.py b/tests/briar/gtk/test_toolbar.py deleted file mode 100644 index 065101a..0000000 --- a/tests/briar/gtk/test_toolbar.py +++ /dev/null @@ -1,50 +0,0 @@ -# Copyright (c) 2019 Nico Alt -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md - -import pytest -from unittest.mock import Mock - -from briar.gtk.toolbar import Toolbar - - -def test_show_back_button(mocker): - get_object_mock = mocker.patch("gi.repository.Gtk.Builder.get_object") - back_button_mock = get_object_mock.return_value - callback = Mock() - mocker.patch("briar.gtk.toolbar.Toolbar._setup_toolbar") - - Toolbar().show_back_button(True, callback) - - get_object_mock.assert_called_once_with("back_button") - back_button_mock.hide.assert_not_called() - back_button_mock.show.assert_called_once() - back_button_mock.connect.assert_called_once() - - -def test_show_back_button_without_callback(mocker): - get_object_mock = mocker.patch("gi.repository.Gtk.Builder.get_object") - back_button_mock = get_object_mock.return_value - mocker.patch("briar.gtk.toolbar.Toolbar._setup_toolbar") - - with pytest.raises(Exception, - match="Callback needed when showing back button"): - Toolbar().show_back_button(True) - - get_object_mock.assert_called_once_with("back_button") - back_button_mock.hide.assert_not_called() - back_button_mock.show.assert_not_called() - back_button_mock.connect.assert_not_called() - - -def test_hide_back_button(mocker): - get_object_mock = mocker.patch("gi.repository.Gtk.Builder.get_object") - back_button_mock = get_object_mock.return_value - mocker.patch("briar.gtk.toolbar.Toolbar._setup_toolbar") - - Toolbar().show_back_button(False) - - get_object_mock.assert_called_once_with("back_button") - back_button_mock.hide.assert_called_once() - back_button_mock.show.assert_not_called() - back_button_mock.connect.assert_not_called() diff --git a/tools/generate_data.sh b/tools/generate_data.sh deleted file mode 100755 index af6de4e..0000000 --- a/tools/generate_data.sh +++ /dev/null @@ -1,52 +0,0 @@ -#!/bin/bash -# Copyright (c) 2019 Nico Alt -# SPDX-License-Identifier: AGPL-3.0-only -# License-Filename: LICENSE.md -# -# Initial version from GNOME Lollypop -# https://gitlab.gnome.org/World/lollypop/blob/1.0.2/generate_data.sh - -function generate_resource() -{ - echo '<?xml version="1.0" encoding="UTF-8"?>' - echo '<gresources>' - echo ' <gresource prefix="/app/briar/gtk">' - for file in data/ui/*.css - do - echo -n ' <file compressed="true">' - echo -n 'ui/' - echo -n $(basename $file) - echo '</file>' - done - for file in data/ui/*.ui - do - echo -n ' <file compressed="true" preprocess="xml-stripblanks">' - echo -n 'ui/' - echo -n $(basename $file) - echo '</file>' - done - echo ' </gresource>' - echo '</gresources>' -} - -function generate_po() -{ - cd po - # git pull https://www.transifex.com/otf/briar/ - >briar-gtk.pot - for file in ../data/app.briar.gtk.gschema.xml ../data/ui/*.ui $(find "../src/briar" -name '*.py'); - do - xgettext --from-code=UTF-8 -j $file -o briar-gtk.pot - done - >LINGUAS - for po in *.po - do - msgmerge -N $po briar-gtk.pot > /tmp/$$language_new.po - mv /tmp/$$language_new.po $po - language=${po%.po} - echo $language >>LINGUAS - done -} - -generate_resource > data/ui/app.briar.gtk.gresource.xml -generate_po -- GitLab