pax_global_header00006660000000000000000000000064142027746310014520gustar00rootroot0000000000000052 comment=c15483838555fe2ee0426e94448cb776f0140598 gnome-console-42~beta/000077500000000000000000000000001420277463100151065ustar00rootroot00000000000000gnome-console-42~beta/.editorconfig000066400000000000000000000000561420277463100175640ustar00rootroot00000000000000[*.{c,h}] indent_size = 2 indent_style = spacegnome-console-42~beta/.gitignore000066400000000000000000000001011420277463100170660ustar00rootroot00000000000000.buildconfig *~ build .vscode /subprojects/vte /subprojects/handygnome-console-42~beta/.gitlab-ci.yml000066400000000000000000000016131420277463100175430ustar00rootroot00000000000000debian: image: debian:testing stage: build before_script: - apt -y update - apt -y install gcc g++ gettext git libgnutls28-dev libgtk-3-dev libsystemd-dev libgtop2-dev meson sassc desktop-file-utils appstream-util gsettings-desktop-schemas-dev script: - meson --buildtype=release _build . - ninja -C _build fedora: image: fedora:latest stage: build before_script: - dnf update -y --nogpgcheck - dnf install -y --nogpgcheck meson gettext glib2-devel gcc gcc-c++ git desktop-file-utils gperf "pkgconfig(gtk+-3.0)" libappstream-glib "pkgconfig(vte-2.91)" "pkgconfig(libgtop-2.0)" "pkgconfig(fribidi)" "pkgconfig(gnutls)" "pkgconfig(libsystemd)" "pkgconfig(libpcre2-8)" "pkgconfig(gsettings-desktop-schemas)" sassc script: - meson --buildtype=release -Dtests=true _build . - meson compile -C _build - meson test -C _build gnome-console-42~beta/COPYING000066400000000000000000001045141420277463100161460ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . gnome-console-42~beta/NEWS000066400000000000000000000036471420277463100156170ustar00rootroot00000000000000Version 42.beta ~~~~~~~~~~~~~~~ Released: 2022-02-14 KGX now goes by Console and we have restored the legendary โ€˜Dayโ€™ mode Also in this release: * ๐Ÿ‘“ Much better High Contrast support * ๐Ÿ”ฌ Increased Zoom range * ๐Ÿ“‹ Paste is now less pernickety * ๐Ÿฉน Fixed a couple leaks and assorted issues GNOME l10n Teams have updated translations: * Basque * Chinese (China) * Finnish * Galician * Hebrew * Polish * Portuguese * Portuguese (Brazil) * Russian * Slovenian * Spanish * Swedish * Turkish * Ukrainian Version 0.4.0 ~~~~~~~~~~~~~ Released: 2021-10-24 More Terminals! KGX can now host multiple sessions per window with nifty tabs on larger screens and a neat list for those on the narrower side Also in this release: * ๐ŸŽจ Shiny new โ€” yet familiar โ€” icon * ๐Ÿ“œ More scrollback * ๐Ÿ”— Mouse users can ctrl-click links * ๐Ÿ—„๏ธ Handy little Files (Nautilus) extension to launch KGX in a folder * ๐Ÿคฆโ€โ™€๏ธ Assorted bugs have been wrangled and scrolling behaviour (especially on touch) has been improved * ๐Ÿ’ฌ GNOME l10n teams have added many more translations * ๐Ÿช› Adventurous users can set a custom shell (such as fish) and tweak the scrollback size Version 0.2.1 ~~~~~~~~~~~~~ Released: 2019-10-06 Use HdySearchBar to match the behaviour in other apps. Improved generic banding (no weird symbols in about dialog). Translation updates from the wonderful d-l team (except en_GB, that translator seems to have dropped the ball....). Version 0.2.0 ~~~~~~~~~~~~~ Released: 2019-09-15 Impoved tracking of running commands reducing resource usage, especially when running in the background. Command complete notifications and query close when commands are still running. Translations for de, en_GB, es, fi, hu, pl & pt_BR from various users on l10n.gnome.org (thanks guys!). Version 0.1.0 ~~~~~~~~~~~~~ Released: 2019-07-30 The first release of our little terminal emulator with basic functionality. gnome-console-42~beta/README.md000066400000000000000000000013751420277463100163730ustar00rootroot00000000000000# Console ![](logo.png) A minimal terminal for GNOME Console is supposed to be a simple terminal emulator for the average user to carry out simple cli tasks and aims to be a โ€˜coreโ€™ app for GNOME/Phosh We are not however trying to replace GNOME Terminal/Tilix, these advanced tools are great for developers and administrators, rather Console aims to serve the casual linux user who rarely needs a terminal ## Roadmap - [ ] โ€˜APIโ€™ compatible with GNOME Terminal - [ ] Command line flags *Partial, supports -e/--command and --working-directory* - [X] Command done notifications - [X] โ€˜root modeโ€™ turns red when sudo/su/pkexec is active in the terminal - [X] โ€˜remote modeโ€™ turns (purple?) when ssh is in use - [ ] Other bash/shell integrations gnome-console-42~beta/console.doap000066400000000000000000000017131420277463100174170ustar00rootroot00000000000000 Console Terminal Emulator C A simple user-friendly terminal emulator for the GNOME desktop. Zander Brown zbrown gnome-console-42~beta/data/000077500000000000000000000000001420277463100160175ustar00rootroot00000000000000gnome-console-42~beta/data/meson.build000066400000000000000000000050241420277463100201620ustar00rootroot00000000000000src_datadir = meson.current_source_dir() desktop_utils = find_program('desktop-file-validate', required: false) appstream_util = find_program('appstream-util', required: false) compile_schemas = find_program('glib-compile-schemas') desktop_filename = 'org.gnome.Console.desktop.in.in' if get_option('devel') icon_filename = 'org.gnome.Console.Devel.svg' else icon_filename = 'org.gnome.Console.svg' endif desktop_file = i18n.merge_file( input: configure_file( input: desktop_filename, output: '@BASENAME@', configuration: conf ), output: app_id + '.desktop', type: 'desktop', po_dir: '../po', install: true, install_dir: datadir / 'applications' ) if desktop_utils.found() and get_option('tests') test('Validate desktop file', desktop_utils, args: [desktop_file] ) endif appstream_file = i18n.merge_file( input: configure_file( input: 'org.gnome.Console.metainfo.xml.in.in', output: '@BASENAME@', configuration: conf ), output: app_id + '.metainfo.xml', po_dir: '../po', install: true, install_dir: datadir / 'metainfo' ) if appstream_util.found() and get_option('tests') test('Validate appstream file', appstream_util, args: ['validate', '--nonet', appstream_file] ) endif schema_file = configure_file( input: 'org.gnome.Console.gschema.xml.in', output: app_id + '.gschema.xml', configuration: conf, install_dir: datadir / 'glib-2.0/schemas' ) # gnome.compile_schemas only looks at the source tree custom_target('kgx-schemas', input: schema_file, output: 'gschemas.compiled', command: [compile_schemas, meson.current_build_dir()], ) meson.add_devenv({'GSETTINGS_SCHEMA_DIR': meson.current_build_dir()}) test('Validate schema file', compile_schemas, args: ['--strict', '--dry-run', meson.current_build_dir()] ) configure_file( input: 'org.gnome.Console.service.in', output: app_id + '.service', configuration: conf, install_dir: datadir / 'dbus-1/services' ) install_data(icon_filename, install_dir: datadir / 'icons/hicolor/scalable/apps', rename: app_id + '.svg', ) install_data('org.gnome.Console-symbolic.svg', install_dir: datadir / 'icons/hicolor/symbolic/apps', rename: app_id + '-symbolic.svg', ) gnome-console-42~beta/data/org.gnome.Console-symbolic.svg000066400000000000000000000040161420277463100236540ustar00rootroot00000000000000 gnome-console-42~beta/data/org.gnome.Console.Devel.svg000066400000000000000000000101441420277463100230720ustar00rootroot00000000000000 gnome-console-42~beta/data/org.gnome.Console.Source.svg000066400000000000000000001270311420277463100232770ustar00rootroot00000000000000 Adwaita Icon Template Adwaita Icon Template Hicolor Symbolic gnome-console-42~beta/data/org.gnome.Console.desktop.in.in000066400000000000000000000020001420277463100237100ustar00rootroot00000000000000[Desktop Entry] Name=Console Exec=@BIN_NAME@ # Translators: Do NOT translate or transliterate this text (this is an icon file name)! Icon=@KGX_APPLICATION_ID_RAW@ # Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! Keywords=command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross; Terminal=false Type=Application Categories=System;TerminalEmulator;X-GNOME-Utilities;GTK;GNOME; StartupNotify=true DBusActivatable=true X-GNOME-UsesNotifications=true Actions=new-window;new-tab; # Translators: Do NOT translate or transliterate this text (these are enum types)! X-Purism-FormFactor=Workstation;Mobile; [Desktop Action new-window] Exec=@BIN_NAME@ Name=New Window # Translators: Do NOT translate or transliterate this text (this is an icon file name)! Icon=window-new [Desktop Action new-tab] Exec=@BIN_NAME@ --tab Name=New Tab # Translators: Do NOT translate or transliterate this text (this is an icon file name)! Icon=tab-new gnome-console-42~beta/data/org.gnome.Console.gschema.xml.in000066400000000000000000000013611420277463100240510ustar00rootroot00000000000000 'night' 1.0 [] 10000 gnome-console-42~beta/data/org.gnome.Console.metainfo.xml.in.in000066400000000000000000000105721420277463100246550ustar00rootroot00000000000000 @KGX_APPLICATION_ID_RAW@ CC0-1.0 GPL-3.0 GNOME Console Terminal Emulator

A simple user-friendly terminal emulator for the GNOME desktop.

HiDpiIcon ModernToolkit keyboard pointing touch 360 https://gitlab.gnome.org/GNOME/console/raw/HEAD/data/screenshots/01-Terminal.png Terminal window

KGX now goes by Console and we have restored the legendary โ€˜Dayโ€™ mode

Also in this release:

  • ๐Ÿ‘“ Much better High Contrast support
  • ๐Ÿ”ฌ Increased Zoom range
  • ๐Ÿ“‹ Paste is now less pernickety
  • ๐Ÿฉน Fixed a couple leaks and assorted issues

GNOME l10n Teams have updated translations:

  • Basque
  • Chinese (China)
  • Finnish
  • Galician
  • Hebrew
  • Polish
  • Portuguese
  • Portuguese (Brazil)
  • Russian
  • Slovenian
  • Spanish
  • Swedish
  • Turkish
  • Ukrainian

More Terminals! KGX can now host multiple sessions per window with nifty tabs on larger screens and a neat list for those on the narrower side

Also in this release:

  • ๐ŸŽจ Shiny new โ€” yet familiar โ€” icon
  • ๐Ÿ“œ More scrollback
  • ๐Ÿ”— Mouse users can ctrl-click links
  • ๐Ÿ—„๏ธ Handy little Files (Nautilus) extension to launch KGX in a folder
  • ๐Ÿคฆโ€โ™€๏ธ Assorted bugs have been wrangled and scrolling behaviour (especially on touch) has been improved
  • ๐Ÿ’ฌ GNOME l10n teams have added many more translations
  • ๐Ÿช› Adventurous users can set a custom shell (such as fish) and tweak the scrollback size

Use HdySearchBar to match the behaviour in other apps.

Improved generic banding (no weird symbols in about dialog).

Translation updates from the wonderful d-l team (except en_GB, that translator seems to have dropped the ball....).

Impoved tracking of running commands reducing resource usage, especially when running in the background.

Command complete notifications and query close when commands are still running.

Translations for de, en_GB, es, fi, hu, pl & pt_BR from various users on l10n.gnome.org (thanks guys!).

The first release of our little terminal emulator with basic functionality.

@KGX_APPLICATION_ID_RAW@.desktop https://gitlab.gnome.org/ZanderBrown/KGX/ https://gitlab.gnome.org/ZanderBrown/KGX/issues zbrown@gnome.org @BIN_NAME@ Zander Brown workstation mobile
gnome-console-42~beta/data/org.gnome.Console.service.in000066400000000000000000000001371420277463100233030ustar00rootroot00000000000000[D-BUS Service] Name=@KGX_APPLICATION_ID_RAW@ Exec=@BIN_DIR@/@BIN_NAME@ --gapplication-service gnome-console-42~beta/data/org.gnome.Console.svg000066400000000000000000000033321420277463100220350ustar00rootroot00000000000000 gnome-console-42~beta/data/screenshots/000077500000000000000000000000001420277463100203575ustar00rootroot00000000000000gnome-console-42~beta/data/screenshots/01-Terminal.png000066400000000000000000000727451420277463100230750ustar00rootroot00000000000000‰PNG  IHDRถ๏t?sBIT|dˆtEXtSoftwaregnome-screenshot๏ฟ>*tEXtCreation TimeThu 07 Oct 2021 22:05:57 BSTnžำ IDATxœ์w|Sๅ๐ฯsVF“6ฅปJ[ ”ฝงWD๔\‘%CE†Aฤ-r€‚8@™‚( เV”% {ii.h้nึฟ?JำAฺฆ–ถ~฿ฏืy%อIฮ๙ๆ$้๙ไษsžB!„B!„B!„B!„B!„BJb๐๕B!„๏าnิŠoDฐค0K!„๒ฯPฃ!ทฆB&…YB!„ถjนี8ฏgน‚ !„B๊†๋ ซ^บ ‘UY–ง๗ฅK!„RปxHซ\ฝrฝ=YNy๗ฉ์ฑn !„Bj‡สhy๓= ฎืnฏ74V5”บปฟงทB!„ฺร]๕ไถk ว•ชฎพฐฺสยnU–K!„BชWEAณฒะชy8ฏ*๋,ืตEOปธ ดๅ…Šยฏ'๋&„B!ๅi๘ฌ์๚ต*‡k ‰ž„ฺŠBly—]๗d„B!ฤป< ูŠ‚mEaทฒชjHฌ,l–d…ูช]O๊ „B!Q•P๋๎า“=ึำ:ฎโ!บ* จ WYwป{ly๋ฅ`K!„Rฝ*;ฌฒเZู฿]zRหUฎgB!„RuๅตึVึถdx- ทฌฬ%puภ-ูz๋.เ–Taุญj‹my-จ๎บธ ณ๎ฆสny๋u๗7!„Bน>U ถช›หข0[4ฉn–Wถตถไผข[ฅV๋9xฌผณ•Yสe;=ด@‡ชW ถ„B!UYt|ํ2œฐภaWWgฦ’!ทd๋nUjpซ*มฑผัตบ– ฐ%ฏ๓ยŒ l"ฦŽใ,Œ1๑Zž!„Bนฑ4MsชชšUPP”––fOOO?เcษ( ทj‰หฒืต๚U @ๅ}hํiKmษ0[tฝ•^ฏฎYณf๕z}คำ้„,หะ4 šv]ฃ;B!„„1ฦA€(Šฐูl งOŸ>gณูpลaึ]ศupห)ๅ  0p–[ฃ›๋ๅ ็UQ -š๊๕๚ญZตjร ตูlP…-!„BH= iEำ้„(Š–฿ฬฬฬๆฒ,๏_ร*น^qVn]KฐญจตถผP+˜ฺฒeหถชช†สฒ์Im„B!คบาxiะาาาlGๅฅ•ฝฝสธk} ฎป๎บ$vอyžTๅ:VI!„B๊EQภ๓|“ภภภ–ฺขt๗TwฃcUฉuึ๒FEpทภŠฮVY—„ž:ป~ญuB!„:ฦnท#((HJOO๏เ( [cy\ถdž,yช"e[qๆษp_ๅฅๆ๒Nจเ.6!BUหŽไPฬ้tยแpิhฟ[ฦxž‡$IE”Bฉue_W๊ฌkxžะลูฐ่์d%ฯLVvr๗T:ฆํตŽc[ ส๋Žะ€oy +z#Y,่๕zp๕๔๐œชชฐูlศสส‚ฆi$ฉFึK!„Sิ•}|]ฉณŽ๒Cแ9 J†ฺขฑkKžกฌlพฌ๒ท‹k ถU๖‹ ื4อํ+U๔F c ชชขข–]oำ๋๕ AZZc๕๖!„Rำ๊ส>พฎิYWišฆ ‡๛Œ่.^ำYวฯซฌomE]xฌผ&ขoGšฆี่›จˆชชะ4 ~~~p85พ~BIึฎ›7oยฤ‰p๋ญฐqใW่ำงOฅแ‡๏ฐiำ†*ฏs้า%ุถํg่๕๚k^FM*YoE~๘แ;ฌ[๗y UEศตฉ+๛๘บRg]u%2”>pฬ“, 7W่zูŒเnrซhผณฺ๐อD’$W—jิซWOL™2ฒ์ฤ๖ํ;œœŒุุX iำ˜jYงูlFttNœ8›อV-๋๐ฆบV/!ฉ+๛๘บRg=Q^N๔สˆภตwEจฌ๕ถlท„r‹ิ4 Œ]ืs๐ ฦX}~#rรu์ุ0sๆ,๙็!€(Š๘ํทํ8u๊Tตฌณ]ปถเ8๛๗จ–ๅ{[]ซ—สิ•}|]ฉณŽ+› หkตE™ฟซดA* ถ•ฝสžtEจดUธฟˆ„oผ๑:z๗พ๐ม๏ฆL™Šุุฆ7๎qผ๛๎|๙ๅW่๛fŒ1MšD"// ‰˜>dgg( ยSฆLฦฟ๕/hšŠ 6โำO—”ปŽ;๖๏฿๏บญฒe๐<aร†โถ๚#88‰‰‰Xผ๘S์ป๋>?๐ถm๛Vซ}๚๔†ชช๘๒หฏฐ}๛Lš๔โโโp๑โEผ๛๎Wˆื๋๕;๖1tS/˜อf:t๏ฝ7ษษษn๋8๐?˜2e๒UฯiแยEXถ์3€ม`ภซฏฮ@—.]™™‰ีซื`ำฆฏฏช355wu'’““1~ฤJŸใย…#..ใวOฤแร‡!I"พ๚๊KH’„แรFjj*L&พ๙f ๖๏?€'Ÿœ์ZWAA๚๖ํŽใฑaร,^iฅ๏Rฟี•}|]ฉณŽsืJ[^ธ-O…aทช]*๚ซ่๒ZŠ$„ิc?๔3Nœ8๘๚๋ฏ๑้งK”tกิ}ยรร๐๊ซC``พ๒+l๖+rss\ก(ฉพ{๗nˆ‡ลbม่ัฃะณgrืฎ]{8;vฬใe<๙ไ$<๚่#e{๗๎Ell,fอš‰vํฺ–Z๖wŽnบ!!!;๖1,]๚)$I‡ŒŒ DGGใ›แ:ย๙ีW‡๛๎ˆcวŽc๛๖่ึญ+|๓u๐|๑ Kึ{ๆฬ_Xฝz Vฏ^ƒ/ฟ šฆAำ4:tศu‹ล‚ฐฐp์฿ฟaaa˜6ํi๔๊ีณTทึ?<นนน๘๛๏xžใ๖ํ;mถดiำ~~~0 ่าฅณkc ปw๏.ตMz๔่Žณgเ๋kฦจQ#ัฃG๗r_Bศ?Š'}iห{œวฎท+‚'”q€๛oBต๑Qmฌ‰บ๎วD›6ญ‡M›6ใ๘๑ใW'"ข!xžวูณg๑ีWJตdษษษมะกรแp80z๔(Œ3ํทวฮปฎบฏษdBllS8pvปรฃeใž{๎ฦูณg1zta๐ป๋ฎป๐์ณำ๐ะCนZ_ //=4Šขเ‘Gฦ`ิจ‘ุบ๕ผ๖LภชU+‰ฦAำ4๔่ัปvํฦ๔้ฏ =๚๖ํ‹ˆˆ$&&^U๏แร‡q๘๐aภ๘๑ใภร๚๕_โเม?]5dddเัGƒชชธใŽ๑โ‹/`เภ`วŽฎ๛จชŠ๑ใ'บถน'ฯ๑ท฿ถใฑวE›6m i:u๊„ŒŒ ๘๙๙ก[ทฎุด้kดo฿ฐs็Nือผผ< 2 Nงร‡รใE‡ฐkWq๘%ตqJYไ†ซจฅๅ~]ฎ%1—WTูม^แp8žžŽ\ศฒ A`6›X_ว#ค;z๔(ฮž=‹.]บ`บฯ‘€eห>ร๗฿เบ,หฎ#†+ jfณษํ๒Š๛ซ๎/u{Eหˆ‰‰วqุณgdYPสŸ}vขขขฎZNั)ย‹Bcษฃฉ=†ศศH๘๙๙มbฑz๖์;ท—ZŽฏฏo…๕ถhัƒ?ˆ””ฬŸฟ ิ<‡รแZ็O?Œ^x‘‘‘ฅ๎“ŸŸ_๊‹„'ฯ๑์ูณธp! mฺดc ]บtฦŽ;†ฮ;ƒ็yดo฿็ฯŸว๙๓ล-๏ฒ,ร้t^yG~~~ ฤšฆ!55ูููฎฯVyxž‡ŸŸBCCkE฿Xโwูฐlvฌ่ฑฐแZOะPvก%ฏWk7„ผผ<ภณฯ>ƒ~nA`` าำำ๑๓ฯฟเร?‚รแ€ษไ~GGฉฝ 0bฤH๔๊ี7฿|3nนๅ_˜>edg็`ฯž=W_Qไ —ืกCQี๒ฤ*ป ฝเyกฤm:hšซต ‚ๅ\=<ช๏˜ณณsปvํฦ๛๏P๊~ฉฉ)ๅึ+Š"^|๑yp‡7฿| VซตІs:+.ž>ว;ถc๐เมhีชš5k†ฯ>[Ž   t้า:t@๓ๆอฑvํบrืใn›R‘ห—/c๒ไ'1pเ\_ห“™™‰ฏพฺ€?5T!๑‚สrโugFoœRท์๕ฒ๓Zฐu8hาค >๙dAฉ๐†กC‡เž{๎ฦุฑใ””D-ท„ิ1Œ10ฦฐ}๛l฿พ‰‰‰?~bc›บ ถ•i฿พ= p๒ไI“˜˜ู่ณ'>๚h>z๔่ฦ๚๋๏*ืP$!!Šข u๋Vศฮฮ.ีoธขzG‰จจ(lุฐัm@ื๋ $ ‡บuc ^yŽท๏ภเมƒ๑๐ร# i๘c?L&ฆL™Œ1cF็y์ฺuuBฎี„ ใ1z๔(๎๋๏๏ัฃG1†ีซืTse๎•์ป_‘VญZUs%uJyูะำึJป&xฺb๋i8ญึ[N็ ตฟพ+Vฌภนs็ัจQC 6 =ztววฯว๗บ!,Bฎ]llSฬš5;v์DNN๎ธใvpท2>>>hึ,{๖์ญ๔'อ’โใใฑgฯt๋ึ K—~ŠSงNฃw๏›แp8ฑt้ฒ*ืQไาฅKุธq>x>พ๖;„„„ภววˆ—_~ลmฝM›ฦ`ุฐก ป8<๘XWE3-Xฒd1N:›oพ ฐz๕jฏ<ว#GŽ"++ ={๖ภQPP€‚‚œ>}mถE^^>rอ„ฒ๎ฝ๗ภฤ‰ล้ำง+ผoณfฑ๘เƒ๗qฯ=w฿ฐ`›”tฃ๛vํี\ษต‹w๕ฌ่@VEQ––›อ†่่hoฏ๒zrขGmฝy"dwMษ^ํ†0bฤp˜L&์น /ฟ<งOŸอfร™3a๚๔WฐcวN˜L&<๐oฎ–R8ŽCBB๚๔้ƒมƒรfณaึฌู8pเ`•—ีถm๐<Mใมพ๔าtlธ ƒ=ztวัฃG1v์Xœ?๏ูNฌ†ข(>|ZถŒƒีjcฬmฝํฺตsํh††แร‡กOŸฎ๛lุฐ999่ำง7’““๑๓/เะกร^yŽŠขธส+ูbพcGแˆ {๗๎u๕ั%ฤgฮœ)u๛ฑcวฎj=}๚ 4MCƒ จํuHIIย็Ÿฏ†รa‡ข(P6› +Wฎ@JJRuญึ]F๔ฺ‹่nA•๕™-:MnัฅPbหLา•้ƒธธธveWคirssๆQฑK—~Š๐๐pL˜0gฮuี่่(,X0ฉฉฉ1bคGห,)%%fณ™>$„ิqใวระกC0rไ(ท+j›บV/!žจ๊>ป๏พc QjT€ขoฟ฿ฅ~-๏ๅ)o_ี:ซ[Mf‘ๅห—!::'Nœภะกร iภ๒ๅŸกu๋VHLLฤ!รผถฎ'N0€ใสไ,3ษ%&€ZโRs3นฎƒวชฒ•ฝŠ@น}Šn ๔๖ช !uHRRVฌXy]bkR]ซ—šPถ•๖ุฑcPUตึ๔Yญ}lงL™Š๗฿Ÿ‡ธธ8ฌ\นšฆกeห–HIIมSO=]ซฎjž๔xศ/oŒŠP ๗tผถห—3ณูไ:สธ$?ฟยas222๊๓p„Jlธ้F—P%uญ^Bชขช๛ใข“‘\ธpฎTซๅ๙๓…>pGฉ–ข๛ืtž๖ฑํ฿ภต”S#.]บ„ &bผ๗ ๐‹๖Oiiซkตีฺ}ญ'hpwฝย๛xcPไ}๛ภw฿…ฑcวbโฤ'NปŽK—.แฝ๗ๆ๖์ู[ฅๅ^OM„BนZmŸา JS.œ/5ิŸnว๙๓ภq\ฉ3#zษตdศ๋>Aƒงjผ#ฺ๊ต๋ะฏ฿-่฿V|๘แx็wqๆฬฤฦฦโๅ—_ยmท๕‡ข(Xผxฑ๋ฤ „Bฉ{ŠF๘๛o]}ikำˆGตน%ึSŠข`อšีhึฌ™k(ภ่่hฌ^ฝƒฉŽ`๋ฉkฮ˜u*๙ฅฅฅaฦŒW๑ส+/ใึ[๛แึ[๛•šฏช*xžวฌY31thแ n !„โm๕กํ’%ŸบBํ„ O>๐}4mฺK—.มcฝมV7S_ดเ:ƒ?ˆnบย฿฿™™™ุปwพz3žzj š5k†5kVaศa0n !„:ชถŽ›œ|ก๒;กvท์ถiำงOŸม”)Oแ๒ๅห€ žภœ9๏ขu๋ ไ^หี‘๘ช=เ^ผx๓ๆฝ๏vณฯ>‡ทzอšลbีช6lb—BฉลJถ~;vฌJ}L;†–-[VGY๕^ฯž7]uๅห—๑๐ร#kชฏgฦ๊lสผ!ƒมๆๆๆโ๙็_ภฬ™o!&&‹-ฤ“ONพฅB!ฤ%[?=m ไoDซhmn‰ญช-#z๓ฬcตFvv6ฆM{งOŸ†(R7B!„‚z›๚ฒณณ]ก !„R{Q๋'๑–zูbK!„ByjฌลถขA‘kำเศตฉBHึญ[WDEEa๛๖HJJBใฦ!โใใoti„Tปบฒฏ+uฯP‹-!„Tƒ๐ผ€๏พ๛}๛๖A@@บvํซีzฃK#„zซ๖ฑ%„)-- iii€_~ู†o€s็ฮ!%%ๅWF!๕ื ถŒ1จช Žปฑวšฆฑ2B!คžKNNฦส•ซnt„ิธบฒฏ+u’ส๐ฎวม้t่2เp8n๘šBฉO๊ส>พฎิI*wรทž(Šศออ…ข(7ฌEQ›› QoX „BH}SW๖๑uฅNRนlcเyว!>>9995๚ฆR999ˆวqเyž~ „Bผ ฎ์ใ๋Jฤ37ผ-H’‹ล‚K—.!)) ชชึศz9Žsญ[’คY'!„๒ORW๖๑uฅNRฑlcะ4 ƒƒกฦวn+๙ญˆพ!B!SW๖๑uฅNRนz‚†kนท•<‘D&„BชG]ูวื•:‰{7ผลถ$๚–B!„ิOue_W๊$๎๐Q!„B๑ ถ„B!ค^ `K!„B๊…๋c›˜˜XSซ"„B!@5lEQ,จฉuB!„ฺรnทืศzจ+!„Bฉ(ุB!„z‚-!„Bฉ(ุB!„zกN[A๐๗฿๛oCFF†q๘๐แต๊ฬi๐ใ?๊ศป›๗Ox„B!ื๊†N:q[ถlั]ธpมฐo฿>ุฑc= hฒ,#&&ฦcพ}ปRuVี๘๑ใ…คค$CRR’!##ร˜žžn,๚{ฬ˜1ืBk๛๓'„Bน‘j<ุv้า…ดi“nอš5Jห–-mร‡w4iา„I’TำฅxG}$GDDX#""ฌห–-“.\่,๚{๑โล๒ฎB!ค>ซ๑`๛ฺkฏI๏ผ๓Žผ|๙r9''G;y๒ค๚sฯ9ภวว๏ผ๓Žt๒ไIร‰' oฟถd4=^~eฯฬฬ46iา„=|๘paร† บขฟุัฃG >>>˜7ožt๚๔iรกC‡ >>>^yฑฑฑlม‚ามƒ๕ †ตkื๊‚‚‚Xษ๛DFFr›7oึ%&&พ{}LL +oye๑<ษ“'‹ิ;vฬ๐๙็Ÿ๋ยรร=~|Xํีซ—mเภถช,ข\ฑฑฑถmิ›nบษึผys+LŸ>],yŸ{๏ฝ—Ÿ|Xๅ8Fฃฑฎ'OžTEA@@._พ\แฒ- `๏พ๛ฎคiลO5##‹นนน{"„B!ตL[Y–qเภuเภย์ูณe็Ÿ;wNี๋๕ aiii4n˜1ฦpแย…RกTUU‚Pๅว;ฑขภซำy+ฟW,ZดHฺฐaƒฒdษz๖์ษ๛฿.๗uˆŒŒdp๎นJŸVV––ญ=๔ะC๖ฃGชีP>!„BHญUใฝ๔าKŽ)SฆC† |||รVฌXก‹ŠŠb๙๙๙Xทn๖oKƒFฃoผ๑†ดz๕jูfณ•ZNBB‚ึฟ^’$3๐ไ๑gฮœQ‡ "˜L&๔๎››8qb†๛ศศHVH###ูิฉSลฒ๗น๛๎ป‹ลยŒF#^uiํฺตrูn๎ž?,\ธPž;wฎTtภ˜ฟฟ?๋ทฏqq !„B๊“ถฟปz฿}๗ูGŽ)œ9sฦฐfอฎ]ป”ณgฯj๐ไ“O:ฒฒฒด๖๏฿oHNNึฆN๊(ปœy๓ๆ96lศNžy–—,f”x}G๒โKEรOEรดaœX๒ๅุ๋‚qk_็uGV †#+รๅDมห็U|#˜O฿W$๐๐ฎฤ๔~ลใa์1EดŒ๘ษ`๑ฃมะ๕ ฑผ‘ฑ๏tษั? ญh f๗5y\€a1OIFมไชใ8_ฃแโ ํ>1<฿va@ฤ`‘+Q_๛7๑3;ฏ7พัiตk1๘ชณ฿]—เpฆ}Quส[LฅทŸ6์ฟขถเƒ6‹A{pœˆ2ŸOญugN{{ฅ^]บอ ฮ๙B~๗z๕=ฬ&LW๘๙6U2›อล๏?Žรร?]ผะฐxัว†กCr๐๕๕e_ฌ[c,9ญโsใฆ_}ŒF: !„ิ5z:YOEEEq PxJุฬฬLืเปใวฺทoฯuํฺีสรฺตkuฃG-Z${2฿ยฯฅiชพŒcนšโช๏nYˆๅnBE+T /›tทK&aซ#O *.hฒสห D]ตœ๊V ๓ใไิl ˜Yฯ”\›ซ>ห16„K๗™U๒ส=:฿;ฺ 9[หเ9๘?Sฬ๙rฟl;|^ัล…qกจsœMWmว“Uoีื$ \bjแ€ส3XVn๑เสอ mcม๕งXT,Eะธยา-ช ทvf/5y๛ŸŠา(l[‚l2ด%Wๆ{๓kฬฉ94เ๔ฆูฒ]๕้Ž๘เึ\ฮšปฌ*ฬ7_งk=Hฐ]SjbdožทDWKุ ะ…q™๖4 Œ‚™ศyฎ๚nพSˆ0ฦpณื at์ บ๎มYย!ุ€ IDATฎ‹฿ส`เ์ะๅ๒ส๘9WอฯkBq,ญp๛มdaศ+~ฺC-บ%ว=yŸUc€๖<ฒ๎ุw๋ ท_d3N›๔ฆŽอ}ึฮฏ"(ŒกQดWฟ™†…‡qiฉ…ฯืlfนนนลŸ฿ป๏b›6ๅ&Lxย ฦ๐๒ห/่nฯผMุ๚อทrNNŽvƒ J.๋‘1ฃEซีŠ‚ญ์z!„ิผZืb;iา$a๎นโจQฃ„Q฿นsgnบuบข๙ฃF^}๕Ug~~>๒๒๒๐ฺkฏ9G%x:z ิ๙ ใq€df™‚๕อ‰›๎่ชo€ไ#,wไ:ญช+Tฌฐๆ8่Œฎ๕็kšถอžฏ–ํ^ Š%Y๎๋"LธU4ัFŸ=Xฏoส…ฮธืUŸ๙ŽถBึ๒]Nล๊€ju k๙.ง๙๖+ญฒŠŠิ้์UQa=šคHP๕อCฝ๖>™p/ฬšภ‹ร๏เ„อณ}วๆทb†เชo๘œ๐ึrี™oU‘g^ฎ8‡฿ฮนถ฿ฬช๓—ช"+ภูhฟะ”ศPๆตฉ๏0F0๖}Eิต$๘ฟJ/ทๅฬw.pีงk=Hฐ>ืฉ: G>l{ๆ9uญ•z1ฝ๓น๙ฉเ๗9^?]s฿ฐ{…๛?&v บM˜๗ฆพฑO,7ฆู‹ฎ๚บ&|›ดสi—mฐ+V|›ดสู-ฐฟซ>ƒhbนฮฌj aฺ= ๊cฯ‹Z๛ํ๕ฅzฤถๆด็฿wีงzŸภญ๙ะ [˜ตlอGNญ}ฎ๚ดู๚…Nvlแ็ใRІ;oี7pเฝย๘qcลnfอ|K฿ฌY,7}z๑๖0เ6a๙Š•NซอซีŠ+V9~›qq-ธธธšฯืึ่iน !„”ฏึตุพ๗{ฒŸŸ๛ๆ›o”#GŽจŸ}๖™nะ Av ๐gึศศH๎๘๑ใ๊คI“ปŽUซV)111ฬ“๙๐ฅ=G๖aŒํSlJผโTŸ34ะอศO/ฌ@วs‰ŠSจ๓œะ๐ณ#O‰เล๛™2k>™๓‘˜uoผbฟค?ง.๕• v\)P๑ๅœ ้ชๅพ.‚ๆt"๏งŠแ_n}Bจ…ๅ~sฤkA่ร๕Š์๋รณ๏๗ชสฑxU]๘ผ Š|ๅ๕…0๎dS'ว vง†ฯR•่ˆาม•ใ3ุ-8ฎ{Kฦ|M๑Z๋ฃํเb™้LLNุฆ(้'UŸ็๊r7ณ_Y38sCNน|Fีw#hŠŽSาคT}>}ฆKึCŸ9‘Ÿ๊๕น-eƒlเ}ุ๑์?”ไ‚ณ๊๐˜งuŸž~ส๛ƒฟยฅZฯฉ}ร๎dี‰?2~Q‚ แฎ๚ ผ |b๙1อ^ไtผงณชฟฆmt:๏d3ถq™ clWpJลิY:๖ฦฏผ8 $‚รนฟTํž‡8ํ`6+Zxคซ>-2–q฿กi=/!ฒ‡คณ*[‘™—ผฒ-ฟrƒ์ใใร๖ํ๛C‰?ซ>๗์4Œฝๆ๚ย%&žSผWp:œ๘๙็_”ˆ๐pทŸร‡‰Ÿฏ]็TฏๅnB!ืฉึตุ@xx8KNNึยรรYRR’k‡&Ixž‡อfCถmนถmrVซUำ๋๕Œ็๙J็{KวฑtUัว.ฉฒซ>ใภ3‡ช"š็นh^เ์ำ$0V-}ส!š˜œ‘ง๑&ฆคฬส ภsPNHัœ.:˜ำ์ฒI`เฏ~+˜o‰ใ5EEมŸ็ผบ็ Kษะดฐฐไtญ๘๕ ๛ฺุ*ZGƒkอ8›šN+๙๒๕jห๘‹๚™9‹Ÿจฮ3็5ฏถ~s>!LอOำ˜O0S๒RKl?Œใ :ํเ[pB`งษ6 :ฎฐ@]ณ;yfh๛‘ี^๋Q–Ÿิ€e;24_ฑหrdธ๊ใyใ +Dขธc็Tšภ$VิO๔Hๆ๏สŽ‹›+~ืฑ>aพณ•ฅGฤp๏๖ฑmยp9Mำ1คงRA, ท;ดจๆขZppุ4ˆ’k๛ฑ!œ๖ะฟm•ูOุaทAฆไอ๒Xzz†ะ ป”ž^๙๐‡ร่จ(.::šณ;š$IŒ/ำ8::š  เ๖๎Gฉ–Bj‘Zืbปhั"ฉ|LL g4แ๏๏ฯžyๆ๑ํท฿vฺl6ไๅๅilฬ˜1 c—.]าEข(ฮ๗†งŒRgัภ‡sงc พŒcƒU_q=ว้PUX5U31žอ.ศt@/ฐ,Uัjj๏<๕ษะฅ /„๛sL'€3๋™Cฤฬี{œชC†fuhผษภ.ฮ๚ฦb€‰)Y๙”าูPยYF๔’า^ส^v๕๘h*/า…ใฃย็ฃ+์c;๙!NœณZuฺ@พšล6nVa+lhc้YšV๒ๅงฆฤ vZ3๖๎$N๊‚ใfญTฝาไ่ำฆ$E๖ๆyK$มฆณ0}็qขํ๙NUถCshฬเว๒xฺผ)˜ฉ—5จ xS3tŸ,ๅnnชฅง †D?)ต๐๋ศJaœศ้เ#˜Yn๘โษ๋œNล‡jำ ข‰๕ก๕“ฐ|gถฆช…๕œห;ญžรi€อZ mMZแ9^ฺt๎Sฏl?uา๋:ฤ#ฌง้ €ูแGEถnก;`+ะ`๒e็ [ู3dgjPฏผภ9—5ถเ5Oซภ6.uj๓ท ำvuื๗ิS“ฅฮ:๒แaaœNฏƒฏูฬ?8H\๓๙Zงรแ€ีjีL&›Nแ๖ hภฒฒณ5E-zvํา™?|่…ZBฉej]‹ํ#<โ8x๐ ฺฟ๙๓ๅ3f8~๛mืN๗่ัฃj๗๎]u๗์ู“;z๔จ๊้๋๕NAฆใ/ูกNหปdl/—ูsk์9ฎ๚งฺ’—\๋oษI\‚โฌž”ใฦลู฿8์gาิไฉklน_”ณ–ํpdฎใชฯ~๖’ชo๎ชOื*‚sœM/UŸฎI โ]บ๔wฟณ;ฮexต๖๑ณวก3ชz๗Tูถ๐kU~s™๊˜ณบ8”?ซฉ][1W}[1๎๘Y๗-ฒ.jฺ'5๙œืฤ๓˜ๆ/Ssึตูฏmฟฯqุ˜๏ชOฮ8ฅ ก]๕ a89ใ” bฬํ<8ๆซ๕–‘ฟฬฌื3ณŒี †v๐สgmU\ว๙‚ฟีN>oyiซผ5iฅใ‡ไuฎ๚’ญ j”ฉ…k]Qฆ–\’5กยืPัdฏu™เ{ม๘ใ*{a”บZf+฿wฐu ‹CsโUkัUŸืž+ ฑ€๓๑ชูด๘งœ, ^ฉwๆ8๚๋ouฺ3ฯู6ฝE^๖ู Gษ>ฒ ‰jห–qลŸ฿–-น„ณWoฟึญ[qงNชฑฯ5!„ฯิบ`[RDDปpแBฉ๎โล‹ๅgŸ}V๔๕๕el๊ิฉbษ*›๏MŒc้j้Pฐีž/ึ›Eฦ˜™๑l$nต็WฯาแLLNฯ+U_–Cฒepw‘๗ั1ฌg~ƒบŠน[น๊ำ7ๅBfซKŸ๓ฝรz๘|ต๎ธรภ’JtE€e[T๙ฉมผh๖ณ˜ม& โฤฅ[ G<๐๕[๚ฒ kS๘หzร`ฦ†ฦ„งผก๓ aj^้~ฒŽ#ซeCื๑"ำ™ำ๛1]งฑbQทกerึา>ึข)w}6อžฏe-ํcuฆ๔z~b–ๅH/U฿๎‹฿สท† ๕‚‘ป%์>๑๗K…#"๘ˆf6บู บpcŽ_ษŸx(sWตดF#3›อlะ๗‹[ฟ๙๖ชฯoHH—žžA#!BH-S๋บ"๘๚๚ฒ\ล}mKฮ_ทnาฐaCn๛๖ํz๘ไ“Oœ[ถlQ<ฝ|cWFง ไx–.+ฅ๊๛ีY ๑7๗สต›ํ๙ฮ฿eซkOHญ/1#cl™o˜ฯปhตชื_&๏ฃcชตฐJ43๙Rnฉ๚r=ฅมพ\๘ผกzศ๚Og๎ฟเDกoฏcŒฑ iwHL*|{จV'ฮ ฤzล0๛€ๅ^YRx c)—ิR๕}๙ซช„3๎‡yข–|ญ8ฟ]ุ“#'ฺ๚Ÿ๙ีฑผุ$ œภ฿ํั”้Ÿx๏เ1ฆ33อ™เอกฬYๆ0๛™- ็ฮ๙ Zฏแ•N็ูŸj์'iฝ`dvฅp๚J,ปLฐ=˜ฑ]๑ืq“[พฃ€ท:f๎U ฿™ซ™ฑCพท๑ฃR€.„išŠ—•ฟO{G๕MŒY๓ ฏ„0ค—~lวท ใดYซ๕ภพYใd{ทนถ;ฒOล๚…Nu๚ำฮžTู๛/{ํ๕๕1Yตp๛^lmปฬอ๛nแ็wห็๏ฟ๏น๊๕๕๗ทฐฌ์๊]‚Bศตqwด/+sฝไฤ•˜๘“@ผr)]น^๒๒}“ษ[=OB!„ิfyyyg<ภภYๆRพr] ”˜ิ“Vf*Rช‘กVwE „B!ฤSl !„BHฝ@ม–B!„ิ l !„BHฝ@ม–B!„ิ l !„BHฝ@ม–B!„ิ ต2ุ๚๘˜X‡๖%ฺ่ฅง$I:ืุบวกuซvโํทeะNC\‹ึbษวr‡ถm:Hท฿v—แ๖๎2t๎ิ]Eฑ์*ฎKCIว^m(ภแ‘’…\๕๑ž wFวถGว&†Š%7r  ฒOยฃtปฃใ ?4iฎ?_‹ืN[ฤaam^๙ท(I~W}ขฏ5{ขxำบG๔}6?ฎ/๛XŽ็ะbJ?๑–Ÿž0๋‡‰†f๛ˆเผ๛6iแรfฟา^€…๏v‘$W}_‰=๗฿8๑ว/๚๊wn้wU}•อ๗c@$‹{hฎmF/•Dโํgดฐ˜;_ป=๓›พ็‹๛ฎZฟoรถ\ว _้๚ผoธ้ีฃ††7?โ๕“ „๘„ฒ ฆH0ญ๛K’Y๒uีg’ฬlXซQโœ[่?ฐไช๚šฤqฏ๕žฅ[~็zร๒;ืi7^ไฝwFb€!,’ต˜6G€ึ["‰พ%ถŸูยข}A์บx›พ๛ส=พ~-ž~W๊๓รyƒW‹ะจQ#6kๆL >๙ไcษbฑธ๊๓๓๓cฯ>๓Œ๘ร๗฿้wlํช๚๎ฝ๗n>%9ษx6>5M{๚i๏ƒ!„rอj™วภว่รๅ็็k ‰s8์ฎมwcข› ?๎ง_พตjะณ๛อ:{TS!์_24nิDhเภ๘๓7Vฦ:ถ๏ขkำ\ี้ด๏ทๆ{ํ”ซฦฦ\ม๙ยณ"Isd[‹/ึ4ไว_Vำลณน%๖ชDำdD7มฏU(๗][ม€ฮ ึEสื์๗ฺiฃนฤ …ฏฏฟEd™ูW}šฆแL|ฎ*n๏zU}•อ๗C`gหHะ@4๚3g~fฉํWvZฝฬ‹j๓๏R๋็81wฝ$&4Oฮ<ณ]๑kา•๋0๑K]…#jึู=^{}รL\Z~Šพ’/หuไo?hธ{Nๅ9ย{^ต}:‡vใฟ:ฝN๓โ~%ุย่3GŸ’—คm๙{ฃื^_Cร&œ-๙ส๖๓๓gฮœ2/๑ดzYxำๅพ~=nๅ‘อ@ๆบE5iย%&&^yYXVVV้๗฿_gTAp๛€Wีg6๛ฑ 7สใฦ๗ฺูะ!„xOญkฑmB่ะพ‹ุคIดะท๗ญzฎgบข๙QMb„ใ'8N'dู‰ใ'Ž8ฃšฤธบNงg้้Š,หp:HNI’ ฃืvc‚…7‚#ฤ!~ย๚ฦM๕ํ nIDดซพ!~ „ูฉฮEAพชเŒT็P?๔<Fฃหไฐk\พไ|ฬ?ุk->1cz mฆ[l4จƒะkี(ฝฅmืeม`W}ฮ\›–ดๅˆ’ฑ็ฌ ีxPแ๔{œrrพง฿฿ๆl@Gฏ}š8&V˜J{qฤ &ย7ซz๋;ถ๕็V-่แช/;ืฉ}ฑ๙‚ฒ}ฯ%ท๕U6z5นu’7xฎk”ะ๕ฉ๕~Qนใึo?kถ–ฒoญr๙ิฏWญ_Uœ€=ใไ/Šชศศ{—šq'ี/ช‹ื>g›?(Œ๏๘ค8 ๊Naึ-๏๋›5ˆใฆ฿๔ฆซพ|GžถํOสแ‹nŸ•ว–:๗ง๎UUAJ^ฒv mŸb ๓ฺ็#rศ…S็ˆแ๗Œ:}ฝทe'ฎ์ตล//[K~’น๊ํWD๔๕gฑ“gJ/๘Ÿ๗N๕{ล„ ใ…™ณfŠร‡ถlฌ๏ุฑ#ทrลrW}999ฺ๚๕_*;ถ๏p[Ÿลฯ]บt‰NฅK!ตTญkฑ=}ๆค,ŠKMMVฒsฒิฎ{๊v›ฝhพั่รๅไไจอb[Šขโ๙ณŠูตcพtNพฉืฟ๔VkพvBขาธqแไฉใ^A~œqQ๖ๅx๖c~ŽrยfS? ‹ิNŠท…฿ŠwสaSว Uร9—•&’žอƒ/วณtUีเธอชŽ๓๒ฺ๋๐๗โ]ฒ`าฑ‹N+9'/ช็ง7nฝ๒Gเ8",\๎™Kjฬ˜ž‚b“‘ด๑ฐโำ$ภkม็ƒลgd_“ศพ฿–ช=™ฃ.žY7t๏žีW~|O ~,ศ7Jnาตํ˜ฯt บๆ๚ Q,i็ฏก/O}.๛ˆ&ถ/eทŸท๚\๗้บ;žฏR}8˜๕พฌcHฎe`๎๕]/yญ๕1qี X˜›‘*7—๔lzpธ$^ษUbfถด๙‹โอ๚ ,zI ะฐKUo=lาŸึํ%Iโu์อำํrฮy๕๓ก g๖‹ษš.0œูชNCo{€—,8ี"Y่ฝ–ไR๋ e)))ZXXKNNฉR}[ถlU๓Ou/ิ๐๐p๖๛๓ค€ภผ๔าห^o]&„Ruต.ุv๎ิ] ใM&3ว๓‘ 8^/Bฐ่Y์ธ›ล3๓ทWบใU์NศNM๒ำณ?งm(พมffฟœฏy+ิ.˜ูI๊ื;„Ž4q‹ศฆŽk.ฮžชVƒึ#I-๛๓ฦ Ž“Œ|Y๔ฯˆ๑฿ผ]ฅ๚wเb๎zY๚๓ฃ๛์ช๊ฝ\๛Tื็ฅฮก๘psงใ๕๐}ูเธแโšห=ฎ๏ฯดสM๗Zƒ}Bุ;M•šดไV[๊•ํ฿j๚B) วญผกQ4'่เ}Yิศiโูฅ3+]พ>(œล<ฒt`ฟmPซฅง >๚่Cฉ฿-ท๐1Qัœัว‹ลยฆLž,พ;gŽGฯภ๊งNŸึ^{ํu็ป๏พ#Qฐ%„ฺกึ?๖๎่ีณฏn็ฎm๖&‘ั‚ขชฺ๙๓ ฎd“ญ6hศฅค$)ะ หษษR@Eะ ฿}ฅ๋BAAพv่ะ~็ท฿m8๘็>‡๊…ๅ“)็หF๋†_ˆท?` dMีพสฮtีwาfS;๋}ธ๏๓ฒ่b0r'l6ืŠSœm๒•ะ ฃ ว6ฏํล|fฃฃ๋ข!บฝฌฒ7ุ^PŠ–ด๙ˆวษ*๗Tš๊฿ฑ!—๖ำi;5โrO]๔Z}O๏Xทธง๎1ป์ Œdงชญ๛๚ผW[4ฏวัฅ8:N ;๐มฝ๖ˆรUqj){?ฏR}ๆ๐V\›วV้Ž๖˜=/ๅ„Wฺ;{฿pผฺ{–๎ฅ฿žถ๗บCp*Nmนฏi๛]ฬOำ6žY/n7N๔Vฐ=6ใQG‡น_้>๙{๘ TงSK~ญG๕๋ผ€ŽฏŽ อฌืฦ†ฃ/Žดgน๐ฦŸเX๛๙ ใAโ‡i^;"ฝ$}ˆ™YSณซดำM\ณ_Žื[Mz&๙XำวnืQ-๕E„ู่…Zุกˆฮมl™ชTŸ_d'ฎ๘/t'–s\>ฝฝzšฏะvI๐๔>’‰ฝุ๋5]ด,วCฐOป-๊฿ย้ห ฿EtAฌ*dฯฏ/๏ผ'ฮZ4ํื&ไj;๏‰ณz#ิ–ฦ’’<ฏฯ฿฿ŸญX™ฎUซVวqfฯ=๗œธqใฦZ๓ลŒB้j]‹ญ(ŠL–  ใUม๖…Dลh4r๊{›โใrตภ๎฿ทด้ ฦ5o%j๒rsิ{ถ{ํเ3ฯณผ+!9L”XjnVฉ๚6ๅd*ขฤm‰Œีภฒฌ gQ๋-4E6=(L็ห๓,UvjM9g?m๗^‹ญhา3%ฏ๐้๊C}™-5ทT}fG๒๏า˜็u"D“Žฒm’~๛๗|ซ\เ@๒–ฃŠ1ฬ—๋ต~ŒWํwตzƒฏYdนy…99,ิภRสOfw–zt เ๕:f“ศŽ:ภ๏๘ูš_เฌt๕ พLฑๅ๔แฬ–™\ชพ6ฃ>•,M{๑ผจ‡ ๗e7ฟ~สปืัช)NtšดY0ึjิb‰ ‡A•ํ๙ุ|3๋uภG๔aฮ@ 1ˆฅ[/–ช๏้n/Jญ๑/ม(๚ฐeทฮ?ยš๏ศำถ% ?ึn‚ๆม๑=)ป”E‡>๒ฺ็C0๙29ฟp๛้Bย™ํb้ํื๊•ล’ฅCOžื้!๘๘ฒ^O`ฯเฮVูš๏ญ2สๅk6ณ<@xx8KII-U฿‚๓ฅป๓zฝfณ™๚๓ z๖บษš™™ฉmุธQ~ใ๕ืฅศศฦLUU|ฑ~ฝ<{๖;ิ Bj wgฐ2ืKN\‰‰/1 ฤ+—า•๋%/฿7™Lฑี๓!„BHm–——wภœe.ๅ+ืeJ‰I-1ieฆ"ฅ(juWB!„B!๘ฐ๕0ํil้๒$๎ํ์๕๚˜ฎ!คฆณR๓OภK‰นฤ&/ภะๅ ]๖Cl< %‡VๆL k NภะํฤจŒ๗j}แฏSXำผแg(~p ˜z›/vL ลoSC0ฉŸนไห[สซw[pdz˜WkSฐ7Mj่๗Bk่ฬขkc ]Fว`ศส^xhE/t]jd๊่>มx์ว~ฝๅ_ฎฉใp๏ึH/`N\ `I›Xฤาozำ8vscนฉ1ž‹๑ฟj0ํ› ุึ-‰}›`oฯFn๖j}:ฝฑฑอqqญ %Žกe QQ1่ึฝ'บv๋‰ศ&ลFEts฿Rำอฝ…}n/ะqธ„RิสฦQQQ\BB‚žฦ233ำ5๘๎๘๑ใ…๖ํs]ปvต2ฦฐvํZ่ัฃ…E‹ษžฬ๗CdcXฯฑฌ„ี IDAT ไ์ืผˆQร`j๛๚ฦqhฝ๘C8.ฅ#eๅฺย;h@ม_๑เDท๕๓VIฅ444ภ[&ภ"‘#Ÿ๔๊กˆnhe วภ‚c ๏ต‚Œะ<|‘๚80Lˆ์‡evโ์Dด57ฤGญ‡แt~*็^๐Z}œ! š-ภฤะไ,ื^พแไคพฆ:_๖โ_ตุAอ}ฑv๔๏`0เตvˆป›“’Iฤ™ŸR๑ห›วชฅ6ˆ2Š8k-~ $Yฮโํ7ฎ‘:๚้ะeืyp`X!i |zก๐3ิา$aI`<|( ปฒlhจะG๒j}ฝV[แ๖Dฒ\ฏ!"ข!Lf3๖ํ u๋vp„;’œงำ‰ท•ZVtLS(ŠEฎ–ณNBฉขZืb;iา$a๎นโจQฃ„Q฿นsgnบuบข๙ฃF^}๕Ug~~>๒๒๒๐ฺkฏ9G%x:z5|๔aฤพ1แรD๛/WภทC;ด๔Cื๐aƒ0๓=จV”$ผ๓>ย‡>่š/็ๆโาื฿ kืo•Tส๐ˆxฑ้x ด3–ถƒ6ๆ†xฏๅื๛C;ใƒ„Ÿ`S(P๘0๑gVุ*ซBรคใซฐ7๋,TMลŸ9็ฐ+๓oด67๔Z}Bฤ8ˆM฿:๚v[ม™;Aืre๑ะ‘p&ผจV@ษ‡3๑Ma#]๓็fBษh 4[”ห?‚้#ฝV฿#7™๐ฦฝ ํ๊ƒ/ฦกCc ‹Fธๆํ๊ƒู?ไย๊ิ๏ะ๐ฮ9ฺองิ2 fmมฌ๏rส.บตฝฟ1nž‡–wFเž๗:#$ฮ^k็šwg๖}๚7dปงUมKโั๒ฎโืO็#ภš้ต3่^ๅ‰H ๆลaLC_ะ5]๔X!ิ5L#_ฬ8sІ๛L7hะ ;p‡ศศH๎๘๑ใ๊คI“ปŽUซV)111ฬ“๙paแ2พพศ๘q๒OœBwqlฬฤย™Œมู๙งBรG†jw ํหฏaˆ๒^๐ชฬ๒ค0 zz๙4ฮไงaๆทw็แq•…ว็ฬž}้’.t…n`ูฅlฒ\ส"ˆXม‹…‚ฒ‰Qูไฒฃ@[เBQูญX*;X–ถถ”ntก า4Mา$อฌ็?&™NาI2iฆmx~ž็<3™3ห›ดะoy็œQ฿ึO%9Rัล฿หู๘ฆพ ข ญ7–†ตdSL8ทLMซNพช% .๗hYeL)P4๎๊…y5ดผ๕Fฟz‰}ฏA๋9W‹ฯญ•ฟภซ5ณทh๋g :้W_า+ฟ8นำ’Š„TณบAcฟ5H‰˜ฃๅฏmR๑€‡gzีgT‘N๙๒็y๕๙ฟชตเูตrโN;ฏุ5๗ฏฉUฑืึ?ถ4ja}TOŒํซ๏ฬ฿ิ2< ๙ดค!ช+—(โธ๚หฦzํ›ทc)ลุย€YทMwŽ๊ฅฑE-mˆ๊w+ทช2’›Ÿๅบukๅ๕zU]ฝE =ๆ-Zธ ต? ฉฑฑA’ใ:ชฌคP^ๆร[:LkVฏ’๋บ๗๖ผ7c+I๛๗ท6lุเ๖๏฿฿Zฟ~}๊_ ฟ฿/วฃp8ฌฑcวฺcวŽต›šš`0hy<žN๗็J ขฏข•›ๅฏ่ซ่ฦสิํถฯ'ูถœHD๛Qมฃๅ„›d‡‚RŽื๙vคฟHU‘z๕๑ช2ฒcึะg{ไ‘ฅจืจ‚~YPกฐSศ๖ษiฅฃtZ๏/)แ:š[๓YNวg๙๛หl’ๅ๏'7ฒaว/ษ#9ูce|Iฎำ$ห)ฏชงไญภˆ๛๛์:9M+r:พŠb*ท%TQไัฆด8๕y,ู–ฅHี}ำ฿งpฬUะgษn๑}mlHๅ๙ถžœุฮณw_~ฏ ถWG”฿+ ฦชp๊vื–e[ŠG•๏Wจ๒} $ไ ฺฒšฏzทJŸ<นผeกนgฉ†ำ[GLl๛‹C๗๔zด1œP€W๋#;ข๗–<–ฅฐใ๊ภBฟฦ๚ี”p๒ุฉŸ_ G7๎[ฆg65่›จ&วีc_๊›ำ๑Eฃ๙E#‘ิํถmK–%วqTPXจ‚‚9‰D๊๖t ‚ฺบต:งctO›ฑ:uช๘๑žแร‡yyy*--ตฎนๆ฿ํท฿ ‡รjhhpKKKญ /ผ0*I๚๕ณชชชD๓[‡ํฯ…Qw฿ฆฒฟขะฐ!๒„B๒––hPๅfญฝa9ัจ ๒•k้Oฎ‘$๙๛๔VlKตไไfFฌ3ฟ๙ [:BƒCๅ y*๑…Tญืิฯg)๊ฤีˆจุา๕Ÿพ I๊ๅ/TuฌQŽZฯ:*่ง+‡žคK>นำพ๎๐ฃ<ฅใe‡†Kž…miHศqฅพE]sjฑฮ~ธJปk๏„k๗ื #zฉxŸ<๙‚Š|:ธ:ชyZฅDฬQด1ฎ`ก/ต†6ฏ< ํ5ัิฌbีงT๕i๒—ฺตš;e…Ž๛ูอ~hyNฦ7ๅ€>:ฅwž๖อ๓+฿cฉฬ็ัฦก ฑชFวU}Qฉฯฃ‰ 7K’*mŽฦๅ4ผ6Gบbq•7$—KณชVKฟ2XA;ฤ5jิ••๗R(/O#ฏฯงAัˆึฎY-วq”H$ไ๓๙ดtI๒็็๗‹Fี๖ดฌผ—jjทv{<€๊q3ถ'NŒฮ›7ฯ?~|๘มŒ฿tำMัoฟ=๕้˜… :ใฦK๛จฃŽฒ.\่dปฟป–NบV๕ j7ฯำบGŸะช[๏ิฺ๛NํoXผTE‡œ๚บ๘๐Cิฐxiฎ^พS7|๚W-jุ ,xTZ?G๗ฌz]S?Ÿ•ฺฟฌฑR๎“๚๚เข}๔iใฆVฯ1<ฏ๎sฎฎ๔}ถฝ*งใ‹~zฉœ†๙ /8]๑๕+บ๊ฆdิ6sส.r๊kป่9 3>—Yฏ๘๚ๅ้=!gใ๛้ณ5Zฐ>ชo?\ฅG฿kะm/ื้ท๊S๛—lŒ้ะม;>ฬtุ`ฟ–lL๕wk€ำ๕+๖์ดNvฺF]ybก –ŠCถฎ8ฑPำš—<>ปQใn”ฺฮx J๕GใnคyksญA5TEZถ๘ลu:๔†สŸ็U ะงC{จ-yD‹@กOง๖@• +,)T๊ื—/W+฿ฺ”้้ปm@ภซ๕แึ้MYทMื /UกืV‰ฯึฯ‡•hส็;๑ีuบnxฉ๚’K‡~:ดDoU7ๅdถถญ@  Hค๕ฯoร†๕"H(R$้vภีใ–"Y๕๕ษฒ–ตถ้๛Ÿ}๖ูฤภํwy'(I“'OŽฝ๔าK‰l๗w—ง @‰๚ไ N __E6ตชฟCมt่ฬ็$I๋{Rีฏฝ•ฺ?๊Urไ—e๒iษ}wšœฆ๎C™๏ จ1ž|žพ"mŽึทฺjีB๕ ๋ฉƒ(I๚๓†น๚็ึO%I^หฃฉcฟ/K–n๙-์ไ_&'ช๑s๏์๖ุ$ษ๒J๑ไ˜ฌ@นัญ๖'ชฆห T๐เ7%Iฑ S”ุ๚ฒ$ษoSผ๊9๙†œ\ส`y•จžฉ่ช_ๆdl’TฐิN•kปฦV’f,hRbf\G’๔ณ๕๚’=8<ฏข“ฑXะ; ฦ-ญรlๅ•*่ิ„‡’ณ ๚นึฬNฮบG๊cZ๙ึ&sลH๖ ษuฅๅฏnิฟงญRฎzmmk ฺ€ Wฺ|่๋๙M ๔๊qษ#5<ดถN3ซvฌG~งฆIทญฌัŒC๛+ไฑ4[D?Zด9gใ๓xฝฉCse ชอ• :๔ะร%I๋ืญSu๕–ž'นD!ถำํ€ฝ+ำัฌ6ืำ7;m๓คm^IพๆK๓๕๔ห๛ ๖=฿B๎ฬ(˜๙ใฯ=ฤ|๖B‡f๋ฝ=„ž๙ษB‡~1wษB‡~zmnOไk3ซ๗๖:tฦืฮสqหเ ฆกกaนค+$E%ลฺ\ฦ›ฏว%%า6'msl-ZM€๖่ฅ@ถ[aฎฑpึ9=๚ญ/-ู้oš฿๙๖"u๚B‡๙ R=ลจส฿i/฿ฏg/E๘๒๐Šฮ๏03ถ0a #ถ0a #๔ธ4HRyy™N?ใ4=๑๘Ÿ๔ฃK&jฺVcc๒–eiย7ฟฎ#:Bฎ๋๊ฝwg๋oำgศm>ํฆeY:็o๋ฐร‘eYZบไS฿cO*อ™Ÿ์Šพ žoฟSฟปQฟฟK๎ถๆ!ุถB?บPSO–G‘—^VำิKk.+UตWษ;fด†5M~Lั7฿ฮูุ$ฉ—งHgกGk_ำeg่ัฺืี่$O"otZมa:88L~หงŸU>ฺ๊ฑ–,]tŒŽฮ#Wฎfm_จถฝฏ\ž๗ษ๒”หSx†โตหWz‰buOHN๓A๚ํถXถ฿ึ‡ฟ\ิ๊ฑ…C๒5dย์’$Uฮฎึช็ึหอแ™ฝz๛ค ฝ-=ผมีO๗ฑ4yƒซ†ๆ๓4ไ{คฏ•[:ดศRภ’~ผผณ]_฿าq%–{qฮฮˆ-)๙ฏฯงX4š<ัB,ฺ๊ฏWO๒‘pSซวz<^๙ฅ61‹)ใd ะ๔ศฐํำทชช’gK*(,HEญ$?๙D 6Dฟธ๖Fูถฅ+']ฎใŽ?Voฟ5K’tฬฑGiุ๐ก๚ลต7สu]]xั๗๕ีำOั๔ฟ=gใ๓  ฤ๚๕’$ซธhGิJ ~็›๒Žฅบณฟ'ู– ๎ผMo|M‘’”ใ/d‘~~ƒ์พ}T๘เ}rชชdQฦืฺ}ฝ%ฺœจ•$ุกTิJษŽืวซๅ :,ด๓93N-8Dร๚Yๅฃฒd้gฝพกฺ๕Fใว9Ÿๅํ+7ž๓•]ธ#j[ฦ฿('โ‘<4ใใ;฿]…าฆๆ?ายภŽจ•’?ฟuu’ว–พผO๋วY–๔ƒคฟ-’UJ#zKฟ/iuดฌ*wใ ๕จฉ๙Tบo*j[ธ}cXถวR๙ม%;=ถllฑึฝฒIตK๊(๗๋ ŸTำๆˆ6พปV๘-mj™z”Šฺๆแi]D๒ิป:ข(ำ๙a’*ฐ40ณ!ตbูv*deY;ฎทŒัqๅ(!ใู๙ฑ–”ˆวFvฺุ๛zR„SNฏ๓ฟ฿:แ„ใt/ฏั๐แC๕“I—ง๖Ÿpโqzู้ŠFฃ ‡#zแ๙ฟ้„Kํ/**ิฒO—)‰(๊ฃญาา฿Uม๏~Gyื]ญภ„ณT4๕๒ฐฟ ๎บ-ต?0แ๋jzpŠpX๎๖&5=4U gI’,ฟ_รUำ=)Ir*7+่ใ žwNฮฦ๗ี‚รta้ษ:) บ๗wตฏฟฟ~V>!ตปั์ํKต(ฒ6ใใOส?HOo{G7ฆฐี3u๏๊ค‚ƒr6>Oมฉ๒–|_žไ๋Kูแ๒•Oฺqgปœฆ9r"ํzญณ๔ต1าวIงŒn>Uฺฏ—t ;๖oJ๏ญ–nฺ๙ฑฎ+๚–๔ษ&ษqฅฅ›ฅ๙’ฯ‘+O๎ซgฐ๚฿[]7JEร๒uภ๗Mํ7%T๕มVี.ญฯ๘๘5/nPอขmrWแชˆถ~RงPฏไ™ฝ,h€ฅSส,:ฬึˆTพิฟร+ต6ถYW–ฉญkVต”œํ]ขฏฆธzg๛"UxKs6พDรหฒ์<%ย๓ๅฦึสWv…bีw็์๙ป๋๏‹“ห >\'ญฉ‘ฎ๚Št[ป|…น]Šฐ๎ีJy๓<ชธNŸoื่K†kั+บ๖$–ไห๗ชt"(ะขVๆl|/nq•๏‘>ๆjuXบzฅ[ืt-ุ฿า‹ีฎชwรป๛๑xL–e)‘ˆหq๙AE#แฮุฬ’%cหoeIJ8 –!@าใfl%ฉดฌTต5ต*-+ีึๆ”$ว#ถ‹ล5xศ>4hขัˆ~ฟ,+9+T[[งฅŸ.ืธq‡๋พWฑxL+V|–ำ๑ู}zหูฒEv๏r*ำย๕y%Gn4*ฯจ๒ŽุOn8,+”l[n8ฌ๘วŸ(x9ฒ๒๒ไาสลฯe๗สแ”žค2Oj๕*๕jk"๓ฬ]&^ห#ฒsใ๊๏ซมพ>Š:q,Ÿ,ตถq—yสคD,O™ฤึ=oŽ”ๅI[ท'/ซทw~๖;TJ8า‚ ณป(๕+Z“ฟิฏhMืืŽ—Œ,ิแ7 ‘?ข๙\7evู(๗I[ใR™O]ŽำcŠ-yฅWชw฿ฌจี<๋šผ์ฺ๚D"ฎx,น!‹สใ๑ส็๓๏ฆ‘บชวอุ^ร 4๖ภ/ฉขขฏ€ ๒U[Sซฟฟ8S๑x\MMaๅ็็k๒Cษ=•”k[ถิƒ?™t™{oŽฆพ?Wฅฅ%๚ฮ9฿า.๘ž}ไ‰œŒ/ฆไ?๚Hyํ#…Bฒ‹‹ไnูขฆGŸข1น ฒŠŠิ๘ซ฿J’์^ๅrชทJN๒ะ†๋ญะฅซ๐๗(๑้25M~Ty?พ$'c“คKหNืมมa๊็-Sภ๖ฉะikขAำ๋็t๚ุ˜›P“Qาถพ$I*๑จ.ั(7G๓–Pv๐@Y YV@ฒ ไ)ฌQขลฮผ๘h้R")่Mฎฑบ]z“ฎ=ฯะ2้ผCค฿พž๚`NŒš8Tec‹๊”'`ห[เี ฺ˜ึฮศฌeตK๋๕•๓(๓kฤ๗‡จhXพึ=7g=ปr ฅC -๕๗[ ุR‘7นฯm๎‡Pๆ“พWa้๚ฯœœ~X1฿ํ๑ศo$Yษธ๕นYฯบ:Ž#)๙฿ฒ๋บŠลv| ฐ๗๕ธษ?ชีซV๋–฿^ฏพ๒บž}๚yล™ฉŸฏ\๛ํ7<๕๕~#๖ีฺต๋$IกPH#GะœูH’jjj๕๘ใาใพ,ฮอทฺxใ๏_ผT.บL‘ฟ<ฃํ๗?”Œฺf๑ๅ+ไ=๐€ิืว*ฑ|ว[ลฮๆ*5๚fm๛ลjผ๕“K–u๑ญไq๋K๚,บIฟฎ๚ณQก\๗ฯฌขถลšุf๐๏8๕์Hญ‰mฮู๘โ5หฎRฌ๊wJ4ผขxำ=&j%้พ๗ค•[ค^–f,‘ฆ}ิ๕จง$น.๗w“4หฅฅSWฉ~Uฃๆ฿ถT๋^ซิช็ึu)jำEถFตตJ๕9ข,gใปwซMฎ~๑™ฃีฎžุไfต’td‘%ฏ%>ึ#ฃl๏พถ๒<า#ฃlฬัษธฃัˆวQ$V<S,ํRึ@ัใย6]Y›ฅ’๔ฦo๋๋฿8CกPH๙๙y:๓ฬำ๕ๆoK’šššT[[งcŽ9R^ฏWถm๋CRuuu๓LKnู}๛ศู:๚"ฯUก‰?•Ÿ/ซจPก Gแ็vฌq๕}๙PYอf๓0Fม๏Ÿงฆวฆๅ|l’Tึลฅ’๔Zร|}ณ่(…lฟ๒ํ พQtค^k˜ฟ[ฦ—\’ะ๓–"ด(฿…ฅรห“GBธ๏=iqๅ๎W‹@™_‘ญูฯzCํูp์“'YษวWKVv๐Iฎn(๗I[bูG฿Kีฎ.\๊คถซW8ฺž.\๊่ำn, iีล‚Y–% ˜๚%ูฒ,๙|>%ํ|ะ ฐว๕ธฅกPHMMษ5eeฅชฉฉmตƒนชผผ\7ๆIาkฏฝกy๓vŠ๊ฎ;๏ำน็~[฿๘ๆืๅ$ฺฐq“๎ฟ๗มœฯสฯ—˜ ปOo9›[&)๚ฺ›ฒ+๚ชhฺ#’คศำฯ)6๋ฝิ~ป_?]uฅฌยB9›ซิpฏ•Xต:gใ ู~mw“‡"*ฯถ—•ฎƒไณผสณ๚cฟไ2ˆI›ฆ*โฦ4ปiฉสฝEบตฯ๙’ค—>าGแอ(ห In๒ุ –งLNข๕/.าษŒ–,Ÿ,;OŠ{%IัสŸInดำ•็“ถ7Oเ•7ฏตMwๅ1า’ฯ“ู”o%oฟ|บwค›N–lK๚้ฑษ๛HR$.M|ฎC“$yB%ยษ ”๚ฉi=8๊ขก*U(gห›็ัธ;วJ’>ธnกโM Uฮูชแ็๎ฃP฿€,R๕ผZญ|๚๓ NRž-55ูห+mm3:iKไ[๒Yษcฺ>2*‰—.sษ๏ž;ณ,ตƒ6ำ–ฅ -๛ƒกไTqธi{๒ˆ ๑ธ|~ฟ,+9๎D<ฮ2่A2}"ศjs=}ณำ6Oฺๆ•ไkพ๔7_Oฟผฟ  `ฟ g“ฃ7wป—์žCHๅสฅำฯC่ะใV฿ณ฿รฮ}c๗ฬŒ็ส•oธท‡ะกป'ฒท‡ะกฟ o๊N{QŸพปaพ–KบBRTRฌอeผ๙z\R"msา6ทอึขี[o=z)-ยFุฃKvฯท€žŒฅ@ถ0a #๔ธฐ=๚ฯ?๖;uŒgocWฝ๚๋ม &|aว฿ึูgŸํy๙ๅ—{{้q'h๘"่ำง5qโD๏˜1c์eห–9wygฌฑq๗œฝ ู้q3ถ=ˆ#ฌ้ำงๆฯŸ๏\vูeั… :ำฆMcF3K?้O}'t’13ฺ ็ุใa;๒''๚NzwRจe;uuy'พ๕ใP๚}๒–ุใ;/0~๖ีกฃž~0pY๊dพย uย๋W„ผy~ฝ้t๓สะ๑ฏ\๒ๆ๙%I<ฟ๘ๅฉ฿๚q่ฤ7sษ~o(น๏ุ.๖9v_$yƒ>ต^vุ ๛่ฟ\”’K!สdtืใ฿ฟ:t?. –8 ๕sบ้ฆ›ื^{mtๆฬ™‰บบ:๗…^HZC† Iq๐เม๖Œ3kึฌ ฝ๚๊ซมแร‡ง๖y<Mš4ษ7oผเขE‹BO?t ฉลลลึย… C๙๙๙บ๏พ๛ห–- }๑วก|IษฅGu”=eส๊ีซC๓ๆอ ~๘แฉ๑ํท฿~ึC=ไŸ7o^p๕๊ีกgžy&ะปw๏ฌŸฟ  @“'O๖ฏ^ฝ:4gฮœเ‘G™ำ1cF๚๋ฏ๗sฯ=–ืศ…=ถŸ๓f์๕c๎nz˜ป›ๆž?-โ„ใ๎วื-’~Ÿ~'๖,อ?ขo|ๅ๎ฆบฅ›œƒn2ฮhIDAT;ซีŒจฟ8คC๎๙V nษ&็ Sรบ๘/แ๘๖ไ๙ฺ๘ีi@๏Bkึ้5อ๚ฺCM๙ƒหฌ1ืŽ๗Kาถลย‘}lI{หื‡๛อ€$ชฐ๋–lL4~์oฯ๐ฏ›qโํSฎ™๗น3ๆ็ษว๗๎ฺgŸ}ฌYณf9’dถFmWWWปƒ JลใYgๅ™4iRt฿}๗mZฐ`3eส”ิ๘ฏบ๊*฿„ <'tRd๗oš={vb๒ไษ๔๏ฏดดTำฆM ,Xฐภ9๚่ฃร&Lง/uxเO>๙dโ ƒ ฯ;ืนๅ–[R฿oฟ์ท฿~9ๆ˜cย#GŽl’คoผั—ํ๓฿}๗าาRk์ุฑแSO=5’ลู ้mW๘๕@ษทOฝf๙%'คฦทlู2w๘๑แ๕๋ืปณfอ }๔ัผkrbฏE…ฏ0h๚‡๏–๗vฌ๚ƒ5N๚พ•ฮŽ5ฌชvXBŸ?๓๏xษAlI^*ฐผk฿>‰ฏy๊ฃxคบัm\ณี•$oศฏ_๛’w๑อฏDใฃŠ7Fต๘ๆWข'ไ๕๘ฝช]ธม)ูื’คผฅVr๖ุ*ืฎ[ด#l—๑ุ–9ซฑmM๎็/ฬ็๋eIาฐaรฌล‹;’t๑ว{^}๕ีเฤ‰ฝฝz๕ฒผ^oj|๗{ol๙๒ๅn,ำc=?๐รํฒฒไฌ๓ฅ—^๊อo~ซฎฎv%้พ๛๎‹|๐มvaaa๊๑EEEึSO=Ÿ:ujผชชส]นreซƒ๗ฟ๓ŸLิึึบO<๑D|ฤˆฉวฮœ93๑ิSOลวัˆ#์+V8‡vXซ?็๖ž?//OgŸ}ถwาคIัmถนตตต๎‹/พ๏สŸk๙e'๚k/ๆ)ช๔ปใ|…'Œ๒x๓ZฏิˆวใบใŽ;b็Ÿ~๔ม œvฺi,MถW>ฑ๕ƒีNล๐l_[ใ&b?ชUซ}๗ื’ค .ธ r๕ื๛ฮ:๋,ฯ 7ดiS*ฯ<๓LoII‰•——ง›oพูฬ3ฯฤ#‘dรO™2%~ฯ=๗๘[>0VZZj๑9{+~๐เม–ื๋M]ฟ๚๊ซ}<$eห–-๎œ9sœoผั็๓๙4pเ@๋โ‹/ฮ๚๑ูธเ‚ ผw฿}ทโฤ‰ั[oฝ5Fิ€\ูฃ3ถ_|f@’Žz6y‚๏œ๑p8ึv%ฉnัฆฤธวฮ * ญ-๏ฎL,หYืฯย฿#:๚g'๙ฟ2๓’$Uพน,๑้]oฆ ฏ[ผั8แ@oฯF,ถฝlฯบฟ~œี:า 6ธGร† ณfอšๅฬš5+ใŒ๓ผy๓/ฝ๔R _ฟ~ึoผ‘ธ๊ชซRใฟๅ–[b—_~นfฮœ๐๛V]];y๒ไ๘oฟํทุกŸ็ฑkฎนฦwๅ•W๚–,Yโ<๘เƒ๑;๏ผณฅm]tัE‘๛๏ฟ฿ฟlูฒะฒeหiำฆลฯ=๗œ…๗ขE‹œใ?>๚น’้๏V›๋้›ถyา6ฏ$_๓ฅฟ๙z๚ๅ๛ํžoaฯ:๚่ฃํ_๊Wsฮ9'RSSใz< 2ฤj๛/$544,—t…คจคX›หx๓๕ธคDฺๆคmn›ญEซโฬc]๔{๏97tS๔๑ว๗KษC~=๔ำ‰•+Wv้่ศ-ยvผ๛ฮ™gžษ{้=ว€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€[ฐ€vgุบป๑น๐ลดqw„-A €ฮไผsถ-บ*g ษ[ก;aห -rm—sWยึm็zW๏€ปฝ!w๗Rข-vkv5lป2ขmํถžีถำฤn†๋™๖เ?Ogุv.ตใ๎:—›แ6gหิˆ{p_ูพ ฮ€l้ฤฌ๎—Mุv๔ฉตฮ– d=ญฝ6์ฌ)>พ]นXАiฝ-3ถHืY'vป3…ํฎTrฆาv%9"nำejรlfiีมพn฿ี4d*ํ๖*‘ฑ,+ถ ฏ€/0หฒข’ยฺ9jณiษ.ษีql;‹Zืuทuup๘bknภuต•ื๊,l;{ฒ๖ุ2Sฒ-sงช+ภŸใ8›%-W๋6์จ!;าแ๎.Eh๛u๕-ƒ0‹9ป๐Z๘‹ลb’๔กZGm{qซ _gญปGEh;งmq,[)ic7__bฑุ IKิ~'fณ$!+]9AC6หด!ัผ=ิิดER}w €/„๚ๆ๖{\;z0›ฅป<{๋i็v+รuซอ๕๔Z6;รm-[“๋บ+‰ฤHŸฯ—T˜อ๐…ณกฉฉiC"‘ธOาZIqํˆ๔อIปL_ข ํย์ํฎ„m{Q^ฆ฿ทฦuGฃั>ฎ๋&lฎถ’|Œ=X๓a]kวYFท„รแEฎ๋ฏdิ&ด#lำ฿อOฺLณธ]G–ทwฑ-›งอๆMปl{+iŒคC%ํ+ฉTRฐอkg๖ผถกูvV5ฌไ!ฝV(๙Aฑ%Jฦlห–ศp=ำ์mgK:S‡ฑุูฌญญึq๋ัฮ๋ํไ2}KŽ๖–5ด7.ไ†›แzGGภj;ฒตุ๖ข6ำฬm{g(ห4ฦ๏.}ป;žะj๓ Zi—V๓ ฅึฺ‘์ๆ๛ท„rฆโถฯEุไV6a›้hXmทฃuตํElื๏’] –ณ”9Rฦmzเฆk๙†<ฺถmฃถๅบ2\ถฝ€๎k/l[.ำC4Sถ7ƒ›้0_ํญญฅuถู†m๚์ฌ•v›ิzึถe€าฮัูvะvฺmeL3ถ™žนี6pณ™ตmoiB่อด–Vฺ9hป4‹QุฆGl{๛^ฆŸ],Sุถ\ถ„mGQvถ–ฐุs2…mห๕Žfm3nuด}P,qตา•ฅ้ณถาฮ3ท™–%ด}ผซไาƒ–ฐmดอึrค€ซฃ# ด7kู์m61QHgฅปKื2๛๊ดนOฆญฝ ํ์H„-ภ๎ีQุถ\ถถอเถ][ู:.๋jุvดึ6zฆuถ™~]ฉ%lvฏฎ†m6›Mฬ๎๒ฺฺ…mG๋l3-Ih‰Uiว‘Z๖ต|X,~-๗้สL-1 ฐgt›ํ…m{‘›)hำOก›œูŒg'ปzธฏLวฅmน-=VำฟN–C‚ูiื; ฏาพV_ 7ฺ›ตmนั์m{๑ฺี ํ๒’„lใ0ำ2อชf:CYญฃูYfkz–lgm~ั’ƒLษ๔ํ#ฃ๎|x,Eฺ-!Sq[i๛: [eธl{{N6q›~ฝณˆํ(jwYWbฑฝ๛ถฃอฤv7h‰\€ซณYำlทฝฏ;บฬf,;้j fทmo๋lูBgฯ‘ํ8ูDfGšอm™›ํ8vฒ+˜Mlvบ'ืภ๎ำ•ธMฟัLlGทe๛๚ํj$fูฦnGืณ}mไVถ‡ส6t3=gNขV๊^$v%>ปrุ.ข ็่สqe;;Lุฎ>oVบŠ=>›hๅรa_<ู’ซซวงๅฃ#ไ* ณyž]]3Kไ๔ ปฅูฤ๊=W.Ÿซ;'†ภ“m€v%Tปตา๎ วตv=Gw‚4'1›nOE$ฑ ๐Ÿ-็!ึN"เ?รnูt{;2๗๖๋ ท๖hฬh฿ V‡ƒ6‰IENDฎB`‚gnome-console-42~beta/logo.png000066400000000000000000000042021420277463100165520ustar00rootroot00000000000000‰PNG  IHDR€€ร>aหbKGD ฝง“7IDATxœํ{l[ี๐๏๏^ทNHฒา@C^อJA€ lk4บu‘2สี:Mซดก!P!"h…ด?˜Pต3M๋‚ส+beํ_lZƒM+ดฃ๊คIlT*ญŠThIišคฉฟ'๗œแGฎcg๋9ตsํ{)๑=>>ื'>?๙<|โ 0ฦcŒ1ฦcŒ1ฦcฬอ่ZO๐๐ƒC,ˆG ธ„ต‚@D "FแึX:m 2๒ท5J"ฃ๘ ฅ„BH!!คX”ถ ‘OKศโ๑y๙s๓๒็*ๆ ‘๎\ZJY|ฝr?นืD ”g%A8'‰ฐott๏GŽภ๐๐ฐ?z%=เqFู‰ฏถ๑ฏ6mุสฐๅ้คs๖โฦ,4F๑xqž-Hไ [’_yBBสฅ`Q€ฒว€`‘Aฃํํmปv๏]ถ๖Gg2oCสA!&/NใาฅRฉ4„%tNษฎ’aš‡่่ผ=0LD๔ทีํญ๗๋OงฑH๚9ณณYœ:yฉdZ็4Lƒฐ,DฃqDฃq\๘|๛7ภ฿์ๆๅุ้รช็S~x๘มก ‚ฤ !„๑Ÿงน๑n แk›ฟ ำ4-Sส;G^9ฉRพฌ๏,ˆG“งน๑๋@<–ภ๙ฑ 0…i์P-ฏัธ4Q-สjdย@HซZV9$dคาีขฌFโ๑d๎€จWตฌrนมซึ|ฑ-ยชeu€น€K่ฎ่qธˆNpธEniX€ซจG€วqx€Kx่mš๓@ืเYใYSๅxto{ฦŠNWฃแ5์Rp฿Cุ่ฒd8^ฦฅ7p>ภ];ึ=‰ฏjํ›œฎNใj๔A` ซท๎|w|-ทๆtuŒ^'PWPะrหmธ๋gฟฦญ;ŸA๓šฎNiภYภ‡ฯ๎Bไ๘๛€”ฅDh฿4€#ฟม๚ก'ฑฒ๕ ฮTะๅด/ šขงO"z๚Y„z๚ะ๙เ๚อƒ%ƒA2}ุ่ฒืoฤ๘;ฦุฏมส๐nไล~)81vฟ๐K|ฐk“๏ดๆK๒อฆftw;๚Ÿ‡5๗๏P-๋˜fิMควฯใใ—๖เ฿ร`ะ›ฐfgK๒WฎZ›ŠงŒURทฏbfz gผŒ=๑.๓˜ำีi.š๘ยat}๛๛ธฎ“ำUi๊Aเ๘ ฐณฉ]@ืถ๏มl ”ๅ'ฮžq V๕Mw)ธฎ€Lึ ~ ฝยสถ๒i฿|"†ฯ^ ใ๏ผ)๘฿ะKh.ืGก๎o`ํฉธ๐#- ?Œsฟ฿นXฬ 6p<ฺ๎๘๚~ดแ/ฎฏ˜?s๊C|๚—‘;ปฬ5๓วเŽŸขโูศ4ฮn?&-_%d่€ลD6‹ ‡ไ?- > ˆg๖ฟ„ฬิ„ำUi8 = HŸว'F9๑ำUi\น/Sๆx|r`ใ‡ษ฿7เวเยก?:]OำZ ึyซaตถฌŸpิฒVแxP-8|MๅmฟฏJ5qˆๆ ฐฎ? dตวcS€\ใsธ…ฦ >ฟแ๛๐kถŒณ๎๊๎;3w.ฒLณn|7แ.ภใิ€฿Uิวถ฿ฌ~ะ๒อˆป€zฤ฿ฦthN™[hฮ8 ‚ื<Žปำrธ†€#ภ54บn|7แ.ภใ4ปๆผภใxภใx?€ว๑~ใว๛<Žปใ.ภใธ ๐8๎ไจj9V[๒ลฃx๛”j9ญY€?HปHโจNYV๏vLฎzZง Vฺ฿น๓'ท๛@;ฉิฝ‰Djm2‘ ๑4ฐ๚lำภD08 5™›๕๙็๗(ฟํ3ฦcŒ1ฦcŒ1ฦcฬ; }.A(B *1IENDฎB`‚gnome-console-42~beta/meson.build000066400000000000000000000063111420277463100172510ustar00rootroot00000000000000project('gnome-console', 'c', version: '42.beta', meson_version: '>= 0.59.0', default_options: [ 'werror=true', 'buildtype=debugoptimized', 'c_std=c17', 'vte:c_std=gnu11', 'vte:cpp_std=gnu++17', 'vte:werror=false', 'vte:gir=false', 'vte:vapi=false', 'libsass:werror=false', 'handy:werror=false', 'handy:vapi=false', 'handy:introspection=disabled', 'handy:tests=false', ], ) i18n = import('i18n') gnome = import('gnome') if get_option('devel') app_id = 'org.gnome.Console.Devel' app_path = '/org/gnome/Console/Devel/' bin_name = 'kgx-devel' log_domain = 'KgxDevel' package_version = meson.project_version() + '-@VCS_TAG@' else app_id = 'org.gnome.Console' app_path = '/org/gnome/Console/' bin_name = 'kgx' log_domain = 'Kgx' package_version = meson.project_version() endif prefix = get_option('prefix') bindir = prefix / get_option('bindir') libdir = prefix / get_option('libdir') datadir = prefix / get_option('datadir') pkglibdir = prefix / libdir / bin_name pkgdatadir = datadir / bin_name conf = configuration_data() conf.set_quoted('PACKAGE_VERSION', package_version) conf.set_quoted('GETTEXT_PACKAGE', bin_name) conf.set_quoted('KGX_APPLICATION_ID', app_id) conf.set('KGX_APPLICATION_ID_RAW', app_id) conf.set_quoted('KGX_APPLICATION_PATH', app_path) conf.set('KGX_APPLICATION_PATH_RAW', app_path) conf.set_quoted('LOCALEDIR', prefix / get_option('localedir')) conf.set('BIN_DIR', prefix / bindir) conf.set('BIN_NAME', bin_name) conf.set('IS_DEVEL', get_option('devel')) config_h_in = configure_file( output: 'kgx-config.h.in', configuration: conf, ) config_h = vcs_tag( input: config_h_in, output: 'kgx-config.h', command: ['git', 'rev-parse', '--short', 'HEAD'], fallback: 'Devel') gtk_ver = 'GDK_VERSION_3_24' glib_ver = 'GLIB_VERSION_2_66' add_project_arguments([ '-DGDK_VERSION_MIN_REQUIRED=@0@'.format(gtk_ver), '-DGDK_VERSION_MAX_ALLOWED=@0@'.format(gtk_ver), '-DGLIB_VERSION_MIN_REQUIRED=@0@'.format(glib_ver), '-DGLIB_VERSION_MAX_ALLOWED=@0@'.format(glib_ver), '-DG_LOG_USE_STRUCTURED', '-DG_LOG_DOMAIN="@0@"'.format(log_domain), ], language: 'c') cc = meson.get_compiler('c') global_c_args = [] test_c_args = [ '-Wdeclaration-after-statement', ['-Werror=format-security', '-Werror=format=2'], '-Werror=missing-declarations', '-Wformat-nonliteral', '-Wformat-security', '-Winit-self', '-Wmaybe-uninitialized', '-Wno-strict-aliasing', '-Wno-unused-parameter', '-Wold-style-definition', '-Wshadow', '-Wstrict-prototypes', '-Wswitch-default', '-Wswitch-enum', '-Wunused-function', ] if get_option('buildtype') != 'plain' test_c_args += '-fstack-protector-strong' endif foreach arg: test_c_args if cc.has_multi_arguments(arg) global_c_args += arg endif endforeach add_project_arguments( global_c_args, language: 'c' ) subdir('data') subdir('src') nautilus_dep = dependency('libnautilus-extension', required: get_option('nautilus')) if nautilus_dep.found() gio_unix = dependency('gio-unix-2.0') subdir('nautilus') endif subdir('po') gnome.post_install( glib_compile_schemas: true, gtk_update_icon_cache: true, update_desktop_database: true, ) gnome-console-42~beta/meson_options.txt000066400000000000000000000007021420277463100205420ustar00rootroot00000000000000option('devel', type: 'boolean', value: false, description: 'Produce a parallel installable development build') option('tests', type: 'boolean', value: false, description: 'Enable tests') option('sassc', type: 'feature', value: 'auto', description: 'Rebuild styles using sassc') option('nautilus', type: 'feature', value: 'auto', description: 'Nautilus plug-in') gnome-console-42~beta/nautilus/000077500000000000000000000000001420277463100167525ustar00rootroot00000000000000gnome-console-42~beta/nautilus/kgx-nautilus-menu-item.c000066400000000000000000000130021420277463100234430ustar00rootroot00000000000000/* kgx-nautilus-menu-item.c * * Copyright 2021 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "kgx-config.h" #include "kgx-nautilus-menu-item.h" #include enum { PROP_0, PROP_EXTENSION, PROP_WINDOW, PROP_FILE, LAST_PROP }; static GParamSpec *pspecs[LAST_PROP] = { NULL, }; G_DEFINE_DYNAMIC_TYPE (KgxNautilusMenuItem, kgx_nautilus_menu_item, NAUTILUS_TYPE_MENU_ITEM) static void kgx_nautilus_menu_item_class_finalize (KgxNautilusMenuItemClass *klass) { } static void kgx_nautilus_menu_item_dispose (GObject *object) { KgxNautilusMenuItem *self = KGX_NAUTILUS_MENU_ITEM (object); g_clear_object (&self->extension); g_clear_object (&self->window); g_clear_object (&self->file); G_OBJECT_CLASS (kgx_nautilus_menu_item_parent_class)->dispose (object); } static void kgx_nautilus_menu_item_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { KgxNautilusMenuItem *self = KGX_NAUTILUS_MENU_ITEM (object); switch (property_id) { case PROP_EXTENSION: g_set_object (&self->extension, g_value_get_object (value)); break; case PROP_WINDOW: g_set_object (&self->window, g_value_get_object (value)); break; case PROP_FILE: g_set_object (&self->file, g_value_get_object (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void kgx_nautilus_menu_item_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { KgxNautilusMenuItem *self = KGX_NAUTILUS_MENU_ITEM (object); switch (property_id) { case PROP_EXTENSION: g_value_set_object (value, self->extension); break; case PROP_WINDOW: g_value_set_object (value, self->window); break; case PROP_FILE: g_value_set_object (value, self->file); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void kgx_nautilus_menu_item_constructed (GObject *object) { KgxNautilusMenuItem *self = KGX_NAUTILUS_MENU_ITEM (object); G_OBJECT_CLASS (kgx_nautilus_menu_item_parent_class)->constructed (object); g_object_set (self, #ifdef IS_DEVEL "label", _("Open in Co_nsole (Devel)"), #else "label", _("Open in Co_nsole"), #endif "tip", _("Start a terminal session for this location"), NULL); } static void kgx_nautilus_menu_item_activate (NautilusMenuItem *item) { KgxNautilusMenuItem *self = KGX_NAUTILUS_MENU_ITEM (item); kgx_nautilus_open (self->extension, self->window, self->file); } static void kgx_nautilus_menu_item_class_init (KgxNautilusMenuItemClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); NautilusMenuItemClass *menu_item_class = NAUTILUS_MENU_ITEM_CLASS (klass); object_class->dispose = kgx_nautilus_menu_item_dispose; object_class->set_property = kgx_nautilus_menu_item_set_property; object_class->get_property = kgx_nautilus_menu_item_get_property; object_class->constructed = kgx_nautilus_menu_item_constructed; menu_item_class->activate = kgx_nautilus_menu_item_activate; pspecs[PROP_EXTENSION] = g_param_spec_object ("extension", "Extension", "The KGX extension object", KGX_TYPE_NAUTILUS, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); pspecs[PROP_WINDOW] = g_param_spec_object ("window", "Window", "The window containing the file", GTK_TYPE_WIDGET, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); pspecs[PROP_FILE] = g_param_spec_object ("file", "File", "The file the item is for", G_TYPE_FILE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); g_object_class_install_properties (object_class, LAST_PROP, pspecs); } static void kgx_nautilus_menu_item_init (KgxNautilusMenuItem *self) { } void kgx_nautilus_menu_item_register (GTypeModule *module) { kgx_nautilus_menu_item_register_type (module); } NautilusMenuItem * kgx_nautilus_menu_item_new (KgxNautilus *extension, GtkWidget *window, GFile *file, gboolean is_back) { return g_object_new (KGX_TYPE_NAUTILUS_MENU_ITEM, "extension", extension, "window", window, "file", file, #ifdef IS_DEVEL "name", is_back ? "KgxDevel:Open" : "KgxDevel:OpenItem", #else "name", is_back ? "Kgx:Open" : "Kgx:OpenItem", #endif "icon", KGX_APPLICATION_ID, NULL); } gnome-console-42~beta/nautilus/kgx-nautilus-menu-item.h000066400000000000000000000027621420277463100234630ustar00rootroot00000000000000/* kgx-nautilus-menu-item.h * * Copyright 2021 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include #include "kgx-nautilus.h" G_BEGIN_DECLS #define KGX_TYPE_NAUTILUS_MENU_ITEM kgx_nautilus_menu_item_get_type () struct _KgxNautilusMenuItem { NautilusMenuItem parent_instance; KgxNautilus *extension; GtkWidget *window; GFile *file; }; G_DECLARE_FINAL_TYPE (KgxNautilusMenuItem, kgx_nautilus_menu_item, KGX, NAUTILUS_MENU_ITEM, NautilusMenuItem) void kgx_nautilus_menu_item_register (GTypeModule *module); NautilusMenuItem *kgx_nautilus_menu_item_new (KgxNautilus *extension, GtkWidget *window, GFile *file, gboolean is_back); G_END_DECLS gnome-console-42~beta/nautilus/kgx-nautilus.c000066400000000000000000000101641420277463100215530ustar00rootroot00000000000000/* kgx-nautilus.c * * Copyright 2021 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "kgx-config.h" #include #include #include "kgx-nautilus.h" #include "kgx-nautilus-menu-item.h" static void kgx_nautilus_menu_provider_iface_init (NautilusMenuProviderIface *iface); G_DEFINE_DYNAMIC_TYPE_EXTENDED (KgxNautilus, kgx_nautilus, G_TYPE_OBJECT, 0, G_IMPLEMENT_INTERFACE_DYNAMIC (NAUTILUS_TYPE_MENU_PROVIDER, kgx_nautilus_menu_provider_iface_init)) static void kgx_nautilus_class_finalize (KgxNautilusClass *klass) { } static void kgx_nautilus_class_init (KgxNautilusClass *klass) { } static GList * get_items (KgxNautilus *self, GtkWidget *window, NautilusFileInfo *info, gboolean is_back) { g_autoptr (GFile) file = NULL; g_autofree char *path = NULL; GList *items = NULL; NautilusMenuItem *item; if (G_UNLIKELY (self->kgx == NULL)) { return items; } file = nautilus_file_info_get_location (info); item = kgx_nautilus_menu_item_new (self, window, file, is_back); items = g_list_append (items, item); return items; } static GList * kgx_nautilus_get_background_items (NautilusMenuProvider *provider, GtkWidget *window, NautilusFileInfo *info) { return get_items (KGX_NAUTILUS (provider), window, info, TRUE); } static GList * kgx_nautilus_get_file_items (NautilusMenuProvider *provider, GtkWidget *window, GList *files) { if (files == NULL || files->next != NULL) { return NULL; } if (!nautilus_file_info_is_directory (files->data)) { return NULL; } return get_items (KGX_NAUTILUS (provider), window, files->data, FALSE); } static void kgx_nautilus_menu_provider_iface_init (NautilusMenuProviderIface *iface) { iface->get_background_items = kgx_nautilus_get_background_items; iface->get_file_items = kgx_nautilus_get_file_items; } static void kgx_nautilus_init (KgxNautilus *self) { g_autoptr (GDesktopAppInfo) info = NULL; info = g_desktop_app_info_new (KGX_APPLICATION_ID ".desktop"); if (G_LIKELY (info)) { self->kgx = G_APP_INFO (g_steal_pointer (&info)); } else { g_warning ("KGX (" KGX_APPLICATION_ID ") is missing"); } } void kgx_nautilus_open (KgxNautilus *self, GtkWidget *window, GFile *file) { g_autoptr (GdkAppLaunchContext) context = NULL; g_autoptr (GError) error = NULL; g_autoptr (GList) list = NULL; list = g_list_append (list, file); context = gdk_display_get_app_launch_context (gtk_widget_get_display (window)); g_app_info_launch (self->kgx, list, G_APP_LAUNCH_CONTEXT (context), &error); if (G_UNLIKELY (error)) { g_critical ("Everything is bad: %s", error->message); } } G_MODULE_EXPORT void nautilus_module_initialize (GTypeModule *module) { kgx_nautilus_register_type (module); kgx_nautilus_menu_item_register (module); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); } G_MODULE_EXPORT void nautilus_module_shutdown (void) { } G_MODULE_EXPORT void nautilus_module_list_types (const GType **types, int *num_types) { static GType type_list[1]; type_list[0] = KGX_TYPE_NAUTILUS; *types = type_list; *num_types = G_N_ELEMENTS (type_list); } gnome-console-42~beta/nautilus/kgx-nautilus.h000066400000000000000000000022511420277463100215560ustar00rootroot00000000000000/* kgx-nautilus.h * * Copyright 2021 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include #include G_BEGIN_DECLS #define KGX_TYPE_NAUTILUS kgx_nautilus_get_type () struct _KgxNautilus { GObject parent_instance; GAppInfo *kgx; }; G_DECLARE_FINAL_TYPE (KgxNautilus, kgx_nautilus, KGX, NAUTILUS, GObject) void kgx_nautilus_open (KgxNautilus *self, GtkWidget *window, GFile *file); G_END_DECLS gnome-console-42~beta/nautilus/meson.build000066400000000000000000000007741420277463100211240ustar00rootroot00000000000000nautilus_sources = [ 'kgx-nautilus.c', 'kgx-nautilus.h', 'kgx-nautilus-menu-item.c', 'kgx-nautilus-menu-item.h', config_h ] nautilus_extension = shared_library(bin_name + '-nautilus', nautilus_sources, dependencies: [nautilus_dep, gio_unix], include_directories: kgx_inc, install: true, install_dir: libdir / 'nautilus' / 'extensions-3.0') gnome-console-42~beta/po/000077500000000000000000000000001420277463100155245ustar00rootroot00000000000000gnome-console-42~beta/po/LINGUAS000066400000000000000000000001411420277463100165450ustar00rootroot00000000000000ca cs da de el en_GB es eu fi fr fur gl he hr hu id it nl pl pt pt_BR ro ru sl sr sv tr uk zh_CN gnome-console-42~beta/po/POTFILES.in000066400000000000000000000006701420277463100173040ustar00rootroot00000000000000data/org.gnome.Console.desktop.in.in data/org.gnome.Console.gschema.xml.in data/org.gnome.Console.metainfo.xml.in.in src/help-overlay.ui src/kgx-application.c src/kgx-application.h src/kgx-close-dialog.c src/kgx-close-dialog.ui src/kgx-pages.ui src/kgx-simple-tab.c src/kgx-tab.c src/kgx-tab-button.ui src/kgx-terminal.c src/kgx-theme-switcher.ui src/kgx-window.c src/kgx-window.ui src/main.c src/menus.ui nautilus/kgx-nautilus-menu-item.c gnome-console-42~beta/po/ca.po000066400000000000000000000214001420277463100164440ustar00rootroot00000000000000# 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 , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/ZanderBrown/kgx/issues\n" "POT-Creation-Date: 2021-10-17 14:45+0000\n" "PO-Revision-Date: 2021-10-20 18:52+0200\n" "Last-Translator: รcar N. S. \n" "Language-Team: \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0\n" #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:3 #: src/kgx-application.h:44 msgid "Terminal" msgstr "Terminal" #. Translators: Search terms to find this application. Do NOT translate or #. localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:8 #: data/org.gnome.zbrown.KingsCross.desktop.in.in:9 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "" "ordre;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;rei;creu;" "commanda;" #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:21 #: data/org.gnome.zbrown.KingsCross.desktop.in.in:22 msgid "New Window" msgstr "Finestra nova" #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:27 #: data/org.gnome.zbrown.KingsCross.desktop.in.in:28 src/kgx-window.ui:157 msgid "New Tab" msgstr "Pestanya nova" #. Translators: This is a train station, see README.md for more info #: data/org.gnome.zbrown.KingsCross.desktop.in.in:4 #: data/org.gnome.zbrown.KingsCross.metainfo.xml.in.in:8 #: src/kgx-application.c:512 src/kgx-application.h:46 src/kgx-window.ui:104 msgid "Kingโ€™s Cross" msgstr "King's Cross" #: data/org.gnome.zbrown.KingsCross.metainfo.xml.in.in:9 #: src/kgx-application.c:514 src/kgx-window.c:530 msgid "Terminal Emulator" msgstr "Emulador de terminal" #: data/org.gnome.zbrown.KingsCross.metainfo.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "" "Un emulador de terminal fร cil d'utilitzar per a l'escriptori del GNOME." #: data/org.gnome.zbrown.KingsCross.metainfo.xml.in.in:30 msgid "Terminal window" msgstr "Finestra de terminal" #: data/org.gnome.zbrown.KingsCross.metainfo.xml.in.in:75 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Aplicaciรณ" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Finestra nova" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminal" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Cerca" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Copia" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "Enganxa" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "Pestanyes" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "Pestanya nova" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "Tanca la pestanya" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "Pestanya segรผent" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "Pestanya anterior" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "Canvia a la pestanya" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:486 #, c-format msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# KGX %s usant el VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:498 src/kgx-window.c:518 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:516 msgid "GPL 3.0 or later" msgstr "GPL 3.0 o posterior" #: src/kgx-application.c:647 msgid "Execute the argument to this option inside the terminal" msgstr "Executa l'argument d'aquesta opciรณ dins del terminal" #: src/kgx-application.c:656 msgid "Set the working directory" msgstr "Estableix el directori de treball" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:658 msgid "DIRNAME" msgstr "NOMDIRECTORI" #: src/kgx-application.c:666 msgid "Wait until the child exits (TODO)" msgstr "Espera fins que el fill surti (TODO)" #: src/kgx-application.c:675 msgid "Set the initial window title" msgstr "Estableix el tรญtol inicial de la finestra" #: src/kgx-application.c:684 msgid "ADVANCED: Set the shell to launch" msgstr "AVANร‡AT: Estableix l'intรจrpret d'ordres a llanรงar" #: src/kgx-application.c:693 msgid "ADVANCED: Set the scrollback length" msgstr "AVANร‡AT: Estableix la longitud del desplaรงament enrere" #: src/kgx-close-dialog.c:52 msgid "Close Window?" msgstr "Voleu tancar la finestra?" #: src/kgx-close-dialog.c:53 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "Algunes ordres encara s'estan executant, el tancament d'aquesta finestra " "les matarร  i pot produir resultats inesperats" #: src/kgx-close-dialog.c:58 msgid "Close Tab?" msgstr "Voleu tancar la pestanya?" #: src/kgx-close-dialog.c:59 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "Algunes ordres encara s'estan executant, el tancament d'aquesta pestanya " "les matarร  i pot produir resultats inesperats" #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:698 msgid "_Cancel" msgstr "_Cancelยทla" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "_Tanca" #: src/kgx-pages.ui:47 msgid "_Detach Tab" msgstr "_Desacobla la pestanya" #: src/kgx-pages.ui:53 msgid "_Close" msgstr "_Tanca" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:119 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "Nomรฉs de lectura - L'ordre ha sortit amb el codi %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:128 msgid "Read Only โ€” Command exited" msgstr "Nomรฉs de lectura - L'ordre ha sortit" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:160 #, c-format msgid "Failed to start โ€” %s" msgstr "Ha fallat iniciar-ho - %s" #: src/kgx-tab.c:1182 msgid "Command completed" msgstr "Ordre completada" #: src/kgx-tab-button.ui:5 msgid "View open tabs" msgstr "Mostra les pestanyes obertes" #: src/kgx-terminal.c:690 msgid "You are pasting a command that runs as an administrator" msgstr "Esteu enganxant una ordre que s'executa com a administrador" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:693 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Assegura't de saber quรจ fa l'ordre:\n" "%s" #: src/kgx-terminal.c:701 src/menus.ui:24 msgid "_Paste" msgstr "_Enganxa" #. Translators: Credit yourself here #: src/kgx-window.c:524 msgid "translator-credits" msgstr "รcar N. S. " #. Translators: Donโ€™t attempt to translate KGX, #. * treat it as a proper noun #: src/kgx-window.c:528 msgid "KGX Terminal Emulator" msgstr "Emulador de terminal KGX" #: src/kgx-window.c:638 msgid "_About Terminal" msgstr "_Quant al terminal" #: src/kgx-window.ui:20 msgid "Shrink text" msgstr "Redueix el text" #: src/kgx-window.ui:33 msgid "Reset size" msgstr "Restableix la mida" #: src/kgx-window.ui:46 msgid "Enlarge text" msgstr "Augmenta el text" #: src/kgx-window.ui:63 msgid "_New Window" msgstr "_Finestra nova" #: src/kgx-window.ui:75 msgid "_Keyboard Shortcuts" msgstr "_Dreceres de teclat" #: src/kgx-window.ui:82 msgid "_About Kingโ€™s Cross" msgstr "_Sobre el King's Cross" #: src/kgx-window.ui:83 msgid "About this program" msgstr "Sobre aquest programa" #: src/kgx-window.ui:112 msgid "Find in terminal" msgstr "Cerca al terminal" #: src/kgx-window.ui:130 msgid "Menu" msgstr "Menรบ" #: src/menus.ui:7 msgid "_Open Link" msgstr "_Obre l'enllaรง" #: src/menus.ui:12 msgid "Copy _Link" msgstr "_Copia l'enllaรง" #: src/menus.ui:19 msgid "_Copy" msgstr "_Copia" #: src/menus.ui:29 msgid "_Select All" msgstr "_Selecciona-ho tot" #: src/menus.ui:36 msgid "Show in _Files" msgstr "_Mostra als fitxers" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in T_erminal" msgstr "_Obre al terminal" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Op_en in Kingโ€™s Cross" msgstr "_Obre al King's Cross" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "Inicia una sessiรณ de terminal per a aquesta ubicaciรณ" gnome-console-42~beta/po/cs.po000066400000000000000000000215141420277463100164740ustar00rootroot00000000000000# Czech translation for kgx. # Copyright (C) 2020 kgx's COPYRIGHT HOLDER # This file is distributed under the same license as the kgx package. # # Marek ฤŒernockรฝ , 2020, 2021. # msgid "" msgstr "" "Project-Id-Version: kgx\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/ZanderBrown/kgx/issues\n" "POT-Creation-Date: 2021-10-04 23:53+0000\n" "PO-Revision-Date: 2021-10-17 16:44+0200\n" "Last-Translator: Marek ฤŒernockรฝ \n" "Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #. Translators: This is a train station, see README.md for more info #: data/org.gnome.zbrown.KingsCross.desktop.in.in:4 #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:8 #: src/kgx-application.c:512 src/kgx-application.h:46 src/kgx-window.ui:104 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross.desktop.in.in:9 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "" "pล™รญkaz;vรฝzva;cmd;command;prompt;commandline;cli;spustit;spouลกtฤ›nรญ;shell;" "terminรกl;kgx;kings cross;" #: data/org.gnome.zbrown.KingsCross.desktop.in.in:22 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:21 msgid "New Window" msgstr "Novรฉ okno" #: data/org.gnome.zbrown.KingsCross.desktop.in.in:28 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:27 #: src/kgx-window.ui:157 msgid "New Tab" msgstr "Novรก karta" #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:3 #: src/kgx-application.h:44 msgid "Terminal" msgstr "Terminรกl" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:9 #: src/kgx-application.c:514 src/kgx-window.c:530 msgid "Terminal Emulator" msgstr "Emulรกtor terminรกlu" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "" "Jednoduchรฝ, uลพivatelsky pล™รญvฤ›tivรฝ emulรกtor terminรกlu pro uลพivatelskรฉ " "prostล™edรญ GNOME." #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:30 msgid "Terminal window" msgstr "Terminรกlovรฉ okno" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:60 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Aplikace" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Novรฉ okno" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminรกl" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Hledat" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Zkopรญrovat" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "Vloลพit" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "Karty" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "Novรก karta" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "Zavล™รญt kartu" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "Nรกsledujรญcรญ karta" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "Pล™edchozรญ karta" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "Pล™epnout na kartu" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:486 #, c-format msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# KGX %s pouลพรญvรก VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:498 src/kgx-window.c:518 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:516 msgid "GPL 3.0 or later" msgstr "GPL 3.0 nebo novฤ›jลกรญ" #: src/kgx-application.c:647 msgid "Execute the argument to this option inside the terminal" msgstr "Provรฉst argument tรฉto volby jako pล™รญkaz uvnitล™ terminรกlu" #: src/kgx-application.c:656 msgid "Set the working directory" msgstr "Nastavit pracovnรญ sloลพku" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:658 msgid "DIRNAME" msgstr "SLOลฝKA" #: src/kgx-application.c:666 msgid "Wait until the child exits (TODO)" msgstr "Poฤkat, dokud potomek neskonฤรญ (NENร HOTOVร‰)" #: src/kgx-application.c:675 msgid "Set the initial window title" msgstr "Nastavit oknu poฤรกteฤnรญ titulek" #: src/kgx-application.c:684 msgid "ADVANCED: Set the shell to launch" msgstr "POKROฤŒILร‰: Nastavit shell, kterรฝ se mรก spustit" #: src/kgx-application.c:693 msgid "ADVANCED: Set the scrollback length" msgstr "POKROฤŒILร‰: Nastavit dรฉlku historie pro posuv zpฤ›t" #: src/kgx-close-dialog.c:52 msgid "Close Window?" msgstr "Zavล™รญt okno?" #: src/kgx-close-dialog.c:53 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "Nฤ›kterรฉ pล™รญkazy doposud bฤ›ลพรญ. Zavล™enรญm tohoto okna je zabijete, coลพ mลฏลพe " "vรฉst k neoฤekรกvanรฝm dลฏsledkลฏm." #: src/kgx-close-dialog.c:58 msgid "Close Tab?" msgstr "Zavล™รญt kartu?" #: src/kgx-close-dialog.c:59 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "Nฤ›kterรฉ pล™รญkazy doposud bฤ›ลพรญ. Zavล™enรญm tรฉto karty je zabijete, coลพ mลฏลพe vรฉst " "k neoฤekรกvanรฝm dลฏsledkลฏm." #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:675 msgid "_Cancel" msgstr "_Zruลกit" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "Zavล™รญ_t" #: src/kgx-pages.ui:47 msgid "_Detach Tab" msgstr "O_dpoutat kartu" #: src/kgx-pages.ui:53 msgid "_Close" msgstr "_Zavล™รญt" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:119 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "Jen ke ฤtenรญ โ€” pล™รญkaz skonฤil s kรณdem %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:128 msgid "Read Only โ€” Command exited" msgstr "Jen ke ฤtenรญ โ€” pล™รญkaz skonฤil" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:160 #, c-format msgid "Failed to start โ€” %s" msgstr "Selhalo spuลกtฤ›nรญ โ€” %s" #: src/kgx-tab.c:1182 msgid "Command completed" msgstr "Pล™รญkaz byl dokonฤen" #: src/kgx-tab-button.ui:5 msgid "View open tabs" msgstr "Zobrazit otevล™enรฉ karty" #: src/kgx-terminal.c:667 msgid "You are pasting a command that runs as an administrator" msgstr "Vklรกdรกte pล™รญkaz, kterรฝ bฤ›ลพรญ pod administrรกtorskรฝm รบฤtem" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:670 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Ujistฤ›te se, ลพe vรญte, co pล™esnฤ› pล™รญkaz dฤ›lรก:\n" "%s" #: src/kgx-terminal.c:678 src/menus.ui:24 msgid "_Paste" msgstr "V_loลพit" #. Translators: Credit yourself here #: src/kgx-window.c:524 msgid "translator-credits" msgstr "Marek ฤŒernockรฝ " #. Translators: Donโ€™t attempt to translate KGX, #. * treat it as a proper noun #: src/kgx-window.c:528 msgid "KGX Terminal Emulator" msgstr "Emulรกtor terminรกlu KGX" #: src/kgx-window.c:638 msgid "_About Terminal" msgstr "O Terminรกlu" #: src/kgx-window.ui:20 msgid "Shrink text" msgstr "Zmenลกit text" #: src/kgx-window.ui:33 msgid "Reset size" msgstr "Vรฝchozรญ velikost" #: src/kgx-window.ui:46 msgid "Enlarge text" msgstr "Zvฤ›tลกit text" #: src/kgx-window.ui:63 msgid "_New Window" msgstr "_Novรฉ okno" #: src/kgx-window.ui:75 msgid "_Keyboard Shortcuts" msgstr "_Klรกvesovรฉ zkratky" #: src/kgx-window.ui:82 msgid "_About Kingโ€™s Cross" msgstr "O aplikaci Kingโ€™s Cross" #: src/kgx-window.ui:83 msgid "About this program" msgstr "O tรฉto aplikaci" #: src/kgx-window.ui:112 msgid "Find in terminal" msgstr "Hledat v terminรกlu" #: src/kgx-window.ui:130 msgid "Menu" msgstr "Nabรญdka" #: src/menus.ui:7 msgid "_Open Link" msgstr "_Otevล™รญt odkaz" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Zkopรญrovat o_dkaz" #: src/menus.ui:19 msgid "_Copy" msgstr "Z_kopรญrovat" #: src/menus.ui:29 msgid "_Select All" msgstr "_Vybrat vลกe" #: src/menus.ui:36 msgid "Show in _Files" msgstr "Zobrazit v _Souborech" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in T_erminal" msgstr "Otevล™รญt v T_erminรกlu" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Op_en in Kingโ€™s Cross" msgstr "Ot_evล™รญt v Kingโ€™s Cross" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "Spustit terminรกlovรฉ sezenรญ pro toto umรญstฤ›nรญ" gnome-console-42~beta/po/da.po000066400000000000000000000234121420277463100164520ustar00rootroot00000000000000# Danish translation for kgx. # Copyright (C) 2019 kgx's COPYRIGHT HOLDER # This file is distributed under the same license as the kgx package. # scootergrisen, 2019-2021. msgid "" msgstr "" "Project-Id-Version: kgx master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/ZanderBrown/kgx/issues\n" "POT-Creation-Date: 2021-03-20 13:09+0000\n" "PO-Revision-Date: 2021-04-24 00:00+0200\n" "Last-Translator: scootergrisen\n" "Language-Team: Danish \n" "Language: da\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. Translators: This is a train station, see README.md for more info #: data/org.gnome.zbrown.KingsCross.desktop.in:4 #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:8 src/kgx-application.c:512 #: src/kgx-window.c:520 src/kgx-window.c:553 src/kgx-window.ui:101 #: src/main.c:37 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross.desktop.in:9 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "kommando;prompt;cmd;kommandolinje;kรธr;skal;terminal;kgx;kings cross;" #: data/org.gnome.zbrown.KingsCross.desktop.in:20 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:19 #| msgctxt "shortcut window" #| msgid "New Window" msgid "New Window" msgstr "Nyt vindue" #: data/org.gnome.zbrown.KingsCross.desktop.in:26 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:25 src/kgx-window.ui:145 msgid "New Tab" msgstr "Nyt faneblad" #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:3 src/kgx-window.c:518 #: src/kgx-window.c:551 src/main.c:35 msgid "Terminal" msgstr "Terminal" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:9 src/kgx-application.c:514 #: src/kgx-window.c:512 msgid "Terminal Emulator" msgstr "Terminalemulator" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "En simpel brugervenlig terminalemulator til GNOME-skrivebordet." #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:22 msgid "Terminal window" msgstr "Terminalvindue" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:52 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Program" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Nyt vindue" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminal" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Find" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Kopiรฉr" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "Indsรฆt" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "Faneblade" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "Nyt faneblad" #: src/help-overlay.ui:66 #| msgid "Close Terminal" msgctxt "shortcut window" msgid "Close Tab" msgstr "Luk faneblad" #: src/help-overlay.ui:73 #| msgctxt "shortcut window" #| msgid "New Tab" msgctxt "shortcut window" msgid "Next Tab" msgstr "Nรฆste faneblad" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "Forrige faneblad" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "Skift til faneblad" #. Translators: The leading # is intentional, the initial %s is the #. version of King's Cross itself, the latter format is the VTE version #: src/kgx-application.c:486 #, c-format msgid "# Kingโ€™s Cross %s using VTE %u.%u.%u %s\n" msgstr "# Kingโ€™s Cross %s bruger VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:498 src/kgx-window.c:500 #, c-format #| msgid "Zander Brown" msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:516 msgid "GPL 3.0 or later" msgstr "GPL 3.0 eller senere" #: src/kgx-application.c:647 msgid "Execute the argument to this option inside the terminal" msgstr "Udfรธr argumentet til valgmuligheden i terminalen" #: src/kgx-application.c:656 msgid "Set the working directory" msgstr "Indstil arbejdsmappen" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:658 msgid "DIRNAME" msgstr "MAPPENAVN" #: src/kgx-application.c:666 msgid "Wait until the child exits (TODO)" msgstr "Vent indtil underprogrammet afslutter (TODO)" # scootergrisen: tjek at det er oversat godt #: src/kgx-application.c:675 msgid "Set the initial window title" msgstr "Indstil den indledende vinduestitel" # scootergrisen: tjek at det er oversat godt #: src/kgx-application.c:684 msgid "ADVANCED: Set the shell to launch" msgstr "AVANCERET: Indstil den skal der skal startes" # scootergrisen: tjek at det er oversat godt #: src/kgx-application.c:693 msgid "ADVANCED: Set the scrollback length" msgstr "AVANCERET: Indstil lรฆngden for tilbagerulning" #: src/kgx-close-dialog.c:52 #| msgctxt "shortcut window" #| msgid "New Window" msgid "Close Window?" msgstr "Luk vindue?" # scootergrisen: tjek om der skal tilfรธjes punktum i slutningen af kilden #: src/kgx-close-dialog.c:53 #| msgid "" #| "Some commands are still running, closing this terminal will kill them and " #| "may lead to unexpected outcomes" msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "Nogle kommandoer kรธrer stadigvรฆk. De drรฆbes hvis vinduet lukkes, hvilket " "kan fรธre til uventede resultater." #: src/kgx-close-dialog.c:58 #| msgid "Close Terminal" msgid "Close Tab?" msgstr "Luk faneblad?" # scootergrisen: tjek om der skal tilfรธjes punktum i slutningen af kilden #: src/kgx-close-dialog.c:59 #| msgid "" #| "Some commands are still running, closing this terminal will kill them and " #| "may lead to unexpected outcomes" msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "Nogle kommandoer kรธrer stadigvรฆk. De drรฆbes hvis fanebladet lukkes, hvilket " "kan fรธre til uventede resultater." #: src/kgx-close-dialog.ui:23 src/kgx-terminal.c:675 msgid "_Cancel" msgstr "_Annullรฉr" #: src/kgx-close-dialog.ui:31 #| msgid "_Close" msgid "C_lose" msgstr "_Luk" #: src/kgx-pages.ui:41 #| msgid "_Detach" msgid "_Detach Tab" msgstr "_Lรธsriv faneblad" #: src/kgx-pages.ui:47 msgid "_Close" msgstr "_Luk" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:119 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "Skrivebeskyttet โ€” Kommandoen afsluttede med koden %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:128 msgid "Read Only โ€” Command exited" msgstr "Skrivebeskyttet โ€” Kommandoen afsluttede" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:160 #, c-format msgid "Failed to start โ€” %s" msgstr "Kunne ikke starte โ€” %s" #: src/kgx-tab.c:1192 msgid "Command completed" msgstr "Kommando fuldfรธrt" #: src/kgx-terminal.c:667 msgid "You are pasting a command that runs as an administrator" msgstr "Du er ved at indsรฆtte en kommando, der kรธrer som en administrator" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:670 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Sรธrg for, at du ved hvad kommandoen gรธr:\n" "%s" #: src/kgx-terminal.c:678 src/menus.ui:24 msgid "_Paste" msgstr "_Indsรฆt" #. Translators: Credit yourself here #: src/kgx-window.c:506 msgid "translator-credits" msgstr "scootergrisen" # scootergrisen: er ikke sikker pรฅ hvordan strengen skal oversรฆttes # scootergrisen: mรฅske "KGX-terminalemulator" # scootergrisen: mรฅske "KGX Terminalemulator" # scootergrisen: mรฅske "KGX Terminal Emulator" #. Translators: Donโ€™t attempt to translate KGX, #. * treat it as a proper noun #: src/kgx-window.c:510 #| msgid "Terminal Emulator" msgid "KGX Terminal Emulator" msgstr "KGX-terminalemulator" #: src/kgx-window.c:613 msgid "_About Terminal" msgstr "_Om Terminal" #: src/kgx-window.ui:20 msgid "Shrink text" msgstr "Mindre tekst" #: src/kgx-window.ui:33 msgid "Reset size" msgstr "Nulstil stรธrrelse" #: src/kgx-window.ui:46 msgid "Enlarge text" msgstr "Stรธrre tekst" #: src/kgx-window.ui:63 msgid "_New Window" msgstr "_Nyt vindue" #: src/kgx-window.ui:75 msgid "_Keyboard Shortcuts" msgstr "_Tastaturgenveje" #: src/kgx-window.ui:82 msgid "_About Kingโ€™s Cross" msgstr "_Om Kingโ€™s Cross" #: src/kgx-window.ui:83 msgid "About this program" msgstr "Om programmet" # scootergrisen: tjek om "Find in terminal" skal vรฆre "Sรธg in terminal" # scootergrisen: tjek om "Find in terminal" skal vรฆre "Find in terminal" #: src/kgx-window.ui:109 msgid "Find in terminal" msgstr "Find i terminal" #: src/kgx-window.ui:127 msgid "Menu" msgstr "Menu" #: src/menus.ui:7 msgid "_Open Link" msgstr "_ร…bn link" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Kopiรฉr _link" #: src/menus.ui:19 msgid "_Copy" msgstr "_Kopiรฉr" #: src/menus.ui:29 msgid "_Select All" msgstr "_Markรฉr alt" #: src/menus.ui:36 msgid "Show in _Files" msgstr "Vis i _Filer" #: nautilus/kgx-nautilus-menu-item.c:120 #| msgid "Find in terminal" msgid "Open in T_erminal" msgstr "ร…bn i _Terminal" #: nautilus/kgx-nautilus-menu-item.c:122 #| msgid "Kingโ€™s Cross" msgid "Op_en in Kingโ€™s Cross" msgstr "_ร…bn i Kingโ€™s Cross" # scootergrisen: tjek at oversรฆttelsen af "for this location" er god #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "Start en terminalsession pรฅ denne placering" gnome-console-42~beta/po/de.po000066400000000000000000000231341420277463100164570ustar00rootroot00000000000000# German translation for kgx. # Copyright (C) 2020 kgx's COPYRIGHT HOLDER # This file is distributed under the same license as the kgx package. # # Tim Sabsch , 2020-2021. # Philipp Kiemle , 2020-2021 # msgid "" msgstr "" "Project-Id-Version: kgx master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/ZanderBrown/kgx/issues\n" "POT-Creation-Date: 2021-03-26 15:38+0000\n" "PO-Revision-Date: 2021-03-28 18:30+0200\n" "Last-Translator: Tim Sabsch \n" "Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.4.2\n" #. Translators: This is a train station, see README.md for more info #: data/org.gnome.zbrown.KingsCross.desktop.in:4 #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:8 src/kgx-application.c:512 #: src/kgx-window.c:520 src/kgx-window.c:553 src/kgx-window.ui:100 #: src/main.c:37 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross.desktop.in:9 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "" "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;befehl;" "kommando;befehlszeile;kommandozeile;ausfรผhren;" #: data/org.gnome.zbrown.KingsCross.desktop.in:20 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:19 msgid "New Window" msgstr "Neues Fenster" #: data/org.gnome.zbrown.KingsCross.desktop.in:26 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:25 src/kgx-window.ui:144 msgid "New Tab" msgstr "Neuer Reiter" #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:3 src/kgx-window.c:518 #: src/kgx-window.c:551 src/main.c:35 msgid "Terminal" msgstr "Terminal" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:9 src/kgx-application.c:514 #: src/kgx-window.c:512 msgid "Terminal Emulator" msgstr "Terminalemulator" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "" "Ein einfacher, nutzerfreundlicher Terminal-Emulator fรผr die GNOME " "Arbeitsumgebung." #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:22 msgid "Terminal window" msgstr "Terminalfenster" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:52 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Anwendung" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Neues Fenster" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminal" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Suchen" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Kopieren" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "Einfรผgen" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "Reiter" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "Neuer Reiter" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "Reiter schlieรŸen" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "Nรคchster Reiter" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "Vorheriger Reiter" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "Zum Reiter wechseln" #. Translators: The leading # is intentional, the initial %s is the #. version of King's Cross itself, the latter format is the VTE version #: src/kgx-application.c:486 #, c-format msgid "# Kingโ€™s Cross %s using VTE %u.%u.%u %s\n" msgstr "# King's Cross %s auf Basis von VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:498 src/kgx-window.c:500 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:516 msgid "GPL 3.0 or later" msgstr "GPL 3.0 oder neuer" #: src/kgx-application.c:647 msgid "Execute the argument to this option inside the terminal" msgstr "Das Argument dieser Option im Terminal ausfรผhren" #: src/kgx-application.c:656 msgid "Set the working directory" msgstr "Den Arbeitsordner festlegen" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:658 msgid "DIRNAME" msgstr "ORDNERNAME" #: src/kgx-application.c:666 msgid "Wait until the child exits (TODO)" msgstr "Auf Beenden des Unterprozesses warten (TODO)" #: src/kgx-application.c:675 msgid "Set the initial window title" msgstr "Anfรคnglichen Titel des Fensters festlegen" # Nach meinem Verstรคndnis gehts hier um bash vs zsh vs fish ... #: src/kgx-application.c:684 msgid "ADVANCED: Set the shell to launch" msgstr "FORTGESCHRITTEN: Zu startende Shell einstellen" # Konsistent mit GNOME Terminal #: src/kgx-application.c:693 msgid "ADVANCED: Set the scrollback length" msgstr "FORTGESCHRITTEN: Anzahl der vorzuhaltenden Zeilen einstellen" #: src/kgx-close-dialog.c:52 msgid "Close Window?" msgstr "Fenster schlieรŸen?" #: src/kgx-close-dialog.c:53 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "Einige Befehle laufen immer noch. Dieses Fenster zu schlieรŸen wรผrde sie " "beenden, was zu unerwarteten Ergebnissen fรผhren kann" #: src/kgx-close-dialog.c:58 msgid "Close Tab?" msgstr "Reiter schlieรŸen?" #: src/kgx-close-dialog.c:59 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "Einige Befehle laufen immer noch. Diesen Reiter zu schlieรŸen wรผrde sie " "beenden, was zu unerwarteten Ergebnissen fรผhren kann" #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:675 msgid "_Cancel" msgstr "A_bbrechen" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "S_chlieรŸen" #: src/kgx-pages.ui:46 msgid "_Detach Tab" msgstr "Reiter abtr_ennen" #: src/kgx-pages.ui:52 msgid "_Close" msgstr "S_chlieรŸen" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:119 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "Nur Lesen โ€” Befehl beendet mit Code %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:128 msgid "Read Only โ€” Command exited" msgstr "Nur Lesen โ€” Befehl beendet" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:160 #, c-format msgid "Failed to start โ€” %s" msgstr "Starten gescheitert โ€” %s" #: src/kgx-tab.c:1182 msgid "Command completed" msgstr "Befehl abgeschlossen" #: src/kgx-terminal.c:667 msgid "You are pasting a command that runs as an administrator" msgstr "Sie kopieren einen Befehl, der als Administrator ausgefรผhrt wird" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:670 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Gehen Sie sicher, dass Sie wissen, was dieser Befehl bewirkt:\n" "%s" #: src/kgx-terminal.c:678 src/menus.ui:24 msgid "_Paste" msgstr "E_infรผgen" #. Translators: Credit yourself here #: src/kgx-window.c:506 msgid "translator-credits" msgstr "" "Philipp Kiemle , 2020-2021\n" "Tim Sabsch , 2021" #. Translators: Donโ€™t attempt to translate KGX, #. * treat it as a proper noun #: src/kgx-window.c:510 msgid "KGX Terminal Emulator" msgstr "KGX-Terminal-Emulator" #: src/kgx-window.c:613 msgid "_About Terminal" msgstr "_Info zu Terminal" #: src/kgx-window.ui:20 msgid "Shrink text" msgstr "Text verkleinern" #: src/kgx-window.ui:33 msgid "Reset size" msgstr "GrรถรŸe zurรผcksetzen" #: src/kgx-window.ui:46 msgid "Enlarge text" msgstr "Text vergrรถรŸern" #: src/kgx-window.ui:63 msgid "_New Window" msgstr "_Neues Fenster" #: src/kgx-window.ui:75 msgid "_Keyboard Shortcuts" msgstr "_Tastaturkรผrzel" #: src/kgx-window.ui:82 msgid "_About Kingโ€™s Cross" msgstr "_Info zu King's Cross" #: src/kgx-window.ui:83 msgid "About this program" msgstr "รœber dieses Programm" #: src/kgx-window.ui:108 msgid "Find in terminal" msgstr "Im Terminal suchen" #: src/kgx-window.ui:126 msgid "Menu" msgstr "Menรผ" #: src/menus.ui:7 msgid "_Open Link" msgstr "Verweis รถ_ffnen" #: src/menus.ui:12 msgid "Copy _Link" msgstr "_Verweis kopieren" #: src/menus.ui:19 msgid "_Copy" msgstr "_Kopieren" #: src/menus.ui:29 msgid "_Select All" msgstr "_Alle auswรคhlen" #: src/menus.ui:36 msgid "Show in _Files" msgstr "In Date_ien anzeigen" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in T_erminal" msgstr "In _Terminal รถffnen" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Op_en in Kingโ€™s Cross" msgstr "I_n King's Cross รถffnen" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "Eine Terminal-Sitzung fรผr diesen Ort starten" #~ msgctxt "shortcut window" #~ msgid "First Tab" #~ msgstr "Erster Reiter" #~ msgctxt "shortcut window" #~ msgid "Last Tab" #~ msgstr "Letzter Reiter" #~ msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;" #~ msgstr "" #~ "command;prompt;cmd;commandline;run;shell;terminal;kgx;befehl;kommando;" #~ "befehlszeile;kommandozeile;ausfรผhren;" #~ msgid "child watcher" #~ msgstr "Unterprozess-Beobachter" #~ msgid "Copyright ยฉ %s Zander Brown" #~ msgstr "Copyright ยฉ %s Zander Brown" #~ msgid "Terminal (Kingโ€™s Cross)" #~ msgstr "Terminal (King's Cross)" #~ msgid "_OK" #~ msgstr "_OK" gnome-console-42~beta/po/el.po000066400000000000000000000163351420277463100164740ustar00rootroot00000000000000# Greek translation for kgx. # Copyright (C) 2020 kgx's COPYRIGHT HOLDER # This file is distributed under the same license as the kgx package. # Efstathios Iosifidis , 2020. # msgid "" msgstr "" "Project-Id-Version: kgx master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/ZanderBrown/kgx/issues\n" "POT-Creation-Date: 2020-09-27 22:08+0000\n" "PO-Revision-Date: 2020-10-01 13:40+0300\n" "Language-Team: Greek \n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Last-Translator: Efstathios Iosifidis \n" "X-Generator: Poedit 2.3\n" #. Translators: This is a train station, see README.md for more info #: data/org.gnome.zbrown.KingsCross.desktop.in:4 #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:8 src/kgx-application.c:439 #: src/kgx-window.c:618 src/kgx-window.ui:102 src/main.c:38 msgid "Kingโ€™s Cross" msgstr "" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross.desktop.in:9 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "" #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:3 src/main.c:35 msgid "Terminal" msgstr "ฮคฮตฯฮผฮฑฯ„ฮนฮบฯŒ" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;" msgstr "" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:9 src/kgx-application.c:441 #: src/kgx-window.c:609 msgid "Terminal Emulator" msgstr "ฮ ฯฮฟฯƒฮฟฮผฮฟฮฏฯ‰ฯƒฮท ฯ„ฮตฯฮผฮฑฯ„ฮนฮบฮฟฯ" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "" "ฮˆฮฝฮฑฯ‚ ฮฑฯ€ฮปฯŒฯ‚ ฯ†ฮนฮปฮนฮบฯŒฯ‚ ฯ€ฯฮฟฯ‚ ฯ„ฮฟฮฝ ฯ‡ฯฮฎฯƒฯ„ฮท ฮตฮพฮฟฮผฮฟฮนฯ‰ฯ„ฮฎฯ‚ ฯ„ฮตฯฮผฮฑฯ„ฮนฮบฮฟฯ ฮณฮนฮฑ ฯ„ฮฟ GNOME." #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:22 msgid "Terminal window" msgstr "ฮ ฮฑฯฮฌฮธฯ…ฯฮฟ ฯ„ฮตฯฮผฮฑฯ„ฮนฮบฮฟฯ" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:52 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "ฮ•ฯ†ฮฑฯฮผฮฟฮณฮฎ" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "ฮฮญฮฟ ฯ€ฮฑฯฮฌฮธฯ…ฯฮฟ" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "New Tab" msgstr "ฮฮญฮฑ ฮบฮฑฯฯ„ฮญฮปฮฑ" #: src/help-overlay.ui:33 msgctxt "shortcut window" msgid "Terminal" msgstr "ฮคฮตฯฮผฮฑฯ„ฮนฮบฯŒ" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Find" msgstr "ฮ•ฯฯฮตฯƒฮท" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Copy" msgstr "ฮ‘ฮฝฯ„ฮนฮณฯฮฑฯ†ฮฎ" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Paste" msgstr "ฮ•ฯ€ฮนฮบฯŒฮปฮปฮทฯƒฮท" #. Translators: This is the name of the timeout that looks for programs #. running in the terminal #: src/kgx-application.c:267 msgid "child watcher" msgstr "" #. Translators: The leading # is intentional, the initial %s is the #. version of King's Cross itself, the latter format is the VTE version #: src/kgx-application.c:413 #, c-format msgid "# Kingโ€™s Cross %s using VTE %u.%u.%u %s\n" msgstr "" #: src/kgx-application.c:425 src/kgx-window.c:601 #, c-format msgid "Copyright ยฉ %s Zander Brown" msgstr "ฮ ฮฝฮตฯ…ฮผฮฑฯ„ฮนฮบฮฌ ฮดฮนฮบฮฑฮนฯŽฮผฮฑฯ„ฮฑ ยฉ %s Zander Brown" #: src/kgx-application.c:545 msgid "Execute the argument to this option inside the terminal" msgstr "ฮ•ฮบฯ„ฮญฮปฮตฯƒฮท ฯ„ฮฟฯ… ฮฟฯฮฏฯƒฮผฮฑฯ„ฮฟฯ‚ ฯƒฮต ฮฑฯ…ฯ„ฮฎฮฝ ฯ„ฮทฮฝ ฮตฯ€ฮนฮปฮฟฮณฮฎ ฮผฮญฯƒฮฑ ฯƒฯ„ฮฟ ฯ„ฮตฯฮผฮฑฯ„ฮนฮบฯŒ" #: src/kgx-application.c:554 msgid "Set the working directory" msgstr "ฮŸฯฮนฯƒฮผฯŒฯ‚ ฯ„ฮฟฯ… ฮบฮฑฯ„ฮฑฮปฯŒฮณฮฟฯ… ฮตฯฮณฮฑฯƒฮฏฮฑฯ‚" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:556 msgid "DIRNAME" msgstr "DIRNAME" #: src/kgx-application.c:564 msgid "Wait until the child exits (TODO)" msgstr "" #: src/kgx-terminal.c:413 msgid "You are pasting a command that runs as an administrator" msgstr "ฮ•ฯ€ฮนฮบฮฟฮปฮปฮฌฯ„ฮต ฮผฮนฮฑ ฮตฮฝฯ„ฮฟฮปฮฎ ฯ€ฮฟฯ… ฮตฮบฯ„ฮตฮปฮตฮฏฯ„ฮฑฮน ฯ‰ฯ‚ ฮดฮนฮฑฯ‡ฮตฮนฯฮนฯƒฯ„ฮฎฯ‚" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:416 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "ฮ’ฮตฮฒฮฑฮนฯ‰ฮธฮตฮฏฯ„ฮต ฯŒฯ„ฮน ฮณฮฝฯ‰ฯฮฏฮถฮตฯ„ฮต ฯ„ฮน ฮบฮฌฮฝฮตฮน ฮท ฮตฮฝฯ„ฮฟฮปฮฎ:\n" "%s" #: src/kgx-terminal.c:421 src/kgx-close-dialog.ui:56 msgid "_Cancel" msgstr "_Aฮบฯฯฯ‰ฯƒฮท" #: src/kgx-terminal.c:424 src/menus.ui:24 msgid "_Paste" msgstr "_ฮ•ฯ€ฮนฮบฯŒฮปฮปฮทฯƒฮท" #. Translators: Credit yourself here #: src/kgx-window.c:608 msgid "translator-credits" msgstr "" "ฮ•ฮปฮปฮทฮฝฮนฮบฮฎ ฮผฮตฯ„ฮฑฯ†ฯฮฑฯƒฯ„ฮนฮบฮฎ ฮฟฮผฮฌฮดฮฑ GNOME\n" " ฮ•ฯ…ฯƒฯ„ฮฌฮธฮนฮฟฯ‚ ฮ™ฯ‰ฯƒฮทฯ†ฮฏฮดฮทฯ‚ \n" "\n" "ฮ“ฮนฮฑ ฯ€ฮตฯฮนฯƒฯƒฯŒฯ„ฮตฯฮตฯ‚ ฯ€ฮปฮทฯฮฟฯ†ฮฟฯฮฏฮตฯ‚, ฮตฯ€ฮนฯƒฮบฮตฯ†ฮธฮตฮฏฯ„ฮต ฯ„ฮท ฯƒฮตฮปฮฏฮดฮฑ\n" "http://gnome.gr/" #. Translators: "by Kingโ€™s Cross" here is meaning #. author or creator of 'Terminal' #: src/kgx-window.c:616 msgid "Terminal (Kingโ€™s Cross)" msgstr "" #: src/kgx-window.c:681 msgid "_About Terminal" msgstr "_ฮ ฮตฯฮฏ ฮคฮตฯฮผฮฑฯ„ฮนฮบฯŒ" #: src/kgx-window.ui:20 msgid "Shrink text" msgstr "ฮฃฮผฮฏฮบฯฯ…ฮฝฯƒฮท ฮบฮตฮนฮผฮญฮฝฮฟฯ…" #: src/kgx-window.ui:33 msgid "Reset size" msgstr "ฮ•ฯ€ฮฑฮฝฮฑฯ†ฮฟฯฮฌ ฮผฮตฮณฮญฮธฮฟฯ…ฯ‚" #: src/kgx-window.ui:46 msgid "Enlarge text" msgstr "ฮœฮตฮณฮญฮธฯ…ฮฝฯƒฮท ฮบฮตฮนฮผฮญฮฝฮฟฯ…" #: src/kgx-window.ui:63 msgid "_New Window" msgstr "_ฮฮญฮฟ ฯ€ฮฑฯฮฌฮธฯ…ฯฮฟ" #: src/kgx-window.ui:75 msgid "_Keyboard Shortcuts" msgstr "_ฮฃฯ…ฮฝฯ„ฮฟฮผฮตฯฯƒฮตฮนฯ‚ ฯ€ฮปฮทฮบฯ„ฯฮฟฮปฮฟฮณฮฏฮฟฯ…" #: src/kgx-window.ui:82 msgid "_About Kingโ€™s Cross" msgstr "" #: src/kgx-window.ui:83 msgid "About this program" msgstr "ฮ ฮตฯฮฏ ฮฑฯ…ฯ„ฮฟฯ ฯ„ฮฟฯ… ฯ€ฯฮฟฮณฯฮฌฮผฮผฮฑฯ„ฮฟฯ‚" #: src/kgx-window.ui:110 msgid "Find in terminal" msgstr "ฮ•ฯฯฮตฯƒฮท ฯƒฯ„ฮฟ ฯ„ฮตฯฮผฮฑฯ„ฮนฮบฯŒ" #: src/kgx-window.ui:128 msgid "Menu" msgstr "ฮœฮตฮฝฮฟฯ" #: src/kgx-window.ui:146 msgid "New Tab" msgstr "ฮฮญฮฑ ฮบฮฑฯฯ„ฮญฮปฮฑ" #: src/menus.ui:7 msgid "_Open Link" msgstr "ฮ†ฮฝ_ฮฟฮนฮณฮผฮฑ ฯƒฯ…ฮฝฮดฮญฯƒฮผฮฟฯ…" #: src/menus.ui:12 msgid "Copy _Link" msgstr "ฮ‘ฮฝฯ„ฮนฮณฯฮฑฯ†ฮฎ _ฯƒฯ…ฮฝฮดฮญฯƒฮผฮฟฯ…" #: src/menus.ui:19 msgid "_Copy" msgstr "_ฮ‘ฮฝฯ„ฮนฮณฯฮฑฯ†ฮฎ" #: src/menus.ui:29 msgid "_Select All" msgstr "_ฮ•ฯ€ฮนฮปฮฟฮณฮฎ ฯŒฮปฯ‰ฮฝ" #: src/menus.ui:36 msgid "Show in _Files" msgstr "ฮ•ฮผฯ†ฮฌฮฝฮนฯƒฮท ฯƒฯ„ฮฟ _ฮ‘ฯฯ‡ฮตฮฏฮฑ" #: src/menus.ui:45 msgid "_Close" msgstr "_ฮšฮปฮตฮฏฯƒฮนฮผฮฟ" #: src/menus.ui:49 msgid "_Detach" msgstr "_ฮ‘ฯ€ฯŒฯƒฯ€ฮฑฯƒฮท" #: src/kgx-close-dialog.ui:6 msgid "Close Terminal" msgstr "ฮšฮปฮตฮฏฯƒฮนฮผฮฟ ฯ„ฮตฯฮผฮฑฯ„ฮนฮบฮฟฯ" #: src/kgx-close-dialog.ui:25 msgid "" "Some commands are still running, closing this terminal will kill them and " "may lead to unexpected outcomes" msgstr "" "ฮŸฯฮนฯƒฮผฮญฮฝฮตฯ‚ ฮตฮฝฯ„ฮฟฮปฮญฯ‚ ฮตฮพฮฑฮบฮฟฮปฮฟฯ…ฮธฮฟฯฮฝ ฮฝฮฑ ฮตฮบฯ„ฮตฮปฮฟฯฮฝฯ„ฮฑฮน, ฯ„ฮฟ ฮบฮปฮตฮฏฯƒฮนฮผฮฟ ฮฑฯ…ฯ„ฮฟฯ ฯ„ฮฟฯ… " "ฯ„ฮตฯฮผฮฑฯ„ฮนฮบฮฟฯ ฮธฮฑ ฯ„ฮนฯ‚ ฯ„ฮตฯฮผฮฑฯ„ฮฏฯƒฮตฮน ฮบฮฑฮน ฮผฯ€ฮฟฯฮตฮฏ ฮฝฮฑ ฮฟฮดฮทฮณฮฎฯƒฮตฮน ฯƒฮต ฮฑฯ€ฯฯŒฯƒฮผฮตฮฝฮฑ " "ฮฑฯ€ฮฟฯ„ฮตฮปฮญฯƒฮผฮฑฯ„ฮฑ" #: src/kgx-close-dialog.ui:64 msgid "_OK" msgstr "_ฮ•ฮฝฯ„ฮฌฮพฮตฮน" gnome-console-42~beta/po/en_GB.po000066400000000000000000000227001420277463100170370ustar00rootroot00000000000000# British English translation for kgx. # Copyright (C) 2019 kgx's COPYRIGHT HOLDER # This file is distributed under the same license as the kgx package. # Zander Brown , 2019-2021. # msgid "" msgstr "" "Project-Id-Version: kgx master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/ZanderBrown/kgx/issues\n" "POT-Creation-Date: 2021-10-04 23:53+0000\n" "PO-Revision-Date: 2021-10-15 16:41+0100\n" "Last-Translator: Zander Brown \n" "Language-Team: English - United Kingdom \n" "Language: en_GB\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 41.0\n" #. Translators: This is a train station, see README.md for more info #: data/org.gnome.zbrown.KingsCross.desktop.in.in:4 #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:8 #: src/kgx-application.c:512 src/kgx-application.h:46 src/kgx-window.ui:104 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross.desktop.in.in:9 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" #: data/org.gnome.zbrown.KingsCross.desktop.in.in:22 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:21 #| msgctxt "shortcut window" #| msgid "New Window" msgid "New Window" msgstr "New Window" #: data/org.gnome.zbrown.KingsCross.desktop.in.in:28 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:27 #: src/kgx-window.ui:157 msgid "New Tab" msgstr "New Tab" #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:3 #: src/kgx-application.h:44 msgid "Terminal" msgstr "Terminal" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:9 #: src/kgx-application.c:514 src/kgx-window.c:530 msgid "Terminal Emulator" msgstr "Terminal Emulator" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "A simple user-friendly terminal emulator for the GNOME desktop." #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:30 msgid "Terminal window" msgstr "Terminal window" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:60 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Application" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "New Window" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminal" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Find" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Copy" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "Paste" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "Tabs" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "New Tab" #: src/help-overlay.ui:66 #| msgid "Close Terminal" msgctxt "shortcut window" msgid "Close Tab" msgstr "Close Tab" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "Next Tab" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "Previous Tab" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "Switch to Tab" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:486 #, c-format #| msgid "# Kingโ€™s Cross %s using VTE %u.%u.%u %s\n" msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# KGX %s using VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:498 src/kgx-window.c:518 #, c-format #| msgid "Zander Brown" msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:516 msgid "GPL 3.0 or later" msgstr "GPL 3.0 or later" #: src/kgx-application.c:647 msgid "Execute the argument to this option inside the terminal" msgstr "Execute the argument to this option inside the terminal" #: src/kgx-application.c:656 msgid "Set the working directory" msgstr "Set the working directory" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:658 msgid "DIRNAME" msgstr "DIRNAME" #: src/kgx-application.c:666 msgid "Wait until the child exits (TODO)" msgstr "Wait until the child exits (TODO)" #: src/kgx-application.c:675 msgid "Set the initial window title" msgstr "Set the initial window title" #: src/kgx-application.c:684 msgid "ADVANCED: Set the shell to launch" msgstr "ADVANCED: Set the shell to launch" #: src/kgx-application.c:693 msgid "ADVANCED: Set the scrollback length" msgstr "ADVANCED: Set the scrollback length" #: src/kgx-close-dialog.c:52 #| msgctxt "shortcut window" #| msgid "New Window" msgid "Close Window?" msgstr "Close Window?" #: src/kgx-close-dialog.c:53 #| msgid "" #| "Some commands are still running, closing this terminal will kill them and " #| "may lead to unexpected outcomes" msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" #: src/kgx-close-dialog.c:58 #| msgid "Close Terminal" msgid "Close Tab?" msgstr "Close Tab?" #: src/kgx-close-dialog.c:59 #| msgid "" #| "Some commands are still running, closing this terminal will kill them and " #| "may lead to unexpected outcomes" msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:675 msgid "_Cancel" msgstr "_Cancel" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "C_lose" #: src/kgx-pages.ui:47 msgid "_Detach Tab" msgstr "_Detach Tab" #: src/kgx-pages.ui:53 msgid "_Close" msgstr "_Close" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:119 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "Read Only โ€” Command exited with code %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:128 msgid "Read Only โ€” Command exited" msgstr "Read Only โ€” Command exited" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:160 #, c-format msgid "Failed to start โ€” %s" msgstr "Failed to start โ€” %s" #: src/kgx-tab.c:1182 msgid "Command completed" msgstr "Command completed" #: src/kgx-tab-button.ui:5 msgid "View open tabs" msgstr "View open tabs" #: src/kgx-terminal.c:667 msgid "You are pasting a command that runs as an administrator" msgstr "You are pasting a command that runs as an administrator" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:670 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Make sure you know what the command does:\n" "%s" #: src/kgx-terminal.c:678 src/menus.ui:24 msgid "_Paste" msgstr "_Paste" #. Translators: Credit yourself here #: src/kgx-window.c:524 msgid "translator-credits" msgstr "Zander Brown " #. Translators: Donโ€™t attempt to translate KGX, #. * treat it as a proper noun #: src/kgx-window.c:528 #| msgid "Terminal Emulator" msgid "KGX Terminal Emulator" msgstr "KGX Terminal Emulator" #: src/kgx-window.c:638 msgid "_About Terminal" msgstr "_About Terminal" #: src/kgx-window.ui:20 msgid "Shrink text" msgstr "Shrink text" #: src/kgx-window.ui:33 msgid "Reset size" msgstr "Reset size" #: src/kgx-window.ui:46 msgid "Enlarge text" msgstr "Enlarge text" #: src/kgx-window.ui:63 msgid "_New Window" msgstr "_New Window" #: src/kgx-window.ui:75 msgid "_Keyboard Shortcuts" msgstr "_Keyboard Shortcuts" #: src/kgx-window.ui:82 msgid "_About Kingโ€™s Cross" msgstr "_About Kingโ€™s Cross" #: src/kgx-window.ui:83 msgid "About this program" msgstr "About this program" #: src/kgx-window.ui:112 msgid "Find in terminal" msgstr "Find in terminal" #: src/kgx-window.ui:130 msgid "Menu" msgstr "Menu" #: src/menus.ui:7 msgid "_Open Link" msgstr "_Open Link" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Copy _Link" #: src/menus.ui:19 msgid "_Copy" msgstr "_Copy" #: src/menus.ui:29 msgid "_Select All" msgstr "_Select All" #: src/menus.ui:36 msgid "Show in _Files" msgstr "Show in _Files" #: nautilus/kgx-nautilus-menu-item.c:120 #| msgid "Close Terminal" msgid "Open in T_erminal" msgstr "Open in T_erminal" #: nautilus/kgx-nautilus-menu-item.c:122 #| msgid "Kingโ€™s Cross" msgid "Op_en in Kingโ€™s Cross" msgstr "Op_en in Kingโ€™s Cross" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "Start a terminal session for this location" #~ msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;" #~ msgstr "command;prompt;cmd;commandline;run;shell;terminal;kgx;" #~ msgid "child watcher" #~ msgstr "child watcher" #~ msgid "Copyright ยฉ %s Zander Brown" #~ msgstr "Copyright ยฉ %s Zander Brown" #~| msgid "" #~| "Terminal\n" #~| "by Kingโ€™s Cross" #~ msgid "Terminal (Kingโ€™s Cross)" #~ msgstr "Terminal (Kingโ€™s Cross)" #~ msgid "_OK" #~ msgstr "_OK" gnome-console-42~beta/po/es.po000066400000000000000000000223501420277463100164750ustar00rootroot00000000000000# Spanish translation for kgx. # Copyright (C) 2019 kgx's COPYRIGHT HOLDER # This file is distributed under the same license as the kgx package. # Rodrigo Lledรณ , 2020. # Daniel Mustieles , 2019-2022. # msgid "" msgstr "" "Project-Id-Version: kgx master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/console/issues\n" "POT-Creation-Date: 2022-02-07 10:11+0000\n" "PO-Revision-Date: 2022-02-07 13:51+0100\n" "Last-Translator: Daniel Mustieles \n" "Language-Team: Spanish - Spain \n" "Language: es_ES\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Gtranslator 41.0\n" #: data/org.gnome.Console.desktop.in.in:3 #: data/org.gnome.Console.metainfo.xml.in.in:8 src/kgx-application.h:46 msgid "Console" msgstr "Consola" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.Console.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "comando;prompt;cmd;lรญnea;ejecutar;shell;terminal;kgx;kings cross;" #: data/org.gnome.Console.desktop.in.in:21 msgid "New Window" msgstr "Ventana nueva" #: data/org.gnome.Console.desktop.in.in:27 src/kgx-window.ui:168 msgid "New Tab" msgstr "Pestaรฑa nueva" #: data/org.gnome.Console.metainfo.xml.in.in:9 src/kgx-application.c:556 msgid "Terminal Emulator" msgstr "Emulador de terminal" #: data/org.gnome.Console.metainfo.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "Un emulador de terminal sencillo y amigable para el escritorio GNOME." #: data/org.gnome.Console.metainfo.xml.in.in:30 msgid "Terminal window" msgstr "Ventana de la terminal" #: data/org.gnome.Console.metainfo.xml.in.in:75 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Aplicacioฬn" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Ventana nueva" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminal" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Buscar" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Copiar" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "Pegar" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "Pestanฬƒas" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "Pestaรฑa nueva" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "Cerrar pestanฬƒa" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "Pestaรฑa siguiente" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "Pestaรฑa anterior" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "Cambiar a la pestaรฑa" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:528 #, c-format msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# KGX %s usando VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:540 src/kgx-window.c:525 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:554 src/kgx-window.ui:115 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #: src/kgx-application.c:558 msgid "GPL 3.0 or later" msgstr "GPL 3.0 o posterior" #: src/kgx-application.c:689 msgid "Execute the argument to this option inside the terminal" msgstr "Ejecutar el argumento de esta opciรณn en la terminal" #: src/kgx-application.c:698 msgid "Set the working directory" msgstr "Establecer la carpeta de trabajo" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:700 msgid "DIRNAME" msgstr "NOMBRE_CARPETA" #: src/kgx-application.c:708 msgid "Wait until the child exits (TODO)" msgstr "Esperar a que el hijo termine (POR_HACER)" #: src/kgx-application.c:717 msgid "Set the initial window title" msgstr "Establecer el tรญtulo inicial de la ventana" #: src/kgx-application.c:726 msgid "ADVANCED: Set the shell to launch" msgstr "AVANZADO: establecer la shell que ejecutar" #: src/kgx-application.c:735 msgid "ADVANCED: Set the scrollback length" msgstr "AVANZADO: establecer la longitud del desplazamiento hacia atrรกs" #: src/kgx-application.h:44 msgid "Console (Development)" msgstr "Consola (desarrollo)" #: src/kgx-close-dialog.c:50 msgid "Close Window?" msgstr "ยฟQuiere cerrar la ventana?" #: src/kgx-close-dialog.c:51 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "Algunos comandos siguen en ejecuciรณn. Cerrar esta ventana los matarรก y esto " "puede provocar comportamientos inesperados" #: src/kgx-close-dialog.c:56 msgid "Close Tab?" msgstr "ยฟQuiere cerrar la pestaรฑa?" #: src/kgx-close-dialog.c:57 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "Algunos comandos siguen en ejecuciรณn. Cerrar esta pestaรฑa los matarรก y esto " "puede provocar comportamientos inesperados" #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:732 msgid "_Cancel" msgstr "C_ancelar" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "C_errar" #: src/kgx-pages.ui:47 msgid "_Detach Tab" msgstr "_Desacoplar pestaรฑa" #: src/kgx-pages.ui:53 msgid "_Close" msgstr "_Cerrar" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:119 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "Sรณlo lectura โ€” el comando ha terminado con cรณdigo %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:128 msgid "Read Only โ€” Command exited" msgstr "Sรณlo lectura โ€” el comando ha terminado" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:160 #, c-format msgid "Failed to start โ€” %s" msgstr "Fallรณ al iniciar โ€” %s" #: src/kgx-tab.c:1160 msgid "Command completed" msgstr "Comando completado" #: src/kgx-tab-button.ui:5 msgid "View Open Tabs" msgstr "Ver pestaรฑas abiertas" #: src/kgx-terminal.c:724 msgid "You are pasting a command that runs as an administrator" msgstr "Estรก pegando un comando que se ejecuta como administrador" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:727 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Asegรบrese de que sabe lo que hace el comando:\n" "%s" #: src/kgx-terminal.c:735 src/menus.ui:24 msgid "_Paste" msgstr "_Pegar" #: src/kgx-theme-switcher.ui:18 msgid "Use System Colors" msgstr "Usar colores del sistema" #: src/kgx-theme-switcher.ui:47 msgid "Use Light Colors" msgstr "Usar colores claros" #: src/kgx-theme-switcher.ui:76 msgid "Use Dark Colors" msgstr "Usar colores oscuros" #. Translators: Credit yourself here #: src/kgx-window.c:531 msgid "translator-credits" msgstr "Daniel Mustieles , 2019" #: src/kgx-window.ui:26 msgid "Shrink Text" msgstr "Reducir texto" #: src/kgx-window.ui:39 msgid "Reset Size" msgstr "Restaurar tamaรฑo" #: src/kgx-window.ui:52 msgid "Enlarge Text" msgstr "Alargar texto" #: src/kgx-window.ui:74 msgid "_New Window" msgstr "Ventana _nueva" #: src/kgx-window.ui:86 msgid "_Keyboard Shortcuts" msgstr "Atajos del _teclado" #: src/kgx-window.ui:93 msgid "_About Console" msgstr "_Acerca de Consola" #: src/kgx-window.ui:94 msgid "About this Program" msgstr "Acerca de este programa" #: src/kgx-window.ui:123 msgid "Find in Terminal" msgstr "Buscar en la terminal" #: src/kgx-window.ui:141 msgid "Menu" msgstr "Menรบ" #: src/menus.ui:7 msgid "_Open Link" msgstr "A_brir enlace" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Copiar en_lace" #: src/menus.ui:19 msgid "_Copy" msgstr "C_opiar" #: src/menus.ui:29 msgid "_Select All" msgstr "Seleccionar _todo" #: src/menus.ui:36 msgid "Show in _Files" msgstr "Mostrar en _Archivos" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in Co_nsole (Devel)" msgstr "Abrir en Co_nsola (desarrollo)" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Open in Co_nsole" msgstr "Abrir en Co_nsola" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "Iniciar una sesiรณn de terminal para esta ubicaciรณn" #~ msgid "Terminal" #~ msgstr "Terminal" #~ msgid "KGX Terminal Emulator" #~ msgstr "Emulador de terminal KGX" #~ msgid "_About Kingโ€™s Cross" #~ msgstr "_Acerca de Kingโ€™s Cross" #~ msgid "Op_en in Kingโ€™s Cross" #~ msgstr "A_brir en Kingโ€™s Cross" #~ msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;" #~ msgstr "comando;prompt;cmd;lรญnea;ejecutar;shell;terminal;kgx;" #~ msgid "child watcher" #~ msgstr "monitor de los hijos" #~ msgid "Copyright ยฉ %s Zander Brown" #~ msgstr "Copyright ยฉ %s Zander Brown" #~ msgid "Terminal (Kingโ€™s Cross)" #~ msgstr "Terminal (Kingโ€™s Cross)" #~ msgid "Close Terminal" #~ msgstr "Cerrar la terminal" #~ msgid "_OK" #~ msgstr "_Aceptar" gnome-console-42~beta/po/eu.po000066400000000000000000000214421420277463100165000ustar00rootroot00000000000000# Basque translation for kgx. # Copyright (C) 2019 kgx's COPYRIGHT HOLDER # This file is distributed under the same license as the kgx package. # Asier Sarasua Garmendia , 2019, 2022. # msgid "" msgstr "Project-Id-Version: kgx master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/console/issues\n" "POT-Creation-Date: 2021-12-30 21:38+0000\n" "PO-Revision-Date: 2022-02-13 10:00+0100\n" "Last-Translator: Asier Sarasua Garmendia \n" "Language-Team: Basque \n" "Language: eu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: data/org.gnome.Console.desktop.in.in:3 #: data/org.gnome.Console.metainfo.xml.in.in:8 src/kgx-application.h:46 msgid "Console" msgstr "Kontsola" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.Console.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "komandoa;gonbitea;cmd;komando-lerroa;exekutatu;shell-a;terminala;kgx;kings cross;" #: data/org.gnome.Console.desktop.in.in:21 msgid "New Window" msgstr "Leiho berria" #: data/org.gnome.Console.desktop.in.in:27 src/kgx-window.ui:168 msgid "New Tab" msgstr "Fitxa berria" #: data/org.gnome.Console.metainfo.xml.in.in:9 src/kgx-application.c:556 msgid "Terminal Emulator" msgstr "Terminalaren emulatzailea" #: data/org.gnome.Console.metainfo.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "Terminalaren emuladore sinple eta erraza GNOME mahaigainerako." #: data/org.gnome.Console.metainfo.xml.in.in:30 msgid "Terminal window" msgstr "Terminalaren leihoa" #: data/org.gnome.Console.metainfo.xml.in.in:75 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Aplikazioa" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "_Leiho berria" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminala" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Bilatu" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Kopiatu" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "Itsatsi" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "Fitxak" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "Fitxa berria" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "Itxi fitxa" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "Hurrengo fitxa" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "Aurreko fitxa" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "Aldatu fitxara" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:528 #, c-format msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# KGX %s, VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:540 src/kgx-window.c:529 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:554 src/kgx-window.ui:115 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #: src/kgx-application.c:558 msgid "GPL 3.0 or later" msgstr "GPL 3.0 edo berriagoa" #: src/kgx-application.c:691 msgid "Execute the argument to this option inside the terminal" msgstr "Exekutatu aukera honen argumentua terminalaren barruan" #: src/kgx-application.c:700 msgid "Set the working directory" msgstr "Ezarri laneko direktorioa" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:702 msgid "DIRNAME" msgstr "DIRIZENA" #: src/kgx-application.c:710 msgid "Wait until the child exits (TODO)" msgstr "Itxaron haurrak amaitu arte (EGITEKO)" #: src/kgx-application.c:719 msgid "Set the initial window title" msgstr "Ezarri leihoaren hasierako izenburua" #: src/kgx-application.c:728 msgid "ADVANCED: Set the shell to launch" msgstr "AURRERATUA: Ezarri abiaraziko den shell-a" #: src/kgx-application.c:737 msgid "ADVANCED: Set the scrollback length" msgstr "AURRERATUA: Ezarri atzeranzko korritzearen luzera" #: src/kgx-application.h:44 msgid "Console (Development)" msgstr "Kontsola (garapena)" #: src/kgx-close-dialog.c:52 msgid "Close Window?" msgstr "Itxi leihoa?" #: src/kgx-close-dialog.c:53 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "Zenbait komando exekutatzen ari dira oraindik, leihoa ixten bada hil egingo dira eta espero gabeko emaitzak egon daitezke" #: src/kgx-close-dialog.c:58 msgid "Close Tab?" msgstr "Itxi fitxa?" #: src/kgx-close-dialog.c:59 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "Zenbait komando exekutatzen ari dira oraindik, fitxa ixten bada hil egingo dira eta espero gabeko emaitzak egon daitezke" #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:740 msgid "_Cancel" msgstr "_Utzi" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "It_xi" #: src/kgx-pages.ui:47 msgid "_Detach Tab" msgstr "Askat_u fitxa" #: src/kgx-pages.ui:53 msgid "_Close" msgstr "I_txi" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:121 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "Irakurtzeko soilik โ€” Komandoa amaitu da %i kodea emanda" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:130 msgid "Read Only โ€” Command exited" msgstr "Irakurtzeko soilik โ€” Komandoa amaitu da" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:162 #, c-format msgid "Failed to start โ€” %s" msgstr "Huts egin du abioak โ€” %s" #: src/kgx-tab.c:1184 msgid "Command completed" msgstr "Komandoa osatu da" #: src/kgx-tab-button.ui:5 msgid "View Open Tabs" msgstr "Ikusi irekitako fitxak" #: src/kgx-terminal.c:732 msgid "You are pasting a command that runs as an administrator" msgstr "Administratzaile modura exekutatzen den komando bat itsasten ari zara" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:735 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "Ziurtatu badakizula komandoak zer egiten duen:\n" "%s" #: src/kgx-terminal.c:743 src/menus.ui:24 msgid "_Paste" msgstr "_Itsatsi" #: src/kgx-theme-switcher.ui:18 msgid "Use System Colors" msgstr "Erabili sistemaren koloreak" #: src/kgx-theme-switcher.ui:47 msgid "Use Light Colors" msgstr "Erabili kolore argiak" #: src/kgx-theme-switcher.ui:76 msgid "Use Dark Colors" msgstr "Erabili kolore ilunak" #. Translators: Credit yourself here #: src/kgx-window.c:535 msgid "translator-credits" msgstr "Asier Sarasua Garmendia " #: src/kgx-window.ui:26 msgid "Shrink Text" msgstr "Txikiagotu testua" #: src/kgx-window.ui:39 msgid "Reset Size" msgstr "Berrezarri tamaina" #: src/kgx-window.ui:52 msgid "Enlarge Text" msgstr "Handiagotu testua" #: src/kgx-window.ui:74 msgid "_New Window" msgstr "_Leiho berria" #: src/kgx-window.ui:86 msgid "_Keyboard Shortcuts" msgstr "Las_ter-teklak" #: src/kgx-window.ui:93 msgid "_About Console" msgstr "Kontsola aplikazioari b_uruz" #: src/kgx-window.ui:94 msgid "About this Program" msgstr "Programa honi buruz" #: src/kgx-window.ui:123 msgid "Find in Terminal" msgstr "Bilatu terminalean" #: src/kgx-window.ui:141 msgid "Menu" msgstr "Menua" #: src/menus.ui:7 msgid "_Open Link" msgstr "_Ireki esteka" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Kopiatu _esteka" #: src/menus.ui:19 msgid "_Copy" msgstr "_Kopiatu" #: src/menus.ui:29 msgid "_Select All" msgstr "_Hautatu denak" #: src/menus.ui:36 msgid "Show in _Files" msgstr "Erakutsi _Fitxategiak aplikazioan" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in Co_nsole (Devel)" msgstr "Ireki ko_ntsolan (garapena)" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Open in Co_nsole" msgstr "Ireki ko_ntsolan" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "Abiarazi terminalaren saio bat kokaleku honetarako" #~ msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;" #~ msgstr "" #~ "komandoa;gonbitea;cmd;komando-lerroa;exekutatu;shell-a;terminala;kgx;" #~ msgid "child watcher" #~ msgstr "haur-begiralea" #~ msgid "Copyright ยฉ %s Zander Brown" #~ msgstr "Copyright ยฉ %s Zander Brown" #~ msgid "Terminal (Kingโ€™s Cross)" #~ msgstr "Terminala (Kingโ€™s Cross)" #~ msgid "_About Kingโ€™s Cross" #~ msgstr "Kingโ€™s Cross aplikazioari _buruz" #~ msgid "_OK" #~ msgstr "_Ados" gnome-console-42~beta/po/fi.po000066400000000000000000000226701420277463100164710ustar00rootroot00000000000000# Finnish translation for kgx. # Copyright (C) 2019 kgx's COPYRIGHT HOLDER # This file is distributed under the same license as the kgx package. # Jiri Grรถnroos , 2019. # msgid "" msgstr "" "Project-Id-Version: kgx master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/ZanderBrown/kgx/issues\n" "POT-Creation-Date: 2021-11-20 08:29+0000\n" "PO-Revision-Date: 2021-11-22 13:59+0200\n" "Last-Translator: Jiri Grรถnroos \n" "Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0\n" #: data/org.gnome.zbrown.KingsCross.desktop.in.in:3 #: data/org.gnome.zbrown.KingsCross.metainfo.xml.in.in:8 #: src/kgx-application.h:43 msgid "Terminal" msgstr "Pรครคte" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "" "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;pรครคte;" "terminaali;komentorivi;" #: data/org.gnome.zbrown.KingsCross.desktop.in.in:21 msgid "New Window" msgstr "Uusi ikkuna" #: data/org.gnome.zbrown.KingsCross.desktop.in.in:27 src/kgx-window.ui:168 msgid "New Tab" msgstr "Uusi vรคlilehti" #: data/org.gnome.zbrown.KingsCross.metainfo.xml.in.in:9 #: src/kgx-application.c:556 src/kgx-window.c:537 msgid "Terminal Emulator" msgstr "Pรครคte-emulaattori" #: data/org.gnome.zbrown.KingsCross.metainfo.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "Helppokรคyttรถinen pรครคte-emulaattori Gnome-tyรถpรถydรคlle." #: data/org.gnome.zbrown.KingsCross.metainfo.xml.in.in:30 msgid "Terminal window" msgstr "Pรครคteikkuna" #: data/org.gnome.zbrown.KingsCross.metainfo.xml.in.in:75 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Sovellus" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Uusi ikkuna" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Pรครคte" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Etsi" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Kopioi" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "Liitรค" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "Vรคlilehdet" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "Uusi vรคlilehti" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "Sulje vรคlilehti" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "Seuraava vรคlilehti" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "Edellinen vรคlilehti" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "Vaihda vรคlilehteen" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:528 #, c-format #| msgid "# Kingโ€™s Cross %s using VTE %u.%u.%u %s\n" msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# KGX %s kรคyttรคen VTE:n versiota %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:540 src/kgx-window.c:524 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:554 src/kgx-window.ui:115 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #: src/kgx-application.c:558 msgid "GPL 3.0 or later" msgstr "GPL 3.0 tai myรถhempi" #: src/kgx-application.c:691 msgid "Execute the argument to this option inside the terminal" msgstr "Toteuta tรคmรคn valinnan argumentti terminaalin sisรคllรค" #: src/kgx-application.c:700 msgid "Set the working directory" msgstr "Aseta tyรถskentelyhakemisto" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:702 msgid "DIRNAME" msgstr "DIRNAME" #: src/kgx-application.c:710 msgid "Wait until the child exits (TODO)" msgstr "Odota kunnes lapsiprosessi valmistuu (TODO)" #: src/kgx-application.c:719 msgid "Set the initial window title" msgstr "Aseta esiotsikko ikkunalle" #: src/kgx-application.c:728 msgid "ADVANCED: Set the shell to launch" msgstr "EDISTYNYT: Aseta pรครคte avautumaan" #: src/kgx-application.c:737 msgid "ADVANCED: Set the scrollback length" msgstr "EDISTYNYT: Aseta takaisinkelauksen mรครคrรค" #: src/kgx-close-dialog.c:52 msgid "Close Window?" msgstr "Sulje ikkuna?" #: src/kgx-close-dialog.c:53 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "Joitain komentoja suoritetaan vielรค. Tรคmรคn ikkunan sulkeminen tappaa " "kyseiset komennot ja saattaa johtaa odottamattomiin tilanteisiin" #: src/kgx-close-dialog.c:58 msgid "Close Tab?" msgstr "Sulje vรคlilehti?" #: src/kgx-close-dialog.c:59 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "Joitain komentoja suoritetaan vielรค. Tรคmรคn vรคlilehden sulkeminen tappaa " "kyseiset komennot ja saattaa johtaa odottamattomiin tilanteisiin" #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:740 msgid "_Cancel" msgstr "_Peru" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "_Sulje" #: src/kgx-pages.ui:47 msgid "_Detach Tab" msgstr "_Irrota vรคlilehti" #: src/kgx-pages.ui:53 msgid "_Close" msgstr "_Sulje" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:119 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "Vain luku โ€” Komento poistui koodilla %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:128 msgid "Read Only โ€” Command exited" msgstr "Vain luku โ€” Komento poistui" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:160 #, c-format msgid "Failed to start โ€” %s" msgstr "Ei voitu kรคynnistรครค โ€” %s" #: src/kgx-tab.c:1184 msgid "Command completed" msgstr "Komento suoritettu" #: src/kgx-tab-button.ui:5 msgid "View open tabs" msgstr "Nรคytรค avoimet vรคlilehdet" #: src/kgx-terminal.c:732 msgid "You are pasting a command that runs as an administrator" msgstr "Olet aikeissa liittรครค komennon, joka suoritetaan yllรคpitรคjรคn oikeuksin" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:735 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Varmista ettรค tiedรคt mitรค komento tekee:\n" "%s" #: src/kgx-terminal.c:743 src/menus.ui:24 msgid "_Paste" msgstr "_Liitรค" #: src/kgx-theme-switcher.ui:14 msgid "Use System Colors" msgstr "Kรคytรค jรคrjestelmรคn vรคrejรค" #: src/kgx-theme-switcher.ui:25 msgid "Use Light Colors" msgstr "Kรคytรค vaaleita vรคrejรค" #: src/kgx-theme-switcher.ui:36 msgid "Use Dark Colors" msgstr "Kรคytรค tummia vรคrejรค" #. Translators: Credit yourself here #: src/kgx-window.c:530 msgid "translator-credits" msgstr "" "Jiri Grรถnroos\n" "JR-Fi" #. Translators: Donโ€™t attempt to translate KGX, #. * treat it as a proper noun. This string is used #. * for developer/preview releases/builds #: src/kgx-window.c:535 msgid "๐Ÿšง KGX Devel Build ๐Ÿšง" msgstr "" #: src/kgx-window.ui:26 msgid "Shrink text" msgstr "Kutista teksti" #: src/kgx-window.ui:39 msgid "Reset size" msgstr "Palauta koko" #: src/kgx-window.ui:52 msgid "Enlarge text" msgstr "Suurenna teksti" #: src/kgx-window.ui:74 msgid "_New Window" msgstr "_Uusi ikkuna" #: src/kgx-window.ui:86 msgid "_Keyboard Shortcuts" msgstr "_Pikanรคppรคimet" #: src/kgx-window.ui:93 msgid "_About Terminal" msgstr "_Tietoja - Pรครคte" #: src/kgx-window.ui:94 msgid "About this program" msgstr "Tietoa tรคstรค ohjelmasta" #: src/kgx-window.ui:123 msgid "Find in terminal" msgstr "Etsi pรครคtteestรค" #: src/kgx-window.ui:141 msgid "Menu" msgstr "Valikko" #: src/menus.ui:7 msgid "_Open Link" msgstr "_Avaa linkki" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Kopioi _linkki" #: src/menus.ui:19 msgid "_Copy" msgstr "_Kopioi" #: src/menus.ui:29 msgid "_Select All" msgstr "_Valitse kaikki" #: src/menus.ui:36 msgid "Show in _Files" msgstr "Nรคytรค tie_dostohallinnassa" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in T_erminal (Devel)" msgstr "Avaa _pรครคtteessรค (Devel)" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Open in T_erminal" msgstr "Avaa _pรครคtteessรค" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "Aloita pรครคteistunto tรคssรค sijainnissa" #~ msgid "KGX Terminal Emulator" #~ msgstr "KGX Pรครคte-emulaattori" #~ msgid "_About Kingโ€™s Cross" #~ msgstr "_Tietoja - Kingโ€™s Cross" #~ msgid "Op_en in Kingโ€™s Cross" #~ msgstr "Avaa Kingโ€™s Crossissa" #~ msgid "Close Terminal" #~ msgstr "Sulje pรครคte" #~ msgid "_OK" #~ msgstr "_OK" #~ msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;" #~ msgstr "" #~ "command;prompt;cmd;commandline;run;shell;terminal;kgx;pรครคte;terminaali;" #~ "komentorivi;" #~ msgid "child watcher" #~ msgstr "pรครคtteen lapsisovellusten tarkkailija" #~ msgid "Copyright ยฉ %s Zander Brown" #~ msgstr "Tekijรคnoikeus ยฉ %s Zander Brown" #~ msgid "Terminal (Kingโ€™s Cross)" #~ msgstr "Pรครคte (Kingโ€™s Cross)" gnome-console-42~beta/po/fr.po000066400000000000000000000160601420277463100164760ustar00rootroot00000000000000# French translation for kgx. # Copyright (C) 2020 kgx's COPYRIGHT HOLDER # This file is distributed under the same license as the kgx package. # Thibault Martin , 2020. # msgid "" msgstr "" "Project-Id-Version: kgx master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/ZanderBrown/kgx/issues\n" "POT-Creation-Date: 2020-05-29 23:32+0000\n" "PO-Revision-Date: 2020-07-15 11:48+0200\n" "Last-Translator: Thibault Martin \n" "Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" "X-Generator: Gtranslator 3.36.0\n" #. Translators: This is a train station, see README.md for more info #: data/org.gnome.zbrown.KingsCross.desktop.in:4 #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:8 src/kgx-application.c:437 #: src/kgx-window.c:618 src/kgx-window.ui:98 src/main.c:38 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross.desktop.in:9 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "" "commande;prompt;invite;cmd;commandline;ligne de commande;exรฉcuter;lancer;" "shell;terminal;kgx;kings cross;" #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:3 src/main.c:35 msgid "Terminal" msgstr "Terminal" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;" msgstr "" "commande;prompt;invite;cmd;commandline;ligne de commande;exรฉcuter;lancer;" "shell;terminal;kgx;kings cross;" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:9 src/kgx-application.c:439 #: src/kgx-window.c:609 msgid "Terminal Emulator" msgstr "ร‰mulateur de terminal" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "Un รฉmulateur de terminal simpliste pour le bureau GNOME" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:22 msgid "Terminal window" msgstr "Fenรชtre de terminal" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:52 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Application" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Nouvelle fenรชtre" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "New Tab" msgstr "Nouvel onglet" #: src/help-overlay.ui:33 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminal" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Find" msgstr "Rechercher" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Copy" msgstr "Copier" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Paste" msgstr "Coller" #. Translators: This is the name of the timeout that looks for programs #. running in the terminal #: src/kgx-application.c:267 msgid "child watcher" msgstr "Moniteur de processus fils" #. Translators: The leading # is intentional, the initial %s is the #. version of King's Cross itself, the latter format is the VTE version #: src/kgx-application.c:411 #, c-format msgid "# Kingโ€™s Cross %s using VTE %u.%u.%u %s\n" msgstr "# Kingโ€™s Cross %s avec VTE %u.%u.%u %s\n" #: src/kgx-application.c:423 src/kgx-window.c:601 #, c-format msgid "Copyright ยฉ %s Zander Brown" msgstr "Copyright ยฉ %s Zander Brown" #: src/kgx-application.c:543 msgid "Execute the argument to this option inside the terminal" msgstr "Exรฉcuter lโ€™argument de cette option au sein du terminal" #: src/kgx-application.c:552 msgid "Set the working directory" msgstr "Dรฉfinir le rรฉpertoire de travail" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:554 msgid "DIRNAME" msgstr "Rร‰PERTOIRE" #: src/kgx-application.c:562 msgid "Wait until the child exits (TODO)" msgstr "En attente de la fin d'exรฉcution du processus fils (TODO)" #: src/kgx-terminal.c:413 msgid "You are pasting a command that runs as an administrator" msgstr "" "Vous collez une commande qui doit รชtre exรฉcutรฉe en tant qu'administrateur" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:416 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Vรฉrifiez que vous savez ce que la commande faitย :\n" "%s" #: src/kgx-terminal.c:421 src/kgx-close-dialog.ui:56 msgid "_Cancel" msgstr "_Annuler" #: src/kgx-terminal.c:424 src/menus.ui:24 msgid "_Paste" msgstr "_Coller" #. Translators: Credit yourself here #: src/kgx-window.c:608 msgid "translator-credits" msgstr "Thibault Martin" #. Translators: "by Kingโ€™s Cross" here is meaning #. author or creator of 'Terminal' #: src/kgx-window.c:616 msgid "Terminal (Kingโ€™s Cross)" msgstr "Terminal (Kingโ€™s Cross)" #: src/kgx-window.c:681 msgid "_About Terminal" msgstr "ร€ _propos de Terminal" #: src/kgx-window.ui:20 msgid "Shrink text" msgstr "Rรฉduire le texte" #: src/kgx-window.ui:33 msgid "Reset size" msgstr "Rรฉinitialiser la taille" #: src/kgx-window.ui:46 msgid "Enlarge text" msgstr "Agrandir le texte" #: src/kgx-window.ui:63 msgid "_New Window" msgstr "_Nouvelle fenรชtre" #: src/kgx-window.ui:75 msgid "_Keyboard Shortcuts" msgstr "_Raccourcis clavier" #: src/kgx-window.ui:82 msgid "_About Kingโ€™s Cross" msgstr "ร€ _propos de Kingโ€™s Cross" #: src/kgx-window.ui:83 msgid "About this program" msgstr "ร€ propos de ce programme" #: src/kgx-window.ui:106 msgid "Find in terminal" msgstr "Rechercher dans le terminal" #: src/kgx-window.ui:124 msgid "Menu" msgstr "Menu" #: src/kgx-window.ui:142 msgid "New Tab" msgstr "Nouvel onglet" #: src/menus.ui:7 msgid "_Open Link" msgstr "_Ouvrir le lien" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Copier le _lien" #: src/menus.ui:19 msgid "_Copy" msgstr "_Copier" #: src/menus.ui:29 msgid "_Select All" msgstr "Tout _sรฉlectionner" #: src/menus.ui:36 msgid "Show in _Files" msgstr "Montrer dans _fichiers" #: src/menus.ui:45 msgid "_Close" msgstr "_Fermer" #: src/menus.ui:49 msgid "_Detach" msgstr "_Dรฉtacher" #: src/kgx-close-dialog.ui:6 msgid "Close Terminal" msgstr "Fermer le terminal" #: src/kgx-close-dialog.ui:25 msgid "" "Some commands are still running, closing this terminal will kill them and " "may lead to unexpected outcomes" msgstr "" "Certaines commandes sont toujours en cours dโ€™exรฉcution, fermer ce terminal " "va tuer leur processus et pourrait mener ร  des situations inattendues" #: src/kgx-close-dialog.ui:64 msgid "_OK" msgstr "_Valider" #~ msgid "Read Only โ€” Command exited with code %i" #~ msgstr "Lecture seule โ€” La commande s'est terminรฉe avec le code %i" #~ msgid "Read Only โ€” Command exited" #~ msgstr "Lecture seule โ€” La commande est terminรฉe" #~ msgid "Failed to start โ€” %s" #~ msgstr "ร‰chec de lancement โ€” %s" #~ msgid "Command completed" #~ msgstr "Commande exรฉcutรฉe" gnome-console-42~beta/po/fur.po000066400000000000000000000147231420277463100166670ustar00rootroot00000000000000# 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 , YEAR. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/ZanderBrown/kgx/issues\n" "POT-Creation-Date: 2020-10-18 12:19+0000\n" "PO-Revision-Date: 2020-10-20 12:28+0200\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.4.1\n" "Last-Translator: Fabio Tomat \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "Language: fur\n" #. Translators: This is a train station, see README.md for more info #: data/org.gnome.zbrown.KingsCross.desktop.in:4 #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:8 src/kgx-application.c:439 #: src/kgx-window.c:618 src/kgx-window.ui:102 src/main.c:38 msgid "Kingโ€™s Cross" msgstr "King's Cross" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross.desktop.in:9 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "comant:prompt;cmd;rie di comant;shell;terminรขl;kgx;kings cross;" #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:3 src/main.c:35 msgid "Terminal" msgstr "Terminรขl" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;" msgstr "comant:prompt;cmd;rie di comant;shell;terminรขl;kgx;" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:9 src/kgx-application.c:441 #: src/kgx-window.c:609 msgid "Terminal Emulator" msgstr "Emuladรดr di terminรขl" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "Un sempliรง e facil emuladรดr di terminรขl pal scritori GNOME." #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:22 msgid "Terminal window" msgstr "Barcon dal terminรขl" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:52 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Aplicazion" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Gnรปf barcon" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "New Tab" msgstr "Gnove schede" #: src/help-overlay.ui:33 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminรขl" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Find" msgstr "Cรฎr" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Copy" msgstr "Copie" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Paste" msgstr "Tache" #. Translators: This is the name of the timeout that looks for programs #. running in the terminal #: src/kgx-application.c:267 msgid "child watcher" msgstr "osservadรดr di procรจs fi" #. Translators: The leading # is intentional, the initial %s is the #. version of King's Cross itself, the latter format is the VTE version #: src/kgx-application.c:413 #, c-format msgid "# Kingโ€™s Cross %s using VTE %u.%u.%u %s\n" msgstr "# King's Cross %s che al dopre VTE %u.%u.%u %s\n" #: src/kgx-application.c:425 src/kgx-window.c:601 #, c-format msgid "Copyright ยฉ %s Zander Brown" msgstr "Copyright ยฉ %s Zander Brown" #: src/kgx-application.c:545 msgid "Execute the argument to this option inside the terminal" msgstr "Al eseguรฌs l'argoment di cheste opzion tal terminรขl" #: src/kgx-application.c:554 msgid "Set the working directory" msgstr "Configure la cartele di lavรดr" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:556 msgid "DIRNAME" msgstr "NONDIR" #: src/kgx-application.c:564 msgid "Wait until the child exits (TODO)" msgstr "Spiete fintremai che il procรจs fi al finissi (DI Fร‚)" #: src/kgx-terminal.c:413 msgid "You are pasting a command that runs as an administrator" msgstr "Tu stรขs tacant un comant che al ven eseguรฎt come aministradรดr" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:416 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Sigurรขsi di savรช ce che al fรขs il comant:\n" "%s" #: src/kgx-terminal.c:421 src/kgx-close-dialog.ui:56 msgid "_Cancel" msgstr "_Anule" #: src/kgx-terminal.c:424 src/menus.ui:24 msgid "_Paste" msgstr "_Tache" #. Translators: Credit yourself here #: src/kgx-window.c:608 msgid "translator-credits" msgstr "Fabio Tomat , 2020." #. Translators: "by Kingโ€™s Cross" here is meaning #. author or creator of 'Terminal' #: src/kgx-window.c:616 msgid "Terminal (Kingโ€™s Cross)" msgstr "Terminรขl (Kingโ€™s Cross)" #: src/kgx-window.c:681 msgid "_About Terminal" msgstr "I_nformazions su Terminรขl" #: src/kgx-window.ui:20 msgid "Shrink text" msgstr "Scurte il test" #: src/kgx-window.ui:33 msgid "Reset size" msgstr "Ripristine dimension" #: src/kgx-window.ui:46 msgid "Enlarge text" msgstr "Slargje il test" #: src/kgx-window.ui:63 msgid "_New Window" msgstr "_Gnรปf barcon" #: src/kgx-window.ui:75 msgid "_Keyboard Shortcuts" msgstr "Scurtis di _tastiere" #: src/kgx-window.ui:82 msgid "_About Kingโ€™s Cross" msgstr "I_nformazions su Kingโ€™s Cross" #: src/kgx-window.ui:83 msgid "About this program" msgstr "Informazions su chest program" #: src/kgx-window.ui:110 msgid "Find in terminal" msgstr "Cjate tal terminรขl" #: src/kgx-window.ui:128 msgid "Menu" msgstr "Menรน" #: src/kgx-window.ui:146 msgid "New Tab" msgstr "Gnove schede" #: src/menus.ui:7 msgid "_Open Link" msgstr "_Vierรง colegament" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Copie _colegament" #: src/menus.ui:19 msgid "_Copy" msgstr "_Copie" #: src/menus.ui:29 msgid "_Select All" msgstr "_Selezione dut" #: src/menus.ui:36 msgid "Show in _Files" msgstr "Mostre in _Files" #: src/menus.ui:45 msgid "_Close" msgstr "_Siere" #: src/menus.ui:49 msgid "_Detach" msgstr "_Distache" #: src/kgx-close-dialog.ui:6 msgid "Close Terminal" msgstr "Siere il terminรขl" #: src/kgx-close-dialog.ui:25 msgid "" "Some commands are still running, closing this terminal will kill them and " "may lead to unexpected outcomes" msgstr "" "Cualchi comant al รจ ancjemรฒ in esecuzion; sierant il terminรขl si coparร  " "chescj comants e al podarรจs puartรข a risultรขts inspietรขts" #: src/kgx-close-dialog.ui:64 msgid "_OK" msgstr "_Va ben" gnome-console-42~beta/po/gl.po000066400000000000000000000210121420277463100164620ustar00rootroot00000000000000# Galician translation for console. # Copyright (C) 2022 console's COPYRIGHT HOLDER # This file is distributed under the same license as the console package. # FIRST AUTHOR , YEAR. # Fran Diรฉguez , 2022. # msgid "" msgstr "" "Project-Id-Version: console main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/console/issues\n" "POT-Creation-Date: 2022-01-02 23:25+0000\n" "PO-Revision-Date: 2022-02-07 07:21+0100\n" "Last-Translator: Fran Diรฉguez \n" "Language-Team: Galician \n" "Language: gl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Gtranslator 41.0\n" "X-DL-Team: gl\n" "X-DL-Module: console\n" "X-DL-Branch: main\n" "X-DL-Domain: po\n" "X-DL-State: Translating\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #: data/org.gnome.Console.desktop.in.in:3 #: data/org.gnome.Console.metainfo.xml.in.in:8 src/kgx-application.h:46 msgid "Console" msgstr "Consola" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.Console.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "orde;prompt;cmd;liรฑa de ores;executar;shell;terminal;kgx;kings cross;" #: data/org.gnome.Console.desktop.in.in:21 msgid "New Window" msgstr "Nova xanela" #: data/org.gnome.Console.desktop.in.in:27 src/kgx-window.ui:168 msgid "New Tab" msgstr "Nova lapela" #: data/org.gnome.Console.metainfo.xml.in.in:9 src/kgx-application.c:556 msgid "Terminal Emulator" msgstr "Emulador de terminal" #: data/org.gnome.Console.metainfo.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "Un emulador de terminal simple e amigรกbel para o escritorio GNOME." #: data/org.gnome.Console.metainfo.xml.in.in:30 msgid "Terminal window" msgstr "Xanela de terminal" #: data/org.gnome.Console.metainfo.xml.in.in:75 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Aplicaciรณn" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Nova xanela" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminal" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Buscar" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Copiar" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "Pegar" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "Lapelas" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "Nova lapela" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "Pechar lapela" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "Seguinte lapela" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "Anterior lapela" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "Trocar รก lapela" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:528 #, c-format msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# KGX %s usando VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:540 src/kgx-window.c:529 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:554 src/kgx-window.ui:115 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #: src/kgx-application.c:558 msgid "GPL 3.0 or later" msgstr "GPL 3.0 ou posterior" #: src/kgx-application.c:691 msgid "Execute the argument to this option inside the terminal" msgstr "Executar o argumento a esta opciรณn dentro da terminal" #: src/kgx-application.c:700 msgid "Set the working directory" msgstr "Estabelecer o cartafol de traballo" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:702 msgid "DIRNAME" msgstr "NOMEDIR" #: src/kgx-application.c:710 msgid "Wait until the child exits (TODO)" msgstr "Agardar ate que o fillo saia (TODO)" #: src/kgx-application.c:719 msgid "Set the initial window title" msgstr "Estabelecer o tรญtulo inicial da xanela" #: src/kgx-application.c:728 msgid "ADVANCED: Set the shell to launch" msgstr "AVANZADO: Estabelece a shell a iniciar" #: src/kgx-application.c:737 msgid "ADVANCED: Set the scrollback length" msgstr "AVANZADO: Estabelecer a lonxitude do desprazamento cara atrรกs" #: src/kgx-application.h:44 msgid "Console (Development)" msgstr "Consola (Desenvolvemento)" #: src/kgx-close-dialog.c:52 msgid "Close Window?" msgstr "Desexa pechar a xanela?" #: src/kgx-close-dialog.c:53 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "Algunhas ordes aรญnda estรกn executรกndose, se pecha esta xanela matarรกnse e " "pode levar a resultados non esperados" #: src/kgx-close-dialog.c:58 msgid "Close Tab?" msgstr "Pechar a lapela?" #: src/kgx-close-dialog.c:59 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "Algunhas ordes aรญnda estรกn executรกndose, ao pechar esta xanela matarรกas e " "pode derivar en resultados non agardados" #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:740 msgid "_Cancel" msgstr "_Cancelar" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "_Pechar" #: src/kgx-pages.ui:47 msgid "_Detach Tab" msgstr "_Desancorar lapela" #: src/kgx-pages.ui:53 msgid "_Close" msgstr "_Pechar" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:121 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "Sรณ lectura โ€” A orde saรญu co cรณdigo%i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:130 msgid "Read Only โ€” Command exited" msgstr "Sรณ lectura โ€” A orde saรญu" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:162 #, c-format msgid "Failed to start โ€” %s" msgstr "Produciuse un fallo ao iniciar โ€” %s" #: src/kgx-tab.c:1184 msgid "Command completed" msgstr "Orde completa" #: src/kgx-tab-button.ui:5 msgid "View Open Tabs" msgstr "Ver lapelas abertas" #: src/kgx-terminal.c:732 msgid "You are pasting a command that runs as an administrator" msgstr "Estรก pegando unha orde que se executa como un administrador" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:735 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Asegรบrese que sabe que fai a orde:\n" "%s" #: src/kgx-terminal.c:743 src/menus.ui:24 msgid "_Paste" msgstr "_Pegar" #: src/kgx-theme-switcher.ui:18 msgid "Use System Colors" msgstr "Usar cores do sistema" #: src/kgx-theme-switcher.ui:47 msgid "Use Light Colors" msgstr "Usar cores claras" #: src/kgx-theme-switcher.ui:76 msgid "Use Dark Colors" msgstr "Usar cores escuras" #. Translators: Credit yourself here #: src/kgx-window.c:535 msgid "translator-credits" msgstr "Fran Diรฉguez , 2021." #: src/kgx-window.ui:26 msgid "Shrink Text" msgstr "Reducir texto" #: src/kgx-window.ui:39 msgid "Reset Size" msgstr "Reiniciar tamaรฑo" #: src/kgx-window.ui:52 msgid "Enlarge Text" msgstr "Agrandar texto" #: src/kgx-window.ui:74 msgid "_New Window" msgstr "_Nova xanela" #: src/kgx-window.ui:86 msgid "_Keyboard Shortcuts" msgstr "ยญ_Atallos de teclado" #: src/kgx-window.ui:93 msgid "_About Console" msgstr "_Sobre Consola" #: src/kgx-window.ui:94 msgid "About this Program" msgstr "Sobre este programa" #: src/kgx-window.ui:123 msgid "Find in Terminal" msgstr "Buscar no terminal" #: src/kgx-window.ui:141 msgid "Menu" msgstr "Menรบ" #: src/menus.ui:7 msgid "_Open Link" msgstr "_Abrir ligazรณn" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Copiar _ligazรณn" #: src/menus.ui:19 msgid "_Copy" msgstr "_Copiar" #: src/menus.ui:29 msgid "_Select All" msgstr "_Seleccionar todo" #: src/menus.ui:36 msgid "Show in _Files" msgstr "Mostrar en _Ficheiros" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in Co_nsole (Devel)" msgstr "Abrir en Co_nsola (Desenvolvemento)" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Open in Co_nsole" msgstr "Abrir en Co_nsola" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "Iniciar una sesiรณn de terminar nesta localizaciรณn" gnome-console-42~beta/po/he.po000066400000000000000000000216741420277463100164720ustar00rootroot00000000000000# Hebrew translation for console. # Copyright (C) 2022 console's COPYRIGHT HOLDER # This file is distributed under the same license as the console package. # Yosef Or Boczko , 2022. # msgid "" msgstr "" "Project-Id-Version: console main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/console/issues\n" "POT-Creation-Date: 2022-02-14 00:49+0000\n" "PO-Revision-Date: 2022-02-14 17:38+0200\n" "Last-Translator: Yosef Or Boczko \n" "Language-Team: Hebrew \n" "Language: he\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : n==2 ? 1 : n>10 && n%10==0 ? " "2 : 3)\n" "X-Generator: Gtranslator 40.0\n" #: data/org.gnome.Console.desktop.in.in:3 #: data/org.gnome.Console.metainfo.xml.in.in:8 src/kgx-application.h:46 msgid "Console" msgstr "ืžืกื•ืฃ" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.Console.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "ืคืงื•ื“ื”;ื”ืคืขืœื”;cmd;ืฉื•ืจืช ืคืงื•ื“ื”;ืžืขื˜ืคืช;ืฉืœ;ื˜ืจืžื™ื ืœ;ืžืกื•ืฃ;kgx;" #: data/org.gnome.Console.desktop.in.in:21 msgid "New Window" msgstr "ื—ืœื•ืŸ ื—ื“ืฉ" #: data/org.gnome.Console.desktop.in.in:27 src/kgx-window.ui:168 msgid "New Tab" msgstr "ืœืฉื•ื ื™ืช ื—ื“ืฉื”" #: data/org.gnome.Console.metainfo.xml.in.in:9 src/kgx-application.c:556 msgid "Terminal Emulator" msgstr "ืžื“ืžื” ืžืกื•ืฃ" #: data/org.gnome.Console.metainfo.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "ืžื“ืžื” ืžืกื•ืฃ ืคืฉื•ื˜ ื•ื™ื“ื™ื“ื•ืชื™ ืœืžืฉืชืžืฉ ืขื‘ื•ื“ ืฉื•ืœื—ืŸ ื”ืขื‘ื•ื“ื” GNOME." #: data/org.gnome.Console.metainfo.xml.in.in:30 msgid "Terminal window" msgstr "ื—ืœื•ืŸ ื”ืžืกื•ืฃ" #: data/org.gnome.Console.metainfo.xml.in.in:75 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "ื™ื™ืฉื•ื" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "ื—ืœื•ืŸ ื—ื“ืฉ" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "ืžืกื•ืฃ" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "ื—ื™ืคื•ืฉ" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "ื”ืขืชืงื”" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "ื”ื“ื‘ืงื”" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "ืœืฉื•ื ื™ื•ืช" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "ืœืฉื•ื ื™ืช ื—ื“ืฉื”" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "ืกื’ื™ืจืช ืœืฉื•ื ื™ืช" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "ืœืฉื•ื ื™ืช ื”ื‘ืื”" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "ืœืฉื•ื ื™ืช ืงื•ื“ืžืช" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "ืžืขื‘ืจ ืœืœืฉื•ื ื™ืช" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:528 #, c-format msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# KGX %s using VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:540 src/kgx-window.c:525 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:554 src/kgx-window.ui:115 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #: src/kgx-application.c:558 msgid "GPL 3.0 or later" msgstr "โ€ซGPL-3.0โ€Ž ืื• ื’ืจืกื” ืžืื•ื—ืจืช ื™ื•ืชืจ" #: src/kgx-application.c:689 msgid "Execute the argument to this option inside the terminal" msgstr "Execute the argument to this option inside the terminal" #: src/kgx-application.c:698 msgid "Set the working directory" msgstr "Set the working directory" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:700 msgid "DIRNAME" msgstr "DIRNAME" #: src/kgx-application.c:708 msgid "Wait until the child exits (TODO)" msgstr "Wait until the child exits (TODO)" #: src/kgx-application.c:717 msgid "Set the initial window title" msgstr "Set the initial window title" #: src/kgx-application.c:726 msgid "ADVANCED: Set the shell to launch" msgstr "ADVANCED: Set the shell to launch" #: src/kgx-application.c:735 msgid "ADVANCED: Set the scrollback length" msgstr "ADVANCED: Set the scrollback length" #: src/kgx-application.h:44 msgid "Console (Development)" msgstr "ืžืกื•ืฃ (ื‘ืคื™ืชื•ื—)" #: src/kgx-close-dialog.c:50 msgid "Close Window?" msgstr "ืœืกื’ื•ืจ ืืช ื”ื—ืœื•ืŸ?" #: src/kgx-close-dialog.c:51 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "ืžืกืคืจ ืชื”ืœื™ื›ื™ื ืขื“ื™ื™ืŸ ืคื•ืขืœื™ื. ืกื’ื™ืจืช ื”ื—ืœื•ืŸ ืชื—ืกืœ ืื•ืชื, ื“ื‘ืจ ืฉืขืฉื•ื™ ืœื”ื•ื‘ื™ืœ ืœืชื•ืฆืื•ืช " "ื‘ืœืชื™ ืฆืคื•ื™ื•ืช." #: src/kgx-close-dialog.c:56 msgid "Close Tab?" msgstr "ืœืกื’ื•ืจ ืืช ื”ืœืฉื•ื ื™ืช?" #: src/kgx-close-dialog.c:57 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "ืžืกืคืจ ืชื”ืœื™ื›ื™ื ืขื“ื™ื™ืŸ ืคื•ืขืœื™ื. ืกื’ื™ืจืช ื”ืœืฉื•ื ื™ืช ืชื—ืกืœ ืื•ืชื, ื“ื‘ืจ ืฉืขืฉื•ื™ ืœื”ื•ื‘ื™ืœ ืœืชื•ืฆืื•ืช " "ื‘ืœืชื™ ืฆืคื•ื™ื•ืช." #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:780 msgid "_Cancel" msgstr "_ื‘ื™ื˜ื•ืœ" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "_ืกื’ื™ืจื”" #: src/kgx-pages.ui:47 msgid "_Detach Tab" msgstr "_ื ื™ืชื•ืง ืœืฉื•ื ื™ืช" #: src/kgx-pages.ui:53 msgid "_Close" msgstr "_ืกื’ื™ืจื”" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:119 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "โ€ืงืจื™ืื” ื‘ืœื‘ื“ โ€” ื”ืคืงื•ื“ื” ื”ืกืชื™ื™ืžื” ืขื ืงื•ื“ ื™ืฆื™ืื” %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:128 msgid "Read Only โ€” Command exited" msgstr "โ€ืงืจื™ืื” ื‘ืœื‘ื“ โ€” ื”ืคืงื•ื“ื” ื”ืกืชื™ื™ืžื”" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:160 #, c-format msgid "Failed to start โ€” %s" msgstr "โ€ืืจืข ื›ืฉืœ ื‘ื”ืคืขืœื” -โ€ %s" #: src/kgx-tab.c:1160 msgid "Command completed" msgstr "ืคืงื•ื“ื” ื”ื•ืฉืœืžื”" #: src/kgx-tab-button.ui:5 msgid "View Open Tabs" msgstr "ื”ืฆื’ืช ืœืฉื•ื ื™ื•ืช ืคืชื•ื—ื•ืช" #: src/kgx-terminal.c:772 msgid "You are pasting a command that runs as an administrator" msgstr "ื”ื“ื‘ืงืช ืคืงื•ื“ื” ืฉืจืฆื” ื›ืžื ื”ืœ" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:775 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "ื™ืฉ ืœื•ื•ื“ื ื›ื™ ื”ื ืš ื™ื•ื“ืข ืžื” ื”ืคืงื•ื“ื” ืขื•ืฉื”:\n" "%s" #: src/kgx-terminal.c:783 src/menus.ui:24 msgid "_Paste" msgstr "ื”_ื“ื‘ืงื”" #: src/kgx-theme-switcher.ui:18 msgid "Use System Colors" msgstr "ืฉื™ืžื•ืฉ ื‘ืฆื‘ืขื™ ืžืขืจื›ืช" #: src/kgx-theme-switcher.ui:47 msgid "Use Light Colors" msgstr "ืฉื™ืžื•ืฉ ื‘ืฆื‘ืขื™ื ื‘ื”ื™ืจื™ื" #: src/kgx-theme-switcher.ui:76 msgid "Use Dark Colors" msgstr "ืฉื™ืžื•ืฉ ื‘ืฆื‘ืขื™ื ื›ื”ื™ื" #. Translators: Credit yourself here #: src/kgx-window.c:531 msgid "translator-credits" msgstr "" "ื™ื•ืกืฃ ืื•ืจ ื‘ื•ืฆืณืงื• \n" "\n" "ืžื™ื–ื ืชืจื’ื•ื GNOME ืœืขื‘ืจื™ืช" #: src/kgx-window.ui:26 msgid "Shrink Text" msgstr "ื”ืงื˜ื ืช ื˜ืงืกื˜" #: src/kgx-window.ui:39 msgid "Reset Size" msgstr "ืื™ืคื•ืก ื’ื•ื“ืœ" #: src/kgx-window.ui:52 msgid "Enlarge Text" msgstr "ื”ื’ื“ืœืช ื˜ืงืกื˜" #: src/kgx-window.ui:74 msgid "_New Window" msgstr "_ื—ืœื•ืŸ ื—ื“ืฉ" #: src/kgx-window.ui:86 msgid "_Keyboard Shortcuts" msgstr "_ืฆื™ืจื•ืคื™ ืžืงืฉื™ื" #: src/kgx-window.ui:93 msgid "_About Console" msgstr "_ืขืœ ืื•ื“ื•ืช ืžืกื•ืฃ" #: src/kgx-window.ui:94 msgid "About this Program" msgstr "ืขืœ ืื•ื“ื•ืช ืชื›ื ื” ื–ื•" #: src/kgx-window.ui:123 msgid "Find in Terminal" msgstr "ืœืžืฆื•ื ื‘ืžืกื•ืฃ" #: src/kgx-window.ui:141 msgid "Menu" msgstr "ืชืคืจื™ื˜" #: src/menus.ui:7 msgid "_Open Link" msgstr "_ืคืชื™ื—ืช ืงื™ืฉื•ืจ" #: src/menus.ui:12 msgid "Copy _Link" msgstr "ื”ืขืชืงืช _ืงื™ืฉื•ืจ" #: src/menus.ui:19 msgid "_Copy" msgstr "_ื”ืขืชืงื”" #: src/menus.ui:29 msgid "_Select All" msgstr "ื‘ื—ื™ืจืช ื”_ื›ื•ืœ" #: src/menus.ui:36 msgid "Show in _Files" msgstr "ื”ืฆื’ื” ื‘_ืงื‘ืฆื™ื" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in Co_nsole (Devel)" msgstr "ืคืชื™ื—ื” ื‘_ืžืกื•ืฃ (ืคื™ืชื•ื—)" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Open in Co_nsole" msgstr "ืคืชื™ื—ื” ื‘_ืžืกื•ืฃ" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "ื”ืคืขืœืช ืžืกื•ืฃ ื‘ืžื™ืงื•ื ื–ื”" gnome-console-42~beta/po/hr.po000066400000000000000000000221631420277463100165010ustar00rootroot00000000000000# Croatian translation for kgx. # Copyright (C) 2020 kgx's COPYRIGHT HOLDER # This file is distributed under the same license as the kgx package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: kgx master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/ZanderBrown/kgx/issues\n" "POT-Creation-Date: 2021-06-14 11:32+0000\n" "PO-Revision-Date: 2021-10-01 18:12+0200\n" "Last-Translator: gogo \n" "Language-Team: Croatian \n" "Language: hr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Poedit 2.3\n" #. Translators: This is a train station, see README.md for more info #: data/org.gnome.zbrown.KingsCross.desktop.in.in:4 #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:8 #: src/kgx-application.c:512 src/kgx-application.h:46 src/kgx-window.ui:100 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross.desktop.in.in:9 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "" "naredba;upit;cmd;naredbeni redak;pokreni;ljuska;terminal;kgx;kings cross;" #: data/org.gnome.zbrown.KingsCross.desktop.in.in:20 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:19 msgid "New Window" msgstr "Novi prozor" #: data/org.gnome.zbrown.KingsCross.desktop.in.in:26 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:25 #: src/kgx-window.ui:144 msgid "New Tab" msgstr "Nova kartica" #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:3 #: src/kgx-application.h:44 msgid "Terminal" msgstr "Terminal" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:9 #: src/kgx-application.c:514 src/kgx-window.c:512 msgid "Terminal Emulator" msgstr "Emulator terminala" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "" "Jednostavan korisniku prilagoฤ‘en emulator terminala za GNOME radno okruลพenje." #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:22 msgid "Terminal window" msgstr "Prozor terminala" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:52 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Aplikacija" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Novi prozor" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminal" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Pretraลพi" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Kopiraj" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "Zalijepi" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "Kartice" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "Nova kartica" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "Zatvori karticu" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "Sljedeฤ‡a kartica" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "Prijaลกnja kartica" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "Prebaci na karticu" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:486 #, c-format msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# KGX %s koristi VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:498 src/kgx-window.c:500 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:516 msgid "GPL 3.0 or later" msgstr "GPL 3.0 ili novija" #: src/kgx-application.c:647 msgid "Execute the argument to this option inside the terminal" msgstr "Izvrลกi argument za ovu moguฤ‡nost unutar terminala" #: src/kgx-application.c:656 msgid "Set the working directory" msgstr "Postavi radni direktorij" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:658 msgid "DIRNAME" msgstr "NAZIV DIREKTORIJA" #: src/kgx-application.c:666 msgid "Wait until the child exits (TODO)" msgstr "ฤŒekaj dok sadrลพajni proces postoji (ZADATAK)" #: src/kgx-application.c:675 msgid "Set the initial window title" msgstr "Postavi poฤetni naslov prozora" #: src/kgx-application.c:684 msgid "ADVANCED: Set the shell to launch" msgstr "NAPREDNO: Postavi ljusku za pokretanje" #: src/kgx-application.c:693 msgid "ADVANCED: Set the scrollback length" msgstr "NAPREDNO: Postavi duljinu vraฤ‡anja pomicanja" #: src/kgx-close-dialog.c:52 msgid "Close Window?" msgstr "Zatvori prozor?" #: src/kgx-close-dialog.c:53 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "Pojedine naredbe joลก uvijek se izvode, zatvaranje ovog prozora ฤ‡e ih ubiti " "ลกto moลพe dovesti do neoฤekivanog ishoda" #: src/kgx-close-dialog.c:58 msgid "Close Tab?" msgstr "Zatvori karticu?" #: src/kgx-close-dialog.c:59 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "Pojedine naredbe joลก uvijek se izvode, zatvaranje ove kartice ฤ‡e ih ubiti " "ลกto moลพe dovesti do neoฤekivanog ishoda" #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:675 msgid "_Cancel" msgstr "_Odustani" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "Z_atvori" #: src/kgx-pages.ui:46 msgid "_Detach Tab" msgstr "_Odvoji karticu" #: src/kgx-pages.ui:52 msgid "_Close" msgstr "_Zatvori" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:119 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "Samo ฤitanje โ€” Naredba je izaลกla s kรดdom %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:128 msgid "Read Only โ€” Command exited" msgstr "Samo ฤitanje โ€” Naredba je zavrลกila" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:160 #, c-format msgid "Failed to start โ€” %s" msgstr "Neuspjelo pokretanje โ€” %s" #: src/kgx-tab.c:1182 msgid "Command completed" msgstr "Naredba je zavrลกena" #: src/kgx-terminal.c:667 msgid "You are pasting a command that runs as an administrator" msgstr "" "Pokuลกavate zalijepiti naredbu koja je pokrenuta s administratorskim ovlastima" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:670 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Pobrinite se da znate ลกto naredba radi:\n" "%s" #: src/kgx-terminal.c:678 src/menus.ui:24 msgid "_Paste" msgstr "_Zalijepi" #. Translators: Credit yourself here #: src/kgx-window.c:506 msgid "translator-credits" msgstr "" "Launchpad Contributions:\n" " gogo https://launchpad.net/~trebelnik-stefina" #. Translators: Donโ€™t attempt to translate KGX, #. * treat it as a proper noun #: src/kgx-window.c:510 msgid "KGX Terminal Emulator" msgstr "KGX emulator terminala" #: src/kgx-window.c:605 msgid "_About Terminal" msgstr "_O Terminalu" #: src/kgx-window.ui:20 msgid "Shrink text" msgstr "Smanji tekst" #: src/kgx-window.ui:33 msgid "Reset size" msgstr "Izvorna veliฤina" #: src/kgx-window.ui:46 msgid "Enlarge text" msgstr "Uveฤ‡aj tekst" #: src/kgx-window.ui:63 msgid "_New Window" msgstr "_Novi prozor" #: src/kgx-window.ui:75 msgid "_Keyboard Shortcuts" msgstr "_Preฤaci tipkovnice" #: src/kgx-window.ui:82 msgid "_About Kingโ€™s Cross" msgstr "_O Kingโ€™s Crossu" #: src/kgx-window.ui:83 msgid "About this program" msgstr "O ovom programu" #: src/kgx-window.ui:108 msgid "Find in terminal" msgstr "Pretraลพi u terminalu" #: src/kgx-window.ui:126 msgid "Menu" msgstr "Izbornik" #: src/menus.ui:7 msgid "_Open Link" msgstr "_Otvori poveznicu" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Kopiraj _poveznicu" #: src/menus.ui:19 msgid "_Copy" msgstr "_Kopiraj" #: src/menus.ui:29 msgid "_Select All" msgstr "_Odaberi sve" #: src/menus.ui:36 msgid "Show in _Files" msgstr "Prikaลพi u _Datotekama" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in T_erminal" msgstr "Otvori u t_erminalu" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Op_en in Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "Pokreni sesiju terminala za ovu lokaciju" #~ msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;" #~ msgstr "naredba;upit;cmd;naredbeni redak;pokreni;ljuska;terminal;kgx;" #~ msgid "child watcher" #~ msgstr "promatraฤ podreฤ‘enog procesa" #~ msgid "Copyright ยฉ %s Zander Brown" #~ msgstr "Autorsko pravo ยฉ %s Zander Brown" #~ msgid "Terminal (Kingโ€™s Cross)" #~ msgstr "Terminal (Kingโ€™s Cross)" #~ msgid "_OK" #~ msgstr "_U redu" gnome-console-42~beta/po/hu.po000066400000000000000000000160741420277463100165100ustar00rootroot00000000000000# Hungarian translation for kgx. # Copyright (C) 2019, 2021 Free Software Foundation, Inc. # This file is distributed under the same license as the kgx package. # # Balรกzs รšr , 2019, 2021. msgid "" msgstr "" "Project-Id-Version: kgx master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/ZanderBrown/kgx/issues\n" "POT-Creation-Date: 2020-05-28 23:21+0000\n" "PO-Revision-Date: 2021-02-15 01:32+0100\n" "Last-Translator: Balรกzs รšr \n" "Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Lokalize 19.12.3\n" #. Translators: This is a train station, see README.md for more info #: data/org.gnome.zbrown.KingsCross.desktop.in:4 #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:8 src/kgx-application.c:440 #: src/kgx-window.c:630 src/kgx-window.ui:98 src/main.c:38 msgid "Kingโ€™s Cross" msgstr "A kirรกly keresztje" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross.desktop.in:9 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "" "parancs;bekรฉrรฉs;cmd;parancssor;futtatรกs;parancsรฉrtelmezล‘;terminรกl;kgx;kirรกly;" "keresztje;" #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:3 src/main.c:35 msgid "Terminal" msgstr "Terminรกl" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;" msgstr "parancs;bekรฉrรฉs;cmd;parancssor;futtatรกs;parancsรฉrtelmezล‘;terminรกl;kgx;" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:9 src/kgx-application.c:442 #: src/kgx-window.c:621 msgid "Terminal Emulator" msgstr "Terminรกlemulรกtor" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "Egy egyszerลฑ, felhasznรกlรณbarรกt terminรกlemulรกtor a GNOME asztalhoz." #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:22 msgid "Terminal window" msgstr "Terminรกlablak" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:52 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Alkalmazรกs" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "รšj ablak" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "New Tab" msgstr "รšj lap" #: src/help-overlay.ui:33 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminรกl" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Find" msgstr "Keresรฉs" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Copy" msgstr "Mรกsolรกs" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Paste" msgstr "Beillesztรฉs" #. Translators: This is the name of the timeout that looks for programs #. running in the terminal #: src/kgx-application.c:269 msgid "child watcher" msgstr "gyermek megfigyelล‘" #. Translators: The leading # is intentional, the initial %s is the #. version of King's Cross itself, the latter format is the VTE version #: src/kgx-application.c:414 #, c-format msgid "# Kingโ€™s Cross %s using VTE %u.%u.%u %s\n" msgstr "# A kirรกly keresztje %s VTE %u.%u.%u %s hasznรกlatรกval\n" #: src/kgx-application.c:426 src/kgx-window.c:613 #, c-format msgid "Copyright ยฉ %s Zander Brown" msgstr "Copyright ยฉ %s Zander Brown" #: src/kgx-application.c:546 msgid "Execute the argument to this option inside the terminal" msgstr "Az argumentum vรฉgrehajtรกsa erre a kapcsolรณra a terminรกlon belรผl" #: src/kgx-application.c:555 msgid "Set the working directory" msgstr "A munkakรถnyvtรกr beรกllรญtรกsa" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:557 msgid "DIRNAME" msgstr "Kร–NYVTรRNร‰V" #: src/kgx-application.c:565 msgid "Wait until the child exits (TODO)" msgstr "Vรกrakozรกs a gyermek kilรฉpรฉsรฉig (TODO)" #: src/kgx-terminal.c:413 msgid "You are pasting a command that runs as an administrator" msgstr "Olyan parancsot illeszt be, amely rendszergazdakรฉnt fut" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:416 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Gyล‘zล‘djรถn meg arrรณl, hogy pontosan tudja-e, mit csinรกl a parancs:\n" "%s" #: src/kgx-terminal.c:421 src/kgx-close-dialog.ui:56 msgid "_Cancel" msgstr "_Mรฉgse" #: src/kgx-terminal.c:424 src/menus.ui:24 msgid "_Paste" msgstr "_Beillesztรฉs" #. Translators: Credit yourself here #: src/kgx-window.c:620 msgid "translator-credits" msgstr "รšr Balรกzs , 2019." #. Translators: "by Kingโ€™s Cross" here is meaning #. author or creator of 'Terminal' #: src/kgx-window.c:628 msgid "Terminal (Kingโ€™s Cross)" msgstr "Terminรกl (A kirรกly keresztje)" #: src/kgx-window.c:693 msgid "_About Terminal" msgstr "A Terminรกl _nรฉvjegye" #: src/kgx-window.ui:20 msgid "Shrink text" msgstr "Szรถveg csรถkkentรฉse" #: src/kgx-window.ui:33 msgid "Reset size" msgstr "Mรฉret visszaรกllรญtรกsa" #: src/kgx-window.ui:46 msgid "Enlarge text" msgstr "Szรถveg nรถvelรฉse" #: src/kgx-window.ui:63 msgid "_New Window" msgstr "รš_j ablak" #: src/kgx-window.ui:75 msgid "_Keyboard Shortcuts" msgstr "_Gyorsbillentyลฑk" #: src/kgx-window.ui:82 msgid "_About Kingโ€™s Cross" msgstr "A kirรกly keresztjรฉnek _nรฉvjegye" #: src/kgx-window.ui:83 msgid "About this program" msgstr "A program nรฉvjegye" #: src/kgx-window.ui:106 msgid "Find in terminal" msgstr "Keresรฉs terminรกlban" #: src/kgx-window.ui:124 msgid "Menu" msgstr "Menรผ" #: src/kgx-window.ui:142 msgid "New Tab" msgstr "รšj lap" #: src/menus.ui:7 msgid "_Open Link" msgstr "_Hivatkozรกs megnyitรกsa" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Hi_vatkozรกs mรกsolรกsa" #: src/menus.ui:19 msgid "_Copy" msgstr "_Mรกsolรกs" #: src/menus.ui:29 msgid "_Select All" msgstr "ร–sszes _kijelรถlรฉse" #: src/menus.ui:36 msgid "Show in _Files" msgstr "Megjelenรญtรฉs a _Fรกjlokban" #: src/menus.ui:45 msgid "_Close" msgstr "_Bezรกrรกs" #: src/menus.ui:49 msgid "_Detach" msgstr "_Levรกlasztรกs" #: src/kgx-close-dialog.ui:6 msgid "Close Terminal" msgstr "Terminรกl bezรกrรกsa" #: src/kgx-close-dialog.ui:25 msgid "" "Some commands are still running, closing this terminal will kill them and " "may lead to unexpected outcomes" msgstr "" "Nรฉhรกny parancs mรฉg mindig fut, a terminรกl bezรกrรกsa ki fogja lล‘ni azokat, รฉs " "ez vรกratlan eredmรฉnyekhez vezethet" #: src/kgx-close-dialog.ui:64 msgid "_OK" msgstr "_Rendben" #~ msgid "Read Only โ€” Command exited with code %i" #~ msgstr "Csak olvashatรณ โ€” A parancs kilรฉpett %i kรณddal" #~ msgid "Read Only โ€” Command exited" #~ msgstr "Csak olvashatรณ โ€” A parancs kilรฉpett" #~ msgid "Failed to start โ€” %s" #~ msgstr "Indรญtรกs sikertelen โ€” %s" #~ msgid "Command completed" #~ msgstr "Parancs befejezve" gnome-console-42~beta/po/id.po000066400000000000000000000220141420277463100164570ustar00rootroot00000000000000# Indonesian translation for kgx. # Copyright (C) 2020 kgx's COPYRIGHT HOLDER # This file is distributed under the same license as the kgx package. # Kukuh Syafaat , 2020-2021. # msgid "" msgstr "" "Project-Id-Version: kgx master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/ZanderBrown/kgx/issues\n" "POT-Creation-Date: 2021-10-04 23:53+0000\n" "PO-Revision-Date: 2021-10-16 10:49+0700\n" "Last-Translator: Kukuh Syafaat \n" "Language-Team: Indonesian \n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 3.0\n" #. Translators: This is a train station, see README.md for more info #: data/org.gnome.zbrown.KingsCross.desktop.in.in:4 #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:8 #: src/kgx-application.c:512 src/kgx-application.h:46 src/kgx-window.ui:104 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross.desktop.in.in:9 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "" "perintah;prompt;cmd;baris perintah;jalankan;shell;terminal;kgx;kings cross;" #: data/org.gnome.zbrown.KingsCross.desktop.in.in:22 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:21 msgid "New Window" msgstr "Jendela Baru" #: data/org.gnome.zbrown.KingsCross.desktop.in.in:28 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:27 #: src/kgx-window.ui:157 msgid "New Tab" msgstr "Tab Baru" #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:3 #: src/kgx-application.h:44 msgid "Terminal" msgstr "Terminal" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:9 #: src/kgx-application.c:514 src/kgx-window.c:530 msgid "Terminal Emulator" msgstr "Emulator Terminal" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "Emulator terminal sederhana yang mudah digunakan untuk destop GNOME." #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:30 msgid "Terminal window" msgstr "Jendela terminal" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:60 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Aplikasi" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Jendela Baru" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminal" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Cari" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Salin" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "Tempel" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "Tab" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "Tab Baru" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "Tutup Tab" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "Tab Berikutnya" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "Tab Sebelumnya" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "Beralih ke Tab" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:486 #, c-format msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# KGX %s menggunakan VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:498 src/kgx-window.c:518 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:516 msgid "GPL 3.0 or later" msgstr "GPL 3.0 atau yang lebih baru" #: src/kgx-application.c:647 msgid "Execute the argument to this option inside the terminal" msgstr "Jalankan argumen untuk opsi ini di dalam terminal" #: src/kgx-application.c:656 msgid "Set the working directory" msgstr "Atur direktori kerja" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:658 msgid "DIRNAME" msgstr "NAMA-DIREKTORI" #: src/kgx-application.c:666 msgid "Wait until the child exits (TODO)" msgstr "Tunggu sampai anak keluar (TODO)" #: src/kgx-application.c:675 msgid "Set the initial window title" msgstr "Atur judul jendela awal" #: src/kgx-application.c:684 msgid "ADVANCED: Set the shell to launch" msgstr "LANJUTAN: Setel shell untuk diluncurkan" #: src/kgx-application.c:693 msgid "ADVANCED: Set the scrollback length" msgstr "TINGKAT LANJUT: Atur panjang gulir balik" #: src/kgx-close-dialog.c:52 msgid "Close Window?" msgstr "Tutup Jendela?" #: src/kgx-close-dialog.c:53 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "Beberapa perintah masih berjalan, menutup jendela ini akan membunuh mereka " "dan dapat menyebabkan hasil yang tak terduga" #: src/kgx-close-dialog.c:58 msgid "Close Tab?" msgstr "Tutup Tab?" #: src/kgx-close-dialog.c:59 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "Beberapa perintah masih berjalan, menutup tab ini akan membunuh mereka dan " "dapat menyebabkan hasil yang tak terduga" #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:675 msgid "_Cancel" msgstr "_Batal" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "_Tutup" #: src/kgx-pages.ui:47 msgid "_Detach Tab" msgstr "_Lepas Tab" #: src/kgx-pages.ui:53 msgid "_Close" msgstr "_Tutup" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:119 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "Hanya Baca โ€” Perintah keluar dengan kode %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:128 msgid "Read Only โ€” Command exited" msgstr "Hanya Baca โ€” Perintah keluar" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:160 #, c-format msgid "Failed to start โ€” %s" msgstr "Gagal untuk memulai โ€” %s" #: src/kgx-tab.c:1182 msgid "Command completed" msgstr "Perintah selesai" #: src/kgx-tab-button.ui:5 msgid "View open tabs" msgstr "Lihat tab yang terbuka" #: src/kgx-terminal.c:667 msgid "You are pasting a command that runs as an administrator" msgstr "Anda menempelkan perintah yang dijalankan sebagai administrator" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:670 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Pastikan Anda tahu apa yang dilakukan perintah:\n" "%s" #: src/kgx-terminal.c:678 src/menus.ui:24 msgid "_Paste" msgstr "Tem_pel" #. Translators: Credit yourself here #: src/kgx-window.c:524 msgid "translator-credits" msgstr "Kukuh Syafaat , 2020-2021." #. Translators: Donโ€™t attempt to translate KGX, #. * treat it as a proper noun #: src/kgx-window.c:528 msgid "KGX Terminal Emulator" msgstr "Emulator Terminal KGX" #: src/kgx-window.c:638 msgid "_About Terminal" msgstr "Tent_ang Terminal" #: src/kgx-window.ui:20 msgid "Shrink text" msgstr "Memperkecil teks" #: src/kgx-window.ui:33 msgid "Reset size" msgstr "Mengatur ulang ukuran" #: src/kgx-window.ui:46 msgid "Enlarge text" msgstr "Memperbesar teks" #: src/kgx-window.ui:63 msgid "_New Window" msgstr "Je_ndela Baru" #: src/kgx-window.ui:75 msgid "_Keyboard Shortcuts" msgstr "Pintasan Papan Ti_k" #: src/kgx-window.ui:82 msgid "_About Kingโ€™s Cross" msgstr "Tent_ang King's Cross" #: src/kgx-window.ui:83 msgid "About this program" msgstr "Tentang program ini" #: src/kgx-window.ui:112 msgid "Find in terminal" msgstr "Cari di terminal" #: src/kgx-window.ui:130 msgid "Menu" msgstr "Menu" #: src/menus.ui:7 msgid "_Open Link" msgstr "_Buka Tautan" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Salin A_lamat Taut" #: src/menus.ui:19 msgid "_Copy" msgstr "Sali_n" #: src/menus.ui:29 msgid "_Select All" msgstr "Pilih _Semua" #: src/menus.ui:36 msgid "Show in _Files" msgstr "Tampilkan pada B_erkas" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in T_erminal" msgstr "Buka dalam T_erminal" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Op_en in Kingโ€™s Cross" msgstr "Buk_a Kingโ€™s Cross" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "Memulai sesi terminal untuk lokasi ini" #~ msgid "Close Terminal" #~ msgstr "Tutup Terminal" #~ msgid "_OK" #~ msgstr "_Ok" #~ msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;" #~ msgstr "perintah;prompt;cmd;baris perintah;jalankan;shell;terminal;kgx;" #~ msgid "Terminal (Kingโ€™s Cross)" #~ msgstr "Terminal (King's Cross)" #~ msgid "child watcher" #~ msgstr "pengamat anak" #~ msgid "Copyright ยฉ %s Zander Brown" #~ msgstr "Hak Cipta ยฉ %s Zander Brown" gnome-console-42~beta/po/it.po000066400000000000000000000151741420277463100165100ustar00rootroot00000000000000# Italian translation for kgx # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Antonio Pandolfo , 2019. # msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/ZanderBrown/kgx/issues\n" "POT-Creation-Date: 2019-09-24 16:40+0000\n" "PO-Revision-Date: 2019-10-01 10:08+0200\n" "Last-Translator: Milo Casagrande \n" "Language-Team: Italian - Italia \n" "Language: it_IT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 2.2.3\n" #. Translators: This is a train station, see README.md for more info #: data/org.gnome.zbrown.KingsCross.desktop.in:4 #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:8 src/kgx-application.c:422 #: src/kgx-window.c:744 src/main.c:38 msgid "Kingโ€™s Cross" msgstr "King's Cross" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross.desktop.in:9 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "comando:prompt;cmd;riga di comando;shell;terminale;kgx;kings cross;" #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:3 src/main.c:35 msgid "Terminal" msgstr "Terminale" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;" msgstr "comando:prompt;cmd;riga di comando;shell;terminale;kgx;" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:9 src/kgx-application.c:424 #: src/kgx-window.c:735 msgid "Terminal Emulator" msgstr "Emulatore terminale" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "Un semplice e amichevole emulatore di terminale per il desktop GNOME." #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:22 msgid "Terminal window" msgstr "Finestra terminale" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:45 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Applicazione" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Nuova finestra" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminale" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Trova" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Copia" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "Incolla" #. Translators: This is the name of the timeout that looks for programs #. running in the terminal #: src/kgx-application.c:255 msgid "child watcher" msgstr "osservatore processi figli" #. Translators: The leading # is intentional, the initial %s is the #. version of King's Cross itself, the latter format is the VTE version #: src/kgx-application.c:396 #, c-format msgid "# Kingโ€™s Cross %s using VTE %u.%u.%u %s\n" msgstr "# King's Cross %s con VTE %u.%u.%u %s\n" #: src/kgx-application.c:408 src/kgx-window.c:727 #, c-format msgid "Copyright ยฉ %s Zander Brown" msgstr "Copyright ยฉ %s Zander Brown" #: src/kgx-application.c:528 msgid "Execute the argument to this option inside the terminal" msgstr "Esegue l'argomento su questa opzione all'interno del terminale" #: src/kgx-application.c:537 msgid "Set the working directory" msgstr "Imposta la directory di lavoro" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:539 msgid "DIRNAME" msgstr "NOMEDIR" #: src/kgx-application.c:547 msgid "Wait until the child exits (TODO)" msgstr "Aspetta sino a che il processo figlio termini" #: src/kgx-terminal.c:374 msgid "You are pasting a command that runs as an administrator" msgstr "Copiato un comando che viene eseguito come amministratore" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:377 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Assicurarsi di sapere cosa fa il comando:\n" "%s" #: src/kgx-terminal.c:382 src/kgx-close-dialog.ui:56 msgid "_Cancel" msgstr "A_nnulla" #: src/kgx-terminal.c:385 src/menus.ui:24 msgid "_Paste" msgstr "_Incolla" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-window.c:150 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "Solo lettura โ€” Comando terminato con codice %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-window.c:165 msgid "Read Only โ€” Command exited" msgstr "Solo lettura โ€” Comando terminato" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-window.c:202 #, c-format msgid "Failed to start โ€” %s" msgstr "Avvio non riuscito โ€” %s" #. Translators: Credit yourself here #: src/kgx-window.c:734 msgid "translator-credits" msgstr "" "Antonio Pandolfo , 2019\n" "Milo Casagrande , 2019" #. Translators: "by Kingโ€™s Cross" here is meaning #. author or creator of 'Terminal' #: src/kgx-window.c:742 #| msgid "" #| "Terminal\n" #| "by Kingโ€™s Cross" msgid "Terminal (Kingโ€™s Cross)" msgstr "Terminale (Kingโ€™s Cross)" #: src/kgx-window.c:844 msgid "_About Terminal" msgstr "I_nformazioni su Terminale" #: src/kgx-window.c:1024 msgid "Command completed" msgstr "Comando completato" #: src/kgx-window.ui:61 msgid "_New Window" msgstr "_Nuova finestra" #: src/kgx-window.ui:73 msgid "_Keyboard Shortcuts" msgstr "_Scorciatoie da tastiera" #: src/kgx-window.ui:80 msgid "_About Kingโ€™s Cross" msgstr "I_nformazioni su Kingโ€™s Cross" #: src/menus.ui:7 msgid "_Open Link" msgstr "_Apri collegamento" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Copia _collegamento" #: src/menus.ui:19 msgid "_Copy" msgstr "_Copia" #: src/menus.ui:29 msgid "_Select All" msgstr "_Seleziona tutto" #: src/menus.ui:36 msgid "Show in _Files" msgstr "Mostra in _File" #: src/kgx-close-dialog.ui:6 msgid "Close Terminal" msgstr "Chiudi terminale" #: src/kgx-close-dialog.ui:25 msgid "" "Some commands are still running, closing this terminal will kill them and " "may lead to unexpected outcomes" msgstr "" "Alcuni comandi sono ancora in esecuzione: la chiusura del terminale " "terminerร  questi comandi e potrebbe portare risultati non attesi" #: src/kgx-close-dialog.ui:64 msgid "_OK" msgstr "_Ok" gnome-console-42~beta/po/meson.build000066400000000000000000000000471420277463100176670ustar00rootroot00000000000000i18n.gettext(bin_name, preset: 'glib') gnome-console-42~beta/po/nl.po000066400000000000000000000223341420277463100165010ustar00rootroot00000000000000# Dutch translation for kgx. # Copyright (C) 2020 kgx's COPYRIGHT HOLDER # This file is distributed under the same license as the kgx package. # Nathan Follens , 2020-2021. # msgid "" msgstr "" "Project-Id-Version: kgx master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/ZanderBrown/kgx/issues\n" "POT-Creation-Date: 2021-06-14 11:32+0000\n" "PO-Revision-Date: 2021-09-07 14:39+0200\n" "Last-Translator: Nathan Follens \n" "Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0\n" #. Translators: This is a train station, see README.md for more info #: data/org.gnome.zbrown.KingsCross.desktop.in.in:4 #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:8 #: src/kgx-application.c:512 src/kgx-application.h:46 src/kgx-window.ui:100 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross.desktop.in.in:9 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "" "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" "opdrachtregel;opdrachtlijn;commandoregel;commandolijn;" #: data/org.gnome.zbrown.KingsCross.desktop.in.in:20 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:19 msgid "New Window" msgstr "Nieuw venster" #: data/org.gnome.zbrown.KingsCross.desktop.in.in:26 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:25 #: src/kgx-window.ui:144 msgid "New Tab" msgstr "Nieuw tabblad" #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:3 #: src/kgx-application.h:44 msgid "Terminal" msgstr "Terminal" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:9 #: src/kgx-application.c:514 src/kgx-window.c:512 msgid "Terminal Emulator" msgstr "Terminal-emulator" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "" "Een eenvoudige en gebruiksvriendelijke terminal-emulator voor het Gnome-" "bureaublad." #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:22 msgid "Terminal window" msgstr "Terminalvenster" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:52 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Toepassing" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Nieuw venster" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminal" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Zoeken" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Kopiรซren" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "Plakken" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "Tabbladen" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "Nieuw tabblad" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "Tabblad sluiten" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "Volgend tabblad" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "Vorig tabblad" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "Naar tabblad wisselen" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:486 #, c-format msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# KGX %s met VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:498 src/kgx-window.c:500 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:516 msgid "GPL 3.0 or later" msgstr "GPL 3.0 of later" #: src/kgx-application.c:647 msgid "Execute the argument to this option inside the terminal" msgstr "Voer het argument bij deze optie in de terminal uit" #: src/kgx-application.c:656 msgid "Set the working directory" msgstr "Stel de werkmap in" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:658 msgid "DIRNAME" msgstr "MAPNAAM" #: src/kgx-application.c:666 msgid "Wait until the child exits (TODO)" msgstr "Wachten tot het onderliggend proces afsluit (TODO)" #: src/kgx-application.c:675 msgid "Set the initial window title" msgstr "Stel de initiรซle venstertitel in" #: src/kgx-application.c:684 msgid "ADVANCED: Set the shell to launch" msgstr "GEAVANCEERD: stel de uit te voeren shell in" #: src/kgx-application.c:693 msgid "ADVANCED: Set the scrollback length" msgstr "GEAVANCEERD: stel de terugschuiflengte in" #: src/kgx-close-dialog.c:52 msgid "Close Window?" msgstr "Venster sluiten?" #: src/kgx-close-dialog.c:53 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "Er worden nog enkele opdrachten uitgevoerd, dit venster sluiten zal ze " "onmiddellijk beรซindigen en kan tot onverwachte resultaten leiden" #: src/kgx-close-dialog.c:58 msgid "Close Tab?" msgstr "Tabblad sluiten?" #: src/kgx-close-dialog.c:59 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "Er worden nog enkele opdrachten uitgevoerd, dit tabblad sluiten zal ze " "onmiddellijk beรซindigen en kan tot onverwachte resultaten leiden" #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:675 msgid "_Cancel" msgstr "Annu_leren" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "S_luiten" #: src/kgx-pages.ui:46 msgid "_Detach Tab" msgstr "Tabbla_d losmaken" #: src/kgx-pages.ui:52 msgid "_Close" msgstr "_Sluiten" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:119 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "Alleen-lezen โ€” opdracht afgesloten met code %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:128 msgid "Read Only โ€” Command exited" msgstr "Alleen-lezen โ€” Opdracht afgesloten" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:160 #, c-format msgid "Failed to start โ€” %s" msgstr "Starten mislukt โ€” %s" #: src/kgx-tab.c:1182 msgid "Command completed" msgstr "Opdracht voltooid" #: src/kgx-terminal.c:667 msgid "You are pasting a command that runs as an administrator" msgstr "U plakt een opdracht die uitgevoerd wordt met beheerdersrechten" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:670 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Zorg ervoor dat u zeker weet wat de opdracht doet:\n" "%s" #: src/kgx-terminal.c:678 src/menus.ui:24 msgid "_Paste" msgstr "_Plakken" #. Translators: Credit yourself here #: src/kgx-window.c:506 msgid "translator-credits" msgstr "" "Nathan Follens \n" "\n" "Meer info over Gnome-NL https://nl.gnome.org" #. Translators: Donโ€™t attempt to translate KGX, #. * treat it as a proper noun #: src/kgx-window.c:510 msgid "KGX Terminal Emulator" msgstr "KGX-terminal-emulator" #: src/kgx-window.c:605 msgid "_About Terminal" msgstr "_Over Terminal" #: src/kgx-window.ui:20 msgid "Shrink text" msgstr "Tekst verkleinen" #: src/kgx-window.ui:33 msgid "Reset size" msgstr "Originele grootte herstellen" #: src/kgx-window.ui:46 msgid "Enlarge text" msgstr "Tekst vergroten" #: src/kgx-window.ui:63 msgid "_New Window" msgstr "_Nieuw venster" #: src/kgx-window.ui:75 msgid "_Keyboard Shortcuts" msgstr "Snel_toetsen" #: src/kgx-window.ui:82 msgid "_About Kingโ€™s Cross" msgstr "_Over Kingโ€™s Cross" #: src/kgx-window.ui:83 msgid "About this program" msgstr "Over dit programma" #: src/kgx-window.ui:108 msgid "Find in terminal" msgstr "Zoeken in terminal" #: src/kgx-window.ui:126 msgid "Menu" msgstr "Menu" #: src/menus.ui:7 msgid "_Open Link" msgstr "Verwijzing _openen" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Verwijzing _kopiรซren" #: src/menus.ui:19 msgid "_Copy" msgstr "_Kopiรซren" #: src/menus.ui:29 msgid "_Select All" msgstr "Alles _selecteren" #: src/menus.ui:36 msgid "Show in _Files" msgstr "Tonen in _Bestanden" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in T_erminal" msgstr "Openen in t_erminal" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Op_en in Kingโ€™s Cross" msgstr "Op_enen in Kingโ€™s Cross" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "Terminalsessie starten vanaf deze locatie" #~ msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;" #~ msgstr "" #~ "command;prompt;cmd;commandline;run;shell;terminal;kgx;opdrachtregel;" #~ "opdrachtlijn;commandoregel;commandolijn;" #~ msgid "child watcher" #~ msgstr "Onderliggendproceswaarnemer" #~ msgid "Copyright ยฉ %s Zander Brown" #~ msgstr "Copyright ยฉ %s Zander Brown" #~ msgid "Terminal (Kingโ€™s Cross)" #~ msgstr "Terminal (Kingโ€™s Cross)" #~ msgid "_OK" #~ msgstr "_Okรฉ" gnome-console-42~beta/po/pl.po000066400000000000000000000213621420277463100165030ustar00rootroot00000000000000# Polish translation for console. # Copyright ยฉ 2019-2021 the console authors. # This file is distributed under the same license as the console package. # Piotr Drฤ…g , 2019-2021. # Aviary.pl , 2019-2021. # msgid "" msgstr "" "Project-Id-Version: console\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/console/issues\n" "POT-Creation-Date: 2021-12-30 21:38+0000\n" "PO-Revision-Date: 2021-12-12 14:40+0100\n" "Last-Translator: Piotr Drฤ…g \n" "Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: data/org.gnome.Console.desktop.in.in:3 #: data/org.gnome.Console.metainfo.xml.in.in:8 src/kgx-application.h:46 msgid "Console" msgstr "Konsola" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.Console.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "" "powล‚oka;shell;prompt;polecenie;komenda;wiersz poleceล„;linia poleceล„;wiersz " "komend;linia komend;cmd;konsola;terminal;kgx;kings cross;" #: data/org.gnome.Console.desktop.in.in:21 msgid "New Window" msgstr "Nowe okno" #: data/org.gnome.Console.desktop.in.in:27 src/kgx-window.ui:168 msgid "New Tab" msgstr "Nowa karta" #: data/org.gnome.Console.metainfo.xml.in.in:9 src/kgx-application.c:556 msgid "Terminal Emulator" msgstr "Emulator terminala" #: data/org.gnome.Console.metainfo.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "Prosty, ล‚atwy wย uลผyciu emulator terminala dla ล›rodowiska GNOME." #: data/org.gnome.Console.metainfo.xml.in.in:30 msgid "Terminal window" msgstr "Okno terminala" #: data/org.gnome.Console.metainfo.xml.in.in:75 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Program" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Nowe okno" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminal" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Wyszukiwanie" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Skopiowanie" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "Wklejenie" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "Karty" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "Nowa karta" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "Zamkniฤ™cie karty" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "Nastฤ™pna karta" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "Poprzednia karta" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "Przeล‚ฤ…czenie na kartฤ™" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:528 #, c-format msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# KGX %s, uลผywa biblioteki VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:540 src/kgx-window.c:529 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:554 src/kgx-window.ui:115 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #: src/kgx-application.c:558 msgid "GPL 3.0 or later" msgstr "GPL, wersja 3.0 lub pรณลบniejsza" #: src/kgx-application.c:691 msgid "Execute the argument to this option inside the terminal" msgstr "Wykonuje parametr do tej opcji wewnฤ…trz terminala" #: src/kgx-application.c:700 msgid "Set the working directory" msgstr "Ustawia katalog roboczy" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:702 msgid "DIRNAME" msgstr "NAZWA-KATALOGU" #: src/kgx-application.c:710 msgid "Wait until the child exits (TODO)" msgstr "Czeka, aลผ proces potomny zakoล„czy dziaล‚anie (niezaimplementowane)" #: src/kgx-application.c:719 msgid "Set the initial window title" msgstr "Ustawia poczฤ…tkowy tytuล‚ okna" #: src/kgx-application.c:728 msgid "ADVANCED: Set the shell to launch" msgstr "ZAAWANSOWANE: ustawia uruchamianฤ… powล‚okฤ™" #: src/kgx-application.c:737 msgid "ADVANCED: Set the scrollback length" msgstr "ZAAWANSOWANE: ustawia dล‚ugoล›ฤ‡ buforu przewijania" #: src/kgx-application.h:44 msgid "Console (Development)" msgstr "Konsola (wydanie rozwojowe)" #: src/kgx-close-dialog.c:52 msgid "Close Window?" msgstr "Zamknฤ…ฤ‡ okno?" #: src/kgx-close-dialog.c:53 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "Wย oknie uruchomione sฤ… polecenia. Zamkniฤ™cie go spowoduje ich zakoล„czenie " "iย moลผe doprowadziฤ‡ do ich bล‚ฤ™dnego dziaล‚ania." #: src/kgx-close-dialog.c:58 msgid "Close Tab?" msgstr "Zamknฤ…ฤ‡ kartฤ™?" #: src/kgx-close-dialog.c:59 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "Wย karcie uruchomione sฤ… polecenia. Zamkniฤ™cie jej spowoduje ich zakoล„czenie " "iย moลผe doprowadziฤ‡ do ich bล‚ฤ™dnego dziaล‚ania." #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:740 msgid "_Cancel" msgstr "_Anuluj" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "_Zamknij" #: src/kgx-pages.ui:47 msgid "_Detach Tab" msgstr "_Odล‚ฤ…cz kartฤ™" #: src/kgx-pages.ui:53 msgid "_Close" msgstr "Za_mknij" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:121 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "Tylko do odczytu โ€” polecenie zakoล„czyล‚o dziaล‚anie zย kodem %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:130 msgid "Read Only โ€” Command exited" msgstr "Tylko do odczytu โ€” polecenie zakoล„czyล‚o dziaล‚anie" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:162 #, c-format msgid "Failed to start โ€” %s" msgstr "Uruchomienie siฤ™ nie powiodล‚o โ€” %s" #: src/kgx-tab.c:1184 msgid "Command completed" msgstr "Ukoล„czono polecenie" #: src/kgx-tab-button.ui:5 msgid "View Open Tabs" msgstr "Wyล›wietla otwarte karty" #: src/kgx-terminal.c:732 msgid "You are pasting a command that runs as an administrator" msgstr "Wklejane jest polecenie wykonywane jako administrator" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:735 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Proszฤ™ siฤ™ upewniฤ‡, ลผe jest to wล‚aล›ciwe polecenie:\n" "%s" #: src/kgx-terminal.c:743 src/menus.ui:24 msgid "_Paste" msgstr "Wk_lej" #: src/kgx-theme-switcher.ui:18 msgid "Use System Colors" msgstr "Kolory systemowe" #: src/kgx-theme-switcher.ui:47 msgid "Use Light Colors" msgstr "Jasne kolory" #: src/kgx-theme-switcher.ui:76 msgid "Use Dark Colors" msgstr "Ciemne kolory" #. Translators: Credit yourself here #: src/kgx-window.c:535 msgid "translator-credits" msgstr "" "Piotr Drฤ…g , 2019-2021\n" "Aviary.pl , 2019-2021" #: src/kgx-window.ui:26 msgid "Shrink Text" msgstr "Pomniejsza tekst" #: src/kgx-window.ui:39 msgid "Reset Size" msgstr "Przywraca zwykล‚y rozmiar tekstu" #: src/kgx-window.ui:52 msgid "Enlarge Text" msgstr "Powiฤ™ksza tekst" #: src/kgx-window.ui:74 msgid "_New Window" msgstr "_Nowe okno" #: src/kgx-window.ui:86 msgid "_Keyboard Shortcuts" msgstr "_Skrรณty klawiszowe" #: src/kgx-window.ui:93 msgid "_About Console" msgstr "_Oย programie" #: src/kgx-window.ui:94 msgid "About this Program" msgstr "Informacje oย tym programie" #: src/kgx-window.ui:123 msgid "Find in Terminal" msgstr "Wyszukuje wย terminalu" #: src/kgx-window.ui:141 msgid "Menu" msgstr "Menu" #: src/menus.ui:7 msgid "_Open Link" msgstr "_Otwรณrz odnoล›nik" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Skopiuj o_dnoล›nik" #: src/menus.ui:19 msgid "_Copy" msgstr "S_kopiuj" #: src/menus.ui:29 msgid "_Select All" msgstr "Z_aznacz wszystko" #: src/menus.ui:36 msgid "Show in _Files" msgstr "_Wyล›wietl wย menedลผerze plikรณw" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in Co_nsole (Devel)" msgstr "Otwรณrz wย ko_nsoli (wydanie rozwojowe)" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Open in Co_nsole" msgstr "Otwรณrz wย ko_nsoli" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "Uruchamia sesjฤ™ terminala dla tego poล‚oลผenia" gnome-console-42~beta/po/pt.po000066400000000000000000000207231420277463100165130ustar00rootroot00000000000000# Portuguese translation for console. # Copyright (C) 2022 console's COPYRIGHT HOLDER # This file is distributed under the same license as the console package. # Hugo Carvalho , 2022. # msgid "" msgstr "" "Project-Id-Version: console main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/console/issues\n" "POT-Creation-Date: 2022-02-14 22:03+0000\n" "PO-Revision-Date: 2022-02-15 13:18+0000\n" "Last-Translator: Hugo Carvalho \n" "Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" #: data/org.gnome.Console.desktop.in.in:3 #: data/org.gnome.Console.metainfo.xml.in.in:8 src/kgx-application.h:46 msgid "Console" msgstr "Consola" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.Console.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "" "comando;command;prompt;cmd;consola;linha de comandos;commandline;executar;" "run;shell;terminal;kgx;kings cross;" #: data/org.gnome.Console.desktop.in.in:21 msgid "New Window" msgstr "Nova janela" #: data/org.gnome.Console.desktop.in.in:27 src/kgx-window.ui:168 msgid "New Tab" msgstr "Novo separador" #: data/org.gnome.Console.metainfo.xml.in.in:9 src/kgx-application.c:568 msgid "Terminal Emulator" msgstr "Emulador de terminal" #: data/org.gnome.Console.metainfo.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "" "Um emulador de terminal simples e fรกcil de usar para o ambiente de trabalho " "GNOME." #: data/org.gnome.Console.metainfo.xml.in.in:30 msgid "Terminal window" msgstr "Janela do terminal" #: data/org.gnome.Console.metainfo.xml.in.in:75 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Aplicaรงรฃo" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Nova janela" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminal" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Localizar" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Copiar" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "Colar" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "Separadores" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "Novo separador" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "Fechar separador" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "Separador seguinte" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "Separador anterior" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "Mudar para separador" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:540 #, c-format msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# KGX %s a usar VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:552 src/kgx-window.c:525 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:566 src/kgx-window.ui:115 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #: src/kgx-application.c:570 msgid "GPL 3.0 or later" msgstr "GPL 3.0 ou posterior" #: src/kgx-application.c:701 msgid "Execute the argument to this option inside the terminal" msgstr "Executa o argumento para esta opรงรฃo dentro do terminal" #: src/kgx-application.c:710 msgid "Set the working directory" msgstr "Define o diretรณrio de trabalho" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:712 msgid "DIRNAME" msgstr "NOME-DIR" #: src/kgx-application.c:720 msgid "Wait until the child exits (TODO)" msgstr "Aguarda atรฉ o sub-processo sair (ToDo)" #: src/kgx-application.c:729 msgid "Set the initial window title" msgstr "Define o tรญtulo da janela inicial" #: src/kgx-application.c:738 msgid "ADVANCED: Set the shell to launch" msgstr "AVANร‡ADO: Define o shell a lanรงar" #: src/kgx-application.c:747 msgid "ADVANCED: Set the scrollback length" msgstr "AVANร‡ADO: Define o comprimento do buffer de deslocamento (scrollback)" #: src/kgx-application.h:44 msgid "Console (Development)" msgstr "Consola (Desenvolvimento)" #: src/kgx-close-dialog.c:50 msgid "Close Window?" msgstr "Fechar janela?" #: src/kgx-close-dialog.c:51 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "Alguns comandos ainda estรฃo em execuรงรฃo, fechar esta janela vai terminรก-los " "e pode levar a resultados inesperados" #: src/kgx-close-dialog.c:56 msgid "Close Tab?" msgstr "Fechar o separador?" #: src/kgx-close-dialog.c:57 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "Alguns comandos ainda estรฃo em execuรงรฃo, fechar este separador vai terminรก-" "los e pode levar a resultados inesperados" #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:780 msgid "_Cancel" msgstr "_Cancelar" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "_Fechar" #: src/kgx-pages.ui:47 msgid "_Detach Tab" msgstr "_Desanexar separador" #: src/kgx-pages.ui:53 msgid "_Close" msgstr "_Fechar" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:168 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "Apenas leitura โ€” Comando encerrado com cรณdigo %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:177 msgid "Read Only โ€” Command exited" msgstr "Apenas leitura โ€” Comando encerrado" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:210 #, c-format msgid "Failed to start โ€” %s" msgstr "Falha ao iniciar โ€” %s" #: src/kgx-tab.c:1160 msgid "Command completed" msgstr "Comando concluรญdo" #: src/kgx-tab-button.ui:5 msgid "View Open Tabs" msgstr "Ver separadores abertos" #: src/kgx-terminal.c:772 msgid "You are pasting a command that runs as an administrator" msgstr "Estรก a colar um comando que executa como administrador" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:775 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Certifique-se de que sabe o que o comando faz:\n" "%s" #: src/kgx-terminal.c:783 src/menus.ui:24 msgid "_Paste" msgstr "C_olar" #: src/kgx-theme-switcher.ui:18 msgid "Use System Colors" msgstr "Usar cores do sistema" #: src/kgx-theme-switcher.ui:47 msgid "Use Light Colors" msgstr "Usar cores claras" #: src/kgx-theme-switcher.ui:76 msgid "Use Dark Colors" msgstr "Usar cores escuras" #. Translators: Credit yourself here #: src/kgx-window.c:531 msgid "translator-credits" msgstr "Hugo Carvalho " #: src/kgx-window.ui:26 msgid "Shrink Text" msgstr "Reduzir texto" #: src/kgx-window.ui:39 msgid "Reset Size" msgstr "Repor tamanho" #: src/kgx-window.ui:52 msgid "Enlarge Text" msgstr "Aumentar texto" #: src/kgx-window.ui:74 msgid "_New Window" msgstr "_Nova janela" #: src/kgx-window.ui:86 msgid "_Keyboard Shortcuts" msgstr "_Teclas de atalho" #: src/kgx-window.ui:93 msgid "_About Console" msgstr "_Acerca da Consola" #: src/kgx-window.ui:94 msgid "About this Program" msgstr "Acerca deste programa" #: src/kgx-window.ui:123 msgid "Find in Terminal" msgstr "Localizar no terminal" #: src/kgx-window.ui:141 msgid "Menu" msgstr "Menu" #: src/menus.ui:7 msgid "_Open Link" msgstr "Abrir ligaรงรฃ_o" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Copiar _ligaรงรฃo" #: src/menus.ui:19 msgid "_Copy" msgstr "_Copiar" #: src/menus.ui:29 msgid "_Select All" msgstr "_Selecionar tudo" #: src/menus.ui:36 msgid "Show in _Files" msgstr "Mostrar no Ficheiros" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in Co_nsole (Devel)" msgstr "Abrir na Co_nsola (Desenv.)" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Open in Co_nsole" msgstr "Abrir na Co_nsola" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "Inicia uma sessรฃo de terminal para este local" gnome-console-42~beta/po/pt_BR.po000066400000000000000000000215101420277463100170710ustar00rootroot00000000000000# Brazilian Portuguese translation for kgx. # Copyright (C) 2021 kgx's COPYRIGHT HOLDER # This file is distributed under the same license as the kgx package. # Rafael Fontenelle , 2019-2021. # Enrico Nicoletto , 2021. # msgid "" msgstr "" "Project-Id-Version: kgx master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/console/issues\n" "POT-Creation-Date: 2021-12-30 21:38+0000\n" "PO-Revision-Date: 2021-12-31 18:04-0300\n" "Last-Translator: Enrico Nicoletto \n" "Language-Team: Brazilian Portuguese \n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Generator: Poedit 3.0.1\n" #: data/org.gnome.Console.desktop.in.in:3 #: data/org.gnome.Console.metainfo.xml.in.in:8 src/kgx-application.h:46 msgid "Console" msgstr "Console" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.Console.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "" "comando;command;prompt;cmd;linha de comando;commandline;executar;run;shell;" "terminal;kgx;kings cross;" #: data/org.gnome.Console.desktop.in.in:21 msgid "New Window" msgstr "Nova janela" #: data/org.gnome.Console.desktop.in.in:27 src/kgx-window.ui:168 msgid "New Tab" msgstr "Nova aba" #: data/org.gnome.Console.metainfo.xml.in.in:9 src/kgx-application.c:556 msgid "Terminal Emulator" msgstr "Emulador de terminal" #: data/org.gnome.Console.metainfo.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "Um simples emulador de terminal fรกcil de usar para o ambiente GNOME." #: data/org.gnome.Console.metainfo.xml.in.in:30 msgid "Terminal window" msgstr "Janela do terminal" #: data/org.gnome.Console.metainfo.xml.in.in:75 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Aplicativo" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Nova janela" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminal" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Localiza" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Copia" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "Cola" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "Abas" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "Nova aba" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "Fechar aba" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "Prรณxima aba" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "Aba anterior" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "Alternar para aba" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:528 #, c-format msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# KGX %s usando VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:540 src/kgx-window.c:529 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:554 src/kgx-window.ui:115 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #: src/kgx-application.c:558 msgid "GPL 3.0 or later" msgstr "GPL 3.0 ou posterior" #: src/kgx-application.c:691 msgid "Execute the argument to this option inside the terminal" msgstr "Executa o argumento para essa opรงรฃo dentro do terminal" #: src/kgx-application.c:700 msgid "Set the working directory" msgstr "Define o diretรณrio de trabalho" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:702 msgid "DIRNAME" msgstr "NOME-DIR" #: src/kgx-application.c:710 msgid "Wait until the child exits (TODO)" msgstr "Aguarda atรฉ o filho sair (ToDo)" #: src/kgx-application.c:719 msgid "Set the initial window title" msgstr "Define o tรญtulo da janela inicial" #: src/kgx-application.c:728 msgid "ADVANCED: Set the shell to launch" msgstr "AVANร‡ADO: Define o shell a lanรงar" #: src/kgx-application.c:737 msgid "ADVANCED: Set the scrollback length" msgstr "AVANร‡ADO: Define o comprimento do buffer de rolagem (scrollback)" #: src/kgx-application.h:44 msgid "Console (Development)" msgstr "Console (Desenvolvimento)" #: src/kgx-close-dialog.c:52 msgid "Close Window?" msgstr "Fechar a janela?" #: src/kgx-close-dialog.c:53 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "Alguns comandos ainda estรฃo em execuรงรฃo, de forma que fechar esta janela vai " "encerrรก-los e pode levar a resultados inesperados" #: src/kgx-close-dialog.c:58 msgid "Close Tab?" msgstr "Fechar a aba?" #: src/kgx-close-dialog.c:59 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "Alguns comandos ainda estรฃo em execuรงรฃo, de forma que fechar esta aba vai " "encerrรก-los e pode levar a resultados inesperados" #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:740 msgid "_Cancel" msgstr "_Cancelar" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "_Fechar" #: src/kgx-pages.ui:47 msgid "_Detach Tab" msgstr "_Desanexar aba" #: src/kgx-pages.ui:53 msgid "_Close" msgstr "_Fechar" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:121 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "Somente leitura โ€” Comando encerrado com cรณdigo %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:130 msgid "Read Only โ€” Command exited" msgstr "Somente leitura โ€” Comando encerrado" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:162 #, c-format msgid "Failed to start โ€” %s" msgstr "Falha ao iniciar โ€” %s" #: src/kgx-tab.c:1184 msgid "Command completed" msgstr "Comando concluรญdo" #: src/kgx-tab-button.ui:5 msgid "View Open Tabs" msgstr "Ver abas abertas" #: src/kgx-terminal.c:732 msgid "You are pasting a command that runs as an administrator" msgstr "Vocรช estรก colando um comando que executa como um administrador" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:735 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Certifique-se que vocรช sabe o que o comando faz:\n" "%s" #: src/kgx-terminal.c:743 src/menus.ui:24 msgid "_Paste" msgstr "C_olar" #: src/kgx-theme-switcher.ui:18 msgid "Use System Colors" msgstr "Usar cores do sistema" #: src/kgx-theme-switcher.ui:47 msgid "Use Light Colors" msgstr "Usar cores claras" #: src/kgx-theme-switcher.ui:76 msgid "Use Dark Colors" msgstr "Usar cores escuras" #. Translators: Credit yourself here #: src/kgx-window.c:535 msgid "translator-credits" msgstr "" "Rafael Fontenelle \n" "Enrico Nicoletto " #: src/kgx-window.ui:26 msgid "Shrink Text" msgstr "Reduzir texto" #: src/kgx-window.ui:39 msgid "Reset Size" msgstr "Redefinir tamanho" #: src/kgx-window.ui:52 msgid "Enlarge Text" msgstr "Aumentar texto" #: src/kgx-window.ui:74 msgid "_New Window" msgstr "_Nova janela" #: src/kgx-window.ui:86 msgid "_Keyboard Shortcuts" msgstr "Atalhos de _teclado" #: src/kgx-window.ui:93 msgid "_About Console" msgstr "_Sobre o Console" #: src/kgx-window.ui:94 msgid "About this Program" msgstr "Sobre este programa" #: src/kgx-window.ui:123 msgid "Find in Terminal" msgstr "Localizar no terminal" #: src/kgx-window.ui:141 msgid "Menu" msgstr "Menu" #: src/menus.ui:7 msgid "_Open Link" msgstr "_Abrir link" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Copiar _link" #: src/menus.ui:19 msgid "_Copy" msgstr "_Copiar" #: src/menus.ui:29 msgid "_Select All" msgstr "_Selecionar tudo" #: src/menus.ui:36 msgid "Show in _Files" msgstr "Mostrar no _Arquivos" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in Co_nsole (Devel)" msgstr "Abrir no Co_nsole (Desenv.)" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Open in Co_nsole" msgstr "Abrir no Co_nsole" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "Inicia uma sessรฃo de terminal para este local" #~ msgid "Terminal" #~ msgstr "Terminal" #~ msgid "๐Ÿšง KGX Devel Build ๐Ÿšง" #~ msgstr "๐Ÿšง Build de Desenv. KGX ๐Ÿšง" #~ msgid "KGX Terminal Emulator" #~ msgstr "Emulador de terminal KGX" #~ msgid "_About Kingโ€™s Cross" #~ msgstr "_Sobre o Kingโ€™s Cross" #~ msgid "Op_en in Kingโ€™s Cross" #~ msgstr "Ab_rir no Kingโ€™s Cross" gnome-console-42~beta/po/ro.po000066400000000000000000000226221420277463100165100ustar00rootroot00000000000000# Romanian translation for kgx. # Copyright (C) 2020 kgx's COPYRIGHT HOLDER # This file is distributed under the same license as the kgx package. # Florentina Muศ™at , 2020. # msgid "" msgstr "" "Project-Id-Version: kgx master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/ZanderBrown/kgx/issues\n" "POT-Creation-Date: 2021-03-20 13:09+0000\n" "PO-Revision-Date: 2021-05-14 15:44+0300\n" "Last-Translator: Florentina Muศ™at \n" "Language-Team: Romanian \n" "Language: ro\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2);;\n" "X-Generator: Poedit 2.4.3\n" #. Translators: This is a train station, see README.md for more info #: data/org.gnome.zbrown.KingsCross.desktop.in:4 #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:8 src/kgx-application.c:512 #: src/kgx-window.c:520 src/kgx-window.c:553 src/kgx-window.ui:101 #: src/main.c:37 msgid "Kingโ€™s Cross" msgstr "Intersecศ›ia regelui" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross.desktop.in:9 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "" "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;comandฤƒ;" "linie de comandฤƒ;intersecศ›ia regelui;" #: data/org.gnome.zbrown.KingsCross.desktop.in:20 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:19 msgid "New Window" msgstr "Fereastrฤƒ nouฤƒ" #: data/org.gnome.zbrown.KingsCross.desktop.in:26 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:25 src/kgx-window.ui:145 msgid "New Tab" msgstr "Filฤƒ nouฤƒ" #: data/org.gnome.zbrown.KingsCross-generic.desktop.in:3 src/kgx-window.c:518 #: src/kgx-window.c:551 src/main.c:35 msgid "Terminal" msgstr "Terminal" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:9 src/kgx-application.c:514 #: src/kgx-window.c:512 msgid "Terminal Emulator" msgstr "Emulator de terminal" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "" "Un emulator de terminal simplu uศ™or de utilizat pentru desktopul GNOME." #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:22 msgid "Terminal window" msgstr "Fereastrฤƒ de terminal" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in:52 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Aplicaศ›ie" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Fereastrฤƒ nouฤƒ" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminal" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Cautฤƒ" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Copiazฤƒ" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "Lipeศ™te" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "File" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "Filฤƒ nouฤƒ" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "รŽnchide fila" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "Fila urmฤƒtoare" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "Fila anterioarฤƒ" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "Comutฤƒ la fila" #. Translators: The leading # is intentional, the initial %s is the #. version of King's Cross itself, the latter format is the VTE version #: src/kgx-application.c:486 #, c-format msgid "# Kingโ€™s Cross %s using VTE %u.%u.%u %s\n" msgstr "# Intersecศ›ia regelui %s utilizรขnd VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:498 src/kgx-window.c:500 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:516 msgid "GPL 3.0 or later" msgstr "GPL 3.0 sau o versiune ulterioarฤƒ" #: src/kgx-application.c:647 msgid "Execute the argument to this option inside the terminal" msgstr "Executฤƒ argumentul de la aceastฤƒ opศ›iune รฎnฤƒuntrul terminalului" #: src/kgx-application.c:656 msgid "Set the working directory" msgstr "Stabiliศ›i directorul de lucru" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:658 msgid "DIRNAME" msgstr "NUMEDIR" #: src/kgx-application.c:666 msgid "Wait until the child exits (TODO)" msgstr "Aศ™teptaศ›i pรขnฤƒ ce inferiorul iese (DEFฤ‚CUT)" #: src/kgx-application.c:675 msgid "Set the initial window title" msgstr "Stabileศ™te titlul iniศ›ial al ferestrei" #: src/kgx-application.c:684 msgid "ADVANCED: Set the shell to launch" msgstr "AVANSAT: Stabileศ™te shell-ul de lansat" #: src/kgx-application.c:693 msgid "ADVANCED: Set the scrollback length" msgstr "AVANSAT: Stabileศ™te lungimea derulฤƒrii รฎnapoi" #: src/kgx-close-dialog.c:52 msgid "Close Window?" msgstr "Se รฎnchide fereastra?" #: src/kgx-close-dialog.c:53 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "Unele comenzi รฎncฤƒ ruleazฤƒ, รฎnchiderea acestei ferestre le va termina ศ™i " "poate conduce la rezultate neaศ™teptate" #: src/kgx-close-dialog.c:58 msgid "Close Tab?" msgstr "Se รฎnchide fila?" #: src/kgx-close-dialog.c:59 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "Unele comenzi รฎncฤƒ ruleazฤƒ, รฎnchiderea acestei file le va termina ศ™i poate " "conduce la rezultate neaศ™teptate" #: src/kgx-close-dialog.ui:23 src/kgx-terminal.c:675 msgid "_Cancel" msgstr "_Anuleazฤƒ" #: src/kgx-close-dialog.ui:31 msgid "C_lose" msgstr "รŽ_nchide" #: src/kgx-pages.ui:41 msgid "_Detach Tab" msgstr "_Detaศ™eazฤƒ fila" #: src/kgx-pages.ui:47 msgid "_Close" msgstr "รŽn_chide" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:119 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "Doar citire โ€” Comanda a ieศ™it cu codul %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:128 msgid "Read Only โ€” Command exited" msgstr "Doar citire โ€” Comanda a ieศ™it" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:160 #, c-format msgid "Failed to start โ€” %s" msgstr "Nu s-a putut porni โ€” %s" #: src/kgx-tab.c:1192 msgid "Command completed" msgstr "Comandฤƒ completatฤƒ" #: src/kgx-terminal.c:667 msgid "You are pasting a command that runs as an administrator" msgstr "Lipiศ›i o comandฤƒ care ruleazฤƒ ca administrator" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:670 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Asiguraศ›i-vฤƒ cฤƒ ศ™tiศ›i ce face comanda:\n" "%s" #: src/kgx-terminal.c:678 src/menus.ui:24 msgid "_Paste" msgstr "Li_peศ™te" #. Translators: Credit yourself here #: src/kgx-window.c:506 msgid "translator-credits" msgstr "" "Florentina Muศ™at , " "2020-2021" #. Translators: Donโ€™t attempt to translate KGX, #. * treat it as a proper noun #: src/kgx-window.c:510 msgid "KGX Terminal Emulator" msgstr "Emulator de Terminal KGX" #: src/kgx-window.c:613 msgid "_About Terminal" msgstr "Despre Termin_al" #: src/kgx-window.ui:20 msgid "Shrink text" msgstr "Micศ™oreazฤƒ textul" #: src/kgx-window.ui:33 msgid "Reset size" msgstr "Restabileศ™te dimensiunea" #: src/kgx-window.ui:46 msgid "Enlarge text" msgstr "Mฤƒreศ™te textul" #: src/kgx-window.ui:63 msgid "_New Window" msgstr "Fereastrฤƒ _nouฤƒ" #: src/kgx-window.ui:75 msgid "_Keyboard Shortcuts" msgstr "Scurtฤƒturi de _tastaturฤƒ" #: src/kgx-window.ui:82 msgid "_About Kingโ€™s Cross" msgstr "Despre Intersecศ›i_a regelui" #: src/kgx-window.ui:83 msgid "About this program" msgstr "Despre acest program" #: src/kgx-window.ui:109 msgid "Find in terminal" msgstr "Gฤƒseศ™te รฎn terminal" #: src/kgx-window.ui:127 msgid "Menu" msgstr "Meniu" #: src/menus.ui:7 msgid "_Open Link" msgstr "_Deschide legฤƒtura" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Copiazฤƒ _legฤƒtura" #: src/menus.ui:19 msgid "_Copy" msgstr "_Copiazฤƒ" #: src/menus.ui:29 msgid "_Select All" msgstr "_Selecteazฤƒ toate" #: src/menus.ui:36 msgid "Show in _Files" msgstr "Aratฤƒ รฎn _fiศ™iere" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in T_erminal" msgstr "Deschide รฎn T_erminal" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Op_en in Kingโ€™s Cross" msgstr "D_eschide รฎn Intersecศ›ia regelui" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "รŽncepe o sesiune de terminal pentru aceastฤƒ locaศ›ie" #~ msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;" #~ msgstr "" #~ "command;prompt;cmd;commandline;run;shell;terminal;kgx;comandฤƒ;linie de " #~ "comandฤƒ;" #~ msgid "child watcher" #~ msgstr "observator inferior" #~ msgid "Copyright ยฉ %s Zander Brown" #~ msgstr "Drepturi de autor ยฉ %s Zander Brown" #~ msgid "Terminal (Kingโ€™s Cross)" #~ msgstr "Terminal (Intersecศ›ia regelui)" #~ msgid "_OK" #~ msgstr "_OK" gnome-console-42~beta/po/ru.po000066400000000000000000000235171420277463100165220ustar00rootroot00000000000000# Russian translation for console. # Copyright (C) 2022 console's COPYRIGHT HOLDER # This file is distributed under the same license as the console package. # Aleksandr Melman , 2022. # msgid "" msgstr "" "Project-Id-Version: console main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/console/issues\n" "POT-Creation-Date: 2022-01-18 01:08+0000\n" "PO-Revision-Date: 2022-01-24 17:34+0300\n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "Last-Translator: Aleksandr Melman \n" "X-Generator: Poedit 3.0\n" #: data/org.gnome.Console.desktop.in.in:3 #: data/org.gnome.Console.metainfo.xml.in.in:8 src/kgx-application.h:46 msgid "Console" msgstr "ะšะพะฝัะพะปัŒ" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.Console.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" #: data/org.gnome.Console.desktop.in.in:21 msgid "New Window" msgstr "ะะพะฒะพะต ะžะบะฝะพ" #: data/org.gnome.Console.desktop.in.in:27 src/kgx-window.ui:168 msgid "New Tab" msgstr "ะะพะฒะฐั ะ’ะบะปะฐะดะบะฐ" #: data/org.gnome.Console.metainfo.xml.in.in:9 src/kgx-application.c:556 msgid "Terminal Emulator" msgstr "ะญะผัƒะปัั‚ะพั€ ะขะตั€ะผะธะฝะฐะปะฐ" #: data/org.gnome.Console.metainfo.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "ะŸั€ะพัั‚ะพะน ะธ ัƒะดะพะฑะฝั‹ะน ัะผัƒะปัั‚ะพั€ ั‚ะตั€ะผะธะฝะฐะปะฐ ะดะปั ั€ะฐะฑะพั‡ะตะณะพ ัั‚ะพะปะฐ GNOME." #: data/org.gnome.Console.metainfo.xml.in.in:30 msgid "Terminal window" msgstr "ะžะบะฝะพ ั‚ะตั€ะผะธะฝะฐะปะฐ" #: data/org.gnome.Console.metainfo.xml.in.in:75 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "ะŸั€ะธะปะพะถะตะฝะธะต" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "ะะพะฒะพะต ะžะบะฝะพ" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "ะขะตั€ะผะธะฝะฐะป" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "ะะฐะนั‚ะธ" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "ะšะพะฟะธั€ะพะฒะฐั‚ัŒ" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "ะ’ัั‚ะฐะฒะธั‚ัŒ" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "ะ’ะบะปะฐะดะบะธ" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "ะะพะฒะฐั ะ’ะบะปะฐะดะบะฐ" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "ะ—ะฐะบั€ั‹ั‚ัŒ ะ’ะบะปะฐะดะบัƒ" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "ะกะปะตะดัƒัŽั‰ะฐั ะ’ะบะปะฐะดะบะฐ" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "ะŸั€ะตะดั‹ะดัƒั‰ะฐั ะ’ะบะปะฐะดะบะฐ" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "ะŸะตั€ะตะบะปัŽั‡ะธั‚ัŒัั ะฝะฐ ะ’ะบะปะฐะดะบัƒ" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:528 #, c-format msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# KGX %s ั ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะตะผ VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:540 src/kgx-window.c:525 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:554 src/kgx-window.ui:115 msgid "Kingโ€™s Cross" msgstr "ะšะธะฝะณั-ะšั€ะพัั" #: src/kgx-application.c:558 msgid "GPL 3.0 or later" msgstr "GPL 3.0 ะธะปะธ ะฑะพะปะตะต ะฟะพะทะดะฝัั" #: src/kgx-application.c:689 msgid "Execute the argument to this option inside the terminal" msgstr "ะ’ั‹ะฟะพะปะฝะธั‚ัŒ ะฐั€ะณัƒะผะตะฝั‚ ัั‚ะพะน ะพะฟั†ะธะธ ะฒ ั‚ะตั€ะผะธะฝะฐะปะต" #: src/kgx-application.c:698 msgid "Set the working directory" msgstr "ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ ั€ะฐะฑะพั‡ัƒัŽ ะฟะฐะฟะบัƒ" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:700 msgid "DIRNAME" msgstr "ะ˜ะœะฏ ะŸะะŸะšะ˜" #: src/kgx-application.c:708 msgid "Wait until the child exits (TODO)" msgstr "ะŸะพะดะพะถะดะธั‚ะต, ะฟะพะบะฐ ะดะพั‡ะตั€ะฝะธะน ะฟั€ะพั†ะตัั ะทะฐะฒะตั€ัˆะธั‚ัั (ะ—ะะ”ะะงะ)" #: src/kgx-application.c:717 msgid "Set the initial window title" msgstr "ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ ะฝะฐั‡ะฐะปัŒะฝั‹ะน ะทะฐะณะพะปะพะฒะพะบ ะพะบะฝะฐ" #: src/kgx-application.c:726 msgid "ADVANCED: Set the shell to launch" msgstr "ะ”ะžะŸะžะ›ะะ˜ะขะ•ะ›ะฌะะž: ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ ะพะฑะพะปะพั‡ะบัƒ ะดะปั ะทะฐะฟัƒัะบะฐ" #: src/kgx-application.c:735 msgid "ADVANCED: Set the scrollback length" msgstr "ะ”ะžะŸะžะ›ะะ˜ะขะ•ะ›ะฌะะž: ะฃัั‚ะฐะฝะพะฒะธั‚ัŒ ะดะปะธะฝัƒ ะฟั€ะพะบั€ัƒั‚ะบะธ" #: src/kgx-application.h:44 msgid "Console (Development)" msgstr "ะšะพะฝัะพะปัŒ (ะ ะฐะทั€ะฐะฑะพั‚ะบะฐ)" #: src/kgx-close-dialog.c:50 msgid "Close Window?" msgstr "ะ—ะฐะบั€ั‹ั‚ัŒ ะžะบะฝะพ?" #: src/kgx-close-dialog.c:51 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "ะะตะบะพั‚ะพั€ั‹ะต ะบะพะผะฐะฝะดั‹ ะฒัะต ะตั‰ะต ะฒั‹ะฟะพะปะฝััŽั‚ัั, ะทะฐะบั€ั‹ั‚ะธะต ัั‚ะพะณะพ ะพะบะฝะฐ ะฟั€ะธะฒะตะดะตั‚ ะบ ะธั… " "ะทะฐะฒะตั€ัˆะตะฝะธัŽ ะธ ะผะพะถะตั‚ ะฟั€ะธะฒะตัั‚ะธ ะบ ะฝะตะพะถะธะดะฐะฝะฝั‹ะผ ะฟะพัะปะตะดัั‚ะฒะธัะผ" #: src/kgx-close-dialog.c:56 msgid "Close Tab?" msgstr "ะ—ะฐะบั€ั‹ั‚ัŒ ะ’ะบะปะฐะดะบัƒ?" #: src/kgx-close-dialog.c:57 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "ะะตะบะพั‚ะพั€ั‹ะต ะบะพะผะฐะฝะดั‹ ะฒัะต ะตั‰ะต ะฒั‹ะฟะพะปะฝััŽั‚ัั, ะทะฐะบั€ั‹ั‚ะธะต ัั‚ะพะน ะฒะบะปะฐะดะบะธ ะฟั€ะธะฒะตะดะตั‚ ะบ ะธั… " "ะทะฐะฒะตั€ัˆะตะฝะธัŽ ะธ ะผะพะถะตั‚ ะฟั€ะธะฒะตัั‚ะธ ะบ ะฝะตะพะถะธะดะฐะฝะฝั‹ะผ ะฟะพัะปะตะดัั‚ะฒะธัะผ" #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:732 msgid "_Cancel" msgstr "_ะžั‚ะผะตะฝะธั‚ัŒ" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "ะ—_ะฐะบั€ั‹ั‚ัŒ" #: src/kgx-pages.ui:47 msgid "_Detach Tab" msgstr "_ะžั‚ัะพะตะดะธะฝะธั‚ัŒ ะ’ะบะปะฐะดะบัƒ" #: src/kgx-pages.ui:53 msgid "_Close" msgstr "_ะ—ะฐะบั€ั‹ั‚ัŒ" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:119 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "ะขะพะปัŒะบะพ ะดะปั ะงั‚ะตะฝะธั โ€” ะšะพะผะฐะฝะดะฐ ะทะฐะฒะตั€ัˆะธะปะฐััŒ ั ะบะพะดะพะผ %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:128 msgid "Read Only โ€” Command exited" msgstr "ะขะพะปัŒะบะพ ะดะปั ะงั‚ะตะฝะธั โ€” ะšะพะผะฐะฝะดะฐ ะทะฐะฒะตั€ัˆะตะฝะฐ" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:160 #, c-format msgid "Failed to start โ€” %s" msgstr "ะะต ัƒะดะฐะปะพััŒ ะฝะฐั‡ะฐั‚ัŒ โ€” %s" #: src/kgx-tab.c:1160 msgid "Command completed" msgstr "ะšะพะผะฐะฝะดะฐ ะฒั‹ะฟะพะปะฝะตะฝะฐ" #: src/kgx-tab-button.ui:5 msgid "View Open Tabs" msgstr "ะŸั€ะพัะผะพั‚ั€ะตั‚ัŒ ะžั‚ะบั€ั‹ั‚ั‹ะต ะ’ะบะปะฐะดะบะธ" #: src/kgx-terminal.c:724 msgid "You are pasting a command that runs as an administrator" msgstr "ะ’ั‹ ะฒัั‚ะฐะฒะปัะตั‚ะต ะบะพะผะฐะฝะดัƒ, ะบะพั‚ะพั€ะฐั ะฒั‹ะฟะพะปะฝัะตั‚ัั ะพั‚ ะธะผะตะฝะธ ะฐะดะผะธะฝะธัั‚ั€ะฐั‚ะพั€ะฐ" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:727 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "ะฃะฑะตะดะธั‚ะตััŒ, ั‡ั‚ะพ ะฒั‹ ะทะฝะฐะตั‚ะต, ั‡ั‚ะพ ะดะตะปะฐะตั‚ ะบะพะผะฐะฝะดะฐ:\n" "%s" #: src/kgx-terminal.c:735 src/menus.ui:24 msgid "_Paste" msgstr "_ะ’ัั‚ะฐะฒะธั‚ัŒ" #: src/kgx-theme-switcher.ui:18 msgid "Use System Colors" msgstr "ะ˜ัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะกะธัั‚ะตะผะฝั‹ะต ะฆะฒะตั‚ะฐ" #: src/kgx-theme-switcher.ui:47 msgid "Use Light Colors" msgstr "ะ˜ัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะกะฒะตั‚ะปั‹ะต ะฆะฒะตั‚ะฐ" #: src/kgx-theme-switcher.ui:76 msgid "Use Dark Colors" msgstr "ะ˜ัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะขะตะผะฝั‹ะต ะฆะฒะตั‚ะฐ" #. Translators: Credit yourself here #: src/kgx-window.c:531 msgid "translator-credits" msgstr "Aleksandr Melman , 2022" #: src/kgx-window.ui:26 msgid "Shrink Text" msgstr "ะฃะผะตะฝัŒัˆะธั‚ัŒ ะขะตะบัั‚" #: src/kgx-window.ui:39 msgid "Reset Size" msgstr "ะกะฑั€ะพั ะ ะฐะทะผะตั€ะฐ" #: src/kgx-window.ui:52 msgid "Enlarge Text" msgstr "ะฃะฒะตะปะธั‡ะธั‚ัŒ ะขะตะบัั‚" #: src/kgx-window.ui:74 msgid "_New Window" msgstr "_ะะพะฒะพะต ะžะบะฝะพ" #: src/kgx-window.ui:86 msgid "_Keyboard Shortcuts" msgstr "_ะšะพะผะฑะธะฝะฐั†ะธะธ ะšะปะฐะฒะธัˆ" #: src/kgx-window.ui:93 msgid "_About Console" msgstr "_ะž ะŸั€ะพะณั€ะฐะผะผะต" #: src/kgx-window.ui:94 msgid "About this Program" msgstr "ะžะฑ ัั‚ะพะน ะŸั€ะพะณั€ะฐะผะผะต" #: src/kgx-window.ui:123 msgid "Find in Terminal" msgstr "ะะฐะนั‚ะธ ะฒ ะขะตั€ะผะธะฝะฐะปะต" #: src/kgx-window.ui:141 msgid "Menu" msgstr "ะœะตะฝัŽ" #: src/menus.ui:7 msgid "_Open Link" msgstr "_ะžั‚ะบั€ั‹ั‚ัŒ ะกัั‹ะปะบัƒ" #: src/menus.ui:12 msgid "Copy _Link" msgstr "ะšะพะฟะธั€ะพะฒะฐั‚ัŒ _ะกัั‹ะปะบัƒ" #: src/menus.ui:19 msgid "_Copy" msgstr "_ะšะพะฟะธั€ะพะฒะฐั‚ัŒ" #: src/menus.ui:29 msgid "_Select All" msgstr "_ะ’ั‹ะฑั€ะฐั‚ัŒ ะ’ัะต" #: src/menus.ui:36 msgid "Show in _Files" msgstr "ะŸะพะบะฐะทะฐั‚ัŒ ะฒ _ะคะฐะนะปะฐั…" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in Co_nsole (Devel)" msgstr "ะžั‚ะบั€ั‹ั‚ัŒ ะฒ ะšะพ_ะฝัะพะปะต (ะ ะฐะทั€ะฐะฑะพั‚ะบะฐ)" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Open in Co_nsole" msgstr "ะžั‚ะบั€ั‹ั‚ัŒ ะฒ ะšะพ_ะฝัะพะปะต" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "ะ—ะฐะฟัƒัั‚ะธั‚ัŒ ัะตะฐะฝั ั‚ะตั€ะผะธะฝะฐะปะฐ ะดะปั ัั‚ะพะณะพ ั€ะฐัะฟะพะปะพะถะตะฝะธั" gnome-console-42~beta/po/sl.po000066400000000000000000000177711420277463100165170ustar00rootroot00000000000000# Slovenian translation for kgx. # Copyright (C) 2020 kgx's COPYRIGHT HOLDER # This file is distributed under the same license as the kgx package. # # Matej Urbanฤiฤ , 2020โ€“2022. # msgid "" msgstr "" "Project-Id-Version: kgx master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/console/issues\n" "POT-Creation-Date: 2021-12-30 21:38+0000\n" "PO-Revision-Date: 2022-02-14 22:56+0100\n" "Last-Translator: Matej Urbanฤiฤ \n" "Language-Team: Slovenian GNOME Translation Team \n" "Language: sl_SI\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n" "%100==4 ? 3 : 0);\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Poedit 3.0\n" #: data/org.gnome.Console.desktop.in.in:3 #: data/org.gnome.Console.metainfo.xml.in.in:8 src/kgx-application.h:46 msgid "Console" msgstr "Konzola" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.Console.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "ukaz;cmd;ukazna vrstica;zagon;lupina;terminal;kgx;" #: data/org.gnome.Console.desktop.in.in:21 msgid "New Window" msgstr "Novo okno" #: data/org.gnome.Console.desktop.in.in:27 src/kgx-window.ui:168 msgid "New Tab" msgstr "Nov zavihek" #: data/org.gnome.Console.metainfo.xml.in.in:9 src/kgx-application.c:556 msgid "Terminal Emulator" msgstr "Posnemovalnik terminala" #: data/org.gnome.Console.metainfo.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "" #: data/org.gnome.Console.metainfo.xml.in.in:30 msgid "Terminal window" msgstr "Okno terminala" #: data/org.gnome.Console.metainfo.xml.in.in:75 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Program" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Odpre novo okno" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminal" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Odpre iskalno polje" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Kopira izbrano" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "Prilepi izbrano" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "Zavihki" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "Odpre nov zavihek" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "Zapre zavihek" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "Odpre naslednji zavihek" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "Premakne na predhodni zavihek" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "Preklopi na zavihek" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:528 #, c-format msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "" #. Translators: %s is the year range #: src/kgx-application.c:540 src/kgx-window.c:529 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:554 src/kgx-window.ui:115 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #: src/kgx-application.c:558 msgid "GPL 3.0 or later" msgstr "GPL 3.0 ali viลกje" #: src/kgx-application.c:691 msgid "Execute the argument to this option inside the terminal" msgstr "" #: src/kgx-application.c:700 msgid "Set the working directory" msgstr "" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:702 msgid "DIRNAME" msgstr "IMEIMENIKA" #: src/kgx-application.c:710 msgid "Wait until the child exits (TODO)" msgstr "" #: src/kgx-application.c:719 msgid "Set the initial window title" msgstr "Nastavi zaฤetni naslov okna" #: src/kgx-application.c:728 msgid "ADVANCED: Set the shell to launch" msgstr "" #: src/kgx-application.c:737 msgid "ADVANCED: Set the scrollback length" msgstr "" #: src/kgx-application.h:44 msgid "Console (Development)" msgstr "Konzola (razvoj)" #: src/kgx-close-dialog.c:52 msgid "Close Window?" msgstr "Ali ลพelite zapreti okno?" #: src/kgx-close-dialog.c:53 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" #: src/kgx-close-dialog.c:58 msgid "Close Tab?" msgstr "Ali ลพelite zapreti zavihek?" #: src/kgx-close-dialog.c:59 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:740 msgid "_Cancel" msgstr "_Prekliฤi" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "_Zapri" #: src/kgx-pages.ui:47 msgid "_Detach Tab" msgstr "_Odpni zavihek" #: src/kgx-pages.ui:53 msgid "_Close" msgstr "_Zapri" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:121 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:130 msgid "Read Only โ€” Command exited" msgstr "" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:162 #, c-format msgid "Failed to start โ€” %s" msgstr "" #: src/kgx-tab.c:1184 msgid "Command completed" msgstr "" #: src/kgx-tab-button.ui:5 msgid "View Open Tabs" msgstr "" #: src/kgx-terminal.c:732 msgid "You are pasting a command that runs as an administrator" msgstr "" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:735 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" #: src/kgx-terminal.c:743 src/menus.ui:24 msgid "_Paste" msgstr "_Prilepi" #: src/kgx-theme-switcher.ui:18 msgid "Use System Colors" msgstr "Uporabi sistemske barve" #: src/kgx-theme-switcher.ui:47 msgid "Use Light Colors" msgstr "Uporabi svetle barve" #: src/kgx-theme-switcher.ui:76 msgid "Use Dark Colors" msgstr "Uporabi temne barve" #. Translators: Credit yourself here #: src/kgx-window.c:535 msgid "translator-credits" msgstr "Matej Urbanฤiฤ " #: src/kgx-window.ui:26 msgid "Shrink Text" msgstr "Skrฤi besedilo" #: src/kgx-window.ui:39 msgid "Reset Size" msgstr "Ponastavi velikost" #: src/kgx-window.ui:52 msgid "Enlarge Text" msgstr "Poveฤaj besedilo" #: src/kgx-window.ui:74 msgid "_New Window" msgstr "_Novo okno" #: src/kgx-window.ui:86 msgid "_Keyboard Shortcuts" msgstr "_Tipkovne bliลพnjice" #: src/kgx-window.ui:93 msgid "_About Console" msgstr "_O programu" #: src/kgx-window.ui:94 msgid "About this Program" msgstr "O programu" #: src/kgx-window.ui:123 msgid "Find in Terminal" msgstr "Najdi v terminalu" #: src/kgx-window.ui:141 msgid "Menu" msgstr "Meni" #: src/menus.ui:7 msgid "_Open Link" msgstr "_Odpri povezavo" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Kopiraj _povezavo" #: src/menus.ui:19 msgid "_Copy" msgstr "_Kopiraj" #: src/menus.ui:29 msgid "_Select All" msgstr "Izberi _vse" #: src/menus.ui:36 msgid "Show in _Files" msgstr "" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in Co_nsole (Devel)" msgstr "" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Open in Co_nsole" msgstr "" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "" #~ msgid "Terminal" #~ msgstr "Terminal" #~ msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;" #~ msgstr "ukaz;cmd;ukazna vrstica;zagon;lupina;terminal;kgx;" #~ msgid "Copyright ยฉ %s Zander Brown" #~ msgstr "Avtorske pravice ยฉ %s Zander Brown" #~ msgid "Terminal (Kingโ€™s Cross)" #~ msgstr "Terminal (Kingโ€™s Cross)" #~ msgid "_About Kingโ€™s Cross" #~ msgstr "_O programu King's Cross" #~ msgid "_OK" #~ msgstr "_V redu" gnome-console-42~beta/po/sr.po000066400000000000000000000265661420277463100165270ustar00rootroot00000000000000# Serbian translation for kgx. # Copyright ยฉ 2020 kgx's COPYRIGHT HOLDER # This file is distributed under the same license as the kgx package. # ะœะฐั€ะบะพ ะšะพัั‚ะธั› , 2020. # ะœะธั€ะพัะปะฐะฒ ะะธะบะพะปะธั› , 2021. msgid "" msgstr "" "Project-Id-Version: kgx master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/ZanderBrown/kgx/issues\n" "POT-Creation-Date: 2021-06-14 11:32+0000\n" "PO-Revision-Date: 2021-09-18 21:06+0200\n" "Last-Translator: ะœะธั€ะพัะปะฐะฒ ะะธะบะพะปะธั› \n" "Language-Team: ัั€ะฟัะบะธ \n" "Language: sr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1? 3 : n%10==1 && n%100!=11 ? 0 : n" "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" #. Translators: This is a train station, see README.md for more info #: data/org.gnome.zbrown.KingsCross.desktop.in.in:4 #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:8 #: src/kgx-application.c:512 src/kgx-application.h:46 src/kgx-window.ui:100 msgid "Kingโ€™s Cross" msgstr "ะšั€ะฐั™ะตะฒัะบะธ ะšั€ัั‚" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.zbrown.KingsCross.desktop.in.in:9 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "" "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;ะบะพะผะฐะฝะดะฐ;" "ะฝะฐั€ะตะดะฑะฐ;ะปะธะฝะธั˜ะฐ;ั†ะผะด;ะบะพะผะฐะฝะดะปะฐั˜ะฝ;ะฟะพะบั€ะตะฝะธ;ัˆะตะป;ัˆะบะพั™ะบะฐ;ั‚ะตั€ะผะธะฝะฐะป;ะบะณัŸ;ะบั€ะฐั™ะตะฒ ะบั€ัั‚;" #: data/org.gnome.zbrown.KingsCross.desktop.in.in:20 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:19 #| msgctxt "shortcut window" #| msgid "New Window" msgid "New Window" msgstr "ะะพะฒะธ ะฟั€ะพะทะพั€" #: data/org.gnome.zbrown.KingsCross.desktop.in.in:26 #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:25 #: src/kgx-window.ui:144 msgid "New Tab" msgstr "ะะพะฒะธ ั˜ะตะทะธั‡ะฐะบ" #: data/org.gnome.zbrown.KingsCross-generic.desktop.in.in:3 #: src/kgx-application.h:44 msgid "Terminal" msgstr "ะขะตั€ะผะธะฝะฐะป" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:9 #: src/kgx-application.c:514 src/kgx-window.c:512 msgid "Terminal Emulator" msgstr "ะžะฟะพะฝะฐัˆะฐะฒะฐั‡ ั‚ะตั€ะผะธะฝะฐะปะฐ" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "ะˆะตะดะฝะพัั‚ะฐะฒะฐะฝ ะพะฟะพะฝะฐัˆะฐะฒะฐั‡ ั‚ะตั€ะผะธะฝะฐะปะฐ ะทะฐ ะ“ะฝะพะผะพะฒัƒ ั€ะฐะดะฝัƒ ะฟะพะฒั€ัˆ." #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:22 msgid "Terminal window" msgstr "ะŸั€ะพะทะพั€ ั‚ะตั€ะผะธะฝะฐะปะฐ" #: data/org.gnome.zbrown.KingsCross.appdata.xml.in.in:52 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "ะะฟะปะธะบะฐั†ะธั˜ะฐ" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "ะะพะฒะธ ะฟั€ะพะทะพั€" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "ะขะตั€ะผะธะฝะฐะป" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "ะŸั€ะพะฝะฐั’ะธ" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "ะšะพะฟะธั€ะฐั˜" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "ะฃะฑะฐั†ะธ" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "ะˆะตะทะธั‡ั†ะธ" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "ะะพะฒะธ ั˜ะตะทะธั‡ะฐะบ" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "ะ—ะฐั‚ะฒะพั€ะธ ั˜ะตะทะธั‡ะฐะบ" #: src/help-overlay.ui:73 #| msgctxt "shortcut window" #| msgid "New Tab" msgctxt "shortcut window" msgid "Next Tab" msgstr "ะกะปะตะดะตั›ะธ ั˜ะตะทะธั‡ะฐะบ" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "ะŸั€ะตั‚ั…ะพะดะฝะธ ั˜ะตะทะธั‡ะฐะบ" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "ะŸั€ะตั’ะธ ะฝะฐ ั˜ะตะทะธั‡ะฐะบ" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:486 #, c-format #| msgid "# Kingโ€™s Cross %s using VTE %u.%u.%u %s\n" msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# ะšั€ะฐั™ะตะฒ ะšั€ัั‚ %s ัƒะท ะฟะพะผะพั› VTE-ะฐ %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:498 src/kgx-window.c:500 #, c-format #| msgid "Zander Brown" msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s ะ—ะฐะฝะดะตั€ ะ‘ั€ะฐัƒะฝ" #: src/kgx-application.c:516 msgid "GPL 3.0 or later" msgstr "ะžะˆะ› 3.0 ะธะปะธ ะบะฐัะฝะธั˜ะฐ" #: src/kgx-application.c:647 msgid "Execute the argument to this option inside the terminal" msgstr "ะ˜ะทะฒั€ัˆะธ ะฐั€ะณัƒะผะตะฝั‚ ะพะฒะต ะพะฟั†ะธั˜ะต ัƒะฝัƒั‚ะฐั€ ั‚ะตั€ะผะธะฝะฐะปะฐ" #: src/kgx-application.c:656 msgid "Set the working directory" msgstr "ะŸะพะดะตัะธ ั€ะฐะดะฝะธ ะดะธั€ะตะบั‚ะพั€ะธั˜ัƒะผ" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:658 msgid "DIRNAME" msgstr "ะ”ะ˜ะ ะะะ—ะ˜ะ’" #: src/kgx-application.c:666 msgid "Wait until the child exits (TODO)" msgstr "ะกะฐั‡ะตะบะฐั˜ ะดะฐ ะดะตั‚ะต ะธะทะฐั’ะต (ะฃะ ะะ”ะ˜ะขะ˜)" #: src/kgx-application.c:675 msgid "Set the initial window title" msgstr "ะŸะพัั‚ะฐะฒะธ ะฟะพั‡ะตั‚ะฝะธ ะฝะฐัะปะพะฒ ะฟั€ะพะทะพั€ะฐ" #: src/kgx-application.c:684 msgid "ADVANCED: Set the shell to launch" msgstr "ะะะŸะ ะ•ะ”ะะž: ะŸะพัั‚ะฐะฒะธ ัˆะบะพั™ะบัƒ ะทะฐ ะฟะพะบั€ะตั‚ะฐัšะต" #: src/kgx-application.c:693 msgid "ADVANCED: Set the scrollback length" msgstr "ะะะŸะ ะ•ะ”ะะž: ะŸะพัั‚ะฐะฒะธ ะดัƒะถะธะฝัƒ ะฟั€ะตะผะธั†ะฐัšะฐ" #: src/kgx-close-dialog.c:52 #| msgctxt "shortcut window" #| msgid "New Window" msgid "Close Window?" msgstr "ะ”ะฐ ะทะฐั‚ะฒะพั€ะธะผ ะฟั€ะพะทะพั€?" #: src/kgx-close-dialog.c:53 #| msgid "" #| "Some commands are still running, closing this terminal will kill them and " #| "may lead to unexpected outcomes" msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "ะะตะบะต ะฝะฐั€ะตะดะฑะต ััƒ ะธ ะดะฐั™ะต ะฟะพะบั€ะตะฝัƒั‚ะต, ะทะฐั‚ะฒะฐั€ะฐัšะต ะพะฒะพะณ ะฟั€ะพะทะพั€ะฐ ั›ะต ะธั… ะพะบะพะฝั‡ะฐั‚ะธ ะธ ั‚ะพ " "ะผะพะถะต ะดะพะฒะตัั‚ะธ ะดะพ ะฝะตะพั‡ะตะบะธะฒะฐะฝะธั… ะธัั…ะพะดะฐ" #: src/kgx-close-dialog.c:58 #| msgctxt "shortcut window" #| msgid "Close Tab" msgid "Close Tab?" msgstr "ะ”ะฐ ะทะฐั‚ะฒะพั€ะธะผ ั˜ะตะทะธั‡ะฐะบ?" #: src/kgx-close-dialog.c:59 #| msgid "" #| "Some commands are still running, closing this terminal will kill them and " #| "may lead to unexpected outcomes" msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "ะะตะบะต ะฝะฐั€ะตะดะฑะต ััƒ ะธ ะดะฐั™ะต ะฟะพะบั€ะตะฝัƒั‚ะต, ะทะฐั‚ะฒะฐั€ะฐัšะต ะพะฒะพะณ ั˜ะตะทะธั‡ะบะฐ ั›ะต ะธั… ะพะบะพะฝั‡ะฐั‚ะธ ะธ ั‚ะพ " "ะผะพะถะต ะดะพะฒะตัั‚ะธ ะดะพ ะฝะตะพั‡ะตะบะธะฒะฐะฝะธั… ะธัั…ะพะดะฐ" #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:675 msgid "_Cancel" msgstr "_ะžั‚ะบะฐะถะธ" #: src/kgx-close-dialog.ui:32 #| msgid "_Close" msgid "C_lose" msgstr "_ะ—ะฐั‚ะฒะพั€ะธ" #: src/kgx-pages.ui:46 #| msgid "_Detach" msgid "_Detach Tab" msgstr "_ะžั‚ะบะฐั‡ะธ ั˜ะตะทะธั‡ะฐะบ" #: src/kgx-pages.ui:52 msgid "_Close" msgstr "_ะ—ะฐั‚ะฒะพั€ะธ" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:119 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "ะกะฐะผะพ ะทะฐ ั‡ะธั‚ะฐัšะต โ€” ะะฐั€ะตะดะฑะฐ ั˜ะต ะธะทะฐัˆะปะฐ ัะฐ ัˆะธั„ั€ะพะผ %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:128 msgid "Read Only โ€” Command exited" msgstr "ะกะฐะผะพ ะทะฐ ั‡ะธั‚ะฐัšะต โ€” ะะฐั€ะตะดะฑะฐ ั˜ะต ะธะทะฐัˆะปะฐ" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:160 #, c-format msgid "Failed to start โ€” %s" msgstr "ะะธัะฐะผ ัƒัะฟะตะพ ะดะฐ ะฟะพะบั€ะตะฝะตะผ โ€” %s" #: src/kgx-tab.c:1182 msgid "Command completed" msgstr "ะะฐั€ะตะดะฑะฐ ั˜ะต ะพะฑะฐะฒั™ะตะฝะฐ" #: src/kgx-terminal.c:667 msgid "You are pasting a command that runs as an administrator" msgstr "ะฃะฑะฐั†ัƒั˜ะตั‚ะต ะฝะฐั€ะตะดะฑัƒ ะบะพั˜ะฐ ัะต ะธะทะฒั€ัˆะฐะฒะฐ ัะฐ ะฐะดะผะธะฝ ะฟั€ะฐะฒะธะผะฐ" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:670 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "ะŸะพัั‚ะฐั€ะฐั˜ั‚ะต ัะต ะดะฐ ั€ะฐะทัƒะผะตั‚ะต ัˆั‚ะฐ ะฝะฐั€ะตะดะฑะฐ ั€ะฐะดะธ: %s" #: src/kgx-terminal.c:678 src/menus.ui:24 msgid "_Paste" msgstr "_ะฃะฑะฐั†ะธ" #. Translators: Credit yourself here #: src/kgx-window.c:506 msgid "translator-credits" msgstr "" "ะœะฐั€ะบะพ ะœ. ะšะพัั‚ะธั› \n" "\n" "https://ะณะฝะพะผ.ัั€ะฑ โ€” ะฟั€ะตะฒะพะด ะ“ะฝะพะผะฐ ะฝะฐ ัั€ะฟัะบะธ ั˜ะตะทะธะบ" #. Translators: Donโ€™t attempt to translate KGX, #. * treat it as a proper noun #: src/kgx-window.c:510 #| msgid "Terminal Emulator" msgid "KGX Terminal Emulator" msgstr "ะžะฟะพะฝะฐัˆะฐะฒะฐั‡ ั‚ะตั€ะผะธะฝะฐะปะฐ โ€“ KGX" #: src/kgx-window.c:605 msgid "_About Terminal" msgstr "ะž ะขะตั€ะผะธะฝ_ะฐะปัƒ" #: src/kgx-window.ui:20 msgid "Shrink text" msgstr "ะกะบัƒะฟะธ ั‚ะตะบัั‚" #: src/kgx-window.ui:33 msgid "Reset size" msgstr "ะŸะพะฒั€ะฐั‚ะธ ะฒะตะปะธั‡ะธะฝัƒ" #: src/kgx-window.ui:46 msgid "Enlarge text" msgstr "ะŸะพะฒะตั›ะฐั˜ ั‚ะตะบัั‚" #: src/kgx-window.ui:63 msgid "_New Window" msgstr "_ะะพะฒะธ ะฟั€ะพะทะพั€" #: src/kgx-window.ui:75 msgid "_Keyboard Shortcuts" msgstr "ะŸั€ะตั‡ะธั†ะต ะฝะฐ ั‚ะฐ_ัั‚ะฐั‚ัƒั€ะธ" #: src/kgx-window.ui:82 msgid "_About Kingโ€™s Cross" msgstr "ะž ะšั€_ะฐั™ะตะฒะพะผ ะšั€ัั‚ัƒ" #: src/kgx-window.ui:83 msgid "About this program" msgstr "ะž ะพะฒะพะผ ะฟั€ะพะณั€ะฐะผัƒ" #: src/kgx-window.ui:108 msgid "Find in terminal" msgstr "ะะฐั’ะธ ัƒ ั‚ะตั€ะผะธะฝะฐะปัƒ" #: src/kgx-window.ui:126 msgid "Menu" msgstr "ะœะตะฝะธ" #: src/menus.ui:7 msgid "_Open Link" msgstr "_ะžั‚ะฒะพั€ะธ ะฒะตะทัƒ" #: src/menus.ui:12 msgid "Copy _Link" msgstr "ะšะพะฟะธั€ะฐั˜ _ะฒะตะทัƒ" #: src/menus.ui:19 msgid "_Copy" msgstr "_ะšะพะฟะธั€ะฐั˜" #: src/menus.ui:29 msgid "_Select All" msgstr "ะ˜ะทะฐะฑะตั€ะธ _ัะฒะต" #: src/menus.ui:36 msgid "Show in _Files" msgstr "ะŸั€ะธะบะฐะถะธ ัƒ _ะ”ะฐั‚ะพั‚ะตะบะฐะผะฐ" #: nautilus/kgx-nautilus-menu-item.c:120 #| msgid "Find in terminal" msgid "Open in T_erminal" msgstr "ะžั‚ะฒะพั€ะธ ัƒ _ั‚ะตั€ะผะธะฝะฐะปัƒ" #: nautilus/kgx-nautilus-menu-item.c:122 #| msgid "Kingโ€™s Cross" msgid "Op_en in Kingโ€™s Cross" msgstr "ะžั‚ะฒะพั€ะธ ัƒ _ะšั€ะฐั™ะตะฒัะบะพะผ ะšั€ัั‚ัƒ" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "ะŸะพะบั€ะตะฝะธ ัะตัะธั˜ัƒ ั‚ะตั€ะผะธะฝะฐะปะฐ ะทะฐ ะพะฒะพ ะผะตัั‚ะพ" #~ msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;" #~ msgstr "" #~ "command;prompt;cmd;commandline;run;shell;terminal;kgx;ะบะพะผะฐะฝะดะฐ;ะฝะฐั€ะตะดะฑะฐ;" #~ "ะปะธะฝะธั˜ะฐ;ั†ะผะด;ะบะพะผะฐะฝะดะปะฐั˜ะฝ;ะฟะพะบั€ะตะฝะธ;ัˆะตะป;ัˆะบะพั™ะบะฐ;ั‚ะตั€ะผะธะฝะฐะป;ะบะณัŸ;" #~ msgid "child watcher" #~ msgstr "ะฝะฐะดะทะพั€ะฝะธะบ ะดะตั†ะต" #~ msgid "Copyright ยฉ %s Zander Brown" #~ msgstr "ะŸั€ะฐะฒะพ ะฝะฐ ะบะพะฟะธั€ะฐัšะต ยฉ %s Zander Brown" #~ msgid "Close Terminal" #~ msgstr "ะ—ะฐั‚ะฒะพั€ะธ ั‚ะตั€ะผะธะฝะฐะป" #~ msgid "_OK" #~ msgstr "ะฃ _ั€ะตะดัƒ" #~ msgid "Terminal (Kingโ€™s Cross)" #~ msgstr "ะขะตั€ะผะธะฝะฐะป (ะšั€ะฐั™ะตะฒัะบะธ ะšั€ัั‚)" gnome-console-42~beta/po/sv.po000066400000000000000000000207141420277463100165200ustar00rootroot00000000000000# Swedish translation for console. # Copyright ยฉ 2019-2021 console's COPYRIGHT HOLDER # This file is distributed under the same license as the console package. # Anders Jonsson , 2019, 2020, 2021. # Luna Jernberg , 2021. # msgid "" msgstr "" "Project-Id-Version: console main\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/console/issues\n" "POT-Creation-Date: 2021-12-30 21:38+0000\n" "PO-Revision-Date: 2021-12-30 23:17+0100\n" "Last-Translator: Anders Jonsson \n" "Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Poedit 3.0.1\n" #: data/org.gnome.Console.desktop.in.in:3 #: data/org.gnome.Console.metainfo.xml.in.in:8 src/kgx-application.h:46 msgid "Console" msgstr "Konsol" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.Console.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "kommando;prompt;cmd;kommandorad;kรถr;skal;terminal;kgx;kings cross;" #: data/org.gnome.Console.desktop.in.in:21 msgid "New Window" msgstr "Nytt fรถnster" #: data/org.gnome.Console.desktop.in.in:27 src/kgx-window.ui:168 msgid "New Tab" msgstr "Ny flik" #: data/org.gnome.Console.metainfo.xml.in.in:9 src/kgx-application.c:556 msgid "Terminal Emulator" msgstr "Terminalemulator" #: data/org.gnome.Console.metainfo.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "En enkel anvรคndarvรคnlig terminalemulator fรถr GNOME-skrivbordet." #: data/org.gnome.Console.metainfo.xml.in.in:30 msgid "Terminal window" msgstr "Terminalfรถnster" #: data/org.gnome.Console.metainfo.xml.in.in:75 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Program" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Nytt fรถnster" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Terminal" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Sรถk" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Kopiera" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "Klistra in" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "Flikar" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "Ny flik" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "Stรคng flik" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "Nรคsta flik" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "Fรถregรฅende flik" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "Vรคxla till flik" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:528 #, c-format msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# KGX %s med VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:540 src/kgx-window.c:529 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:554 src/kgx-window.ui:115 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #: src/kgx-application.c:558 msgid "GPL 3.0 or later" msgstr "GPL 3.0 eller senare" #: src/kgx-application.c:691 msgid "Execute the argument to this option inside the terminal" msgstr "Kรถr argumentet till denna flagga inuti terminalen" #: src/kgx-application.c:700 msgid "Set the working directory" msgstr "Stรคll in arbetskatalogen" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:702 msgid "DIRNAME" msgstr "KATNAMN" #: src/kgx-application.c:710 msgid "Wait until the child exits (TODO)" msgstr "Vรคnta tills barnet avslutar (TODO)" #: src/kgx-application.c:719 msgid "Set the initial window title" msgstr "Stรคll in fรถnstrets ursprungliga titel" #: src/kgx-application.c:728 msgid "ADVANCED: Set the shell to launch" msgstr "AVANCERAT: Stรคll in skalet att starta" #: src/kgx-application.c:737 msgid "ADVANCED: Set the scrollback length" msgstr "AVANCERAT: Stรคll in lรคngd pรฅ rullningshistorik" #: src/kgx-application.h:44 msgid "Console (Development)" msgstr "Konsol (Utveckling)" #: src/kgx-close-dialog.c:52 msgid "Close Window?" msgstr "Stรคng fรถnster?" #: src/kgx-close-dialog.c:53 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "Nรฅgra kommandon kรถrs รคnnu, att stรคnga detta fรถnster kommer att dรถda dem och " "kan leda till ovรคntade resultat" #: src/kgx-close-dialog.c:58 msgid "Close Tab?" msgstr "Stรคng flik?" #: src/kgx-close-dialog.c:59 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "Nรฅgra kommandon kรถrs รคnnu, att stรคnga denna flik kommer att dรถda dem och kan " "leda till ovรคntade resultat" #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:740 msgid "_Cancel" msgstr "A_vbryt" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "S_tรคng" #: src/kgx-pages.ui:47 msgid "_Detach Tab" msgstr "_Koppla loss flik" #: src/kgx-pages.ui:53 msgid "_Close" msgstr "S_tรคng" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:121 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "Skrivskyddad โ€” Kommando avslutades med kod %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:130 msgid "Read Only โ€” Command exited" msgstr "Skrivskyddad โ€” Kommando avslutades" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:162 #, c-format msgid "Failed to start โ€” %s" msgstr "Misslyckades med att starta โ€” %s" #: src/kgx-tab.c:1184 msgid "Command completed" msgstr "Kommando slutfรถrt" #: src/kgx-tab-button.ui:5 msgid "View Open Tabs" msgstr "Visa รถppna flikar" #: src/kgx-terminal.c:732 msgid "You are pasting a command that runs as an administrator" msgstr "Du klistrar in ett kommando som kรถrs som en administratรถr" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:735 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Sรคkerstรคll att du vet vad kommandot gรถr:\n" "%s" #: src/kgx-terminal.c:743 src/menus.ui:24 msgid "_Paste" msgstr "_Klistra in" #: src/kgx-theme-switcher.ui:18 msgid "Use System Colors" msgstr "Anvรคnd systemfรคrger" #: src/kgx-theme-switcher.ui:47 msgid "Use Light Colors" msgstr "Anvรคnd ljusa fรคrger" #: src/kgx-theme-switcher.ui:76 msgid "Use Dark Colors" msgstr "Anvรคnd mรถrka fรคrger" #. Translators: Credit yourself here #: src/kgx-window.c:535 msgid "translator-credits" msgstr "" "Anders Jonsson \n" "\n" "Skicka synpunkter pรฅ รถversรคttningen till\n" "" #: src/kgx-window.ui:26 msgid "Shrink Text" msgstr "Krymp text" #: src/kgx-window.ui:39 msgid "Reset Size" msgstr "ร…terstรคll storlek" #: src/kgx-window.ui:52 msgid "Enlarge Text" msgstr "Fรถrstora text" #: src/kgx-window.ui:74 msgid "_New Window" msgstr "_Nytt fรถnster" #: src/kgx-window.ui:86 msgid "_Keyboard Shortcuts" msgstr "_Tangentbordsgenvรคgar" #: src/kgx-window.ui:93 msgid "_About Console" msgstr "_Om Konsol" #: src/kgx-window.ui:94 msgid "About this Program" msgstr "Om detta program" #: src/kgx-window.ui:123 msgid "Find in Terminal" msgstr "Sรถk i terminal" #: src/kgx-window.ui:141 msgid "Menu" msgstr "Meny" #: src/menus.ui:7 msgid "_Open Link" msgstr "ร–_ppna lรคnk" #: src/menus.ui:12 msgid "Copy _Link" msgstr "Kopiera _lรคnk" #: src/menus.ui:19 msgid "_Copy" msgstr "K_opiera" #: src/menus.ui:29 msgid "_Select All" msgstr "_Markera allt" #: src/menus.ui:36 msgid "Show in _Files" msgstr "Visa i _Filer" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in Co_nsole (Devel)" msgstr "ร–ppna i Ko_nsol (Utveckling)" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Open in Co_nsole" msgstr "ร–ppna i Ko_nsol" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "Starta en terminalsession fรถr den hรคr platsen" gnome-console-42~beta/po/tr.po000066400000000000000000000223321420277463100165130ustar00rootroot00000000000000# Turkish translation of Console. # Copyright (C) 2019-2020 Console COPYRIGHT HOLDER # This file is distributed under the same license as the Console package. # # Sabri รœnal , 2019, 2020. # Muhammet Kara , 2021. # Emin Tufan ร‡etin , 2019, 2020, 2022. # msgid "" msgstr "" "Project-Id-Version: Console master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/console/issues\n" "POT-Creation-Date: 2021-12-30 21:38+0000\n" "PO-Revision-Date: 2022-02-15 12:44+0300\n" "Last-Translator: Emin Tufan ร‡etin \n" "Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 3.0.1\n" #: data/org.gnome.Console.desktop.in.in:3 #: data/org.gnome.Console.metainfo.xml.in.in:8 src/kgx-application.h:46 msgid "Console" msgstr "Konsol" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.Console.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "" "komut;istem;cmd;komut satฤฑrฤฑ;รงalฤฑลŸtฤฑr;kabuk;uรงbirim;terminal;kgx;kings cross;" #: data/org.gnome.Console.desktop.in.in:21 msgid "New Window" msgstr "Yeni Pencere" #: data/org.gnome.Console.desktop.in.in:27 src/kgx-window.ui:168 msgid "New Tab" msgstr "Yeni Sekme" #: data/org.gnome.Console.metainfo.xml.in.in:9 src/kgx-application.c:556 msgid "Terminal Emulator" msgstr "Uรงbirim ร–ykรผnรผcรผ" #: data/org.gnome.Console.metainfo.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "GNOME masaรผstรผ iรงin basit, kullanฤฑcฤฑ dostu uรงbirim รถykรผnรผcรผ." #: data/org.gnome.Console.metainfo.xml.in.in:30 msgid "Terminal window" msgstr "Uรงbirim penceresi" #: data/org.gnome.Console.metainfo.xml.in.in:75 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "Uygulama" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "Yeni Pencere" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "Uรงbirim" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "Bul" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "Kopyala" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "YapฤฑลŸtฤฑr" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "Sekmeler" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "Yeni Sekme" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "Sekmeyi Kapat" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "Sonraki Sekme" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "ร–nceki Sekme" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "Sekmeye Geรง" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:528 #, c-format msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# KGX %s VTE %u.%u.%u %s kullanฤฑyor\n" #. Translators: %s is the year range #: src/kgx-application.c:540 src/kgx-window.c:529 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:554 src/kgx-window.ui:115 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #: src/kgx-application.c:558 msgid "GPL 3.0 or later" msgstr "GPL 3.0 veya daha yenisi" #: src/kgx-application.c:691 msgid "Execute the argument to this option inside the terminal" msgstr "Argรผmanฤฑ uรงbirimin iรงinde bu seรงeneฤŸe รงalฤฑลŸtฤฑr" #: src/kgx-application.c:700 msgid "Set the working directory" msgstr "ร‡alฤฑลŸma dizinini belirle" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:702 msgid "DIRNAME" msgstr "DฤฐZฤฐNADI" #: src/kgx-application.c:710 msgid "Wait until the child exits (TODO)" msgstr "Alt sรผreรง รงฤฑkana dek bekle (TODO)" #: src/kgx-application.c:719 msgid "Set the initial window title" msgstr "ฤฐlk pencere baลŸlฤฑฤŸฤฑnฤฑ belirle" #: src/kgx-application.c:728 msgid "ADVANCED: Set the shell to launch" msgstr "GELฤฐลžMฤฐลž: BaลŸlatฤฑlacak kabuฤŸu belirle" #: src/kgx-application.c:737 msgid "ADVANCED: Set the scrollback length" msgstr "GELฤฐลžMฤฐลž: Geri kaydฤฑrma uzunluฤŸunu belirle" #: src/kgx-application.h:44 msgid "Console (Development)" msgstr "Konsol (GeliลŸtirme)" #: src/kgx-close-dialog.c:52 msgid "Close Window?" msgstr "Pencere Kapatฤฑlsฤฑn Mฤฑ?" #: src/kgx-close-dialog.c:53 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "Bazฤฑ komutlar hala รงalฤฑลŸฤฑyor, bu pencereyi kapatmak onlarฤฑ รถldรผrebilir ve " "beklenmedik sonuรงlara neden olabilir" #: src/kgx-close-dialog.c:58 msgid "Close Tab?" msgstr "Sekme Kapatฤฑlsฤฑn Mฤฑ?" #: src/kgx-close-dialog.c:59 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "Bazฤฑ komutlar hala รงalฤฑลŸฤฑyor, bu sekmeyi kapatmak onlarฤฑ รถldรผrebilir ve " "beklenmedik sonuรงlara neden olabilir" #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:740 msgid "_Cancel" msgstr "_ฤฐptal" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "_Kapat" #: src/kgx-pages.ui:47 msgid "_Detach Tab" msgstr "Sekmeyi _Ayฤฑr" #: src/kgx-pages.ui:53 msgid "_Close" msgstr "_Kapat" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:121 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "Salt Okunur โ€” Komut, %i koduyla รงฤฑktฤฑ" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:130 msgid "Read Only โ€” Command exited" msgstr "Salt Okunur โ€” Komut รงฤฑktฤฑ" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:162 #, c-format msgid "Failed to start โ€” %s" msgstr "BaลŸlatma baลŸarฤฑsฤฑz โ€” %s" #: src/kgx-tab.c:1184 msgid "Command completed" msgstr "Komut tamamlandฤฑ" #: src/kgx-tab-button.ui:5 msgid "View Open Tabs" msgstr "Aรงฤฑk Sekmeleri Gรถr" #: src/kgx-terminal.c:732 msgid "You are pasting a command that runs as an administrator" msgstr "Yรถnetici olarak รงalฤฑลŸan komut yapฤฑลŸtฤฑrฤฑyorsunuz" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:735 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "Komutun ne yaptฤฑฤŸฤฑndan emin olun:\n" "%s" #: src/kgx-terminal.c:743 src/menus.ui:24 msgid "_Paste" msgstr "_YapฤฑลŸtฤฑr" #: src/kgx-theme-switcher.ui:18 msgid "Use System Colors" msgstr "Sistem Renklerini Kullan" #: src/kgx-theme-switcher.ui:47 msgid "Use Light Colors" msgstr "Aรงฤฑk Renkler Kullan" #: src/kgx-theme-switcher.ui:76 msgid "Use Dark Colors" msgstr "Koyu Renkler Kullan" #. Translators: Credit yourself here #: src/kgx-window.c:535 msgid "translator-credits" msgstr "" "Sabri รœnal \n" "Emin Tufan ร‡etin " #: src/kgx-window.ui:26 msgid "Shrink Text" msgstr "Metni Daralt" #: src/kgx-window.ui:39 msgid "Reset Size" msgstr "Boyutu Sฤฑfฤฑrla" #: src/kgx-window.ui:52 msgid "Enlarge Text" msgstr "Metni GeniลŸlet" #: src/kgx-window.ui:74 msgid "_New Window" msgstr "_Yeni Pencere" #: src/kgx-window.ui:86 msgid "_Keyboard Shortcuts" msgstr "_Klavye Kฤฑsayollarฤฑ" #: src/kgx-window.ui:93 msgid "_About Console" msgstr "Konsol _Hakkฤฑnda" #: src/kgx-window.ui:94 msgid "About this Program" msgstr "Bu program hakkฤฑnda" #: src/kgx-window.ui:123 msgid "Find in Terminal" msgstr "Uรงbirimde Bul" #: src/kgx-window.ui:141 msgid "Menu" msgstr "Menรผ" #: src/menus.ui:7 msgid "_Open Link" msgstr "BaฤŸlantฤฑyฤฑ _Aรง" #: src/menus.ui:12 msgid "Copy _Link" msgstr "_BaฤŸlantฤฑyฤฑ Kopyala" #: src/menus.ui:19 msgid "_Copy" msgstr "_Kopyala" #: src/menus.ui:29 msgid "_Select All" msgstr "Tรผmรผnรผ _Seรง" #: src/menus.ui:36 msgid "Show in _Files" msgstr "Dosyalarสผda Gรถster" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in Co_nsole (Devel)" msgstr "Ko_nsol (GeliลŸtirme)โ€™de Aรง" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Open in Co_nsole" msgstr "Ko_nsolโ€™da Aรง" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "Bu konum iรงin uรงbirim oturumu baลŸlat" #~ msgid "Terminal" #~ msgstr "Uรงbirim" #, fuzzy #~| msgid "Terminal Emulator" #~ msgid "KGX Terminal Emulator" #~ msgstr "Uรงbirim ร–ykรผnรผcรผ" #~ msgid "_About Kingโ€™s Cross" #~ msgstr "Kingสผs Cross _Hakkฤฑnda" #, fuzzy #~| msgid "Kingโ€™s Cross" #~ msgid "Op_en in Kingโ€™s Cross" #~ msgstr "Kingโ€™s Cross" #~ msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;" #~ msgstr "komut;istem;cmd;komut satฤฑrฤฑ;รงalฤฑลŸtฤฑr;kabuk;uรงbirim;terminal;kgx;" #~ msgid "child watcher" #~ msgstr "alt sรผreรง izleyici" #~ msgid "Copyright ยฉ %s Zander Brown" #~ msgstr "Telif Hakkฤฑ ยฉ %s Zander Brown" #~ msgid "Terminal (Kingโ€™s Cross)" #~ msgstr "Uรงbirim (Kingสผs Cross)" #~ msgid "_OK" #~ msgstr "_Tamam" gnome-console-42~beta/po/uk.po000066400000000000000000000271621420277463100165130ustar00rootroot00000000000000# Ukrainian translation for kgx. # Copyright (C) 2020 kgx's COPYRIGHT HOLDER # This file is distributed under the same license as the kgx package. # # Yuri Chornoivan , 2020, 2021. msgid "" msgstr "" "Project-Id-Version: kgx master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/console/issues\n" "POT-Creation-Date: 2021-12-30 21:38+0000\n" "PO-Revision-Date: 2021-12-31 16:47+0200\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Lokalize 20.12.0\n" #: data/org.gnome.Console.desktop.in.in:3 #: data/org.gnome.Console.metainfo.xml.in.in:8 src/kgx-application.h:46 msgid "Console" msgstr "ะšะพะฝัะพะปัŒ" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.Console.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "" "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;ะบะพะผะฐะฝะดะฐ;" "ะทะฐะฟะธั‚;ะบะพะผะฐะฝะดะฝะธะน ั€ัะดะพะบ;ะทะฐะฟัƒัั‚ะธั‚ะธ;ะทะฐะฟัƒัะบ;ะพะฑะพะปะพะฝะบะฐ;ั‚ะตั€ะผั–ะฝะฐะป;ะบั–ะฝะณั-ะบั€ะพัั;" #: data/org.gnome.Console.desktop.in.in:21 msgid "New Window" msgstr "ะะพะฒะต ะฒั–ะบะฝะพ" #: data/org.gnome.Console.desktop.in.in:27 src/kgx-window.ui:168 msgid "New Tab" msgstr "ะะพะฒะฐ ะฒะบะปะฐะดะบะฐ" #: data/org.gnome.Console.metainfo.xml.in.in:9 src/kgx-application.c:556 msgid "Terminal Emulator" msgstr "ะ•ะผัƒะปัั‚ะพั€ ั‚ะตั€ะผั–ะฝะฐะปะฐ" #: data/org.gnome.Console.metainfo.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "ะŸั€ะพัั‚ะธะน ะทั€ัƒั‡ะฝะธะน ะดะปั ะบะพั€ะธัั‚ัƒะฒะฐั‡ั–ะฒ ั‚ะตั€ะผั–ะฝะฐะป ะดะปั ัั‚ั–ะปัŒะฝะธั†ั– GNOME." #: data/org.gnome.Console.metainfo.xml.in.in:30 msgid "Terminal window" msgstr "ะ’ั–ะบะฝะพ ั‚ะตั€ะผั–ะฝะฐะปะฐ" #: data/org.gnome.Console.metainfo.xml.in.in:75 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "ะŸั€ะพะณั€ะฐะผะฐ" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "ะะพะฒะต ะฒั–ะบะฝะพ" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "ะขะตั€ะผั–ะฝะฐะป" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "ะ—ะฝะฐะนั‚ะธ" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "ะšะพะฟั–ัŽะฒะฐั‚ะธ" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "ะ’ัั‚ะฐะฒะธั‚ะธ" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "ะ’ะบะปะฐะดะบะธ" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "ะะพะฒะฐ ะฒะบะปะฐะดะบะฐ" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "ะ—ะฐะบั€ะธั‚ะธ ะฒะบะปะฐะดะบัƒ" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "ะะฐัั‚ัƒะฟะฝะฐ ะฒะบะปะฐะดะบะฐ" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "ะŸะพะฟะตั€ะตะดะฝั ะฒะบะปะฐะดะบะฐ" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "ะŸะตั€ะตะผะบะฝัƒั‚ะธัั ะฝะฐ ะฒะบะปะฐะดะบัƒ" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:528 #, c-format msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# KGX %s ะท ะฒะธะบะพั€ะธัั‚ะฐะฝะฝัะผ VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:540 src/kgx-window.c:529 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ Zander Brown, %s" #: src/kgx-application.c:554 src/kgx-window.ui:115 msgid "Kingโ€™s Cross" msgstr "ะšั–ะฝะณั-ะบั€ะพัั" #: src/kgx-application.c:558 msgid "GPL 3.0 or later" msgstr "GPL 3.0 ะฐะฑะพ ะฝะพะฒั–ัˆะฐ" #: src/kgx-application.c:691 msgid "Execute the argument to this option inside the terminal" msgstr "ะ’ะธะบะพะฝะฐั‚ะธ ะฐั€ะณัƒะผะตะฝั‚ ั†ัŒะพะณะพ ะฟะฐั€ะฐะผะตั‚ั€ะฐ ัƒ ั‚ะตั€ะผั–ะฝะฐะปั–" #: src/kgx-application.c:700 msgid "Set the working directory" msgstr "ะ’ัั‚ะฐะฝะพะฒะธั‚ะธ ั€ะพะฑะพั‡ะธะน ะบะฐั‚ะฐะปะพะณ" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:702 msgid "DIRNAME" msgstr "ะะะ—ะ’ะ_ะšะะขะะ›ะžะ“ะฃ" #: src/kgx-application.c:710 msgid "Wait until the child exits (TODO)" msgstr "ะžั‡ั–ะบัƒะฒะฐั‚ะธ ะฝะฐ ะทะฐะฒะตั€ัˆะตะฝะฝั ะดะพั‡ั–ั€ะฝัŒะพะณะพ ะฟั€ะพั†ะตััƒ (ะฉะ• ะะ• ะ ะ•ะะ›ะ†ะ—ะžะ’ะะะž)" #: src/kgx-application.c:719 msgid "Set the initial window title" msgstr "ะ’ัั‚ะฐะฝะพะฒะธั‚ะธ ะฟะพั‡ะฐั‚ะบะพะฒะธะน ะทะฐะณะพะปะพะฒะพะบ ะฒั–ะบะฝะฐ" #: src/kgx-application.c:728 msgid "ADVANCED: Set the shell to launch" msgstr "ะ”ะ›ะฏ ะ”ะžะกะ’ะ†ะ”ะงะ•ะะ˜ะฅ: ะฒัั‚ะฐะฝะพะฒะธั‚ะธ ะบะพะผะฐะฝะดะฝัƒ ะพะฑะพะปะพะฝะบัƒ ะดะปั ะทะฐะฟัƒัะบัƒ" #: src/kgx-application.c:737 msgid "ADVANCED: Set the scrollback length" msgstr "ะ”ะ›ะฏ ะ”ะžะกะ’ะ†ะ”ะงะ•ะะ˜ะฅ: ะฒัั‚ะฐะฝะพะฒะธั‚ะธ ะดะพะฒะถะธะฝัƒ ะฑัƒั„ะตั€ะฐ ะณะพั€ั‚ะฐะฝะฝั" #: src/kgx-application.h:44 msgid "Console (Development)" msgstr "ะšะพะฝัะพะปัŒ (ั€ะพะทั€ะพะฑะบะฐ)" #: src/kgx-close-dialog.c:52 msgid "Close Window?" msgstr "ะ—ะฐะบั€ะธั‚ะธ ะฒั–ะบะฝะพ?" #: src/kgx-close-dialog.c:53 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "" "ะ’ะธะบะพะฝะฐะฝะฝั ัะบะธั…ะพััŒ ั–ะท ะบะพะผะฐะฝะด ั‰ะต ะฝะต ะทะฐะฒะตั€ัˆะตะฝะพ. ะ—ะฐะบั€ะธั‚ั‚ั ั†ัŒะพะณะพ ะฒั–ะบะฝะฐ ะฟั€ะธะทะฒะตะดะต " "ะดะพ ะฐะฒะฐั€ั–ะนะฝะพะณะพ ะทะฐะฒะตั€ัˆะตะฝะฝั ั€ะพะฑะพั‚ะธ ั†ะธั… ะบะพะผะฐะฝะด ั– ะผะพะถะต ะผะฐั‚ะธ ะฝะตะฟะตั€ะตะดะฑะฐั‡ัƒะฒะฐะฝั– " "ะฝะฐัะปั–ะดะบะธ." #: src/kgx-close-dialog.c:58 msgid "Close Tab?" msgstr "ะ—ะฐะบั€ะธั‚ะธ ะฒะบะปะฐะดะบัƒ?" #: src/kgx-close-dialog.c:59 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "" "ะ’ะธะบะพะฝะฐะฝะฝั ัะบะธั…ะพััŒ ั–ะท ะบะพะผะฐะฝะด ั‰ะต ะฝะต ะทะฐะฒะตั€ัˆะตะฝะพ. ะ—ะฐะบั€ะธั‚ั‚ั ั†ั–ั”ั— ะฒะบะปะฐะดะบะธ ะฟั€ะธะทะฒะตะดะต " "ะดะพ ะฐะฒะฐั€ั–ะนะฝะพะณะพ ะทะฐะฒะตั€ัˆะตะฝะฝั ั€ะพะฑะพั‚ะธ ั†ะธั… ะบะพะผะฐะฝะด ั– ะผะพะถะต ะผะฐั‚ะธ ะฝะตะฟะตั€ะตะดะฑะฐั‡ัƒะฒะฐะฝั– " "ะฝะฐัะปั–ะดะบะธ." #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:740 msgid "_Cancel" msgstr "_ะกะบะฐััƒะฒะฐั‚ะธ" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "_ะ—ะฐะบั€ะธั‚ะธ" #: src/kgx-pages.ui:47 msgid "_Detach Tab" msgstr "_ะ’ั–ะด'ั”ะดะฝะฐั‚ะธ ะฒะบะปะฐะดะบัƒ" #: src/kgx-pages.ui:53 msgid "_Close" msgstr "_ะ—ะฐะบั€ะธั‚ะธ" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:121 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "ะ›ะธัˆะต ั‡ะธั‚ะฐะฝะฝั โ€” ะฒะธะบะพะฝะฐะฝะฝั ะบะพะผะฐะฝะดะธ ะทะฐะฒะตั€ัˆะตะฝะพ ั–ะท ะบะพะดะพะผ %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:130 msgid "Read Only โ€” Command exited" msgstr "ะ›ะธัˆะต ั‡ะธั‚ะฐะฝะฝั โ€” ะฒะธะบะพะฝะฐะฝะฝั ะบะพะผะฐะฝะดะธ ะทะฐะฒะตั€ัˆะตะฝะพ" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:162 #, c-format msgid "Failed to start โ€” %s" msgstr "ะะต ะฒะดะฐะปะพัั ะทะฐะฟัƒัั‚ะธั‚ะธ โ€“ %s" #: src/kgx-tab.c:1184 msgid "Command completed" msgstr "ะ’ะธะบะพะฝะฐะฝะฝั ะบะพะผะฐะฝะดะธ ะทะฐะฒะตั€ัˆะตะฝะพ" #: src/kgx-tab-button.ui:5 #| msgid "View open tabs" msgid "View Open Tabs" msgstr "ะŸะตั€ะตะณะปัะฝัƒั‚ะธ ะฒั–ะดะบั€ะธั‚ั– ะฒะบะปะฐะดะบะธ" #: src/kgx-terminal.c:732 msgid "You are pasting a command that runs as an administrator" msgstr "ะ’ะธ ะฒัั‚ะฐะฒะธะปะธ ะบะพะผะฐะฝะดัƒ, ัะบัƒ ัะปั–ะด ะทะฐะฟัƒัะบะฐั‚ะธ ะฒั–ะด ั–ะผะตะฝั– ะฐะดะผั–ะฝั–ัั‚ั€ะฐั‚ะพั€ะฐ" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:735 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "ะŸะตั€ะตะบะพะฝะฐะนั‚ะตัั ัƒ ั‚ะพะผัƒ, ั‰ะพ ะฒะฐะผ ะฒั–ะดะพะผั– ะฝะฐัะปั–ะดะบะธ ะฒะธะบะพะฝะฐะฝะฝั ะบะพะผะฐะฝะดะธ:\n" "%s" #: src/kgx-terminal.c:743 src/menus.ui:24 msgid "_Paste" msgstr "ะ’ัั‚_ะฐะฒะธั‚ะธ" #: src/kgx-theme-switcher.ui:18 msgid "Use System Colors" msgstr "ะ’ะธะบะพั€ะธัั‚ะพะฒัƒะฒะฐั‚ะธ ะบะพะปัŒะพั€ะธ ัะธัั‚ะตะผะธ" #: src/kgx-theme-switcher.ui:47 msgid "Use Light Colors" msgstr "ะ’ะธะบะพั€ะธัั‚ะพะฒัƒะฒะฐั‚ะธ ัะฒั–ั‚ะปั– ะบะพะปัŒะพั€ะธ" #: src/kgx-theme-switcher.ui:76 msgid "Use Dark Colors" msgstr "ะ’ะธะบะพั€ะธัั‚ะพะฒัƒะฒะฐั‚ะธ ั‚ะตะผะฝั– ะบะพะปัŒะพั€ะธ" #. Translators: Credit yourself here #: src/kgx-window.c:535 msgid "translator-credits" msgstr "ะฎั€ั–ะน ะงะพั€ะฝะพั–ะฒะฐะฝ " #: src/kgx-window.ui:26 #| msgid "Shrink text" msgid "Shrink Text" msgstr "ะกั‚ะธัะฝัƒั‚ะธ ั‚ะตะบัั‚" #: src/kgx-window.ui:39 #| msgid "Reset size" msgid "Reset Size" msgstr "ะ’ั–ะดะฝะพะฒะธั‚ะธ ะฟะพั‡ะฐั‚ะบะพะฒะธะน ั€ะพะทะผั–ั€" #: src/kgx-window.ui:52 #| msgid "Enlarge text" msgid "Enlarge Text" msgstr "ะ—ะฑั–ะปัŒัˆะธั‚ะธ ั‚ะตะบัั‚" #: src/kgx-window.ui:74 msgid "_New Window" msgstr "_ะะพะฒะต ะฒั–ะบะฝะพ" #: src/kgx-window.ui:86 msgid "_Keyboard Shortcuts" msgstr "_ะšะปะฐะฒั–ะฐั‚ัƒั€ะฝั– ัะบะพั€ะพั‡ะตะฝะฝั" #: src/kgx-window.ui:93 msgid "_About Console" msgstr "_ะŸั€ะพ ยซะšะพะฝัะพะปัŒยป" #: src/kgx-window.ui:94 #| msgid "About this program" msgid "About this Program" msgstr "ะŸั€ะพ ั†ัŽ ะฟั€ะพะณั€ะฐะผัƒ" #: src/kgx-window.ui:123 #| msgid "Find in terminal" msgid "Find in Terminal" msgstr "ะ—ะฝะฐะนั‚ะธ ัƒ ั‚ะตั€ะผั–ะฝะฐะปั–" #: src/kgx-window.ui:141 msgid "Menu" msgstr "ะœะตะฝัŽ" #: src/menus.ui:7 msgid "_Open Link" msgstr "_ะ’ั–ะดะบั€ะธั‚ะธ ะฟะพัะธะปะฐะฝะฝั" #: src/menus.ui:12 msgid "Copy _Link" msgstr "ะšะพะฟั–ัŽะฒะฐั‚ะธ _ะฟะพัะธะปะฐะฝะฝั" #: src/menus.ui:19 msgid "_Copy" msgstr "_ะšะพะฟั–ัŽะฒะฐั‚ะธ" #: src/menus.ui:29 msgid "_Select All" msgstr "ะ’ะธ_ะฑั€ะฐั‚ะธ ะฒัะต" #: src/menus.ui:36 msgid "Show in _Files" msgstr "ะŸะพะบะฐะทะฐั‚ะธ ัƒ ยซ_ะคะฐะนะปะฐั…ยป" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in Co_nsole (Devel)" msgstr "ะ’ั–ะดะบั€ะธั‚ะธ ัƒ _ะšะพะฝัะพะปั– (ั‚ะตัั‚ะพะฒะฐ ะทะฑั–ั€ะบะฐ)" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Open in Co_nsole" msgstr "ะ’ั–ะดะบั€ะธั‚ะธ ัƒ _ะšะพะฝัะพะปั–" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "ะ ะพะทะฟะพั‡ะฐั‚ะธ ัะตะฐะฝั ั‚ะตั€ะผั–ะฝะฐะปะฐ ะดะปั ั†ั–ั”ั— ะฐะดั€ะตัะธ" #~ msgid "Terminal" #~ msgstr "ะขะตั€ะผั–ะฝะฐะป" #~ msgid "๐Ÿšง KGX Devel Build ๐Ÿšง" #~ msgstr "๐Ÿšง ะขะตัั‚ะพะฒะฐ ะทะฑั–ั€ะบะฐ KGX ๐Ÿšง" #~ msgid "KGX Terminal Emulator" #~ msgstr "ะ•ะผัƒะปัั‚ะพั€ ั‚ะตั€ะผั–ะฝะฐะปะฐ KGX" #~ msgid "_About Kingโ€™s Cross" #~ msgstr "_ะŸั€ะพ ยซะšั–ะฝะณั-ะบั€ะพััยป" #~ msgid "Op_en in Kingโ€™s Cross" #~ msgstr "ะ’ั–ะด_ะบั€ะธั‚ะธ ัƒ ยซะšั–ะฝะณั-ะบั€ะพััยป" #~ msgctxt "shortcut window" #~ msgid "First Tab" #~ msgstr "ะŸะตั€ัˆะฐ ะฒะบะปะฐะดะบะฐ" #~ msgctxt "shortcut window" #~ msgid "Last Tab" #~ msgstr "ะžัั‚ะฐะฝะฝั ะฒะบะปะฐะดะบะฐ" #~ msgid "Close Terminal" #~ msgstr "ะ—ะฐะบั€ะธั‚ะธ ยซะขะตั€ะผั–ะฝะฐะปยป" #~ msgid "_OK" #~ msgstr "_ะ“ะฐั€ะฐะทะด" #~ msgid "Terminal (Kingโ€™s Cross)" #~ msgstr "ะขะตั€ะผั–ะฝะฐะป (ะšั–ะฝะณั-ะบั€ะพัั)" #~ msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;" #~ msgstr "" #~ "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;ะบะพะผะฐะฝะดะฐ;" #~ "ะทะฐะฟะธั‚;ะบะพะผะฐะฝะดะฝะธะน ั€ัะดะพะบ;ะทะฐะฟัƒัั‚ะธั‚ะธ;ะทะฐะฟัƒัะบ;ะพะฑะพะปะพะฝะบะฐ;ั‚ะตั€ะผั–ะฝะฐะป;" #~ msgid "child watcher" #~ msgstr "ะดะธั‚ัั‡ะฝะธะน ะฝะฐะณะปัะดะฐั‡" #~ msgid "Copyright ยฉ %s Zander Brown" #~ msgstr "ยฉ Zander Brown, %s" gnome-console-42~beta/po/zh_CN.po000066400000000000000000000215001420277463100170630ustar00rootroot00000000000000# # lumingzh , 2022. # msgid "" msgstr "" "Project-Id-Version: kgx master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/console/issues\n" "POT-Creation-Date: 2022-01-27 15:01+0000\n" "PO-Revision-Date: 2022-02-03 10:10+0800\n" "Last-Translator: lumingzh \n" "Language-Team: Chinese - China \n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Gtranslator 41.0\n" "Plural-Forms: nplurals=1; plural=0\n" #: data/org.gnome.Console.desktop.in.in:3 #: data/org.gnome.Console.metainfo.xml.in.in:8 src/kgx-application.h:46 msgid "Console" msgstr "ๆŽงๅˆถๅฐ" #. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! #: data/org.gnome.Console.desktop.in.in:8 msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;" msgstr "" "command;prompt;cmd;commandline;run;shell;terminal;kgx;kings cross;ๅ‘ฝไปค;ๆ็คบ" "็ฌฆ;ๅ‘ฝไปค่กŒ;่ฟ่กŒ;็ปˆ็ซฏ;" #: data/org.gnome.Console.desktop.in.in:21 msgid "New Window" msgstr "ๆ–ฐๅปบ็ช—ๅฃ" #: data/org.gnome.Console.desktop.in.in:27 src/kgx-window.ui:168 msgid "New Tab" msgstr "ๆ–ฐๅปบๆ ‡็ญพ้กต" #: data/org.gnome.Console.metainfo.xml.in.in:9 src/kgx-application.c:556 msgid "Terminal Emulator" msgstr "็ปˆ็ซฏๆจกๆ‹Ÿๅ™จ" #: data/org.gnome.Console.metainfo.xml.in.in:11 msgid "A simple user-friendly terminal emulator for the GNOME desktop." msgstr "GNOME ๆกŒ้ข็š„็ฎ€ๅ•ใ€็”จๆˆทๅ‹ๅฅฝ็š„็ปˆ็ซฏๆจกๆ‹Ÿๅ™จใ€‚" #: data/org.gnome.Console.metainfo.xml.in.in:30 msgid "Terminal window" msgstr "็ปˆ็ซฏ็ช—ๅฃ" #: data/org.gnome.Console.metainfo.xml.in.in:75 msgid "Zander Brown" msgstr "Zander Brown" #: src/help-overlay.ui:13 msgctxt "shortcut window" msgid "Application" msgstr "ๅบ”็”จ็จ‹ๅบ" #: src/help-overlay.ui:19 msgctxt "shortcut window" msgid "New Window" msgstr "ๆ–ฐๅปบ็ช—ๅฃ" #: src/help-overlay.ui:26 msgctxt "shortcut window" msgid "Terminal" msgstr "็ปˆ็ซฏ" #: src/help-overlay.ui:32 msgctxt "shortcut window" msgid "Find" msgstr "ๆŸฅๆ‰พ" #: src/help-overlay.ui:39 msgctxt "shortcut window" msgid "Copy" msgstr "ๅคๅˆถ" #: src/help-overlay.ui:46 msgctxt "shortcut window" msgid "Paste" msgstr "็ฒ˜่ดด" #: src/help-overlay.ui:53 msgctxt "shortcut window" msgid "Tabs" msgstr "ๆ ‡็ญพ้กต" #: src/help-overlay.ui:59 msgctxt "shortcut window" msgid "New Tab" msgstr "ๆ–ฐๅปบๆ ‡็ญพ้กต" #: src/help-overlay.ui:66 msgctxt "shortcut window" msgid "Close Tab" msgstr "ๅ…ณ้—ญๆ ‡็ญพ้กต" #: src/help-overlay.ui:73 msgctxt "shortcut window" msgid "Next Tab" msgstr "ไธ‹ไธ€ไธชๆ ‡็ญพ้กต" #: src/help-overlay.ui:80 msgctxt "shortcut window" msgid "Previous Tab" msgstr "ไธŠไธ€ไธชๆ ‡็ญพ้กต" #: src/help-overlay.ui:87 msgctxt "shortcut window" msgid "Switch to Tab" msgstr "ๅˆ‡ๆขๅˆฐๆ ‡็ญพ้กต" #. Translators: The leading # is intentional, the initial %s is the #. version of KGX itself, the latter format is the VTE version #: src/kgx-application.c:528 #, c-format msgid "# KGX %s using VTE %u.%u.%u %s\n" msgstr "# KGX %s ไฝฟ็”จ VTE %u.%u.%u %s\n" #. Translators: %s is the year range #: src/kgx-application.c:540 src/kgx-window.c:525 #, c-format msgid "ยฉ %s Zander Brown" msgstr "ยฉ %s Zander Brown" #: src/kgx-application.c:554 src/kgx-window.ui:115 msgid "Kingโ€™s Cross" msgstr "Kingโ€™s Cross" #: src/kgx-application.c:558 msgid "GPL 3.0 or later" msgstr "GPL 3.0 ๆˆ–ๆ›ด้ซ˜็‰ˆๆœฌ" #: src/kgx-application.c:689 msgid "Execute the argument to this option inside the terminal" msgstr "ๅœจ็ปˆ็ซฏๅ†…ๆ‰ง่กŒๆญค้€‰้กน็š„ๅ‚ๆ•ฐ" #: src/kgx-application.c:698 msgid "Set the working directory" msgstr "่ฎพ็ฝฎๅทฅไฝœ็›ฎๅฝ•" #. Translators: Placeholder of for a given directory #: src/kgx-application.c:700 msgid "DIRNAME" msgstr "DIRNAME" #: src/kgx-application.c:708 msgid "Wait until the child exits (TODO)" msgstr "็ญ‰ๅพ…ๅญๅ‘ฝไปค้€€ๅ‡บ (TODO)" #: src/kgx-application.c:717 msgid "Set the initial window title" msgstr "่ฎพ็ฝฎๅˆๅง‹็ช—ๅฃๆ ‡้ข˜" #: src/kgx-application.c:726 msgid "ADVANCED: Set the shell to launch" msgstr "้ซ˜็บง๏ผš่ฎพ็ฝฎ่ฆๅฏๅŠจ็š„ shell" #: src/kgx-application.c:735 msgid "ADVANCED: Set the scrollback length" msgstr "้ซ˜็บง๏ผš่ฎพ็ฝฎๅ›žๆปš้•ฟๅบฆ" #: src/kgx-application.h:44 msgid "Console (Development)" msgstr "ๆŽงๅˆถๅฐ๏ผˆๅผ€ๅ‘็‰ˆ๏ผ‰" #: src/kgx-close-dialog.c:50 msgid "Close Window?" msgstr "ๅ…ณ้—ญ็ช—ๅฃ๏ผŸ" #: src/kgx-close-dialog.c:51 msgid "" "Some commands are still running, closing this window will kill them and may " "lead to unexpected outcomes" msgstr "ๆŸไบ›ๅ‘ฝไปคไปๅœจ่ฟ่กŒ๏ผŒๅ…ณ้—ญๆญค็ช—ๅฃไผšๅฐ†ๅ…ถๆ€ๆญปๅนถๅฏ่ƒฝๅฏผ่‡ดๆ„ๅค–็ป“ๆžœ" #: src/kgx-close-dialog.c:56 msgid "Close Tab?" msgstr "ๅ…ณ้—ญๆ ‡็ญพ้กต๏ผŸ" #: src/kgx-close-dialog.c:57 msgid "" "Some commands are still running, closing this tab will kill them and may " "lead to unexpected outcomes" msgstr "ๆŸไบ›ๅ‘ฝไปคไปๅœจ่ฟ่กŒ๏ผŒๅ…ณ้—ญๆญคๆ ‡็ญพ้กตไผšๅฐ†ๅ…ถๆ€ๆญปๅนถๅฏ่ƒฝๅฏผ่‡ดๆ„ๅค–็ป“ๆžœ" #: src/kgx-close-dialog.ui:24 src/kgx-terminal.c:732 msgid "_Cancel" msgstr "ๅ–ๆถˆ(_C)" #: src/kgx-close-dialog.ui:32 msgid "C_lose" msgstr "ๅ…ณ้—ญ(_L)" #: src/kgx-pages.ui:47 msgid "_Detach Tab" msgstr "ๅˆ†็ฆปๆ ‡็ญพ้กต(_D)" #: src/kgx-pages.ui:53 msgid "_Close" msgstr "ๅ…ณ้—ญ(_C)" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:119 #, c-format msgid "Read Only โ€” Command exited with code %i" msgstr "ๅช่ฏป โ€” ๅ‘ฝไปคๅทฒ้€€ๅ‡บ๏ผŒไปฃ็ ไธบ %i" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:128 msgid "Read Only โ€” Command exited" msgstr "ๅช่ฏป โ€” ๅ‘ฝไปคๅทฒ้€€ๅ‡บ" #. translators: marks the text as bold, ensure they are #. matched please! #: src/kgx-simple-tab.c:160 #, c-format msgid "Failed to start โ€” %s" msgstr "ๅฏๅŠจๅคฑ่ดฅ โ€” %s" #: src/kgx-tab.c:1160 msgid "Command completed" msgstr "ๅ‘ฝไปคๅทฒๅฎŒๆˆ" #: src/kgx-tab-button.ui:5 msgid "View Open Tabs" msgstr "ๆŸฅ็œ‹ๆ‰“ๅผ€็š„ๆ ‡็ญพ้กต" #: src/kgx-terminal.c:724 msgid "You are pasting a command that runs as an administrator" msgstr "ๆ‚จๆญฃๅœจ็ฒ˜่ดดไปฅ็ฎก็†ๅ‘˜ๆƒ้™่ฟ่กŒ็š„ๅ‘ฝไปค" #. TRANSLATORS: %s is the command being pasted #: src/kgx-terminal.c:727 #, c-format msgid "" "Make sure you know what the command does:\n" "%s" msgstr "" "็กฎไฟๆ‚จ็Ÿฅ้“่ฏฅๅ‘ฝไปคๅšไบ†ไป€ไนˆ๏ผš\n" "%s" #: src/kgx-terminal.c:735 src/menus.ui:24 msgid "_Paste" msgstr "็ฒ˜่ดด(_P)" #: src/kgx-theme-switcher.ui:18 msgid "Use System Colors" msgstr "ไฝฟ็”จ็ณป็ปŸ้…่‰ฒ" #: src/kgx-theme-switcher.ui:47 msgid "Use Light Colors" msgstr "ไฝฟ็”จไบฎ่‰ฒ้…่‰ฒ" #: src/kgx-theme-switcher.ui:76 msgid "Use Dark Colors" msgstr "ไฝฟ็”จๆš—่‰ฒ้…่‰ฒ" #. Translators: Credit yourself here #: src/kgx-window.c:531 msgid "translator-credits" msgstr "" "Damned , 2020.\n" "lumingzh , 2022." #: src/kgx-window.ui:26 msgid "Shrink Text" msgstr "็ผฉๅฐๆ–‡ๆœฌ" #: src/kgx-window.ui:39 msgid "Reset Size" msgstr "้‡็ฝฎๅคงๅฐ" #: src/kgx-window.ui:52 msgid "Enlarge Text" msgstr "ๆ”พๅคงๆ–‡ๆœฌ" #: src/kgx-window.ui:74 msgid "_New Window" msgstr "ๆ–ฐๅปบ็ช—ๅฃ(_N)" #: src/kgx-window.ui:86 msgid "_Keyboard Shortcuts" msgstr "้”ฎ็›˜ๅฟซๆท้”ฎ(_K)" #: src/kgx-window.ui:93 msgid "_About Console" msgstr "ๅ…ณไบŽๆŽงๅˆถๅฐ(_A)" #: src/kgx-window.ui:94 msgid "About this Program" msgstr "ๅ…ณไบŽๆญค็จ‹ๅบ" #: src/kgx-window.ui:123 msgid "Find in Terminal" msgstr "ๅœจ็ปˆ็ซฏไธญๆŸฅๆ‰พ" #: src/kgx-window.ui:141 msgid "Menu" msgstr "่œๅ•" #: src/menus.ui:7 msgid "_Open Link" msgstr "ๆ‰“ๅผ€้“พๆŽฅ(_O)" #: src/menus.ui:12 msgid "Copy _Link" msgstr "ๅคๅˆถ้“พๆŽฅ(_L)" #: src/menus.ui:19 msgid "_Copy" msgstr "ๅคๅˆถ(_C)" #: src/menus.ui:29 msgid "_Select All" msgstr "ๅ…จ้€‰(_S)" #: src/menus.ui:36 msgid "Show in _Files" msgstr "ๅœจๆ–‡ไปถไธญๆ˜พ็คบ(_F)" #: nautilus/kgx-nautilus-menu-item.c:120 msgid "Open in Co_nsole (Devel)" msgstr "ๅœจๆŽงๅˆถๅฐไธญๆ‰“ๅผ€๏ผˆๅผ€ๅ‘๏ผ‰(_N)" #: nautilus/kgx-nautilus-menu-item.c:122 msgid "Open in Co_nsole" msgstr "ๅœจๆŽงๅˆถๅฐไธญๆ‰“ๅผ€(_N)" #: nautilus/kgx-nautilus-menu-item.c:124 msgid "Start a terminal session for this location" msgstr "ไธบๆญคไฝ็ฝฎๅฏๅŠจ็ปˆ็ซฏไผš่ฏ" #~ msgid "Terminal" #~ msgstr "็ปˆ็ซฏ" #~| msgid "Terminal Emulator" #~ msgid "KGX Terminal Emulator" #~ msgstr "KGX ็ปˆ็ซฏๆจกๆ‹Ÿๅ™จ" #~ msgid "_About Kingโ€™s Cross" #~ msgstr "ๅ…ณไบŽ Kingโ€™s Cross(_A)" #~| msgid "Kingโ€™s Cross" #~ msgid "Op_en in Kingโ€™s Cross" #~ msgstr "ๅœจ Kingโ€™s Cross ไธญๆ‰“ๅผ€(_E)" #~ msgid "command;prompt;cmd;commandline;run;shell;terminal;kgx;" #~ msgstr "" #~ "command;prompt;cmd;commandline;run;shell;terminal;kgx;ๅ‘ฝไปค;ๆ็คบ็ฌฆ;ๅ‘ฝไปค่กŒ;" #~ "่ฟ่กŒ;็ปˆ็ซฏ;" #~ msgid "child watcher" #~ msgstr "ๅญ่ฟ›็จ‹็›‘่ง†" #~ msgid "Copyright ยฉ %s Zander Brown" #~ msgstr "็‰ˆๆƒๆ‰€ๆœ‰ ยฉ %s Zander Brown" #~ msgid "Terminal (Kingโ€™s Cross)" #~ msgstr "็ปˆ็ซฏ๏ผˆKingโ€™s Cross๏ผ‰" #~ msgid "_OK" #~ msgstr "็กฎๅฎš(_O)" gnome-console-42~beta/src/000077500000000000000000000000001420277463100156755ustar00rootroot00000000000000gnome-console-42~beta/src/fp-vte-util.c000066400000000000000000000125211420277463100202160ustar00rootroot00000000000000/* fp-vte-util.c * * Copyright 2019 Christian Hergert * * Licensed under the Apache License, Version 2.0 or the MIT License * , at your * option. This file may not be copied, modified, or distributed * except according to those terms. * * SPDX-License-Identifier: (MIT OR Apache-2.0) */ #undef G_LOG_DOMAIN #define G_LOG_DOMAIN "fp-vte-util" #include "fp-vte-util.h" /** * SECTION:fp-vte-util * @title: FpVte * @short_description: Vte utils * * One of the more complicated things about making a terminal work across * pid namespaces is that you need to be careful about where you perform * the ioctl() for TIOCSCTTY to set the controlling terminal. If you pass * the PTY to another a process in another pid/pty namespace, then you risk * the ioctl() failing there if your fork()d process has already called the * same thing. * * Where this is troublesome, is that vte_pty_child_setup() does this for * you as part of the code that goes through the child-side of the PTY * dance (sometimes known in PTY parlance as the "slave FD"). * * So the following code duplicates some of that to allow more precise * control over where the ioctl() is performed. If we are not in flatpak, * then we can just call vte_pty_child_setup() and have that work done for * us. But if we're going to pass the FD along to another pid/pty namespace, * we need to pass it along un-perterbed. Sadly, ioctl() TIOCNOTTY causes * signals to be delivered to the process group which is non-ideal. * * The API here maps vte_pty_spawn_async() mildly, but provides a GSubprocess * to the caller to conveniently wait/wait-check for the child. */ static void fp_vte_pty_spawn_cb (VtePty *pty, GAsyncResult *result, gpointer user_data) { g_autoptr (GTask) task = user_data; g_autoptr (GError) error = NULL; GPid child_pid; g_assert (VTE_IS_PTY (pty)); g_assert (G_IS_ASYNC_RESULT (result)); g_assert (G_IS_TASK (task)); if (!vte_pty_spawn_finish (pty, result, &child_pid, &error)) { g_task_return_error (task, g_steal_pointer (&error)); } else { g_task_return_int (task, child_pid); } } /** * fp_vte_pty_spawn_async: * @pty: a #VtePty * @working_directory: (nullable): the name of a directory the command should * start in, or NULL to use the current working directory. * @argv: (array zero-terminated=1) (element-type filename): child's argument * vector. * @env: (nullable) (array zero-terminated=1) (element-type filename): a list * of environment variables to be added to the environment before starting * the process, or NULL. * @timeout: a timeout value in ms, or -1 to wait indefinitely * @cancellable: (nullable): a #GCancellable, or %NULL * @callback: a callback to execute upon completion * @user_data: user data for @callback * * Creates a new process that uses #VtePty for stdin/stdout/stderr. * * See fp_vte_pty_spawn_finish() to complete the request. */ void fp_vte_pty_spawn_async (VtePty *pty, const char *working_directory, const char *const *argv, const char *const *env, int timeout, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { g_autoptr (GTask) task = NULL; g_auto (GStrv) copy_env = NULL; g_return_if_fail (VTE_IS_PTY (pty)); g_return_if_fail (argv != NULL); g_return_if_fail (argv[0] != NULL); if (timeout < 0) { timeout = -1; } if (working_directory == NULL) { working_directory = g_get_home_dir (); } if (env == NULL) { copy_env = g_get_environ (); env = (const char * const *) copy_env; } task = g_task_new (pty, cancellable, callback, user_data); g_task_set_source_tag (task, fp_vte_pty_spawn_async); vte_pty_spawn_async (pty, working_directory, (char **) argv, (char **) env, G_SPAWN_SEARCH_PATH | G_SPAWN_SEARCH_PATH_FROM_ENVP, NULL, NULL, NULL, -1, cancellable, (GAsyncReadyCallback) fp_vte_pty_spawn_cb, g_steal_pointer (&task)); } /** * fp_vte_pty_spawn_finish: * @pty: a #VtePty * @result: a #GAsyncResult * @child_pid: (out): a location for the #GPid * @error: a location for a #GError, or %NULL * * Completes a request to spawn a process for a #VtePty. * * To wait for the exit of the subprocess, use g_subprocess_wait_async() * or g_subprocess_wait_check_async(). * * Returns: %TRUE if successful; otherwise %FALSE and @error is set. */ gboolean fp_vte_pty_spawn_finish (VtePty *pty, GAsyncResult *result, GPid *child_pid, GError **error) { GPid pid; g_return_val_if_fail (VTE_IS_PTY (pty), FALSE); g_return_val_if_fail (G_IS_TASK (result), FALSE); pid = g_task_propagate_int (G_TASK (result), error); if (pid > 0) { if (child_pid != NULL) { *child_pid = pid; } return TRUE; } return FALSE; } gnome-console-42~beta/src/fp-vte-util.h000066400000000000000000000025021420277463100202210ustar00rootroot00000000000000/* fp-vte-util.h * * Copyright 2019 Christian Hergert * * Licensed under the Apache License, Version 2.0 or the MIT License * , at your * option. This file may not be copied, modified, or distributed * except according to those terms. * * SPDX-License-Identifier: (MIT OR Apache-2.0) */ #pragma once #include G_BEGIN_DECLS void fp_vte_pty_spawn_async (VtePty *pty, const char *working_directory, const char *const *argv, const char *const *env, int timeout, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data); gboolean fp_vte_pty_spawn_finish (VtePty *pty, GAsyncResult *result, GPid *child_pid, GError **error); G_END_DECLS gnome-console-42~beta/src/help-overlay.ui000066400000000000000000000104021420277463100206400ustar00rootroot00000000000000 True shortcuts 12 True Application True True win.new-window New Window Terminal True True win.find Find True term.copy Copy True term.paste Paste Tabs True True win.new-tab New Tab True win.close-tab Close Tab True <primary>Tab Next Tab True <shift><primary>Tab Previous Tab True <alt>1...9 Switch to Tab gnome-console-42~beta/src/icons/000077500000000000000000000000001420277463100170105ustar00rootroot00000000000000gnome-console-42~beta/src/icons/scalable/000077500000000000000000000000001420277463100205565ustar00rootroot00000000000000gnome-console-42~beta/src/icons/scalable/status/000077500000000000000000000000001420277463100221015ustar00rootroot00000000000000gnome-console-42~beta/src/icons/scalable/status/status-privileged-symbolic.svg000066400000000000000000000014251420277463100301160ustar00rootroot00000000000000 gnome-console-42~beta/src/icons/scalable/status/status-regular-symbolic.svg000066400000000000000000000036301420277463100274250ustar00rootroot00000000000000gnome-console-42~beta/src/icons/scalable/status/status-remote-symbolic.svg000066400000000000000000000016261420277463100272620ustar00rootroot00000000000000gnome-console-42~beta/src/icons/scalable/status/tab-counter-symbolic.svg000066400000000000000000000070441420277463100266710ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme gnome-console-42~beta/src/icons/scalable/status/tab-overflow-symbolic.svg000066400000000000000000000066411420277463100270570ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme gnome-console-42~beta/src/icons/scalable/status/tab-switcher-collapse-symbolic.svg000066400000000000000000000061241420277463100306400ustar00rootroot00000000000000 image/svg+xml gnome-console-42~beta/src/icons/scalable/status/theme-check-symbolic.svg000066400000000000000000000026751420277463100266300ustar00rootroot00000000000000 gnome-console-42~beta/src/kgx-application.c000066400000000000000000000755401420277463100211460ustar00rootroot00000000000000/* kgx-window.c * * Copyright 2019 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * SECTION:kgx-application * @title: KgxApplication * @short_description: Application * * The application, on the face of it nothing particularly interesting but * under the hood it contains a #GSource used to monitor the shells (and * there children) running in the open #KgxWindow s */ #include "kgx-config.h" #include #include #include #include #include "rgba.h" #include "kgx-application.h" #include "kgx-window.h" #include "kgx-pages.h" #include "kgx-simple-tab.h" #include "kgx-resources.h" #define LOGO_COL_SIZE 28 #define LOGO_ROW_SIZE 14 G_DEFINE_TYPE (KgxApplication, kgx_application, GTK_TYPE_APPLICATION) enum { PROP_0, PROP_THEME, PROP_FONT, PROP_FONT_SCALE, PROP_SCROLLBACK_LINES, LAST_PROP }; static GParamSpec *pspecs[LAST_PROP] = { NULL, }; static void kgx_application_set_theme (KgxApplication *self, KgxTheme theme) { HdyStyleManager *style_manager; g_return_if_fail (KGX_IS_APPLICATION (self)); self->theme = theme; style_manager = hdy_style_manager_get_default (); switch (theme) { case KGX_THEME_AUTO: hdy_style_manager_set_color_scheme (style_manager, HDY_COLOR_SCHEME_PREFER_LIGHT); break; case KGX_THEME_DAY: hdy_style_manager_set_color_scheme (style_manager, HDY_COLOR_SCHEME_FORCE_LIGHT); break; case KGX_THEME_NIGHT: case KGX_THEME_HACKER: default: hdy_style_manager_set_color_scheme (style_manager, HDY_COLOR_SCHEME_FORCE_DARK); break; } g_object_notify_by_pspec (G_OBJECT (self), pspecs[PROP_THEME]); } static void kgx_application_set_scale (KgxApplication *self, gdouble scale) { GAction *action; g_return_if_fail (KGX_IS_APPLICATION (self)); self->scale = CLAMP (scale, KGX_FONT_SCALE_MIN, KGX_FONT_SCALE_MAX); action = g_action_map_lookup_action (G_ACTION_MAP (self), "zoom-out"); g_simple_action_set_enabled (G_SIMPLE_ACTION (action), self->scale > KGX_FONT_SCALE_MIN); action = g_action_map_lookup_action (G_ACTION_MAP (self), "zoom-normal"); g_simple_action_set_enabled (G_SIMPLE_ACTION (action), self->scale != KGX_FONT_SCALE_DEFAULT); action = g_action_map_lookup_action (G_ACTION_MAP (self), "zoom-in"); g_simple_action_set_enabled (G_SIMPLE_ACTION (action), self->scale < KGX_FONT_SCALE_MAX); g_object_notify_by_pspec (G_OBJECT (self), pspecs[PROP_FONT_SCALE]); } static void kgx_application_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { KgxApplication *self = KGX_APPLICATION (object); switch (property_id) { case PROP_THEME: kgx_application_set_theme (self, g_value_get_enum (value)); break; case PROP_FONT_SCALE: kgx_application_set_scale (self, g_value_get_double (value)); break; case PROP_SCROLLBACK_LINES: self->scrollback_lines = g_value_get_int64 (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void kgx_application_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { KgxApplication *self = KGX_APPLICATION (object); switch (property_id) { case PROP_THEME: g_value_set_enum (value, self->theme); break; case PROP_FONT: g_value_take_boxed (value, kgx_application_get_font (self)); break; case PROP_FONT_SCALE: g_value_set_double (value, self->scale); break; case PROP_SCROLLBACK_LINES: g_value_set_int64 (value, self->scrollback_lines); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void kgx_application_finalize (GObject *object) { KgxApplication *self = KGX_APPLICATION (object); g_clear_object (&self->settings); g_clear_object (&self->desktop_interface); g_clear_pointer (&self->watching, g_tree_unref); g_clear_pointer (&self->children, g_tree_unref); g_clear_pointer (&self->pages, g_tree_unref); G_OBJECT_CLASS (kgx_application_parent_class)->finalize (object); } static void kgx_application_activate (GApplication *app) { GtkWindow *window; guint32 timestamp; timestamp = GDK_CURRENT_TIME; /* Get the current window or create one if necessary. */ window = gtk_application_get_active_window (GTK_APPLICATION (app)); if (window == NULL) { kgx_application_add_terminal (KGX_APPLICATION (app), NULL, timestamp, NULL, NULL, NULL); return; } gtk_window_present_with_time (window, timestamp); } static gboolean handle_watch_iter (gpointer pid, gpointer val, gpointer user_data) { KgxProcess *process = val; KgxApplication *self = user_data; GPid parent = kgx_process_get_parent (process); struct ProcessWatch *watch = NULL; watch = g_tree_lookup (self->watching, GINT_TO_POINTER (parent)); // There are far more processes on the system than there are children // of watches, thus lookup are unlikly if (G_UNLIKELY (watch != NULL)) { /* If the page died we stop caring about its processes */ if (G_UNLIKELY (watch->page == NULL)) { g_tree_remove (self->watching, GINT_TO_POINTER (parent)); g_tree_remove (self->children, pid); return FALSE; } if (!g_tree_lookup (self->children, pid)) { struct ProcessWatch *child_watch = g_new0 (struct ProcessWatch, 1); child_watch->process = g_rc_box_acquire (process); g_set_weak_pointer (&child_watch->page, watch->page); g_debug ("Hello %i!", GPOINTER_TO_INT (pid)); g_tree_insert (self->children, pid, child_watch); } kgx_tab_push_child (watch->page, process); } return FALSE; } struct RemoveDead { GTree *plist; GPtrArray *dead; }; static gboolean remove_dead (gpointer pid, gpointer val, gpointer user_data) { struct RemoveDead *data = user_data; struct ProcessWatch *watch = val; if (!g_tree_lookup (data->plist, pid)) { g_debug ("%i marked as dead", GPOINTER_TO_INT (pid)); kgx_tab_pop_child (watch->page, watch->process); g_ptr_array_add (data->dead, pid); } return FALSE; } static gboolean watch (gpointer data) { KgxApplication *self = KGX_APPLICATION (data); g_autoptr (GTree) plist = NULL; struct RemoveDead dead; plist = kgx_process_get_list (); g_tree_foreach (plist, handle_watch_iter, self); dead.plist = plist; dead.dead = g_ptr_array_new_full (1, NULL); g_tree_foreach (self->children, remove_dead, &dead); // We can't modify self->chilren whilst walking it for (int i = 0; i < dead.dead->len; i++) { g_tree_remove (self->children, g_ptr_array_index (dead.dead, i)); } g_ptr_array_unref (dead.dead); return G_SOURCE_CONTINUE; } static inline void set_watcher (KgxApplication *self, gboolean focused) { g_debug ("updated watcher focused? %s", focused ? "yes" : "no"); if (self->timeout != 0) { g_source_remove (self->timeout); } // Slow down polling when nothing is focused self->timeout = g_timeout_add (focused ? 500 : 2000, watch, self); g_source_set_name_by_id (self->timeout, "[kgx] child watcher"); } static void update_styles (KgxApplication *self) { HdyStyleManager *style_manager = hdy_style_manager_get_default (); gboolean dark = hdy_style_manager_get_dark (style_manager); gboolean hc = hdy_style_manager_get_high_contrast (style_manager); if (hc && dark) { gtk_css_provider_load_from_resource (self->provider, KGX_APPLICATION_PATH "styles-hc-dark.css"); } else if (hc) { gtk_css_provider_load_from_resource (self->provider, KGX_APPLICATION_PATH "styles-hc.css"); } else if (dark) { gtk_css_provider_load_from_resource (self->provider, KGX_APPLICATION_PATH "styles-dark.css"); } else { gtk_css_provider_load_from_resource (self->provider, KGX_APPLICATION_PATH "styles-light.css"); } } static void kgx_application_startup (GApplication *app) { KgxApplication *self = KGX_APPLICATION (app); HdyStyleManager *style_manager; g_autoptr(GAction) settings_action; const char *const new_window_accels[] = { "n", NULL }; const char *const new_tab_accels[] = { "t", NULL }; const char *const close_tab_accels[] = { "w", NULL }; const char *const copy_accels[] = { "c", NULL }; const char *const paste_accels[] = { "v", NULL }; const char *const find_accels[] = { "f", NULL }; const char *const zoom_in_accels[] = { "plus", NULL }; const char *const zoom_out_accels[] = { "minus", NULL }; const char *const zoom_normal_accels[] = { "0", NULL }; g_set_prgname (g_application_get_application_id (app)); g_resources_register (kgx_get_resource ()); g_type_ensure (KGX_TYPE_TERMINAL); g_type_ensure (KGX_TYPE_PAGES); G_APPLICATION_CLASS (kgx_application_parent_class)->startup (app); hdy_init (); gtk_application_set_accels_for_action (GTK_APPLICATION (app), "win.new-window", new_window_accels); gtk_application_set_accels_for_action (GTK_APPLICATION (app), "win.new-tab", new_tab_accels); gtk_application_set_accels_for_action (GTK_APPLICATION (app), "win.close-tab", close_tab_accels); gtk_application_set_accels_for_action (GTK_APPLICATION (app), "term.copy", copy_accels); gtk_application_set_accels_for_action (GTK_APPLICATION (app), "term.paste", paste_accels); gtk_application_set_accels_for_action (GTK_APPLICATION (app), "win.find", find_accels); gtk_application_set_accels_for_action (GTK_APPLICATION (app), "app.zoom-in", zoom_in_accels); gtk_application_set_accels_for_action (GTK_APPLICATION (app), "app.zoom-out", zoom_out_accels); gtk_application_set_accels_for_action (GTK_APPLICATION (app), "app.zoom-normal", zoom_normal_accels); self->settings = g_settings_new (KGX_APPLICATION_ID); g_settings_bind (self->settings, "theme", app, "theme", G_SETTINGS_BIND_DEFAULT); g_settings_bind (self->settings, "font-scale", app, "font-scale", G_SETTINGS_BIND_DEFAULT); g_settings_bind (self->settings, "scrollback-lines", app, "scrollback-lines", G_SETTINGS_BIND_DEFAULT); settings_action = g_settings_create_action (self->settings, "theme"); g_action_map_add_action (G_ACTION_MAP (self), G_ACTION (settings_action)); self->provider = gtk_css_provider_new (); gtk_style_context_add_provider_for_screen (gdk_screen_get_default (), GTK_STYLE_PROVIDER (self->provider), /* Is this stupid? Yes * Does it fix vte using the wrong * priority for fallback styles? Yes*/ GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + 1); style_manager = hdy_style_manager_get_default (); g_signal_connect_swapped (style_manager, "notify::dark", G_CALLBACK (update_styles), self); g_signal_connect_swapped (style_manager, "notify::high-contrast", G_CALLBACK (update_styles), self); update_styles (self); set_watcher (KGX_APPLICATION (app), TRUE); } static void kgx_application_open (GApplication *app, GFile **files, int n_files, const char *hint) { guint32 timestamp = GDK_CURRENT_TIME; for (int i = 0; i < n_files; i++) { kgx_application_add_terminal (KGX_APPLICATION (app), NULL, timestamp, files[i], NULL, NULL); } } static int kgx_application_command_line (GApplication *app, GApplicationCommandLine *cli) { KgxApplication *self = KGX_APPLICATION (app); guint32 timestamp = GDK_CURRENT_TIME; GVariantDict *options = NULL; const char *working_dir = NULL; const char *title = NULL; const char *command = NULL; const char *const *shell = NULL; const char *cwd = NULL; gint64 scrollback; gboolean tab; g_autoptr (GFile) path = NULL; options = g_application_command_line_get_options_dict (cli); cwd = g_application_command_line_get_cwd (cli); g_variant_dict_lookup (options, "working-directory", "^&ay", &working_dir); g_variant_dict_lookup (options, "title", "&s", &title); g_variant_dict_lookup (options, "command", "^&ay", &command); if (g_variant_dict_lookup (options, "set-shell", "^as", &shell) && shell) { g_settings_set_strv (self->settings, "shell", shell); return EXIT_SUCCESS; } if (g_variant_dict_lookup (options, "set-scrollback", "x", &scrollback)) { g_settings_set_int64 (self->settings, "scrollback-lines", scrollback); return EXIT_SUCCESS; } if (working_dir != NULL) { path = g_file_new_for_commandline_arg_and_cwd (working_dir, cwd); } if (path == NULL) { path = g_file_new_for_path (cwd); } if (g_variant_dict_lookup (options, "tab", "b", &tab) && tab) { kgx_application_add_terminal (self, KGX_WINDOW (gtk_application_get_active_window (GTK_APPLICATION (self))), timestamp, path, command, title); } else { kgx_application_add_terminal (self, NULL, timestamp, path, command, title); } return EXIT_SUCCESS; } static void print_center (char *msg, int ign, short width) { int half_msg = 0; int half_screen = 0; half_msg = strlen (msg) / 2; half_screen = width / 2; g_print ("%*s\n", half_screen + half_msg, msg); } static void print_logo (short width) { g_autoptr (GFile) logo = NULL; g_autoptr (GError) error = NULL; g_auto (GStrv) logo_lines = NULL; g_autofree char *logo_text = NULL; int i = 0; int half_screen = width / 2; logo = g_file_new_for_uri ("resource:/" KGX_APPLICATION_PATH "logo.txt"); g_file_load_contents (logo, NULL, &logo_text, NULL, NULL, &error); if (error) { g_error ("Wat? %s", error->message); } logo_lines = g_strsplit (logo_text, "\n", -1); while (logo_lines[i]) { g_print ("%*s%s\n", half_screen - (LOGO_COL_SIZE / 2), "", logo_lines[i]); i++; } } static int kgx_application_handle_local_options (GApplication *app, GVariantDict *options) { gboolean version = FALSE; gboolean about = FALSE; if (g_variant_dict_lookup (options, "version", "b", &version)) { if (version) { // Translators: The leading # is intentional, the initial %s is the // version of KGX itself, the latter format is the VTE version g_print (_("# KGX %s using VTE %u.%u.%u %s\n"), PACKAGE_VERSION, vte_get_major_version (), vte_get_minor_version (), vte_get_micro_version (), vte_get_features ()); return EXIT_SUCCESS; } } if (g_variant_dict_lookup (options, "about", "b", &about)) { if (about) { g_autofree char *copyright = g_strdup_printf (_("ยฉ %s Zander Brown"), "2019-2021"); struct winsize w; int padding = 0; ioctl (STDOUT_FILENO, TIOCGWINSZ, &w); padding = ((w.ws_row -1) - (LOGO_ROW_SIZE + 5)) / 2; for (int i = 0; i < padding; i++) { g_print ("\n"); } print_logo (w.ws_col); print_center (_("Kingโ€™s Cross"), -1, w.ws_col); print_center (PACKAGE_VERSION, -1, w.ws_col); print_center (_("Terminal Emulator"), -1, w.ws_col); print_center (copyright, -1, w.ws_col); print_center (_("GPL 3.0 or later"), -1, w.ws_col); for (int i = 0; i < padding; i++) { g_print ("\n"); } return EXIT_SUCCESS; } } return G_APPLICATION_CLASS (kgx_application_parent_class)->handle_local_options (app, options); } static void kgx_application_class_init (KgxApplicationClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GApplicationClass *app_class = G_APPLICATION_CLASS (klass); object_class->set_property = kgx_application_set_property; object_class->get_property = kgx_application_get_property; object_class->finalize = kgx_application_finalize; app_class->activate = kgx_application_activate; app_class->startup = kgx_application_startup; app_class->open = kgx_application_open; app_class->command_line = kgx_application_command_line; app_class->handle_local_options = kgx_application_handle_local_options; /** * KgxApplication:theme: * * The palette to use, one of the values of #KgxTheme * * Officially only "night" exists, "hacker" is just a little fun * * Bound to โ€˜themeโ€™ GSetting so changes persist * * Stability: Private */ pspecs[PROP_THEME] = g_param_spec_enum ("theme", "Theme", "Terminal theme", KGX_TYPE_THEME, KGX_THEME_NIGHT, G_PARAM_READWRITE); pspecs[PROP_FONT] = g_param_spec_boxed ("font", "Font", "Monospace font", PANGO_TYPE_FONT_DESCRIPTION, G_PARAM_READABLE); pspecs[PROP_FONT_SCALE] = g_param_spec_double ("font-scale", "Font scale", "Font scaling", KGX_FONT_SCALE_MIN, KGX_FONT_SCALE_MAX, KGX_FONT_SCALE_DEFAULT, G_PARAM_READWRITE); /** * KgxApplication:scrollback-lines: * * How many lines of scrollback #KgxTerminal should keep * * Bound to โ€˜scrollback-linesโ€™ GSetting so changes persist * * Stability: Private */ pspecs[PROP_SCROLLBACK_LINES] = g_param_spec_int64 ("scrollback-lines", "Scrollback Lines", "Size of the scrollback", G_MININT64, G_MAXINT64, 512, G_PARAM_READWRITE); g_object_class_install_properties (object_class, LAST_PROP, pspecs); } static void clear_watch (struct ProcessWatch *watch) { g_return_if_fail (watch != NULL); g_clear_pointer (&watch->process, kgx_process_unref); g_clear_weak_pointer (&watch->page); g_clear_pointer (&watch, g_free); } static void font_changed (GSettings *settings, const char *key, KgxApplication *self) { g_object_notify_by_pspec (G_OBJECT (self), pspecs[PROP_FONT]); } static GOptionEntry entries[] = { { "version", 0, 0, G_OPTION_ARG_NONE, NULL, NULL, NULL }, { "about", 0, 0, G_OPTION_ARG_NONE, NULL, NULL, NULL }, { "tab", 0, 0, G_OPTION_ARG_NONE, NULL, NULL, NULL }, { "command", 'e', 0, G_OPTION_ARG_FILENAME, NULL, N_("Execute the argument to this option inside the terminal"), NULL }, { "working-directory", 0, 0, G_OPTION_ARG_FILENAME, NULL, N_("Set the working directory"), // Translators: Placeholder of for a given directory N_("DIRNAME") }, { "wait", 0, 0, G_OPTION_ARG_NONE, NULL, N_("Wait until the child exits (TODO)"), NULL }, { "title", 'T', 0, G_OPTION_ARG_STRING, NULL, N_("Set the initial window title"), NULL }, { "set-shell", 0, 0, G_OPTION_ARG_STRING_ARRAY, NULL, N_("ADVANCED: Set the shell to launch"), NULL }, { "set-scrollback", 0, 0, G_OPTION_ARG_INT64, NULL, N_("ADVANCED: Set the scrollback length"), NULL }, { NULL } }; static void new_window_activated (GSimpleAction *action, GVariant *parameter, gpointer data) { KgxApplication *self = KGX_APPLICATION (data); guint32 timestamp = GDK_CURRENT_TIME; kgx_application_add_terminal (self, NULL, timestamp, NULL, NULL, NULL); } static void new_tab_activated (GSimpleAction *action, GVariant *parameter, gpointer data) { KgxApplication *self = KGX_APPLICATION (data); guint32 timestamp = GDK_CURRENT_TIME; g_autoptr (GFile) dir = NULL; GtkWindow *window; window = gtk_application_get_active_window (GTK_APPLICATION (self)); if (window) { dir = kgx_window_get_working_dir (KGX_WINDOW (window)); kgx_application_add_terminal (self, KGX_WINDOW (window), timestamp, dir, NULL, NULL); } else { kgx_application_add_terminal (self, NULL, timestamp, NULL, NULL, NULL); } } static void focus_activated (GSimpleAction *action, GVariant *parameter, gpointer data) { KgxApplication *self = KGX_APPLICATION (data); GtkWidget *window; KgxPages *pages; KgxTab *page; page = kgx_application_lookup_page (self, g_variant_get_uint32 (parameter)); pages = kgx_tab_get_pages (page); kgx_pages_focus_page (pages, page); window = gtk_widget_get_toplevel (GTK_WIDGET (pages)); gtk_window_present_with_time (GTK_WINDOW (window), GDK_CURRENT_TIME); } static void zoom_out_activated (GSimpleAction *action, GVariant *parameter, gpointer data) { KgxApplication *self = KGX_APPLICATION (data); if (self->scale < 0.1) { return; } kgx_application_set_scale (self, self->scale - 0.1); } static void zoom_normal_activated (GSimpleAction *action, GVariant *parameter, gpointer data) { KgxApplication *self = KGX_APPLICATION (data); kgx_application_set_scale (self, KGX_FONT_SCALE_DEFAULT); } static void zoom_in_activated (GSimpleAction *action, GVariant *parameter, gpointer data) { KgxApplication *self = KGX_APPLICATION (data); kgx_application_set_scale (self, self->scale + 0.1); } static GActionEntry app_entries[] = { { "new-window", new_window_activated, NULL, NULL, NULL }, { "new-tab", new_tab_activated, NULL, NULL, NULL }, { "focus-page", focus_activated, "u", NULL, NULL }, { "zoom-out", zoom_out_activated, NULL, NULL, NULL }, { "zoom-normal", zoom_normal_activated, NULL, NULL, NULL }, { "zoom-in", zoom_in_activated, NULL, NULL, NULL }, }; static void kgx_application_init (KgxApplication *self) { g_application_add_main_option_entries (G_APPLICATION (self), entries); g_action_map_add_action_entries (G_ACTION_MAP (self), app_entries, G_N_ELEMENTS (app_entries), self); self->desktop_interface = g_settings_new (DESKTOP_INTERFACE_SETTINGS_SCHEMA); g_signal_connect (self->desktop_interface, "changed::" MONOSPACE_FONT_KEY_NAME, G_CALLBACK (font_changed), self); self->watching = g_tree_new_full (kgx_pid_cmp, NULL, NULL, (GDestroyNotify) clear_watch); self->children = g_tree_new_full (kgx_pid_cmp, NULL, NULL, (GDestroyNotify) clear_watch); self->pages = g_tree_new_full (kgx_pid_cmp, NULL, NULL, NULL); self->active = 0; self->timeout = 0; } /** * kgx_application_add_watch: * @self: the #KgxApplication * @pid: the shell process to watch * @page: the #KgxTab the shell is running in * * Registers a new shell process with the pid watcher */ void kgx_application_add_watch (KgxApplication *self, GPid pid, KgxTab *page) { struct ProcessWatch *watch; g_return_if_fail (KGX_IS_APPLICATION (self)); g_return_if_fail (KGX_IS_TAB (page)); watch = g_new0 (struct ProcessWatch, 1); watch->process = kgx_process_new (pid); g_set_weak_pointer (&watch->page, page); g_debug ("Started watching %i", pid); g_tree_insert (self->watching, GINT_TO_POINTER (pid), watch); } /** * kgx_application_remove_watch: * @self: the #KgxApplication * @pid: the shell process to stop watch watching * * unregisters the shell with #GPid pid */ void kgx_application_remove_watch (KgxApplication *self, GPid pid) { g_return_if_fail (KGX_IS_APPLICATION (self)); if (G_LIKELY (g_tree_lookup (self->watching, GINT_TO_POINTER (pid)))) { g_tree_remove (self->watching, GINT_TO_POINTER (pid)); g_debug ("Stopped watching %i", pid); } else { g_warning ("Unknown process %i", pid); } } /** * kgx_application_get_font: * @self: the #KgxApplication * * Creates a #PangoFontDescription for the system monospace font. * * Returns: (transfer full): a new #PangoFontDescription */ PangoFontDescription * kgx_application_get_font (KgxApplication *self) { // Taken from gnome-terminal g_autofree char *font = NULL; g_return_val_if_fail (KGX_IS_APPLICATION (self), NULL); font = g_settings_get_string (self->desktop_interface, MONOSPACE_FONT_KEY_NAME); return pango_font_description_from_string (font); } /** * kgx_application_push_active: * @self: the #KgxApplication * * Increase the active window count */ void kgx_application_push_active (KgxApplication *self) { g_return_if_fail (KGX_IS_APPLICATION (self)); self->active++; g_debug ("push_active"); if (G_LIKELY (self->active > 0)) { set_watcher (self, TRUE); } else { set_watcher (self, FALSE); } } /** * kgx_application_pop_active: * @self: the #KgxApplication * * Decrease the active window count */ void kgx_application_pop_active (KgxApplication *self) { g_return_if_fail (KGX_IS_APPLICATION (self)); self->active--; g_debug ("pop_active"); if (G_LIKELY (self->active < 1)) { set_watcher (self, FALSE); } else { set_watcher (self, TRUE); } } static void page_died (gpointer data, GObject *dead_object) { KgxApplication *self = KGX_APPLICATION (g_application_get_default ()); g_tree_remove (self->pages, data); } /** * kgx_application_add_page: * @self: the instance to look for @id in * @page: the page to add * * Register a new #KgxTab with @self */ void kgx_application_add_page (KgxApplication *self, KgxTab *page) { guint id = 0; g_return_if_fail (KGX_IS_APPLICATION (self)); g_return_if_fail (KGX_IS_TAB (page)); id = kgx_tab_get_id (page); g_tree_insert (self->pages, GINT_TO_POINTER (id), page); g_object_weak_ref (G_OBJECT (page), page_died, GINT_TO_POINTER (id)); } /** * kgx_application_lookup_page: * @self: the instance to look for @id in * @id: the page id to look for * * Try and find a #KgxTab with @id in @self * * Returns: (transfer none) (nullable): the found #KgxTab or %NULL */ KgxTab * kgx_application_lookup_page (KgxApplication *self, guint id) { g_return_val_if_fail (KGX_IS_APPLICATION (self), NULL); return g_tree_lookup (self->pages, GUINT_TO_POINTER (id)); } static void started (GObject *src, GAsyncResult *res, gpointer app) { g_autoptr (GError) error = NULL; KgxTab *page = KGX_TAB (src); GPid pid; pid = kgx_tab_start_finish (page, res, &error); if (error) { g_warning ("Failed to start %s: %s", G_OBJECT_TYPE_NAME (src), error->message); return; } kgx_application_add_watch (KGX_APPLICATION (app), pid, page); } KgxTab * kgx_application_add_terminal (KgxApplication *self, KgxWindow *existing_window, guint32 timestamp, GFile *working_directory, const char *command, const char *title) { g_autofree char *user_shell = vte_get_user_shell (); g_autofree char *directory = NULL; g_autoptr (GError) error = NULL; g_auto (GStrv) shell = NULL; g_auto (GStrv) custom_shell = NULL; GtkWindow *window; GtkWidget *tab; KgxPages *pages; g_shell_parse_argv (command ? command : user_shell, NULL, &shell, &error); if (error) { g_warning ("Failed to parse โ€œ%sโ€ as a command", command ? command : user_shell); shell = NULL; g_clear_error (&error); } if (G_LIKELY (command == NULL)) { custom_shell = g_settings_get_strv (self->settings, "shell"); if (g_strv_length (custom_shell) > 0) { shell = g_steal_pointer (&custom_shell); } } /* We should probably do something other than /bin/sh */ if (shell == NULL) { shell = g_new0 (char *, 2); shell[0] = g_strdup ("/bin/sh"); shell[1] = NULL; g_warning ("Defaulting to โ€œ%sโ€", shell[0]); } if (working_directory) { directory = g_file_get_path (working_directory); } else { directory = g_strdup (g_get_home_dir ()); } tab = g_object_new (KGX_TYPE_SIMPLE_TAB, "application", self, "visible", TRUE, "initial-work-dir", directory, "command", shell, "tab-title", title, "close-on-quit", command == NULL, NULL); kgx_tab_start (KGX_TAB (tab), started, self); if (existing_window) { window = GTK_WINDOW (existing_window); } else { window = g_object_new (KGX_TYPE_WINDOW, "application", self, NULL); } pages = kgx_window_get_pages (KGX_WINDOW (window)); kgx_pages_add_page (pages, KGX_TAB (tab)); kgx_pages_focus_page (pages, KGX_TAB (tab)); gtk_window_present_with_time (window, timestamp); return KGX_TAB (tab); } gnome-console-42~beta/src/kgx-application.h000066400000000000000000000102641420277463100211430ustar00rootroot00000000000000/* kgx-application.h * * Copyright 2019 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include #include "kgx-process.h" #include "kgx-window.h" #include "kgx-terminal.h" #include "kgx-tab.h" G_BEGIN_DECLS /** * DESKTOP_INTERFACE_SETTINGS_SCHEMA: * The schema that defines the system fonts */ #define DESKTOP_INTERFACE_SETTINGS_SCHEMA "org.gnome.desktop.interface" /** * MONOSPACE_FONT_KEY_NAME: * The name of the key in %DESKTOP_INTERFACE_SETTINGS_SCHEMA for the monospace * font */ #define MONOSPACE_FONT_KEY_NAME "monospace-font-name" #ifdef IS_DEVEL #define KGX_DISPLAY_NAME _("Console (Development)") #else #define KGX_DISPLAY_NAME _("Console") #endif #define KGX_TYPE_APPLICATION (kgx_application_get_type()) /** * ProcessWatch: * @page: the #KgxTab the #KgxProcess is in * @process: what we are watching * * Stability: Private */ struct ProcessWatch { KgxTab /*weak*/ *page; KgxProcess *process; }; /** * KgxApplication: * @theme: the colour palette in use * @scale: the font scaling used * @desktop_interface: the #GSettings storing the system monospace font * @watching: ~ (element-type GLib.Pid ProcessWatch) the shells running in windows * @children: ~ (element-type GLib.Pid ProcessWatch) the processes running in shells * @pages: ~ (element-type uint Kgx.Page) the global page id / page map * @active: counter of #KgxWindow's with #GtkWindow:is-active = %TRUE, * obviously this should only ever be 1 or but we can't be certain * @timeout: the current #GSource id of the watcher * * Stability: Private */ struct _KgxApplication { /*< private >*/ GtkApplication parent_instance; /*< public >*/ KgxTheme theme; double scale; gint64 scrollback_lines; GSettings *settings; GSettings *desktop_interface; GTree *watching; GTree *children; GTree *pages; guint timeout; int active; GtkCssProvider *provider; }; G_DECLARE_FINAL_TYPE (KgxApplication, kgx_application, KGX, APPLICATION, GtkApplication) void kgx_application_add_watch (KgxApplication *self, GPid pid, KgxTab *page); void kgx_application_remove_watch (KgxApplication *self, GPid pid); PangoFontDescription *kgx_application_get_font (KgxApplication *self); void kgx_application_push_active (KgxApplication *self); void kgx_application_pop_active (KgxApplication *self); void kgx_application_add_page (KgxApplication *self, KgxTab *page); KgxTab *kgx_application_lookup_page (KgxApplication *self, guint id); KgxTab * kgx_application_add_terminal (KgxApplication *self, KgxWindow *existing_window, guint32 timestamp, GFile *working_directory, const char *command, const char *title); G_END_DECLS gnome-console-42~beta/src/kgx-close-dialog.c000066400000000000000000000050101420277463100211660ustar00rootroot00000000000000/* kgx-close-dialog.c * * Copyright 2019 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * SECTION:kgx-close-dialog * @title: KgxCloseDialog * @short_description: Confirmation dialog to close a terminal with children * * The "are you sure?" dialog when a terminal is closed whilst commands are * still running within it */ #include #include "kgx-config.h" #include "kgx-close-dialog.h" #include "kgx-process.h" #include GtkWidget * kgx_close_dialog_new (KgxCloseDialogContext context, GPtrArray *commands) { g_autoptr (GtkBuilder) builder = NULL; GtkWidget *dialog, *list; builder = gtk_builder_new_from_resource (KGX_APPLICATION_PATH "kgx-close-dialog.ui"); dialog = GTK_WIDGET (gtk_builder_get_object (builder, "dialog")); list = GTK_WIDGET (gtk_builder_get_object (builder, "list")); switch (context) { case KGX_CONTEXT_WINDOW: g_object_set (dialog, "text", _("Close Window?"), "secondary-text", _("Some commands are still running, closing this window will kill them and may lead to unexpected outcomes"), NULL); break; case KGX_CONTEXT_TAB: g_object_set (dialog, "text", _("Close Tab?"), "secondary-text", _("Some commands are still running, closing this tab will kill them and may lead to unexpected outcomes"), NULL); break; default: g_assert_not_reached (); } for (int i = 0; i < commands->len; i++) { KgxProcess *process = g_ptr_array_index (commands, i); GtkWidget *row; row = g_object_new (HDY_TYPE_ACTION_ROW, "visible", TRUE, "can-focus", FALSE, "title", kgx_process_get_exec (process), NULL); gtk_container_add (GTK_CONTAINER (list), row); } return dialog; } gnome-console-42~beta/src/kgx-close-dialog.h000066400000000000000000000017631420277463100212060ustar00rootroot00000000000000/* kgx-close-dialog.h * * Copyright 2019 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include #include "kgx-enums.h" G_BEGIN_DECLS typedef enum { KGX_CONTEXT_WINDOW, KGX_CONTEXT_TAB, } KgxCloseDialogContext; GtkWidget *kgx_close_dialog_new (KgxCloseDialogContext context, GPtrArray *commands); G_END_DECLS gnome-console-42~beta/src/kgx-close-dialog.ui000066400000000000000000000031401420277463100213630ustar00rootroot00000000000000 True True False none 300 _Cancel True True True C_lose True True button-cancel button-ok gnome-console-42~beta/src/kgx-pages.c000066400000000000000000000605621420277463100177400ustar00rootroot00000000000000/* kgx-pages.c * * Copyright 2019 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * SECTION:kgx-pages * @title: KgxPages * @short_description: Container of #KgxTab s * * The container of open #KgxTab (uses #HdyTabView internally) */ #include #include "kgx-close-dialog.h" #include "kgx-config.h" #include "kgx-pages.h" #include "kgx-tab.h" #include "kgx-window.h" #include "kgx-terminal.h" typedef struct _KgxPagesPrivate KgxPagesPrivate; struct _KgxPagesPrivate { GtkWidget *view; GtkWidget *status; GtkWidget *status_revealer; int last_cols; int last_rows; guint timeout; gulong size_watcher; KgxTab *active_page; char *title; GBinding *title_bind; GFile *path; GBinding *path_bind; KgxStatus page_status; GBinding *page_status_bind; gboolean is_active; GBinding *is_active_bind; gboolean search_mode_enabled; GBinding *search_bind; PangoFontDescription *font; double zoom; KgxTheme theme; gboolean opaque; gint64 scrollback_lines; HdyTabPage *action_page; }; G_DEFINE_TYPE_WITH_PRIVATE (KgxPages, kgx_pages, GTK_TYPE_BIN) enum { PROP_0, PROP_TAB_VIEW, PROP_TAB_COUNT, PROP_TITLE, PROP_PATH, PROP_THEME, PROP_OPAQUE, PROP_FONT, PROP_ZOOM, PROP_IS_ACTIVE, PROP_STATUS, PROP_SEARCH_MODE_ENABLED, PROP_SCROLLBACK_LINES, LAST_PROP }; static GParamSpec *pspecs[LAST_PROP] = { NULL, }; enum { ZOOM, N_SIGNALS }; static guint signals[N_SIGNALS]; static void kgx_pages_dispose (GObject *object) { KgxPages *self = KGX_PAGES (object); KgxPagesPrivate *priv = kgx_pages_get_instance_private (self); g_clear_handle_id (&priv->timeout, g_source_remove); if (priv->active_page) { g_clear_signal_handler (&priv->size_watcher, priv->active_page); } g_clear_pointer (&priv->title, g_free); g_clear_object (&priv->path); g_clear_pointer (&priv->font, pango_font_description_free); G_OBJECT_CLASS (kgx_pages_parent_class)->dispose (object); } static void kgx_pages_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { KgxPages *self = KGX_PAGES (object); KgxPagesPrivate *priv = kgx_pages_get_instance_private (self); switch (property_id) { case PROP_TAB_COUNT: g_value_set_uint (value, hdy_tab_view_get_n_pages (HDY_TAB_VIEW (priv->view))); break; case PROP_TAB_VIEW: g_value_set_object (value, priv->view); break; case PROP_TITLE: g_value_set_string (value, priv->title); break; case PROP_PATH: g_value_set_object (value, priv->path); break; case PROP_THEME: g_value_set_enum (value, priv->theme); break; case PROP_OPAQUE: g_value_set_boolean (value, priv->opaque); break; case PROP_FONT: g_value_set_boxed (value, priv->font); break; case PROP_ZOOM: g_value_set_double (value, priv->zoom); break; case PROP_IS_ACTIVE: g_value_set_boolean (value, priv->is_active); break; case PROP_STATUS: g_value_set_flags (value, priv->page_status); break; case PROP_SEARCH_MODE_ENABLED: g_value_set_boolean (value, priv->search_mode_enabled); break; case PROP_SCROLLBACK_LINES: g_value_set_int64 (value, priv->scrollback_lines); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void kgx_pages_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { KgxPages *self = KGX_PAGES (object); KgxPagesPrivate *priv = kgx_pages_get_instance_private (self); switch (property_id) { case PROP_TITLE: g_clear_pointer (&priv->title, g_free); priv->title = g_value_dup_string (value); break; case PROP_PATH: g_clear_object (&priv->path); priv->path = g_value_dup_object (value); break; case PROP_THEME: priv->theme = g_value_get_enum (value); break; case PROP_OPAQUE: priv->opaque = g_value_get_boolean (value); break; case PROP_FONT: if (priv->font) { g_boxed_free (PANGO_TYPE_FONT_DESCRIPTION, priv->font); } priv->font = g_value_dup_boxed (value); break; case PROP_ZOOM: priv->zoom = g_value_get_double (value); break; case PROP_IS_ACTIVE: priv->is_active = g_value_get_boolean (value); break; case PROP_STATUS: priv->page_status = g_value_get_flags (value); break; case PROP_SEARCH_MODE_ENABLED: priv->search_mode_enabled = g_value_get_boolean (value); break; case PROP_SCROLLBACK_LINES: priv->scrollback_lines = g_value_get_int64 (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static gboolean size_timeout (KgxPages *self) { KgxPagesPrivate *priv = kgx_pages_get_instance_private (self); priv->timeout = 0; gtk_revealer_set_reveal_child (GTK_REVEALER (priv->status_revealer), FALSE); return G_SOURCE_REMOVE; } static void size_changed (KgxTab *tab, guint rows, guint cols, KgxPages *self) { KgxPagesPrivate *priv = kgx_pages_get_instance_private (self); g_autofree char *label = NULL; if (gtk_widget_in_destruction (GTK_WIDGET (self))) return; if (cols == priv->last_cols && rows == priv->last_rows) { return; } priv->last_cols = cols; priv->last_rows = rows; if (gtk_window_is_maximized (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))))) { // Don't show when maximised as it isn't very interesting return; } g_clear_handle_id (&priv->timeout, g_source_remove); priv->timeout = g_timeout_add (800, G_SOURCE_FUNC (size_timeout), self); g_source_set_name_by_id (priv->timeout, "[kgx] resize label timeout"); label = g_strdup_printf ("%i ร— %i", cols, rows); gtk_label_set_label (GTK_LABEL (priv->status), label); gtk_widget_show (priv->status_revealer); gtk_revealer_set_reveal_child (GTK_REVEALER (priv->status_revealer), TRUE); } static void page_changed (GObject *object, GParamSpec *pspec, KgxPages *self) { KgxPagesPrivate *priv; HdyTabPage *page = NULL; KgxTab *tab; priv = kgx_pages_get_instance_private (self); page = hdy_tab_view_get_selected_page (HDY_TAB_VIEW (priv->view)); if (!page) { return; } tab = KGX_TAB (hdy_tab_page_get_child (page)); g_clear_signal_handler (&priv->size_watcher, priv->active_page); priv->size_watcher = g_signal_connect (tab, "size-changed", G_CALLBACK (size_changed), self); g_clear_object (&priv->title_bind); priv->title_bind = g_object_bind_property (tab, "tab-title", self, "title", G_BINDING_SYNC_CREATE); g_clear_object (&priv->path_bind); priv->path_bind = g_object_bind_property (tab, "tab-path", self, "path", G_BINDING_SYNC_CREATE); if (priv->active_page) { g_object_set (priv->active_page, "is-active", FALSE, NULL); } g_clear_object (&priv->is_active_bind); priv->is_active_bind = g_object_bind_property (self, "is-active", tab, "is-active", G_BINDING_SYNC_CREATE); g_clear_object (&priv->page_status_bind); priv->page_status_bind = g_object_bind_property (tab, "tab-status", self, "status", G_BINDING_SYNC_CREATE); g_clear_object (&priv->search_bind); priv->search_bind = g_object_bind_property (tab, "search-mode-enabled", self, "search-mode-enabled", G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL); priv->active_page = KGX_TAB (tab); } static void died (KgxTab *page, GtkMessageType type, const char *message, gboolean success, KgxPages *self) { KgxPagesPrivate *priv; HdyTabPage *tab_page; gboolean close_on_quit; int tab_count; priv = kgx_pages_get_instance_private (self); tab_page = hdy_tab_view_get_page (HDY_TAB_VIEW (priv->view), GTK_WIDGET (page)); g_object_get (page, "close-on-quit", &close_on_quit, NULL); if (!close_on_quit) { return; } g_object_get (self, "tab-count", &tab_count, NULL); if (tab_count < 1) { return; } hdy_tab_view_close_page (HDY_TAB_VIEW (priv->view), tab_page); } static void zoom (KgxTab *tab, KgxZoom dir, KgxPages *self) { g_signal_emit (self, signals[ZOOM], 0, dir); } static void page_attached (HdyTabView *view, HdyTabPage *page, int position, KgxPages *self) { KgxTab *tab; g_return_if_fail (HDY_IS_TAB_PAGE (page)); tab = KGX_TAB (hdy_tab_page_get_child (page)); g_object_connect (tab, "signal::died", G_CALLBACK (died), self, "signal::zoom", G_CALLBACK (zoom), self, NULL); kgx_tab_set_pages (tab, self); } static void page_detached (HdyTabView *view, HdyTabPage *page, int position, KgxPages *self) { KgxTab *tab; KgxPagesPrivate *priv; GtkWidget *toplevel; g_return_if_fail (HDY_IS_TAB_PAGE (page)); tab = KGX_TAB (hdy_tab_page_get_child (page)); priv = kgx_pages_get_instance_private (self); kgx_tab_set_pages (tab, NULL); g_signal_handlers_disconnect_by_data (tab, self); if (hdy_tab_view_get_n_pages (HDY_TAB_VIEW (priv->view)) == 0) { toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self)); if (GTK_IS_WINDOW (toplevel)) { /* Not a massive fan, would prefer it if window observed pages is empty */ gtk_window_close (GTK_WINDOW (toplevel)); } priv->active_page = NULL; priv->size_watcher = 0; } } static HdyTabView * create_window (HdyTabView *view, KgxPages *self) { /* Perhaps this should be handled via KgxWindow? */ GtkWindow *window; KgxWindow *new_window; GtkApplication *app; KgxPages *new_pages; KgxPagesPrivate *priv; int width, height; window = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))); app = gtk_window_get_application (window); kgx_window_get_size (KGX_WINDOW (window), &width, &height); new_window = g_object_new (KGX_TYPE_WINDOW, "application", app, "default-width", width, "default-height", height, NULL); new_pages = kgx_window_get_pages (new_window); priv = kgx_pages_get_instance_private (new_pages); gtk_window_set_position (GTK_WINDOW (new_window), GTK_WIN_POS_MOUSE); gtk_window_present (GTK_WINDOW (new_window)); return HDY_TAB_VIEW (priv->view); } static void close_response (GtkWidget *dlg, int response, HdyTabPage *page) { KgxTab *tab = KGX_TAB (hdy_tab_page_get_child (page)); KgxPages *self = kgx_tab_get_pages (tab); KgxPagesPrivate *priv = kgx_pages_get_instance_private (self); gtk_widget_destroy (dlg); hdy_tab_view_close_page_finish (HDY_TAB_VIEW (priv->view), page, response == GTK_RESPONSE_OK); } static gboolean close_page (HdyTabView *view, HdyTabPage *page, KgxPages *self) { GtkWidget *dlg; g_autoptr (GPtrArray) children = NULL; GtkWidget *toplevel; children = kgx_tab_get_children (KGX_TAB (hdy_tab_page_get_child (page))); if (children->len < 1) { return FALSE; // Aka no, I donโ€™t want to block closing } toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self)); dlg = kgx_close_dialog_new (KGX_CONTEXT_TAB, children); gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (toplevel)); g_signal_connect (dlg, "response", G_CALLBACK (close_response), page); gtk_widget_show (dlg); return TRUE; // Block the close } static void setup_menu (HdyTabView *view, HdyTabPage *page, KgxPages *self) { KgxPagesPrivate *priv = kgx_pages_get_instance_private (self); priv->action_page = page; } static void check_revealer (GtkRevealer *revealer, GParamSpec *pspec, KgxPages *self) { if (!gtk_revealer_get_child_revealed (revealer)) gtk_widget_hide (GTK_WIDGET (revealer)); } static gboolean status_to_icon (GBinding *binding, const GValue *from_value, GValue *to_value, gpointer user_data) { KgxStatus status = g_value_get_flags (from_value); if (status & KGX_REMOTE) g_value_take_object (to_value, g_themed_icon_new ("status-remote-symbolic")); else if (status & KGX_PRIVILEGED) g_value_take_object (to_value, g_themed_icon_new ("status-privileged-symbolic")); else g_value_set_object (to_value, NULL); return TRUE; } static void kgx_pages_class_init (KgxPagesClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); object_class->dispose = kgx_pages_dispose; object_class->get_property = kgx_pages_get_property; object_class->set_property = kgx_pages_set_property; /** * KgxPages:tab-view: * * The #HdyTabView * * Stability: Private */ pspecs[PROP_TAB_VIEW] = g_param_spec_object ("tab-view", "Tab View", "The tab view", HDY_TYPE_TAB_VIEW, G_PARAM_READABLE); /** * KgxPages:tab-count: * * The number of open pages * * Stability: Private */ pspecs[PROP_TAB_COUNT] = g_param_spec_uint ("tab-count", "Page Count", "Number of pages", 0, G_MAXUINT32, 0, G_PARAM_READABLE); /** * KgxPages:title: * * The #KgxTab:tab-title of the current #KgxTab * * Note the writability of this property in an implementation detail, DO NOT * set this property * * Stability: Private */ pspecs[PROP_TITLE] = g_param_spec_string ("title", "Title", "The title of the active page", NULL, G_PARAM_READWRITE); /** * KgxPages:path: * * The #KgxTab:tab-path of the current #KgxTab * * Note the writability of this property in an implementation detail, DO NOT * set this property * * Stability: Private */ pspecs[PROP_PATH] = g_param_spec_object ("path", "Path", "The path of the active page", G_TYPE_FILE, G_PARAM_READWRITE); /** * KgxPages:theme: * * The #KgxTheme to apply to the #KgxTerminal s in the #KgxTab s * * Stability: Private */ pspecs[PROP_THEME] = g_param_spec_enum ("theme", "Theme", "The path of the active page", KGX_TYPE_THEME, KGX_THEME_NIGHT, G_PARAM_READWRITE); /** * KgxPages:opaque: * * Whether to disable transparency * * Bound to #GtkWindow:is-maximized on the #KgxWindow * * Stability: Private */ pspecs[PROP_OPAQUE] = g_param_spec_boolean ("opaque", "Opaque", "Terminal opaqueness", FALSE, G_PARAM_READWRITE); pspecs[PROP_FONT] = g_param_spec_boxed ("font", "Font", "Monospace font", PANGO_TYPE_FONT_DESCRIPTION, G_PARAM_READWRITE); pspecs[PROP_ZOOM] = g_param_spec_double ("zoom", "Zoom", "Font scaling", KGX_FONT_SCALE_MIN, KGX_FONT_SCALE_MAX, KGX_FONT_SCALE_DEFAULT, G_PARAM_READWRITE); pspecs[PROP_IS_ACTIVE] = g_param_spec_boolean ("is-active", "Is Active", "Is active pages", FALSE, G_PARAM_READWRITE); pspecs[PROP_STATUS] = g_param_spec_flags ("status", "Status", "Active page status", KGX_TYPE_STATUS, KGX_NONE, G_PARAM_READWRITE); pspecs[PROP_SEARCH_MODE_ENABLED] = g_param_spec_boolean ("search-mode-enabled", "Search mode enabled", "Whether the search mode is enabled for active page", FALSE, G_PARAM_READWRITE); /** * KgxTab:scrollback-lines: * * How many lines of scrollback #KgxTerminal should keep * * Bound to โ€˜scrollback-linesโ€™ GSetting so changes persist * * Stability: Private */ pspecs[PROP_SCROLLBACK_LINES] = g_param_spec_int64 ("scrollback-lines", "Scrollback Lines", "Size of the scrollback", G_MININT64, G_MAXINT64, 512, G_PARAM_READWRITE); g_object_class_install_properties (object_class, LAST_PROP, pspecs); signals[ZOOM] = g_signal_new ("zoom", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 1, KGX_TYPE_ZOOM); gtk_widget_class_set_template_from_resource (widget_class, KGX_APPLICATION_PATH "kgx-pages.ui"); gtk_widget_class_bind_template_child_private (widget_class, KgxPages, view); gtk_widget_class_bind_template_child_private (widget_class, KgxPages, status); gtk_widget_class_bind_template_child_private (widget_class, KgxPages, status_revealer); gtk_widget_class_bind_template_callback (widget_class, page_changed); gtk_widget_class_bind_template_callback (widget_class, page_attached); gtk_widget_class_bind_template_callback (widget_class, page_detached); gtk_widget_class_bind_template_callback (widget_class, create_window); gtk_widget_class_bind_template_callback (widget_class, close_page); gtk_widget_class_bind_template_callback (widget_class, setup_menu); gtk_widget_class_bind_template_callback (widget_class, check_revealer); gtk_widget_class_set_css_name (widget_class, "pages"); } static void kgx_pages_init (KgxPages *self) { KgxPagesPrivate *priv = kgx_pages_get_instance_private (self); priv->font = NULL; priv->zoom = KGX_FONT_SCALE_DEFAULT; priv->theme = KGX_THEME_NIGHT; priv->opaque = FALSE; gtk_widget_init_template (GTK_WIDGET (self)); } void kgx_pages_add_page (KgxPages *self, KgxTab *tab) { KgxPagesPrivate *priv; HdyTabPage *page; g_return_if_fail (KGX_IS_PAGES (self)); priv = kgx_pages_get_instance_private (self); kgx_tab_set_initial_title (tab, priv->title, priv->path); page = hdy_tab_view_add_page (HDY_TAB_VIEW (priv->view), GTK_WIDGET (tab), NULL); g_object_bind_property (tab, "tab-title", page, "title", G_BINDING_SYNC_CREATE); g_object_bind_property (tab, "tab-tooltip", page, "tooltip", G_BINDING_SYNC_CREATE); g_object_bind_property (tab, "needs-attention", page, "needs-attention", G_BINDING_SYNC_CREATE); g_object_bind_property_full (tab, "tab-status", page, "icon", G_BINDING_SYNC_CREATE, status_to_icon, NULL, NULL, NULL); } void kgx_pages_remove_page (KgxPages *self, KgxTab *page) { KgxPagesPrivate *priv; HdyTabPage *tab_page; g_return_if_fail (KGX_IS_PAGES (self)); priv = kgx_pages_get_instance_private (self); if (!page) { tab_page = hdy_tab_view_get_selected_page (HDY_TAB_VIEW (priv->view)); hdy_tab_view_close_page (HDY_TAB_VIEW (priv->view), tab_page); return; } g_return_if_fail (KGX_IS_TAB (page)); tab_page = hdy_tab_view_get_page (HDY_TAB_VIEW (priv->view), GTK_WIDGET (page)); hdy_tab_view_close_page (HDY_TAB_VIEW (priv->view), tab_page); } /** * kgx_pages_focus_page: * @self: the #KgxPages * @page: the #KgxTab to focus * * Switch to a page */ void kgx_pages_focus_page (KgxPages *self, KgxTab *page) { KgxPagesPrivate *priv; HdyTabPage *index; g_return_if_fail (KGX_IS_PAGES (self)); g_return_if_fail (KGX_IS_TAB (page)); priv = kgx_pages_get_instance_private (self); index = hdy_tab_view_get_page (HDY_TAB_VIEW (priv->view), GTK_WIDGET (page)); g_return_if_fail (index != NULL); hdy_tab_view_set_selected_page (HDY_TAB_VIEW (priv->view), index); gtk_widget_grab_focus (GTK_WIDGET (page)); } /** * kgx_pages_current_status: * @self: the #KgxPages * * Get the #KgxStatus of the current #KgxTab */ KgxStatus kgx_pages_current_status (KgxPages *self) { KgxPagesPrivate *priv; g_return_val_if_fail (KGX_IS_PAGES (self), KGX_NONE); priv = kgx_pages_get_instance_private (self); return priv->page_status; } /** * kgx_pages_get_children: * @self: the #KgxPages * * Call kgx_tab_get_children on all #KgxTab s in @self building a * combined list * * Returns: (element-type Kgx.Process) (transfer full): the list of #KgxProcess */ GPtrArray * kgx_pages_get_children (KgxPages *self) { KgxPagesPrivate *priv; GPtrArray *children; guint n; g_return_val_if_fail (KGX_IS_PAGES (self), KGX_NONE); priv = kgx_pages_get_instance_private (self); children = g_ptr_array_new_full (10, (GDestroyNotify) kgx_process_unref); n = hdy_tab_view_get_n_pages (HDY_TAB_VIEW (priv->view)); for (guint i = 0; i < n; i++) { HdyTabPage *page = hdy_tab_view_get_nth_page (HDY_TAB_VIEW (priv->view), i); g_autoptr (GPtrArray) page_children = NULL; page_children = kgx_tab_get_children (KGX_TAB (hdy_tab_page_get_child (page))); for (int j = 0; j < page_children->len; j++) { g_ptr_array_add (children, g_ptr_array_steal_index (page_children, j)); } // 2.62: g_ptr_array_extend_and_steal (children, page_children); }; return children; } void kgx_pages_set_shortcut_widget (KgxPages *self, GtkWidget *widget) { KgxPagesPrivate *priv; g_return_if_fail (KGX_IS_PAGES (self)); g_return_if_fail (GTK_IS_WIDGET (widget) || widget == NULL); priv = kgx_pages_get_instance_private (self); hdy_tab_view_set_shortcut_widget (HDY_TAB_VIEW (priv->view), widget); } gboolean kgx_pages_key_press_event (KgxPages *self, GdkEvent *event) { KgxPagesPrivate *priv; g_return_val_if_fail (KGX_IS_PAGES (self), GDK_EVENT_PROPAGATE); g_return_val_if_fail (event != NULL, GDK_EVENT_PROPAGATE); priv = kgx_pages_get_instance_private (self); if (!priv->active_page) return GDK_EVENT_PROPAGATE; return kgx_tab_key_press_event (priv->active_page, event); } void kgx_pages_close_page (KgxPages *self) { KgxPagesPrivate *priv; HdyTabPage *page; g_return_if_fail (KGX_IS_PAGES (self)); priv = kgx_pages_get_instance_private (self); page = priv->action_page; if (!page) page = hdy_tab_view_get_selected_page (HDY_TAB_VIEW (priv->view)); hdy_tab_view_close_page (HDY_TAB_VIEW (priv->view), page); } void kgx_pages_detach_page (KgxPages *self) { KgxPagesPrivate *priv; HdyTabPage *page; HdyTabView *new_view; g_return_if_fail (KGX_IS_PAGES (self)); priv = kgx_pages_get_instance_private (self); page = priv->action_page; if (!page) page = hdy_tab_view_get_selected_page (HDY_TAB_VIEW (priv->view)); new_view = create_window (HDY_TAB_VIEW (priv->view), self); hdy_tab_view_transfer_page (HDY_TAB_VIEW (priv->view), page, new_view, 0); } gnome-console-42~beta/src/kgx-pages.h000066400000000000000000000034561420277463100177440ustar00rootroot00000000000000/* kgx-pages.h * * Copyright 2019 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include #include "kgx-tab.h" G_BEGIN_DECLS #define KGX_TYPE_PAGES (kgx_pages_get_type()) /** * KgxPagesClass: */ struct _KgxPagesClass { /*< private >*/ GtkBinClass parent; /*< public >*/ }; G_DECLARE_DERIVABLE_TYPE (KgxPages, kgx_pages, KGX, PAGES, GtkBin) void kgx_pages_add_page (KgxPages *self, KgxTab *page); void kgx_pages_remove_page (KgxPages *self, KgxTab *page); GPtrArray *kgx_pages_get_children (KgxPages *self); void kgx_pages_focus_page (KgxPages *self, KgxTab *page); KgxStatus kgx_pages_current_status (KgxPages *self); void kgx_pages_set_shortcut_widget (KgxPages *self, GtkWidget *widget); gboolean kgx_pages_key_press_event (KgxPages *self, GdkEvent *event); void kgx_pages_close_page (KgxPages *self); void kgx_pages_detach_page (KgxPages *self); G_END_DECLS gnome-console-42~beta/src/kgx-pages.ui000066400000000000000000000045731420277463100201330ustar00rootroot00000000000000
_Detach Tab tab.detach
_Close tab.close
status-regular-symbolic
gnome-console-42~beta/src/kgx-process.c000066400000000000000000000122361420277463100203120ustar00rootroot00000000000000/* kgx-process.c * * Copyright 2019 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * SECTION:kgx-process * @title: KgxProcess * @short_description: Information about running processes * * Provides an abstraction of libgtop to fetch information about running * process, this is used by #KgxApplication to monitor things happening in * a #KgxTerminal for the purposes of styling a #KgxWindow */ #include #include #include #include #include "kgx-process.h" struct _KgxProcess { GPid pid; GPid parent; gint32 uid; gint32 euid; char *exec; }; static void clear_process (KgxProcess *self) { g_clear_pointer (&self->exec, g_free); } /** * kgx_process_unref: * @self: the #KgxProcess * * Reduce the refrence count of @self, possibly freeing @self * * See g_rc_box_acquire() and g_rc_box_release_full() * * Stability: Private */ void kgx_process_unref (KgxProcess *self) { g_return_if_fail (self != NULL); g_rc_box_release_full (self, (GDestroyNotify) clear_process); } G_DEFINE_BOXED_TYPE (KgxProcess, kgx_process, g_rc_box_acquire, kgx_process_unref) /** * kgx_process_new: * @pid: The #GPid to get info about * * Populate a new #KgxProcess with details about the process @pid * * Stability: Private */ inline KgxProcess * kgx_process_new (GPid pid) { glibtop_proc_uid info; KgxProcess *self = NULL; self = g_rc_box_new0 (KgxProcess); self->pid = pid; glibtop_get_proc_uid (&info, pid); self->parent = info.ppid; self->uid = info.uid; self->euid = info.euid; self->exec = NULL; return self; } /** * kgx_process_get_pid: * @self: the #KgxProcess * * Returns: The process id * * Stability: Private */ inline GPid kgx_process_get_pid (KgxProcess *self) { g_return_val_if_fail (self != NULL, 0); return self->pid; } /** * kgx_process_get_uid: * @self: the #KgxProcess * * Returns: The user id of the process * * Stability: Private */ inline gint32 kgx_process_get_uid (KgxProcess *self) { g_return_val_if_fail (self != NULL, 0); return self->uid; } /** * kgx_process_get_is_root: * @self: the #KgxProcess * * Returns: %TRUE if this process is running as root * * Stability: Private */ inline gboolean kgx_process_get_is_root (KgxProcess *self) { g_return_val_if_fail (self != NULL, FALSE); return self->euid == 0; } /** * kgx_process_get_parent: * @self: the #KgxProcess * * Get information about the processes parent * * Note a previous version (0.1.0) returned a #KgxProcess, this has been * changed in favour of lazy loading * * Returns: the parent #GPid * * Stability: Private */ inline GPid kgx_process_get_parent (KgxProcess *self) { g_return_val_if_fail (self != NULL, 0); return self->parent; } /** * kgx_process_get_exec: * @self: the #KgxProcess * * Get the command line used to invoke to process * * Stability: Private */ inline const char * kgx_process_get_exec (KgxProcess *self) { g_return_val_if_fail (self != NULL, NULL); if (G_LIKELY (self->exec == NULL)) { g_auto(GStrv) args = NULL; glibtop_proc_args args_size; args = glibtop_get_proc_argv (&args_size, self->pid, 0); self->exec = g_strjoinv (" ", args); } return self->exec; } /** * kgx_pid_cmp: * @a: the first #GPid * @b: the second #GPid * @data: unused * * Implementation of #GCompareDataFunc for comparing #GPid encoded with * GINT_TO_POINTER() * * Returns: difference between @a and @b * * Stability: Private */ int kgx_pid_cmp (gconstpointer a, gconstpointer b, gpointer data) { return a - b; } /** * kgx_process_get_list: (skip) * * Get the list of running processes * * Note: This originally (0.1.0) returned #GPtrArray but now returns #GTree * for faster lookup * * Note: (skip) due to * https://gitlab.gnome.org/GNOME/gobject-introspection/issues/310 * * #GTree is map of #GPid -> #KgxProcess * * Returns: ~ (transfer full) (element-type GLib.Pid Kgx.Process) * List of processes, free with g_tree_unref() * * Stability: Private */ GTree * kgx_process_get_list (void) { glibtop_proclist pid_list; g_autofree GPid *pids = NULL; GTree *list = NULL; list = g_tree_new_full (kgx_pid_cmp, NULL, NULL, (GDestroyNotify) kgx_process_unref); pids = glibtop_get_proclist (&pid_list, GLIBTOP_KERN_PROC_ALL, 0); g_return_val_if_fail (pids != NULL, NULL); for (int i = 0; i < pid_list.number; i++) { g_tree_insert (list, GINT_TO_POINTER (pids[i]), kgx_process_new (pids[i])); } return list; } gnome-console-42~beta/src/kgx-process.h000066400000000000000000000031211420277463100203100ustar00rootroot00000000000000/* kgx-process.h * * Copyright 2019 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include #include #include "kgx-config.h" G_BEGIN_DECLS typedef struct _KgxProcess KgxProcess; #define KGX_TYPE_PROCESS (kgx_process_get_type ()) GTree *kgx_process_get_list (void); KgxProcess *kgx_process_new (GPid pid); GPid kgx_process_get_pid (KgxProcess *self); gint32 kgx_process_get_uid (KgxProcess *self); gboolean kgx_process_get_is_root (KgxProcess *self); GPid kgx_process_get_parent (KgxProcess *self); const char *kgx_process_get_exec (KgxProcess *self); GType kgx_process_get_type (void); void kgx_process_unref (KgxProcess *self); int kgx_pid_cmp (gconstpointer a, gconstpointer b, gpointer data); G_DEFINE_AUTOPTR_CLEANUP_FUNC (KgxProcess, kgx_process_unref) G_END_DECLS gnome-console-42~beta/src/kgx-proxy-info.c000066400000000000000000000175531420277463100207550ustar00rootroot00000000000000/* kgx-proxy-info.c * * Copyright 2021 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * SECTION:kgx-proxy-info * @short_description: An object with proxy details * @title: KgxProxyInfo * * #KgxProxyInfo maps org.gnome.system.proxy to environmental variables * when launching new sessions * * Note that whilst changes to system settings are tracked, they _cannot_ be * applied existing terminals * * Only manual proxies are supported */ #include "kgx-config.h" #include #include #include "kgx-proxy-info.h" struct _KgxProxyInfo { GObject parent_instance; GSettings *settings; GSettings *protocols[4]; gulong changed_handler[4]; GDesktopProxyMode mode; GHashTable *environ; }; static char *proxy_scheme[] = { "http", "http", "http", "socks", }; static char *proxy_variable[] = { "http_proxy", "https_proxy", "ftp_proxy", "all_proxy", }; typedef enum { HTTP = 0, HTTPS, FTP, SOCKS, } Protocol; G_DEFINE_TYPE (KgxProxyInfo, kgx_proxy_info, G_TYPE_OBJECT) static void kgx_proxy_info_dispose (GObject *object) { KgxProxyInfo *self = KGX_PROXY_INFO (object); G_STATIC_ASSERT (G_N_ELEMENTS (self->protocols) == G_N_ELEMENTS (self->changed_handler)); g_clear_object (&self->settings); for (int i = 0; i < G_N_ELEMENTS (self->protocols); i++) { g_clear_signal_handler (&self->changed_handler[i], self->protocols[i]); g_clear_object (&self->protocols[i]); } g_clear_pointer (&self->environ, g_hash_table_unref); G_OBJECT_CLASS (kgx_proxy_info_parent_class)->dispose (object); } static void kgx_proxy_info_class_init (KgxProxyInfoClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); object_class->dispose = kgx_proxy_info_dispose; } /** * env_set_both: * @self: the #KgxProxyInfo * @key: (transfer none): the lower case key name * @value: (transfer full): the value to set * * Set both upper and lower case variants of @key to @value */ static void env_set_both (KgxProxyInfo *self, const char *key, char *value) { if (!value) return; g_hash_table_replace (self->environ, g_strdup (key), g_strdup (value)); g_hash_table_replace (self->environ, g_ascii_strup (key, -1), value); } static void handle_protocol (KgxProxyInfo *self, Protocol protocol) { g_autoptr (GUri) uri = NULL; g_autofree char *host = NULL; g_autofree char *user = NULL; g_autofree char *password = NULL; int port = -1; GSettings *settings = self->protocols[protocol]; host = g_settings_get_string (settings, "host"); port = g_settings_get_int (settings, "port"); if (!host || !host[0] || port == 0) { g_hash_table_remove (self->environ, proxy_variable[protocol]); return; } if (G_UNLIKELY (protocol == HTTP && g_settings_get_boolean (settings, "use-authentication"))) { user = g_settings_get_string (settings, "authentication-user"); password = g_settings_get_string (settings, "authentication-password"); } uri = g_uri_build_with_user (G_URI_FLAGS_NONE, proxy_scheme[protocol], user && user[0] ? user : NULL, password && password[0] ? password : NULL, NULL, host, port, "", NULL, NULL); env_set_both (self, proxy_variable[protocol], g_uri_to_string (uri)); } static void handle_ignored (KgxProxyInfo *self) { g_autoptr (GString) value = NULL; g_auto (GStrv) hosts = NULL; g_settings_get (self->settings, "ignore-hosts", "^as", &hosts); if (hosts == NULL) { return; } value = g_string_sized_new (100); for (int i = 0; hosts[i] != NULL; ++i) { if (i > 0) { g_string_append_c (value, ','); } g_string_append (value, hosts[i]); } env_set_both (self, "no_proxy", g_string_free (g_steal_pointer (&value), FALSE)); } static void manual_settings_changed (GSettings *settings, const char *key, KgxProxyInfo *self) { g_hash_table_remove_all (self->environ); for (int i = 0; i < G_N_ELEMENTS (self->protocols); i++) { handle_protocol (self, i); } handle_ignored (self); } static void proxy_settings_changed (GSettings *settings, const char *key, KgxProxyInfo *self) { GDesktopProxyMode mode = g_settings_get_enum (settings, "mode"); if (mode == self->mode) { return; } switch (mode) { case G_DESKTOP_PROXY_MODE_MANUAL: for (int i = 0; i < G_N_ELEMENTS (self->changed_handler); i++) { self->changed_handler[i] = g_signal_connect (self->protocols[i], "changed", G_CALLBACK (manual_settings_changed), self); } manual_settings_changed (NULL, NULL, self); break; case G_DESKTOP_PROXY_MODE_AUTO: g_info ("Can't handle auto proxy"); case G_DESKTOP_PROXY_MODE_NONE: for (int i = 0; i < G_N_ELEMENTS (self->changed_handler); i++) { g_clear_signal_handler (&self->changed_handler[i], self->protocols[i]); } g_hash_table_remove_all (self->environ); break; default: g_return_if_reached (); } } static void kgx_proxy_info_init (KgxProxyInfo *self) { self->settings = g_settings_new ("org.gnome.system.proxy"); self->protocols[HTTP] = g_settings_get_child (self->settings, "http"); self->protocols[HTTPS] = g_settings_get_child (self->settings, "https"); self->protocols[FTP] = g_settings_get_child (self->settings, "ftp"); self->protocols[SOCKS] = g_settings_get_child (self->settings, "socks"); self->environ = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); g_signal_connect (self->settings, "changed", G_CALLBACK (proxy_settings_changed), self); proxy_settings_changed (self->settings, NULL, self); } /** * kgx_proxy_info_get_default: * * Returns: (transfer none): the #KgxProxyInfo singleton */ KgxProxyInfo * kgx_proxy_info_get_default (void) { static KgxProxyInfo *instance; if (instance == NULL) { instance = g_object_new (KGX_TYPE_PROXY_INFO, NULL); g_object_add_weak_pointer (G_OBJECT (instance), (gpointer *) &instance); } return instance; } /** * kgx_proxy_info_apply_to_environ: * @self: the #KgxProxyInfo * @env: (out caller-allocates): an environment to modify * * Add the users current proxy settings to @env */ void kgx_proxy_info_apply_to_environ (KgxProxyInfo *self, char ***env) { GHashTableIter iter; char *key, *value; g_return_if_fail (KGX_IS_PROXY_INFO (self)); g_hash_table_iter_init (&iter, self->environ); while (g_hash_table_iter_next (&iter, (gpointer *) &key, (gpointer *) &value)) { *env = g_environ_setenv (*env, key, value, TRUE); } } gnome-console-42~beta/src/kgx-proxy-info.h000066400000000000000000000021171420277463100207500ustar00rootroot00000000000000/* kgx-proxy-info.h * * Copyright 2021 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include G_BEGIN_DECLS #define KGX_TYPE_PROXY_INFO kgx_proxy_info_get_type () G_DECLARE_FINAL_TYPE (KgxProxyInfo, kgx_proxy_info, KGX, PROXY_INFO, GObject) KgxProxyInfo *kgx_proxy_info_get_default (void); void kgx_proxy_info_apply_to_environ (KgxProxyInfo *self, char ***env); G_END_DECLS gnome-console-42~beta/src/kgx-simple-tab.c000066400000000000000000000224711420277463100206730ustar00rootroot00000000000000/* kgx-local-page.c * * Copyright 2019-2020 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * SECTION:kgx-simple-tab * @title: KgxSimpleTab * @short_description: #KgxTab for an old fashioned local terminal */ #include "kgx-config.h" #include #include "kgx-terminal.h" #include "kgx-proxy-info.h" #include "kgx-simple-tab.h" #include "fp-vte-util.h" G_DEFINE_TYPE (KgxSimpleTab, kgx_simple_tab, KGX_TYPE_TAB) enum { PROP_0, PROP_INITIAL_WORK_DIR, PROP_COMMAND, LAST_PROP }; static GParamSpec *pspecs[LAST_PROP] = { NULL, }; static void kgx_simple_tab_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { KgxSimpleTab *self = KGX_SIMPLE_TAB (object); switch (property_id) { case PROP_INITIAL_WORK_DIR: self->initial_work_dir = g_value_dup_string (value); break; case PROP_COMMAND: self->command = g_value_dup_boxed (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void kgx_simple_tab_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { KgxSimpleTab *self = KGX_SIMPLE_TAB (object); switch (property_id) { case PROP_INITIAL_WORK_DIR: g_value_set_string (value, self->initial_work_dir); break; case PROP_COMMAND: g_value_set_boxed (value, self->command); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void kgx_simple_tab_finalize (GObject *object) { KgxSimpleTab *self = KGX_SIMPLE_TAB (object); g_clear_pointer (&self->initial_work_dir, g_free); g_clear_pointer (&self->command, g_strfreev); if (self->spawn_cancellable) { g_cancellable_cancel (self->spawn_cancellable); } g_clear_object (&self->spawn_cancellable); G_OBJECT_CLASS (kgx_simple_tab_parent_class)->finalize (object); } typedef struct { KgxSimpleTab *self; GTask *task; } StartData; static void clear_start_data (gpointer data) { StartData *self = data; g_clear_weak_pointer (&self->self); g_clear_object (&self->task); g_free (self); } G_DEFINE_AUTOPTR_CLEANUP_FUNC (StartData, clear_start_data) typedef struct { KgxSimpleTab *self; } WaitData; static void clear_wait_data (gpointer data) { WaitData *self = data; g_clear_weak_pointer (&self->self); g_free (self); } G_DEFINE_AUTOPTR_CLEANUP_FUNC (WaitData, clear_wait_data) static void wait_cb (GPid pid, int status, gpointer user_data) { g_autoptr (WaitData) data = user_data; g_autoptr (GError) error = NULL; if (!data->self) { return; /* Tab destroyed before the process actually died */ } g_return_if_fail (KGX_SIMPLE_TAB (data->self)); /* wait_check will set @error if it got a signal/non-zero exit */ if (!g_spawn_check_exit_status (status, &error)) { g_autofree char *message = NULL; // translators: marks the text as bold, ensure they are // matched please! message = g_strdup_printf (_("Read Only โ€” Command exited with code %i"), status); kgx_tab_died (KGX_TAB (data->self), GTK_MESSAGE_ERROR, message, TRUE); } else { kgx_tab_died (KGX_TAB (data->self), GTK_MESSAGE_INFO, // translators: marks the text as bold, ensure they are // matched please! _("Read Only โ€” Command exited"), TRUE); } } static void spawned (VtePty *pty, GAsyncResult *res, gpointer udata) { g_autoptr (StartData) start_data = udata; g_autoptr (WaitData) wait_data = NULL; g_autoptr (GError) error = NULL; GPid pid; g_return_if_fail (VTE_IS_PTY (pty)); g_return_if_fail (G_IS_ASYNC_RESULT (res)); fp_vte_pty_spawn_finish (pty, res, &pid, &error); if (!start_data->self) { return; /* The tab went away whilst we were spawning */ } g_return_if_fail (KGX_SIMPLE_TAB (start_data->self)); if (error) { g_autofree char *message = NULL; // translators: marks the text as bold, ensure they are // matched please! message = g_strdup_printf (_("Failed to start โ€” %s"), error->message); kgx_tab_died (KGX_TAB (start_data->self), GTK_MESSAGE_ERROR, message, FALSE); g_task_return_error (start_data->task, g_steal_pointer (&error)); return; } wait_data = g_new0 (WaitData, 1); g_set_weak_pointer (&wait_data->self, start_data->self); g_child_watch_add (pid, wait_cb, g_steal_pointer (&wait_data)); g_task_return_int (G_TASK (start_data->task), pid); } static void kgx_simple_tab_start (KgxTab *page, GAsyncReadyCallback callback, gpointer callback_data) { KgxSimpleTab *self; g_autoptr (VtePty) pty = NULL; g_autoptr (GError) error = NULL; g_auto (GStrv) env = NULL; g_autoptr (StartData) data = NULL; g_autoptr (GTask) task = NULL; g_return_if_fail (KGX_IS_SIMPLE_TAB (page)); self = KGX_SIMPLE_TAB (page); if (self->spawn_cancellable) { g_cancellable_reset (self->spawn_cancellable); } else { self->spawn_cancellable = g_cancellable_new (); } task = g_task_new (self, self->spawn_cancellable, callback, callback_data); g_task_set_source_tag (task, kgx_simple_tab_start); pty = vte_pty_new_sync (VTE_PTY_DEFAULT, self->spawn_cancellable, &error); if (error) { g_task_return_error (task, error); g_clear_object (&self->spawn_cancellable); return; } env = g_environ_setenv (env, "TERM", "xterm-256color", TRUE); vte_terminal_set_pty (VTE_TERMINAL (self->terminal), pty); data = g_new0 (StartData, 1); g_set_weak_pointer (&data->self, self); g_set_object (&data->task, task); kgx_proxy_info_apply_to_environ (kgx_proxy_info_get_default (), &env); fp_vte_pty_spawn_async (pty, self->initial_work_dir, (const char *const *) self->command, (const char *const *) env, -1, self->spawn_cancellable, (GAsyncReadyCallback) spawned, g_steal_pointer (&data)); } static GPid kgx_simple_tab_start_finish (KgxTab *page, GAsyncResult *res, GError **error) { g_return_val_if_fail (g_task_is_valid (res, page), 0); return g_task_propagate_int (G_TASK (res), error); } static void path_changed (GObject *object, GParamSpec *pspec, KgxSimpleTab *self) { g_autofree char *desc = NULL; g_autoptr (GFile) path = NULL; g_object_get (self->terminal, "path", &path, NULL); if (path) { desc = g_strdup_printf ("%s", g_file_get_path (path)); } g_object_set (self, "tab-tooltip", desc, NULL); } static void kgx_simple_tab_class_init (KgxSimpleTabClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); KgxTabClass *page_class = KGX_TAB_CLASS (klass); object_class->set_property = kgx_simple_tab_set_property; object_class->get_property = kgx_simple_tab_get_property; object_class->finalize = kgx_simple_tab_finalize; page_class->start = kgx_simple_tab_start; page_class->start_finish = kgx_simple_tab_start_finish; /** * KgxSimpleTab:initial-work-dir: * * Used to handle --working-dir */ pspecs[PROP_INITIAL_WORK_DIR] = g_param_spec_string ("initial-work-dir", "Initial directory", "Initial working directory", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); /** * KgxSimpleTab:command: * * Used to handle -e */ pspecs[PROP_COMMAND] = g_param_spec_boxed ("command", "Command", "Command to run", G_TYPE_STRV, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); g_object_class_install_properties (object_class, LAST_PROP, pspecs); gtk_widget_class_set_template_from_resource (widget_class, KGX_APPLICATION_PATH "kgx-simple-tab.ui"); gtk_widget_class_bind_template_child (widget_class, KgxSimpleTab, terminal); gtk_widget_class_bind_template_callback (widget_class, path_changed); } static void kgx_simple_tab_init (KgxSimpleTab *self) { gtk_widget_init_template (GTK_WIDGET (self)); kgx_tab_connect_terminal (KGX_TAB (self), KGX_TERMINAL (self->terminal)); } gnome-console-42~beta/src/kgx-simple-tab.h000066400000000000000000000026231420277463100206750ustar00rootroot00000000000000/* kgx-simple-tab.h * * Copyright 2019-2020 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include #include "kgx-tab.h" G_BEGIN_DECLS #define KGX_TYPE_SIMPLE_TAB kgx_simple_tab_get_type () /** * KgxSimpleTab: * @title: the title of the page * @path: the current directory of the path * @initial_work_dir: the directory to start in * @command: the root/shell command to run * @terminal: the #KgxTerminal * * Stability: Private */ struct _KgxSimpleTab { /*< private >*/ KgxTab parent_instance; /*< public >*/ char *title; GFile *path; char *initial_work_dir; GStrv command; GtkWidget *terminal; GCancellable *spawn_cancellable; }; G_DECLARE_FINAL_TYPE (KgxSimpleTab, kgx_simple_tab, KGX, SIMPLE_TAB, KgxTab) G_END_DECLS gnome-console-42~beta/src/kgx-simple-tab.ui000066400000000000000000000016661420277463100210710ustar00rootroot00000000000000 gnome-console-42~beta/src/kgx-tab-button.c000066400000000000000000000165431420277463100207200ustar00rootroot00000000000000/* kgx-tab-button.c * * Copyright 2019 Alexander Mikhaylenko * Copyright 2021 Purism SPC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * SECTION:hdy-tab-button * @short_description: A button that displays the number of #HdyTabView pages * @title: KgxTabButton * * The #KgxTabButton widget is a #GtkButton subclass that displays the number * of pages in a given #HdyTabView. * * It can be used to open a tab switcher view in a mobile UI. * * # CSS nodes * * #KgxTabButton has a main CSS node with name button and style class * .tab-button. * * It contains the subnode overlay, which contains nodes image and label. The * label subnode can contain the .small style class for 10 or more tabs. */ #include "kgx-config.h" #include "kgx-tab-button.h" /* Copied from GtkInspector code */ #define XFT_DPI_MULTIPLIER (96.0 * PANGO_SCALE) struct _KgxTabButton { GtkButton parent_instance; GtkLabel *label; GtkImage *icon; HdyTabView *view; }; G_DEFINE_TYPE (KgxTabButton, kgx_tab_button, GTK_TYPE_BUTTON) enum { PROP_0, PROP_VIEW, LAST_PROP }; static GParamSpec *pspecs[LAST_PROP] = { NULL, }; /* FIXME: I hope there is a better way to prevent the label from changing scale */ static void update_label_scale (KgxTabButton *self, GtkSettings *settings) { int xft_dpi; PangoAttrList *attrs; PangoAttribute *scale_attribute; g_object_get (settings, "gtk-xft-dpi", &xft_dpi, NULL); attrs = pango_attr_list_new (); scale_attribute = pango_attr_scale_new (XFT_DPI_MULTIPLIER / (double) xft_dpi); pango_attr_list_change (attrs, scale_attribute); gtk_label_set_attributes (self->label, attrs); pango_attr_list_unref (attrs); } static void xft_dpi_changed (KgxTabButton *self, GParamSpec *pspec, GtkSettings *settings) { update_label_scale (self, settings); } static void update_icon (KgxTabButton *self) { gboolean display_label = FALSE; gboolean small_label = FALSE; const char *icon_name = "tab-counter-symbolic"; g_autofree char *label_text = NULL; GtkStyleContext *context; if (self->view) { guint n_pages = hdy_tab_view_get_n_pages (self->view); small_label = n_pages >= 10; if (n_pages < 100) { display_label = TRUE; label_text = g_strdup_printf ("%u", n_pages); } else { icon_name = "tab-overflow-symbolic"; } } context = gtk_widget_get_style_context (GTK_WIDGET (self->label)); if (small_label) { gtk_style_context_add_class (context, "small"); } else { gtk_style_context_remove_class (context, "small"); } gtk_widget_set_visible (GTK_WIDGET (self->label), display_label); gtk_label_set_text (self->label, label_text); gtk_image_set_from_icon_name (self->icon, icon_name, GTK_ICON_SIZE_BUTTON); } static void kgx_tab_button_dispose (GObject *object) { KgxTabButton *self = KGX_TAB_BUTTON (object); kgx_tab_button_set_view (self, NULL); G_OBJECT_CLASS (kgx_tab_button_parent_class)->dispose (object); } static void kgx_tab_button_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { KgxTabButton *self = KGX_TAB_BUTTON (object); switch (prop_id) { case PROP_VIEW: g_value_set_object (value, kgx_tab_button_get_view (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void kgx_tab_button_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { KgxTabButton *self = KGX_TAB_BUTTON (object); switch (prop_id) { case PROP_VIEW: kgx_tab_button_set_view (self, g_value_get_object (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void kgx_tab_button_class_init (KgxTabButtonClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); object_class->dispose = kgx_tab_button_dispose; object_class->get_property = kgx_tab_button_get_property; object_class->set_property = kgx_tab_button_set_property; /** * KgxTabButton:view: * * The #HdyTabView the tab button displays. */ pspecs[PROP_VIEW] = g_param_spec_object ("view", "View", "The view the tab button displays.", HDY_TYPE_TAB_VIEW, G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY); g_object_class_install_properties (object_class, LAST_PROP, pspecs); gtk_widget_class_set_template_from_resource (widget_class, KGX_APPLICATION_PATH "kgx-tab-button.ui"); gtk_widget_class_bind_template_child (widget_class, KgxTabButton, label); gtk_widget_class_bind_template_child (widget_class, KgxTabButton, icon); } static void kgx_tab_button_init (KgxTabButton *self) { GtkSettings *settings; gtk_widget_init_template (GTK_WIDGET (self)); update_icon (self); settings = gtk_widget_get_settings (GTK_WIDGET (self)); update_label_scale (self, settings); g_signal_connect_object (settings, "notify::gtk-xft-dpi", G_CALLBACK (xft_dpi_changed), self, G_CONNECT_SWAPPED); } /** * kgx_tab_button_new: * * Creates a new #KgxTabButton widget. * * Returns: a new #KgxTabButton */ GtkWidget * kgx_tab_button_new (void) { return g_object_new (KGX_TYPE_TAB_BUTTON, NULL); } /** * kgx_tab_button_get_view: * @self: a #KgxTabButton * * Gets the #HdyTabView @self displays. * * Returns: (transfer none) (nullable): the #HdyTabView @self displays */ HdyTabView * kgx_tab_button_get_view (KgxTabButton *self) { g_return_val_if_fail (KGX_IS_TAB_BUTTON (self), NULL); return self->view; } /** * kgx_tab_button_set_view: * @self: a #KgxTabButton * @view: (nullable): a #HdyTabView * * Sets the #HdyTabView @self displays. */ void kgx_tab_button_set_view (KgxTabButton *self, HdyTabView *view) { g_return_if_fail (KGX_IS_TAB_BUTTON (self)); g_return_if_fail (view == NULL || HDY_IS_TAB_VIEW (view)); if (self->view == view) { return; } if (self->view) { g_signal_handlers_disconnect_by_func (self->view, update_icon, self); } g_set_object (&self->view, view); if (self->view) { g_signal_connect_object (self->view, "notify::n-pages", G_CALLBACK (update_icon), self, G_CONNECT_SWAPPED); } update_icon (self); g_object_notify_by_pspec (G_OBJECT (self), pspecs[PROP_VIEW]); } gnome-console-42~beta/src/kgx-tab-button.h000066400000000000000000000021441420277463100207150ustar00rootroot00000000000000/* kgx-tab-button.h * * Copyright 2021 Purism SPC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include G_BEGIN_DECLS #define KGX_TYPE_TAB_BUTTON (kgx_tab_button_get_type()) G_DECLARE_FINAL_TYPE (KgxTabButton, kgx_tab_button, KGX, TAB_BUTTON, GtkButton) GtkWidget *kgx_tab_button_new (void); HdyTabView *kgx_tab_button_get_view (KgxTabButton *self); void kgx_tab_button_set_view (KgxTabButton *self, HdyTabView *view); G_END_DECLS gnome-console-42~beta/src/kgx-tab-button.ui000066400000000000000000000021501420277463100211000ustar00rootroot00000000000000 gnome-console-42~beta/src/kgx-tab-switcher-row.c000066400000000000000000000260151420277463100220350ustar00rootroot00000000000000/* kgx-tab-switcher-row.c * * Copyright 2021 Purism SPC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "kgx-config.h" #include "kgx-tab-switcher-row.h" struct _KgxTabSwitcherRow { GtkListBoxRow parent_instance; GtkRevealer *revealer; GtkStack *icon_stack; GtkImage *icon; GtkSpinner *spinner; GtkLabel *title; GtkWidget *indicator_btn; GtkImage *indicator_icon; GtkWidget *close_btn; HdyTabPage *page; HdyTabView *view; }; G_DEFINE_TYPE (KgxTabSwitcherRow, kgx_tab_switcher_row, GTK_TYPE_LIST_BOX_ROW) enum { PROP_0, PROP_PAGE, PROP_VIEW, LAST_PROP }; static GParamSpec *pspecs[LAST_PROP] = { NULL, }; static inline void set_style_class (GtkWidget *widget, const char *style_class, gboolean enabled) { GtkStyleContext *context = gtk_widget_get_style_context (widget); if (enabled) { gtk_style_context_add_class (context, style_class); } else { gtk_style_context_remove_class (context, style_class); } } static void update_pinned (KgxTabSwitcherRow *self) { set_style_class (GTK_WIDGET (self), "pinned", hdy_tab_page_get_pinned (self->page)); } static void update_icon (KgxTabSwitcherRow *self) { GIcon *gicon = hdy_tab_page_get_icon (self->page); gboolean loading = hdy_tab_page_get_loading (self->page); const char *name = loading ? "spinner" : "icon"; if (!gicon) { gicon = hdy_tab_view_get_default_icon (self->view); } gtk_image_set_from_gicon (self->icon, gicon, GTK_ICON_SIZE_BUTTON); gtk_stack_set_visible_child_name (self->icon_stack, name); } static void update_spinner (KgxTabSwitcherRow *self) { gboolean loading = self->page && hdy_tab_page_get_loading (self->page); gboolean mapped = gtk_widget_get_mapped (GTK_WIDGET (self)); /* Don't use CPU when not needed */ if (loading && mapped) { gtk_spinner_start (self->spinner); } else if (gtk_widget_get_realized (GTK_WIDGET (self))) { gtk_spinner_stop (self->spinner); } } static void update_loading (KgxTabSwitcherRow *self) { update_icon (self); update_spinner (self); set_style_class (GTK_WIDGET (self), "loading", hdy_tab_page_get_loading (self->page)); } static void update_indicator (KgxTabSwitcherRow *self) { GIcon *indicator = hdy_tab_page_get_indicator_icon (self->page); gboolean activatable = hdy_tab_page_get_indicator_activatable (self->page); gtk_image_set_from_gicon (self->indicator_icon, indicator, GTK_ICON_SIZE_BUTTON); gtk_widget_set_visible (GTK_WIDGET (self->indicator_btn), indicator != NULL); gtk_widget_set_sensitive (GTK_WIDGET (self->indicator_btn), activatable); } static void update_needs_attention (KgxTabSwitcherRow *self) { set_style_class (GTK_WIDGET (self), "needs-attention", hdy_tab_page_get_needs_attention (self->page)); } static void indicator_clicked_cb (KgxTabSwitcherRow *self) { if (!self->page) { return; } g_signal_emit_by_name (self->view, "indicator-activated", self->page); } static void close_clicked_cb (KgxTabSwitcherRow *self) { if (!self->page) { return; } hdy_tab_view_close_page (self->view, self->page); } static void kgx_tab_switcher_row_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { KgxTabSwitcherRow *self = KGX_TAB_SWITCHER_ROW (object); switch (prop_id) { case PROP_PAGE: g_value_set_object (value, self->page); break; case PROP_VIEW: g_value_set_object (value, self->view); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void kgx_tab_switcher_row_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { KgxTabSwitcherRow *self = KGX_TAB_SWITCHER_ROW (object); switch (prop_id) { case PROP_PAGE: self->page = g_value_get_object (value); break; case PROP_VIEW: self->view = g_value_get_object (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void kgx_tab_switcher_row_constructed (GObject *object) { KgxTabSwitcherRow *self = KGX_TAB_SWITCHER_ROW (object); G_OBJECT_CLASS (kgx_tab_switcher_row_parent_class)->constructed (object); g_object_bind_property (self->page, "title", self->title, "label", G_BINDING_SYNC_CREATE); g_object_bind_property (self->page, "pinned", self->close_btn, "visible", G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN); g_signal_connect_object (self->page, "notify::pinned", G_CALLBACK (update_pinned), self, G_CONNECT_SWAPPED); g_signal_connect_object (self->page, "notify::icon", G_CALLBACK (update_icon), self, G_CONNECT_SWAPPED); g_signal_connect_object (self->page, "notify::loading", G_CALLBACK (update_loading), self, G_CONNECT_SWAPPED); g_signal_connect_object (self->page, "notify::indicator-icon", G_CALLBACK (update_indicator), self, G_CONNECT_SWAPPED); g_signal_connect_object (self->page, "notify::indicator-activatable", G_CALLBACK (update_indicator), self, G_CONNECT_SWAPPED); g_signal_connect_object (self->page, "notify::needs-attention", G_CALLBACK (update_needs_attention), self, G_CONNECT_SWAPPED); g_signal_connect_object (self->view, "notify::default-icon", G_CALLBACK (update_icon), self, G_CONNECT_SWAPPED); update_pinned (self); update_loading (self); update_indicator (self); update_needs_attention (self); } static void kgx_tab_switcher_row_map (GtkWidget *widget) { KgxTabSwitcherRow *self = KGX_TAB_SWITCHER_ROW (widget); GTK_WIDGET_CLASS (kgx_tab_switcher_row_parent_class)->map (widget); update_spinner (self); } static void kgx_tab_switcher_row_unmap (GtkWidget *widget) { KgxTabSwitcherRow *self = KGX_TAB_SWITCHER_ROW (widget); GTK_WIDGET_CLASS (kgx_tab_switcher_row_parent_class)->unmap (widget); update_spinner (self); } static void kgx_tab_switcher_row_class_init (KgxTabSwitcherRowClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); object_class->get_property = kgx_tab_switcher_row_get_property; object_class->set_property = kgx_tab_switcher_row_set_property; object_class->constructed = kgx_tab_switcher_row_constructed; widget_class->map = kgx_tab_switcher_row_map; widget_class->unmap = kgx_tab_switcher_row_unmap; pspecs[PROP_PAGE] = g_param_spec_object ("page", "Page", "The page the row displays.", HDY_TYPE_TAB_PAGE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); pspecs[PROP_VIEW] = g_param_spec_object ("view", "View", "The view containing the page.", HDY_TYPE_TAB_VIEW, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); g_object_class_install_properties (object_class, LAST_PROP, pspecs); gtk_widget_class_set_template_from_resource (widget_class, KGX_APPLICATION_PATH "kgx-tab-switcher-row.ui"); gtk_widget_class_bind_template_child (widget_class, KgxTabSwitcherRow, revealer); gtk_widget_class_bind_template_child (widget_class, KgxTabSwitcherRow, icon_stack); gtk_widget_class_bind_template_child (widget_class, KgxTabSwitcherRow, icon); gtk_widget_class_bind_template_child (widget_class, KgxTabSwitcherRow, spinner); gtk_widget_class_bind_template_child (widget_class, KgxTabSwitcherRow, title); gtk_widget_class_bind_template_child (widget_class, KgxTabSwitcherRow, indicator_btn); gtk_widget_class_bind_template_child (widget_class, KgxTabSwitcherRow, indicator_icon); gtk_widget_class_bind_template_child (widget_class, KgxTabSwitcherRow, close_btn); gtk_widget_class_bind_template_callback (widget_class, indicator_clicked_cb); gtk_widget_class_bind_template_callback (widget_class, close_clicked_cb); } static void kgx_tab_switcher_row_init (KgxTabSwitcherRow *self) { gtk_widget_init_template (GTK_WIDGET (self)); } GtkWidget * kgx_tab_switcher_row_new (HdyTabPage *page, HdyTabView *view) { g_return_val_if_fail (HDY_IS_TAB_PAGE (page), NULL); g_return_val_if_fail (HDY_IS_TAB_VIEW (view), NULL); return g_object_new (KGX_TYPE_TAB_SWITCHER_ROW, "page", page, "view", view, NULL); } HdyTabPage * kgx_tab_switcher_row_get_page (KgxTabSwitcherRow *self) { g_return_val_if_fail (KGX_IS_TAB_SWITCHER_ROW (self), NULL); return self->page; } void kgx_tab_switcher_row_animate_close (KgxTabSwitcherRow *self) { g_return_if_fail (KGX_IS_TAB_SWITCHER_ROW (self)); if (!self->page) { return; } g_signal_handlers_disconnect_by_func (self->view, G_CALLBACK (update_icon), self); g_signal_handlers_disconnect_by_func (self->page, G_CALLBACK (update_pinned), self); g_signal_handlers_disconnect_by_func (self->page, G_CALLBACK (update_icon), self); g_signal_handlers_disconnect_by_func (self->page, G_CALLBACK (update_loading), self); g_signal_handlers_disconnect_by_func (self->page, G_CALLBACK (update_indicator), self); g_signal_handlers_disconnect_by_func (self->page, G_CALLBACK (update_needs_attention), self); self->page = NULL; g_signal_connect_swapped (self->revealer, "notify::child-revealed", G_CALLBACK (gtk_widget_destroy), self); gtk_revealer_set_reveal_child (self->revealer, FALSE); } void kgx_tab_switcher_row_animate_open (KgxTabSwitcherRow *self) { g_return_if_fail (KGX_IS_TAB_SWITCHER_ROW (self)); if (!self->page) { return; } gtk_widget_show (GTK_WIDGET (self)); gtk_revealer_set_reveal_child (self->revealer, TRUE); } gboolean kgx_tab_switcher_row_is_animating (KgxTabSwitcherRow *self) { g_return_val_if_fail (KGX_IS_TAB_SWITCHER_ROW (self), FALSE); return self->page == NULL; } gnome-console-42~beta/src/kgx-tab-switcher-row.h000066400000000000000000000025571420277463100220470ustar00rootroot00000000000000/* kgx-tab-switcher-row.h * * Copyright 2021 Purism SPC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include G_BEGIN_DECLS #define KGX_TYPE_TAB_SWITCHER_ROW (kgx_tab_switcher_row_get_type()) G_DECLARE_FINAL_TYPE (KgxTabSwitcherRow, kgx_tab_switcher_row, KGX, TAB_SWITCHER_ROW, GtkListBoxRow) GtkWidget *kgx_tab_switcher_row_new (HdyTabPage *page, HdyTabView *view); HdyTabPage *kgx_tab_switcher_row_get_page (KgxTabSwitcherRow *self); gboolean kgx_tab_switcher_row_is_animating (KgxTabSwitcherRow *self); void kgx_tab_switcher_row_animate_open (KgxTabSwitcherRow *self); void kgx_tab_switcher_row_animate_close (KgxTabSwitcherRow *self); G_END_DECLS gnome-console-42~beta/src/kgx-tab-switcher-row.ui000066400000000000000000000071761420277463100222370ustar00rootroot00000000000000 gnome-console-42~beta/src/kgx-tab-switcher.c000066400000000000000000000440231420277463100212270ustar00rootroot00000000000000/* kgx-tab-switcher.c * * Copyright 2021 Purism SPC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * SECTION:kgx-tab-switcher * @short_description: A mobile tab switcher for HdyTabView * @title: KgxTabSwitcher * * The #KgxTabSwitcher widget is a mobile tab switcher for HdyTabView. It's * supposed to be used in conjunction with #KgxTabButton to open it, and a * #HdyTabBar to provide UI for larger screens. */ #include "kgx-config.h" #include "kgx-tab-switcher.h" #include "kgx-tab-switcher-row.h" struct _KgxTabSwitcher { GtkBin parent_instance; HdyFlap *flap; GtkListBox *list; GtkGesture *click_gesture; GtkGesture *long_press_gesture; GtkMenu *context_menu; GtkPopover *touch_menu; HdyTabView *view; gboolean narrow; }; G_DEFINE_TYPE (KgxTabSwitcher, kgx_tab_switcher, GTK_TYPE_BIN) enum { PROP_0, PROP_VIEW, PROP_NARROW, LAST_PROP }; static GParamSpec *pspecs[LAST_PROP] = { NULL, }; enum { NEW_TAB, N_SIGNALS, }; static guint signals[N_SIGNALS]; static gboolean reset_setup_menu_cb (KgxTabSwitcher *self) { g_signal_emit_by_name (self->view, "setup-menu", NULL); return G_SOURCE_REMOVE; } static void touch_menu_notify_visible_cb (KgxTabSwitcher *self) { if (!self->touch_menu || gtk_widget_get_visible (GTK_WIDGET (self->touch_menu))) { return; } g_idle_add (G_SOURCE_FUNC (reset_setup_menu_cb), self); } static void destroy_cb (KgxTabSwitcher *self) { self->touch_menu = NULL; } static void do_touch_popup (KgxTabSwitcher *self, KgxTabSwitcherRow *row) { GMenuModel *model = hdy_tab_view_get_menu_model (self->view); HdyTabPage *page = kgx_tab_switcher_row_get_page (row); if (!G_IS_MENU_MODEL (model)) { return; } g_signal_emit_by_name (self->view, "setup-menu", page); if (!self->touch_menu) { self->touch_menu = GTK_POPOVER (gtk_popover_new_from_model (GTK_WIDGET (row), model)); gtk_popover_set_constrain_to (self->touch_menu, GTK_POPOVER_CONSTRAINT_WINDOW); g_signal_connect_object (self->touch_menu, "notify::visible", G_CALLBACK (touch_menu_notify_visible_cb), self, G_CONNECT_AFTER | G_CONNECT_SWAPPED); g_signal_connect_object (self->touch_menu, "destroy", G_CALLBACK (destroy_cb), self, G_CONNECT_AFTER | G_CONNECT_SWAPPED); } else { gtk_popover_set_relative_to (self->touch_menu, GTK_WIDGET (row)); } gtk_popover_popup (self->touch_menu); } static void popup_menu_detach (KgxTabSwitcher *self, GtkMenu *menu) { self->context_menu = NULL; } static void popup_menu_deactivate_cb (KgxTabSwitcher *self) { g_idle_add (G_SOURCE_FUNC (reset_setup_menu_cb), self); } static void do_popup (KgxTabSwitcher *self, KgxTabSwitcherRow *row, GdkEvent *event) { GMenuModel *model = hdy_tab_view_get_menu_model (self->view); HdyTabPage *page = kgx_tab_switcher_row_get_page (row); if (!G_IS_MENU_MODEL (model)) { return; } g_signal_emit_by_name (self->view, "setup-menu", page); if (!self->context_menu) { self->context_menu = GTK_MENU (gtk_menu_new_from_model (model)); gtk_style_context_add_class (gtk_widget_get_style_context (GTK_WIDGET (self->context_menu)), GTK_STYLE_CLASS_CONTEXT_MENU); g_signal_connect_object (self->context_menu, "deactivate", G_CALLBACK (popup_menu_deactivate_cb), self, G_CONNECT_SWAPPED); gtk_menu_attach_to_widget (self->context_menu, GTK_WIDGET (self), (GtkMenuDetachFunc) popup_menu_detach); } if (event && gdk_event_triggers_context_menu (event)) { gtk_menu_popup_at_pointer (self->context_menu, event); } else { gtk_menu_popup_at_widget (self->context_menu, GTK_WIDGET (row), GDK_GRAVITY_SOUTH_WEST, GDK_GRAVITY_NORTH_WEST, event); gtk_menu_shell_select_first (GTK_MENU_SHELL (self->context_menu), FALSE); } } static void reveal_flap_cb (KgxTabSwitcher *self) { HdyTabPage *page; GtkWidget *child; gtk_widget_set_sensitive (GTK_WIDGET (self->view), !hdy_flap_get_reveal_flap (self->flap)); if (hdy_flap_get_reveal_flap (self->flap)) { gtk_widget_grab_focus (GTK_WIDGET (self->list)); } else { page = hdy_tab_view_get_selected_page (self->view); child = hdy_tab_page_get_child (page); gtk_widget_grab_focus (GTK_WIDGET (child)); } } static void collapse_cb (KgxTabSwitcher *self) { kgx_tab_switcher_close (self); } static void new_tab_cb (KgxTabSwitcher *self) { g_signal_emit (self, signals[NEW_TAB], 0); kgx_tab_switcher_close (self); } static void row_selected_cb (KgxTabSwitcher *self, KgxTabSwitcherRow *row) { HdyTabPage *page; if (!row) { return; } g_assert (KGX_IS_TAB_SWITCHER_ROW (row)); if (!self->view) { return; } page = kgx_tab_switcher_row_get_page (row); hdy_tab_view_set_selected_page (self->view, page); } static void row_activated_cb (KgxTabSwitcher *self) { kgx_tab_switcher_close (self); } static KgxTabSwitcherRow * find_nth_alive_row (KgxTabSwitcher *self, guint position) { GtkListBoxRow *row = NULL; guint i = 0; do { row = gtk_list_box_get_row_at_index (self->list, i++); if (kgx_tab_switcher_row_is_animating (KGX_TAB_SWITCHER_ROW (row))) position++; } while (i <= position); return KGX_TAB_SWITCHER_ROW (row); } static void pages_changed_cb (KgxTabSwitcher *self, guint position, guint removed, guint added, GListModel *pages) { guint i; while (removed--) { KgxTabSwitcherRow *row = find_nth_alive_row (self, position); kgx_tab_switcher_row_animate_close (KGX_TAB_SWITCHER_ROW (row)); } for (i = 0; i < added; i++) { g_autoptr (HdyTabPage) page = g_list_model_get_item (pages, position + i); GtkWidget *row = kgx_tab_switcher_row_new (page, self->view); gtk_list_box_insert (self->list, row, position + i); kgx_tab_switcher_row_animate_open (KGX_TAB_SWITCHER_ROW (row)); } } static void notify_selected_page_cb (KgxTabSwitcher *self) { HdyTabPage *page = NULL; if (self->view) { page = hdy_tab_view_get_selected_page (self->view); } if (page) { int index = hdy_tab_view_get_page_position (self->view, page); KgxTabSwitcherRow *row = find_nth_alive_row (self, index); gtk_list_box_select_row (self->list, GTK_LIST_BOX_ROW (row)); } else { gtk_list_box_unselect_all (self->list); } } static void click_pressed_cb (KgxTabSwitcher *self, int n_press, double x, double y) { g_autoptr (GdkEvent) event = NULL; GtkListBoxRow *row; HdyTabPage *page; guint button; if (n_press > 1) { gtk_gesture_set_state (self->click_gesture, GTK_EVENT_SEQUENCE_DENIED); return; } row = gtk_list_box_get_row_at_y (self->list, y); if (!row) { gtk_gesture_set_state (self->click_gesture, GTK_EVENT_SEQUENCE_DENIED); return; } event = gtk_get_current_event (); button = gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (self->click_gesture)); page = kgx_tab_switcher_row_get_page (KGX_TAB_SWITCHER_ROW (row)); if (event && gdk_event_triggers_context_menu (event)) { gtk_gesture_set_state (self->click_gesture, GTK_EVENT_SEQUENCE_CLAIMED); do_popup (self, KGX_TAB_SWITCHER_ROW (row), event); return; } if (button == GDK_BUTTON_MIDDLE) { gtk_gesture_set_state (self->click_gesture, GTK_EVENT_SEQUENCE_CLAIMED); hdy_tab_view_close_page (self->view, page); return; } gtk_gesture_set_state (self->click_gesture, GTK_EVENT_SEQUENCE_DENIED); } static void long_press_cb (KgxTabSwitcher *self, double x, double y) { GtkListBoxRow *row = gtk_list_box_get_row_at_y (self->list, y); if (!row) { gtk_gesture_set_state (self->click_gesture, GTK_EVENT_SEQUENCE_DENIED); return; } do_touch_popup (self, KGX_TAB_SWITCHER_ROW (row)); gtk_gesture_set_state (self->long_press_gesture, GTK_EVENT_SEQUENCE_CLAIMED); } static void set_narrow (KgxTabSwitcher *self, gboolean narrow) { if (self->narrow == narrow) { return; } self->narrow = narrow; if (!narrow && self->flap) { kgx_tab_switcher_close (self); } g_object_notify_by_pspec (G_OBJECT (self), pspecs[PROP_NARROW]); } static void kgx_tab_switcher_dispose (GObject *object) { KgxTabSwitcher *self = KGX_TAB_SWITCHER (object); kgx_tab_switcher_set_view (self, NULL); g_clear_object (&self->click_gesture); g_clear_object (&self->long_press_gesture); G_OBJECT_CLASS (kgx_tab_switcher_parent_class)->dispose (object); } static void kgx_tab_switcher_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { KgxTabSwitcher *self = KGX_TAB_SWITCHER (object); switch (prop_id) { case PROP_VIEW: g_value_set_object (value, kgx_tab_switcher_get_view (self)); break; case PROP_NARROW: g_value_set_boolean (value, kgx_tab_switcher_get_narrow (self)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void kgx_tab_switcher_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { KgxTabSwitcher *self = KGX_TAB_SWITCHER (object); switch (prop_id) { case PROP_VIEW: kgx_tab_switcher_set_view (self, g_value_get_object (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void kgx_tab_switcher_destroy (GtkWidget *widget) { gtk_container_forall (GTK_CONTAINER (widget), (GtkCallback) gtk_widget_destroy, NULL); GTK_WIDGET_CLASS (kgx_tab_switcher_parent_class)->destroy (widget); } static gboolean kgx_tab_switcher_popup_menu (GtkWidget *widget) { KgxTabSwitcher *self = KGX_TAB_SWITCHER (widget); GtkListBoxRow *row = gtk_list_box_get_selected_row (self->list); if (row) { do_popup (self, KGX_TAB_SWITCHER_ROW (row), NULL); return GDK_EVENT_STOP; } return GDK_EVENT_PROPAGATE; } static void kgx_tab_switcher_size_allocate (GtkWidget *widget, GtkAllocation *alloc) { KgxTabSwitcher *self = KGX_TAB_SWITCHER (widget); set_narrow (self, alloc->width < 400); GTK_WIDGET_CLASS (kgx_tab_switcher_parent_class)->size_allocate (widget, alloc); } static void kgx_tab_switcher_add (GtkContainer *container, GtkWidget *widget) { KgxTabSwitcher *self = KGX_TAB_SWITCHER (container); if (!self->flap) { GTK_CONTAINER_CLASS (kgx_tab_switcher_parent_class)->add (container, widget); return; } hdy_flap_set_content (self->flap, widget); } static void kgx_tab_switcher_remove (GtkContainer *container, GtkWidget *widget) { KgxTabSwitcher *self = KGX_TAB_SWITCHER (container); if (widget == GTK_WIDGET (self->flap)) { GTK_CONTAINER_CLASS (kgx_tab_switcher_parent_class)->remove (container, widget); return; } hdy_flap_set_content (self->flap, NULL); } static void kgx_tab_switcher_forall (GtkContainer *container, gboolean include_internals, GtkCallback callback, gpointer callback_data) { KgxTabSwitcher *self = KGX_TAB_SWITCHER (container); GtkWidget *content; if (include_internals) { GTK_CONTAINER_CLASS (kgx_tab_switcher_parent_class)->forall (container, include_internals, callback, callback_data); return; } if (!self->flap) { return; } content = hdy_flap_get_content (self->flap); if (content) { callback (content, callback_data); } } static void kgx_tab_switcher_class_init (KgxTabSwitcherClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass); object_class->dispose = kgx_tab_switcher_dispose; object_class->get_property = kgx_tab_switcher_get_property; object_class->set_property = kgx_tab_switcher_set_property; widget_class->destroy = kgx_tab_switcher_destroy; widget_class->popup_menu = kgx_tab_switcher_popup_menu; widget_class->size_allocate = kgx_tab_switcher_size_allocate; container_class->add = kgx_tab_switcher_add; container_class->remove = kgx_tab_switcher_remove; container_class->forall = kgx_tab_switcher_forall; /** * KgxTabSwitcher:view: * * The #HdyTabView the tab switcher controls; */ pspecs[PROP_VIEW] = g_param_spec_object ("view", "View", "The view the tab switcher controls.", HDY_TYPE_TAB_VIEW, G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY); pspecs[PROP_NARROW] = g_param_spec_boolean ("narrow", "Narrow", "Narrow", TRUE, G_PARAM_READABLE); g_object_class_install_properties (object_class, LAST_PROP, pspecs); signals[NEW_TAB] = g_signal_new ("new-tab", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0); gtk_widget_class_set_template_from_resource (widget_class, KGX_APPLICATION_PATH "kgx-tab-switcher.ui"); gtk_widget_class_bind_template_child (widget_class, KgxTabSwitcher, flap); gtk_widget_class_bind_template_child (widget_class, KgxTabSwitcher, list); gtk_widget_class_bind_template_callback (widget_class, reveal_flap_cb); gtk_widget_class_bind_template_callback (widget_class, collapse_cb); gtk_widget_class_bind_template_callback (widget_class, new_tab_cb); gtk_widget_class_bind_template_callback (widget_class, row_selected_cb); gtk_widget_class_bind_template_callback (widget_class, row_activated_cb); } static void kgx_tab_switcher_init (KgxTabSwitcher *self) { self->narrow = TRUE; gtk_widget_init_template (GTK_WIDGET (self)); self->click_gesture = gtk_gesture_multi_press_new (GTK_WIDGET (self->list)); gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (self->click_gesture), 0); g_signal_connect_swapped (self->click_gesture, "pressed", G_CALLBACK (click_pressed_cb), self); self->long_press_gesture = gtk_gesture_long_press_new (GTK_WIDGET (self->list)); gtk_gesture_single_set_touch_only (GTK_GESTURE_SINGLE (self->long_press_gesture), TRUE); g_signal_connect_swapped (self->long_press_gesture, "pressed", G_CALLBACK (long_press_cb), self); } /** * kgx_tab_switcher_new: * * Creates a new #KgxTabSwitcher widget. * * Returns: a new #KgxTabSwitcher */ GtkWidget * kgx_tab_switcher_new (void) { return g_object_new (KGX_TYPE_TAB_SWITCHER, NULL); } /** * kgx_tab_switcher_get_view: * @self: a #KgxTabSwitcher * * Gets the #HdyTabView @self controls. * * Returns: (transfer none) (nullable): the #HdyTabView @self controls */ HdyTabView * kgx_tab_switcher_get_view (KgxTabSwitcher *self) { g_return_val_if_fail (KGX_IS_TAB_SWITCHER (self), NULL); return self->view; } /** * kgx_tab_switcher_set_view: * @self: a #KgxTabSwitcher * @view: (nullable): a #HdyTabView * * Sets the #HdyTabView @self controls. */ void kgx_tab_switcher_set_view (KgxTabSwitcher *self, HdyTabView *view) { g_return_if_fail (KGX_IS_TAB_SWITCHER (self)); g_return_if_fail (view == NULL || HDY_IS_TAB_VIEW (view)); if (self->view == view) { return; } if (self->view) { GListModel *pages = hdy_tab_view_get_pages (self->view); g_signal_handlers_disconnect_by_func (self->view, G_CALLBACK (notify_selected_page_cb), self); g_signal_handlers_disconnect_by_func (pages, G_CALLBACK (pages_changed_cb), self); } g_set_object (&self->view, view); if (self->view) { GListModel *pages = hdy_tab_view_get_pages (self->view); g_signal_connect_object (pages, "items-changed", G_CALLBACK (pages_changed_cb), self, G_CONNECT_SWAPPED); g_signal_connect_object (self->view, "notify::selected-page", G_CALLBACK (notify_selected_page_cb), self, G_CONNECT_SWAPPED); } notify_selected_page_cb (self); g_object_notify_by_pspec (G_OBJECT (self), pspecs[PROP_VIEW]); } void kgx_tab_switcher_open (KgxTabSwitcher *self) { g_return_if_fail (KGX_IS_TAB_SWITCHER (self)); hdy_flap_set_reveal_flap (self->flap, TRUE); } void kgx_tab_switcher_close (KgxTabSwitcher *self) { g_return_if_fail (KGX_IS_TAB_SWITCHER (self)); hdy_flap_set_reveal_flap (self->flap, FALSE); } gboolean kgx_tab_switcher_get_narrow (KgxTabSwitcher *self) { g_return_val_if_fail (KGX_IS_TAB_SWITCHER (self), FALSE); return self->narrow; } gnome-console-42~beta/src/kgx-tab-switcher.h000066400000000000000000000025051420277463100212330ustar00rootroot00000000000000/* kgx-tab-switcher.h * * Copyright 2021 Purism SPC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include G_BEGIN_DECLS #define KGX_TYPE_TAB_SWITCHER (kgx_tab_switcher_get_type()) G_DECLARE_FINAL_TYPE (KgxTabSwitcher, kgx_tab_switcher, KGX, TAB_SWITCHER, GtkBin) GtkWidget *kgx_tab_switcher_new (void); HdyTabView *kgx_tab_switcher_get_view (KgxTabSwitcher *self); void kgx_tab_switcher_set_view (KgxTabSwitcher *self, HdyTabView *view); void kgx_tab_switcher_open (KgxTabSwitcher *self); void kgx_tab_switcher_close (KgxTabSwitcher *self); gboolean kgx_tab_switcher_get_narrow (KgxTabSwitcher *self); G_END_DECLS gnome-console-42~beta/src/kgx-tab-switcher.ui000066400000000000000000000066671420277463100214360ustar00rootroot00000000000000 gnome-console-42~beta/src/kgx-tab.c000066400000000000000000001107411420277463100174020ustar00rootroot00000000000000/* kgx-tab.c * * Copyright 2019-2020 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * SECTION:kgx-page * @title: KgxTab * @short_description: Base for things in a #KgxPages */ #include #define PCRE2_CODE_UNIT_WIDTH 0 #include #include "kgx-config.h" #include "kgx-tab.h" #include "kgx-pages.h" #include "kgx-terminal.h" #include "kgx-application.h" typedef struct _KgxTabPrivate KgxTabPrivate; struct _KgxTabPrivate { guint id; KgxApplication *application; char *title; char *tooltip; GFile *path; PangoFontDescription *font; double zoom; KgxStatus status; KgxTheme theme; gboolean opaque; gint64 scrollback_lines; gboolean is_active; gboolean close_on_quit; gboolean needs_attention; gboolean search_mode_enabled; KgxTerminal *terminal; GBinding *term_title_bind; GBinding *term_path_bind; GBinding *term_font_bind; GBinding *term_zoom_bind; GBinding *term_theme_bind; GBinding *term_opaque_bind; GBinding *term_scrollback_bind; GBinding *pages_font_bind; GBinding *pages_zoom_bind; GBinding *pages_theme_bind; GBinding *pages_opaque_bind; GBinding *pages_scrollback_bind; GtkWidget *stack; GtkWidget *spinner_revealer; GtkWidget *content; guint spinner_timeout; GtkWidget *revealer; GtkWidget *label; GtkWidget *search_entry; GtkWidget *search_bar; char *last_search; /* Remote/root states */ GHashTable *root; GHashTable *remote; GHashTable *children; char *notification_id; }; static void kgx_tab_buildable_iface_init (GtkBuildableIface *iface); G_DEFINE_ABSTRACT_TYPE_WITH_CODE (KgxTab, kgx_tab, GTK_TYPE_BOX, G_ADD_PRIVATE (KgxTab) G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE, kgx_tab_buildable_iface_init)) enum { PROP_0, PROP_APPLICATION, PROP_TAB_TITLE, PROP_TAB_PATH, PROP_TAB_STATUS, PROP_TAB_TOOLTIP, PROP_FONT, PROP_ZOOM, PROP_THEME, PROP_IS_ACTIVE, PROP_OPAQUE, PROP_CLOSE_ON_QUIT, PROP_NEEDS_ATTENTION, PROP_SEARCH_MODE_ENABLED, PROP_SCROLLBACK_LINES, LAST_PROP }; static GParamSpec *pspecs[LAST_PROP] = { NULL, }; enum { SIZE_CHANGED, ZOOM, DIED, N_SIGNALS }; static guint signals[N_SIGNALS]; static void size_changed (KgxTerminal *term, guint rows, guint cols, KgxTab *self) { g_signal_emit (self, signals[SIZE_CHANGED], 0, rows, cols); } static void font_increase (KgxTerminal *term, KgxTab *self) { g_signal_emit (self, signals[ZOOM], 0, KGX_ZOOM_IN); } static void font_decrease (KgxTerminal *term, KgxTab *self) { g_signal_emit (self, signals[ZOOM], 0, KGX_ZOOM_OUT); } static void kgx_tab_dispose (GObject *object) { KgxTab *self = KGX_TAB (object); KgxTabPrivate *priv = kgx_tab_get_instance_private (self); g_clear_handle_id (&priv->spinner_timeout, g_source_remove); if (priv->notification_id) { g_application_withdraw_notification (G_APPLICATION (priv->application), priv->notification_id); g_clear_pointer (&priv->notification_id, g_free); } g_clear_object (&priv->application); g_clear_pointer (&priv->title, g_free); g_clear_pointer (&priv->tooltip, g_free); g_clear_object (&priv->path); g_clear_pointer (&priv->font, pango_font_description_free); if (priv->terminal) { g_object_disconnect (priv->terminal, "any-signal::size-changed", G_CALLBACK (size_changed), self, "any-signal::increase-font-size", G_CALLBACK (font_increase), self, "any-signal::decrease-font-size", G_CALLBACK (font_decrease), self, NULL); } g_clear_object (&priv->terminal); g_clear_pointer (&priv->root, g_hash_table_unref); g_clear_pointer (&priv->remote, g_hash_table_unref); g_clear_pointer (&priv->children, g_hash_table_unref); g_clear_pointer (&priv->last_search, g_free); G_OBJECT_CLASS (kgx_tab_parent_class)->dispose (object); } static void search_enabled (GObject *object, GParamSpec *pspec, KgxTab *self) { KgxTabPrivate *priv = kgx_tab_get_instance_private (self); if (!hdy_search_bar_get_search_mode (HDY_SEARCH_BAR (priv->search_bar))) { gtk_widget_grab_focus (GTK_WIDGET (self)); } } static void search_changed (HdySearchBar *bar, KgxTab *self) { KgxTabPrivate *priv = kgx_tab_get_instance_private (self); const char *search = NULL; VteRegex *regex; g_autoptr (GError) error = NULL; gboolean narrowing_down; guint32 flags = PCRE2_MULTILINE; search = gtk_entry_get_text (GTK_ENTRY (priv->search_entry)); if (search) { g_autofree char *lowercase = g_utf8_strdown (search, -1); if (!g_strcmp0 (lowercase, search)) flags |= PCRE2_CASELESS; } regex = vte_regex_new_for_search (g_regex_escape_string (search, -1), -1, flags, &error); if (error) { g_warning ("Search error: %s", error->message); return; } /* Since VTE doesn't automatically highlight the search match and doesn't have * an API to do that or select text manually, we have to be creative. * * The goals are to: * 1. immediately highlight text for type-to-search * 2. make sure we don't jump to another match when pressing backspace * * Achieving 1. is easy by going to the previous match before setting the * regex and the next match after setting it. However, this fails with 2: * consider a buffer like "foo bar baz". If "baz" is currently highlighted and * we press backspace, our regex is "ba" so "ba" in "bar" starts to match as * well. If we go to the previous match, change regex from "bar" to "ba" and * go next, it will select the occurence in "bar" while we want it to stay on * "baz". Hence, if we're narrowing down the search, go previous/next after * setting the regex and not before. */ narrowing_down = search && priv->last_search && g_strrstr (priv->last_search, search); g_clear_pointer (&priv->last_search, g_free); priv->last_search = g_strdup (search); if (!narrowing_down) vte_terminal_search_find_previous (VTE_TERMINAL (priv->terminal)); vte_terminal_search_set_regex (VTE_TERMINAL (priv->terminal), regex, 0); if (narrowing_down) vte_terminal_search_find_previous (VTE_TERMINAL (priv->terminal)); vte_terminal_search_find_next (VTE_TERMINAL (priv->terminal)); } static void search_next (HdySearchBar *bar, KgxTab *self) { KgxTabPrivate *priv = kgx_tab_get_instance_private (self); vte_terminal_search_find_next (VTE_TERMINAL (priv->terminal)); } static void search_prev (HdySearchBar *bar, KgxTab *self) { KgxTabPrivate *priv = kgx_tab_get_instance_private (self); vte_terminal_search_find_previous (VTE_TERMINAL (priv->terminal)); } static void spinner_mapped (GtkSpinner *spinner, KgxTab *self) { gtk_spinner_start (spinner); } static void spinner_unmapped (GtkSpinner *spinner, KgxTab *self) { gtk_spinner_stop (spinner); } static gboolean start_spinner_timeout_cb (KgxTab *self) { KgxTabPrivate *priv = kgx_tab_get_instance_private (self); gtk_revealer_set_reveal_child (GTK_REVEALER (priv->spinner_revealer), TRUE); priv->spinner_timeout = 0; return G_SOURCE_REMOVE; } static void kgx_tab_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { KgxTab *self = KGX_TAB (object); KgxTabPrivate *priv = kgx_tab_get_instance_private (self); switch (property_id) { case PROP_APPLICATION: g_value_set_object (value, priv->application); break; case PROP_TAB_TITLE: g_value_set_string (value, priv->title); break; case PROP_TAB_PATH: g_value_set_object (value, priv->path); break; case PROP_TAB_STATUS: g_value_set_flags (value, priv->status); break; case PROP_TAB_TOOLTIP: g_value_set_string (value, priv->tooltip); break; case PROP_FONT: g_value_set_boxed (value, priv->font); break; case PROP_ZOOM: g_value_set_double (value, priv->zoom); break; case PROP_IS_ACTIVE: g_value_set_boolean (value, priv->is_active); break; case PROP_THEME: g_value_set_enum (value, priv->theme); break; case PROP_OPAQUE: g_value_set_boolean (value, priv->opaque); break; case PROP_CLOSE_ON_QUIT: g_value_set_boolean (value, priv->close_on_quit); break; case PROP_NEEDS_ATTENTION: g_value_set_boolean (value, priv->needs_attention); break; case PROP_SEARCH_MODE_ENABLED: g_value_set_boolean (value, priv->search_mode_enabled); break; case PROP_SCROLLBACK_LINES: g_value_set_int64 (value, priv->scrollback_lines); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void kgx_tab_set_is_active (KgxTab *self, gboolean active) { KgxTabPrivate *priv; g_return_if_fail (KGX_IS_TAB (self)); priv = kgx_tab_get_instance_private (self); if (active == priv->is_active) { return; } priv->is_active = active; if (!active && priv->notification_id) { g_application_withdraw_notification (G_APPLICATION (priv->application), priv->notification_id); g_clear_pointer (&priv->notification_id, g_free); } g_object_set (self, "needs-attention", FALSE, NULL); g_object_notify_by_pspec (G_OBJECT (self), pspecs[PROP_IS_ACTIVE]); } static void kgx_tab_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { KgxTab *self = KGX_TAB (object); KgxTabPrivate *priv = kgx_tab_get_instance_private (self); switch (property_id) { case PROP_APPLICATION: if (priv->application) { g_critical ("Application was already set %p", priv->application); } priv->application = g_value_dup_object (value); kgx_application_add_page (priv->application, self); break; case PROP_TAB_TITLE: g_clear_pointer (&priv->title, g_free); priv->title = g_value_dup_string (value); break; case PROP_TAB_PATH: g_clear_object (&priv->path); priv->path = g_value_dup_object (value); break; case PROP_TAB_STATUS: priv->status = g_value_get_flags (value); break; case PROP_TAB_TOOLTIP: g_clear_pointer (&priv->tooltip, g_free); priv->tooltip = g_value_dup_string (value); break; case PROP_FONT: if (priv->font) { g_boxed_free (PANGO_TYPE_FONT_DESCRIPTION, priv->font); } priv->font = g_value_dup_boxed (value); break; case PROP_ZOOM: priv->zoom = g_value_get_double (value); break; case PROP_IS_ACTIVE: kgx_tab_set_is_active (self, g_value_get_boolean (value)); break; case PROP_THEME: priv->theme = g_value_get_enum (value); break; case PROP_OPAQUE: priv->opaque = g_value_get_boolean (value); break; case PROP_CLOSE_ON_QUIT: priv->close_on_quit = g_value_get_boolean (value); break; case PROP_NEEDS_ATTENTION: priv->needs_attention = g_value_get_boolean (value); break; case PROP_SEARCH_MODE_ENABLED: priv->search_mode_enabled = g_value_get_boolean (value); break; case PROP_SCROLLBACK_LINES: priv->scrollback_lines = g_value_get_int64 (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static gboolean kgx_tab_draw (GtkWidget *widget, cairo_t *cr) { GtkStateFlags flags; GTK_WIDGET_CLASS (kgx_tab_parent_class)->draw (widget, cr); flags = gtk_widget_get_state_flags (widget); /* FIXME this is a workaround for the fact GTK3 css outline is used for focus * only by default. This can be removed in GTK4 as it just works there. */ if (flags & GTK_STATE_FLAG_DROP_ACTIVE) { GtkStyleContext *context = gtk_widget_get_style_context (widget); int width = gtk_widget_get_allocated_width (widget); int height = gtk_widget_get_allocated_height (widget); gtk_render_focus (context, cr, 0, 0, width, height); } return GDK_EVENT_PROPAGATE; } static void kgx_tab_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint info, guint time) { KgxTab *self = KGX_TAB (widget); GdkDragAction action = gdk_drag_context_get_selected_action (context); kgx_tab_accept_drop (self, selection_data); gtk_drag_finish (context, TRUE, action == GDK_ACTION_COPY, time); } static void kgx_tab_grab_focus (GtkWidget *widget) { KgxTab *self = KGX_TAB (widget); KgxTabPrivate *priv = kgx_tab_get_instance_private (self); if (priv->terminal) { gtk_widget_grab_focus (GTK_WIDGET (priv->terminal)); return; } GTK_WIDGET_CLASS (kgx_tab_parent_class)->grab_focus (widget); } static void kgx_tab_real_start (KgxTab *tab, GAsyncReadyCallback callback, gpointer callback_data) { g_critical ("%s doesn't implement start", G_OBJECT_TYPE_NAME (tab)); } static GPid kgx_tab_real_start_finish (KgxTab *tab, GAsyncResult *res, GError **error) { g_critical ("%s doesn't implement start_finish", G_OBJECT_TYPE_NAME (tab)); return 0; } static void kgx_tab_class_init (KgxTabClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); KgxTabClass *tab_class = KGX_TAB_CLASS (klass); object_class->dispose = kgx_tab_dispose; object_class->get_property = kgx_tab_get_property; object_class->set_property = kgx_tab_set_property; widget_class->draw = kgx_tab_draw; widget_class->drag_data_received = kgx_tab_drag_data_received; widget_class->grab_focus = kgx_tab_grab_focus; tab_class->start = kgx_tab_real_start; tab_class->start_finish = kgx_tab_real_start_finish; /** * KgxTab:application: * * The #KgxApplication this tab is running under * * Stability: Private */ pspecs[PROP_APPLICATION] = g_param_spec_object ("application", "Application", "The application", KGX_TYPE_APPLICATION, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); /** * KgxTab:tab-title: * * Title of this tab * * Stability: Private */ pspecs[PROP_TAB_TITLE] = g_param_spec_string ("tab-title", "Page Title", "Title for this tab", NULL, G_PARAM_READWRITE); /** * KgxTab:tab-path: * * Current path of this tab * * Stability: Private */ pspecs[PROP_TAB_PATH] = g_param_spec_object ("tab-path", "Page Path", "Current path", G_TYPE_FILE, G_PARAM_READWRITE); /** * KgxTab:tab-status: * * Stability: Private */ pspecs[PROP_TAB_STATUS] = g_param_spec_flags ("tab-status", "Page Status", "Session status", KGX_TYPE_STATUS, KGX_NONE, G_PARAM_READWRITE); pspecs[PROP_TAB_TOOLTIP] = g_param_spec_string ("tab-tooltip", "Tab Tooltip", "Extra information to show in the tooltip", NULL, G_PARAM_READWRITE); pspecs[PROP_FONT] = g_param_spec_boxed ("font", "Font", "Monospace font", PANGO_TYPE_FONT_DESCRIPTION, G_PARAM_READWRITE); pspecs[PROP_ZOOM] = g_param_spec_double ("zoom", "Zoom", "Font scaling", KGX_FONT_SCALE_MIN, KGX_FONT_SCALE_MAX, KGX_FONT_SCALE_DEFAULT, G_PARAM_READWRITE); /** * KgxTab:is-active: * * This is the active tab of the active window * * Stability: Private */ pspecs[PROP_IS_ACTIVE] = g_param_spec_boolean ("is-active", "Is Active", "Current tab", FALSE, G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY); /** * KgxTab:theme: * * The #KgxTheme to apply to the #KgxTerminal s in the #KgxTab * * Stability: Private */ pspecs[PROP_THEME] = g_param_spec_enum ("theme", "Theme", "The path of the active tab", KGX_TYPE_THEME, KGX_THEME_NIGHT, G_PARAM_READWRITE); /** * KgxTab:opaque: * * Whether to disable transparency * * Bound to #GtkWindow:is-maximized on the #KgxWindow * * Stability: Private */ pspecs[PROP_OPAQUE] = g_param_spec_boolean ("opaque", "Opaque", "Terminal opaqueness", FALSE, G_PARAM_READWRITE); pspecs[PROP_CLOSE_ON_QUIT] = g_param_spec_boolean ("close-on-quit", "Close on quit", "Should the tab close when dead", FALSE, G_PARAM_READWRITE); pspecs[PROP_NEEDS_ATTENTION] = g_param_spec_boolean ("needs-attention", "Needs attention", "Whether the tab needs attention", FALSE, G_PARAM_READWRITE); pspecs[PROP_SEARCH_MODE_ENABLED] = g_param_spec_boolean ("search-mode-enabled", "Search mode enabled", "Whether the search mode is enabled for active page", FALSE, G_PARAM_READWRITE); /** * KgxTab:scrollback-lines: * * How many lines of scrollback #KgxTerminal should keep * * Bound to โ€˜scrollback-linesโ€™ GSetting so changes persist * * Stability: Private */ pspecs[PROP_SCROLLBACK_LINES] = g_param_spec_int64 ("scrollback-lines", "Scrollback Lines", "Size of the scrollback", G_MININT64, G_MAXINT64, 512, G_PARAM_READWRITE); g_object_class_install_properties (object_class, LAST_PROP, pspecs); signals[SIZE_CHANGED] = g_signal_new ("size-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); signals[ZOOM] = g_signal_new ("zoom", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 1, KGX_TYPE_ZOOM); signals[DIED] = g_signal_new ("died", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 3, GTK_TYPE_MESSAGE_TYPE, G_TYPE_STRING, G_TYPE_BOOLEAN); gtk_widget_class_set_template_from_resource (widget_class, KGX_APPLICATION_PATH "kgx-tab.ui"); gtk_widget_class_bind_template_child_private (widget_class, KgxTab, stack); gtk_widget_class_bind_template_child_private (widget_class, KgxTab, spinner_revealer); gtk_widget_class_bind_template_child_private (widget_class, KgxTab, revealer); gtk_widget_class_bind_template_child_private (widget_class, KgxTab, label); gtk_widget_class_bind_template_child_private (widget_class, KgxTab, search_entry); gtk_widget_class_bind_template_child_private (widget_class, KgxTab, search_bar); gtk_widget_class_bind_template_callback (widget_class, search_enabled); gtk_widget_class_bind_template_callback (widget_class, search_changed); gtk_widget_class_bind_template_callback (widget_class, search_next); gtk_widget_class_bind_template_callback (widget_class, search_prev); gtk_widget_class_bind_template_callback (widget_class, spinner_mapped); gtk_widget_class_bind_template_callback (widget_class, spinner_unmapped); } static void kgx_tab_add_child (GtkBuildable *buildable, GtkBuilder *builder, GObject *child, const char *type) { KgxTab *self = KGX_TAB (buildable); KgxTabPrivate *priv; g_return_if_fail (KGX_IS_TAB (self)); g_return_if_fail (GTK_IS_WIDGET (child)); priv = kgx_tab_get_instance_private (self); if (type && g_str_equal (type, "content")) { g_set_weak_pointer (&priv->content, GTK_WIDGET (child)); gtk_stack_add_named (GTK_STACK (priv->stack), GTK_WIDGET (child), "content"); } else { gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (child)); } } static void kgx_tab_buildable_iface_init (GtkBuildableIface *iface) { iface->add_child = kgx_tab_add_child; } static void died (KgxTab *self, GtkMessageType type, const char *message, gboolean success) { KgxTabPrivate *priv; GtkStyleContext *context; g_return_if_fail (KGX_IS_TAB (self)); priv = kgx_tab_get_instance_private (self); gtk_label_set_markup (GTK_LABEL (priv->label), message); context = gtk_widget_get_style_context (GTK_WIDGET (priv->revealer)); if (type == GTK_MESSAGE_ERROR) { gtk_style_context_add_class (context, "error"); } else { gtk_style_context_remove_class (context, "error"); } gtk_revealer_set_reveal_child (GTK_REVEALER (priv->revealer), TRUE); if (priv->close_on_quit && success) { kgx_pages_remove_page (kgx_tab_get_pages (self), self); } } static void kgx_tab_init (KgxTab *self) { static guint last_id = 0; KgxTabPrivate *priv = kgx_tab_get_instance_private (self); last_id++; priv->id = last_id; priv->root = g_hash_table_new (g_direct_hash, g_direct_equal); priv->remote = g_hash_table_new (g_direct_hash, g_direct_equal); priv->children = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) kgx_process_unref); gtk_widget_init_template (GTK_WIDGET (self)); g_signal_connect (self, "died", G_CALLBACK (died), NULL); hdy_search_bar_connect_entry (HDY_SEARCH_BAR (priv->search_bar), GTK_ENTRY (priv->search_entry)); gtk_drag_dest_set (GTK_WIDGET (self), GTK_DEST_DEFAULT_ALL, NULL, 0, GDK_ACTION_COPY); gtk_drag_dest_add_text_targets (GTK_WIDGET (self)); } void kgx_tab_connect_terminal (KgxTab *self, KgxTerminal *term) { KgxTabPrivate *priv; g_return_if_fail (KGX_IS_TAB (self)); g_return_if_fail (KGX_IS_TERMINAL (term)); priv = kgx_tab_get_instance_private (self); if (priv->terminal == term) { return; } if (priv->terminal) { g_object_disconnect (priv->terminal, "any-signal::size-changed", G_CALLBACK (size_changed), self, "any-signal::increase-font-size", G_CALLBACK (font_increase), self, "any-signal::decrease-font-size", G_CALLBACK (font_decrease), self, NULL); } g_clear_object (&priv->term_title_bind); g_clear_object (&priv->term_path_bind); g_clear_object (&priv->term_font_bind); g_clear_object (&priv->term_zoom_bind); g_clear_object (&priv->term_theme_bind); g_clear_object (&priv->term_opaque_bind); g_clear_object (&priv->term_scrollback_bind); g_set_object (&priv->terminal, term); g_object_connect (term, "signal::size-changed", G_CALLBACK (size_changed), self, "signal::increase-font-size", G_CALLBACK (font_increase), self, "signal::decrease-font-size", G_CALLBACK (font_decrease), self, NULL); priv->term_title_bind = g_object_bind_property (term, "window-title", self, "tab-title", G_BINDING_SYNC_CREATE); priv->term_path_bind = g_object_bind_property (term, "path", self, "tab-path", G_BINDING_SYNC_CREATE); priv->term_font_bind = g_object_bind_property (self, "font", term, "font-desc", G_BINDING_SYNC_CREATE); priv->term_zoom_bind = g_object_bind_property (self, "zoom", term, "font-scale", G_BINDING_SYNC_CREATE); priv->term_theme_bind = g_object_bind_property (self, "theme", term, "theme", G_BINDING_SYNC_CREATE); priv->term_opaque_bind = g_object_bind_property (self, "opaque", term, "opaque", G_BINDING_SYNC_CREATE); priv->term_scrollback_bind = g_object_bind_property (self, "scrollback-lines", term, "scrollback-lines", G_BINDING_SYNC_CREATE); } void kgx_tab_set_pages (KgxTab *self, KgxPages *pages) { KgxTabPrivate *priv; g_return_if_fail (KGX_IS_TAB (self)); g_return_if_fail (KGX_IS_PAGES (pages) || !pages); priv = kgx_tab_get_instance_private (self); g_clear_object (&priv->pages_font_bind); g_clear_object (&priv->pages_zoom_bind); g_clear_object (&priv->pages_theme_bind); g_clear_object (&priv->pages_opaque_bind); g_clear_object (&priv->pages_scrollback_bind); if (pages == NULL) { return; } priv->pages_font_bind = g_object_bind_property (pages, "font", self, "font", G_BINDING_SYNC_CREATE); priv->pages_zoom_bind = g_object_bind_property (pages, "zoom", self, "zoom", G_BINDING_SYNC_CREATE); priv->pages_theme_bind = g_object_bind_property (pages, "theme", self, "theme", G_BINDING_SYNC_CREATE); priv->pages_opaque_bind = g_object_bind_property (pages, "opaque", self, "opaque", G_BINDING_SYNC_CREATE); priv->pages_scrollback_bind = g_object_bind_property (pages, "scrollback-lines", self, "scrollback-lines", G_BINDING_SYNC_CREATE); } void kgx_tab_start (KgxTab *self, GAsyncReadyCallback callback, gpointer callback_data) { KgxTabPrivate *priv; g_return_if_fail (KGX_IS_TAB (self)); g_return_if_fail (KGX_TAB_GET_CLASS (self)->start); priv = kgx_tab_get_instance_private (self); priv->spinner_timeout = g_timeout_add (100, G_SOURCE_FUNC (start_spinner_timeout_cb), self); KGX_TAB_GET_CLASS (self)->start (self, callback, callback_data); } GPid kgx_tab_start_finish (KgxTab *self, GAsyncResult *res, GError **error) { KgxTabPrivate *priv; GPid pid; g_return_val_if_fail (KGX_IS_TAB (self), 0); g_return_val_if_fail (KGX_TAB_GET_CLASS (self)->start, 0); priv = kgx_tab_get_instance_private (self); pid = KGX_TAB_GET_CLASS (self)->start_finish (self, res, error); g_clear_handle_id (&priv->spinner_timeout, g_source_remove); gtk_stack_set_visible_child (GTK_STACK (priv->stack), priv->content); gtk_widget_grab_focus (GTK_WIDGET (self)); return pid; } void kgx_tab_died (KgxTab *self, GtkMessageType type, const char *message, gboolean success) { g_signal_emit (self, signals[DIED], 0, type, message, success); } /** * kgx_tab_get_pages: * @self: the #KgxTab * * Find the #KgxTabs @self is (currently) a memember of * * Returns: (transfer none): the #KgxTabs */ KgxPages * kgx_tab_get_pages (KgxTab *self) { GtkWidget *parent; parent = gtk_widget_get_ancestor (GTK_WIDGET (self), KGX_TYPE_PAGES); g_return_val_if_fail (parent, NULL); g_return_val_if_fail (KGX_IS_PAGES (parent), NULL); return KGX_PAGES (parent); } /** * kgx_tab_get_id: * @self: the #KgxTab * * Get the unique (in the instance) id for the page * * Returns: the identifier for the page */ guint kgx_tab_get_id (KgxTab *self) { KgxTabPrivate *priv; g_return_val_if_fail (KGX_IS_TAB (self), 0); priv = kgx_tab_get_instance_private (self); return priv->id; } static inline KgxStatus push_type (GHashTable *table, GPid pid, KgxProcess *process, GtkStyleContext *context, KgxStatus status) { g_hash_table_insert (table, GINT_TO_POINTER (pid), process != NULL ? g_rc_box_acquire (process) : NULL); g_debug ("Now %i %X", g_hash_table_size (table), status); return status; } /** * kgx_tab_push_child: * @self: the #KgxTab * @process: the #KgxProcess of the remote process * * Registers @pid as a child of @self */ void kgx_tab_push_child (KgxTab *self, KgxProcess *process) { GtkStyleContext *context; GPid pid = 0; const char *exec = NULL; KgxStatus new_status = KGX_NONE; KgxTabPrivate *priv; g_return_if_fail (KGX_IS_TAB (self)); priv = kgx_tab_get_instance_private (self); context = gtk_widget_get_style_context (GTK_WIDGET (self)); pid = kgx_process_get_pid (process); exec = kgx_process_get_exec (process); if (G_UNLIKELY (g_str_has_prefix (exec, "ssh "))) { new_status |= push_type (priv->remote, pid, NULL, context, KGX_REMOTE); } if (G_UNLIKELY (kgx_process_get_is_root (process))) { new_status |= push_type (priv->root, pid, NULL, context, KGX_PRIVILEGED); } push_type (priv->children, pid, process, context, KGX_NONE); if (priv->status != new_status) { priv->status = new_status; g_object_notify_by_pspec (G_OBJECT (self), pspecs[PROP_TAB_STATUS]); } } inline static KgxStatus pop_type (GHashTable *table, GPid pid, GtkStyleContext *context, KgxStatus status) { guint size = 0; g_hash_table_remove (table, GINT_TO_POINTER (pid)); size = g_hash_table_size (table); if (G_LIKELY (size <= 0)) { g_debug ("No longer %X", status); return KGX_NONE; } else { g_debug ("%i %X remaining", size, status); return status; } } /** * kgx_tab_pop_child: * @self: the #KgxTab * @process: the #KgxProcess of the child process * * Remove a child added with kgx_tab_push_child() */ void kgx_tab_pop_child (KgxTab *self, KgxProcess *process) { GtkStyleContext *context; GPid pid = 0; KgxStatus new_status = KGX_NONE; KgxTabPrivate *priv; g_return_if_fail (KGX_IS_TAB (self)); priv = kgx_tab_get_instance_private (self); context = gtk_widget_get_style_context (GTK_WIDGET (self)); pid = kgx_process_get_pid (process); new_status |= pop_type (priv->remote, pid, context, KGX_REMOTE); new_status |= pop_type (priv->root, pid, context, KGX_PRIVILEGED); pop_type (priv->children, pid, context, KGX_NONE); if (priv->status != new_status) { priv->status = new_status; g_object_notify_by_pspec (G_OBJECT (self), pspecs[PROP_TAB_STATUS]); } if (!kgx_tab_is_active (self)) { g_autoptr (GNotification) noti = NULL; noti = g_notification_new (_("Command completed")); g_notification_set_body (noti, kgx_process_get_exec (process)); g_notification_set_default_action_and_target (noti, "app.focus-page", "u", priv->id); priv->notification_id = g_strdup_printf ("command-completed-%u", priv->id); g_application_send_notification (G_APPLICATION (priv->application), priv->notification_id, noti); if (!gtk_widget_get_mapped (GTK_WIDGET (self))) { g_object_set (self, "needs-attention", TRUE, NULL); } } } gboolean kgx_tab_is_active (KgxTab *self) { KgxTabPrivate *priv; g_return_val_if_fail (KGX_IS_TAB (self), FALSE); priv = kgx_tab_get_instance_private (self); return priv->is_active; } /** * kgx_tab_get_children: * @self: the #KgxTab * * Get a list of child process running in @self * * NOTE: This doesn't include the shell/root itself * * Returns: (element-type Kgx.Process) (transfer full): the list of #KgxProcess */ GPtrArray * kgx_tab_get_children (KgxTab *self) { KgxTabPrivate *priv; GPtrArray *children; GHashTableIter iter; gpointer pid, process; g_return_val_if_fail (KGX_IS_TAB (self), NULL); priv = kgx_tab_get_instance_private (self); children = g_ptr_array_new_full (3, (GDestroyNotify) kgx_process_unref); g_hash_table_iter_init (&iter, priv->children); while (g_hash_table_iter_next (&iter, &pid, &process)) { g_ptr_array_add (children, g_rc_box_acquire (process)); } return children; } void kgx_tab_accept_drop (KgxTab *self, GtkSelectionData *selection_data) { KgxTabPrivate *priv; g_autofree char *text = NULL; g_return_if_fail (KGX_IS_TAB (self)); priv = kgx_tab_get_instance_private (self); if (gtk_selection_data_get_length (selection_data) < 0) return; text = (char *) gtk_selection_data_get_text (selection_data); if (priv->terminal) kgx_terminal_accept_paste (KGX_TERMINAL (priv->terminal), text); } void kgx_tab_set_initial_title (KgxTab *self, const char *title, GFile *path) { KgxTabPrivate *priv; g_return_if_fail (KGX_IS_TAB (self)); priv = kgx_tab_get_instance_private (self); if (priv->title || priv->path) return; g_object_set (self, "tab-title", title, "tab-path", path, NULL); } gboolean kgx_tab_key_press_event (KgxTab *self, GdkEvent *event) { KgxTabPrivate *priv; GtkWidget *toplevel, *focus; g_return_val_if_fail (KGX_IS_TAB (self), GDK_EVENT_PROPAGATE); g_return_val_if_fail (event != NULL, GDK_EVENT_PROPAGATE); priv = kgx_tab_get_instance_private (self); toplevel = gtk_widget_get_toplevel (GTK_WIDGET (self)); if (!GTK_IS_WINDOW (toplevel)) return GDK_EVENT_PROPAGATE; focus = gtk_window_get_focus (GTK_WINDOW (toplevel)); if (focus == GTK_WIDGET (priv->terminal)) return gtk_widget_event (GTK_WIDGET (priv->terminal), event); return GDK_EVENT_PROPAGATE; } gnome-console-42~beta/src/kgx-tab.h000066400000000000000000000077221420277463100174130ustar00rootroot00000000000000/* kgx-tab.h * * Copyright 2019-2020 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include #include "kgx-terminal.h" #include "kgx-process.h" #include "kgx-enums.h" G_BEGIN_DECLS /** * KgxStatus: * @KGX_NONE: It's a regular #KgxTab * @KGX_REMOTE: The #KgxTab is connected to a "remote" session * @KGX_PRIVILEGED: The #KgxTab is running as someone other than the current * user * * Indicates the status of the session the #KgxTab represents * * Stability: Private */ typedef enum /*< flags,prefix=KGX >*/ { KGX_NONE = 0, /*< nick=none >*/ KGX_REMOTE = (1 << 0), /*< nick=remote >*/ KGX_PRIVILEGED = (1 << 1), /*< nick=privileged >*/ } KgxStatus; #ifndef __GTK_DOC_IGNORE__ typedef struct _KgxPages KgxPages; #endif #define KGX_TYPE_TAB kgx_tab_get_type () G_DECLARE_DERIVABLE_TYPE (KgxTab, kgx_tab, KGX, TAB, GtkBox) /** * KgxTabClass: * @start: start whatever it is that run in the tab * @start_finish: complete @start * * Stability: Private */ struct _KgxTabClass { /*< private >*/ GtkBoxClass parent; /*< public >*/ void (*start) (KgxTab *tab, GAsyncReadyCallback callback, gpointer callback_data); GPid (*start_finish) (KgxTab *tab, GAsyncResult *res, GError **error); }; guint kgx_tab_get_id (KgxTab *self); void kgx_tab_connect_terminal (KgxTab *self, KgxTerminal *term); void kgx_tab_set_pages (KgxTab *self, KgxPages *pages); void kgx_tab_start (KgxTab *self, GAsyncReadyCallback callback, gpointer callback_data); GPid kgx_tab_start_finish (KgxTab *self, GAsyncResult *res, GError **error); void kgx_tab_died (KgxTab *self, GtkMessageType type, const char *message, gboolean success); KgxPages *kgx_tab_get_pages (KgxTab *self); void kgx_tab_push_child (KgxTab *self, KgxProcess *process); void kgx_tab_pop_child (KgxTab *self, KgxProcess *process); gboolean kgx_tab_is_active (KgxTab *self); GPtrArray *kgx_tab_get_children (KgxTab *self); void kgx_tab_accept_drop (KgxTab *self, GtkSelectionData *selection_data); void kgx_tab_set_initial_title (KgxTab *self, const char *title, GFile *path); gboolean kgx_tab_key_press_event (KgxTab *self, GdkEvent *event); G_END_DECLS gnome-console-42~beta/src/kgx-tab.ui000066400000000000000000000120721420277463100175730ustar00rootroot00000000000000 gnome-console-42~beta/src/kgx-terminal.c000066400000000000000000000563141420277463100204540ustar00rootroot00000000000000/* kgx-terminal.c * * Copyright 2019 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * SECTION:kgx-terminal * @title: KgxTerminal * @short_description: The terminal * * The main terminal widget with various features added such as a context * menu (via #GtkPopover) and link detection */ #include #include #include #define PCRE2_CODE_UNIT_WIDTH 0 #include #include "rgba.h" #include "kgx-config.h" #include "kgx-terminal.h" /* Regex adapted from TerminalWidget.vala in Pantheon Terminal */ #define USERCHARS "-[:alnum:]" #define USERCHARS_CLASS "[" USERCHARS "]" #define PASSCHARS_CLASS "[-[:alnum:]\\Q,?;.:/!%$^*&~\"#'\\E]" #define HOSTCHARS_CLASS "[-[:alnum:]]" #define HOST HOSTCHARS_CLASS "+(\\." HOSTCHARS_CLASS "+)*" #define PORT "(?:\\:[[:digit:]]{1,5})?" #define PATHCHARS_CLASS "[-[:alnum:]\\Q_$.+!*,;:@&=?/~#%\\E]" #define PATHTERM_CLASS "[^\\Q]'.}>) \t\r\n,\"\\E]" #define SCHEME "(?:news:|telnet:|nntp:|file:\\/|https?:|ftps?:|sftp:|webcal:\n" \ "|irc:|sftp:|ldaps?:|nfs:|smb:|rsync:|" \ "ssh:|rlogin:|telnet:|git:\n" \ "|git\\+ssh:|bzr:|bzr\\+ssh:|svn:|svn\\" \ "+ssh:|hg:|mailto:|magnet:)" #define USERPASS USERCHARS_CLASS "+(?:" PASSCHARS_CLASS "+)?" #define URLPATH "(?:(/" PATHCHARS_CLASS "+(?:[(]" PATHCHARS_CLASS "*[)])*" PATHCHARS_CLASS "*)*" PATHTERM_CLASS ")?" static const gchar* links[KGX_TERMINAL_N_LINK_REGEX] = { SCHEME "//(?:" USERPASS "\\@)?" HOST PORT URLPATH, "(?:www|ftp)" HOSTCHARS_CLASS "*\\." HOST PORT URLPATH, "(?:callto:|h323:|sip:)" USERCHARS_CLASS "[" USERCHARS ".]*(?:" PORT "/[a-z0-9]+)?\\@" HOST, "(?:mailto:)?" USERCHARS_CLASS "[" USERCHARS ".]*\\@" HOSTCHARS_CLASS "+\\." HOST, "(?:news:|man:|info:)[[:alnum:]\\Q^_{|}~!\"#$%&'()*+,./;:=?`\\E]+" }; /* Regex adapted from TerminalWidget.vala in Pantheon Terminal */ G_DEFINE_TYPE (KgxTerminal, kgx_terminal, VTE_TYPE_TERMINAL) enum { PROP_0, PROP_THEME, PROP_OPAQUE, PROP_PATH, LAST_PROP }; static GParamSpec *pspecs[LAST_PROP] = { NULL, }; enum { SIZE_CHANGED, N_SIGNALS }; static guint signals[N_SIGNALS]; static void kgx_terminal_dispose (GObject *object) { KgxTerminal *self = KGX_TERMINAL (object); g_clear_object (&self->actions); g_clear_pointer (&self->current_url, g_free); g_clear_object (&self->long_press_gesture); if (self->menu) { gtk_menu_detach (GTK_MENU (self->menu)); self->menu = NULL; } if (self->touch_menu) { gtk_popover_set_relative_to (GTK_POPOVER (self->touch_menu), NULL); self->touch_menu = NULL; } G_OBJECT_CLASS (kgx_terminal_parent_class)->dispose (object); } static void update_terminal_colors (KgxTerminal *self) { KgxTheme resolved_theme; GdkRGBA fg; GdkRGBA bg; // Workings of GDK_RGBA prevent this being static GdkRGBA palette[16] = { GDK_RGBA ("241f31"), // Black GDK_RGBA ("c01c28"), // Red GDK_RGBA ("2ec27e"), // Green GDK_RGBA ("f5c211"), // Yellow GDK_RGBA ("1e78e4"), // Blue GDK_RGBA ("9841bb"), // Magenta GDK_RGBA ("0ab9dc"), // Cyan GDK_RGBA ("c0bfbc"), // White GDK_RGBA ("5e5c64"), // Bright Black GDK_RGBA ("ed333b"), // Bright Red GDK_RGBA ("57e389"), // Bright Green GDK_RGBA ("f8e45c"), // Bright Yellow GDK_RGBA ("51a1ff"), // Bright Blue GDK_RGBA ("c061cb"), // Bright Magenta GDK_RGBA ("4fd2fd"), // Bright Cyan GDK_RGBA ("f6f5f4"), // Bright White }; if (self->theme == KGX_THEME_AUTO) { HdyStyleManager *manager = hdy_style_manager_get_default (); if (hdy_style_manager_get_dark (manager)) { resolved_theme = KGX_THEME_NIGHT; } else { resolved_theme = KGX_THEME_DAY; } } else { resolved_theme = self->theme; } switch (resolved_theme) { case KGX_THEME_HACKER: fg = (GdkRGBA) { 0.1, 1.0, 0.1, 1.0}; bg = (GdkRGBA) { 0.05, 0.05, 0.05, 0.96 }; break; case KGX_THEME_DAY: fg = (GdkRGBA) { 0.0, 0.0, 0.0, 0.0 }; bg = (GdkRGBA) { 1.0, 1.0, 1.0, 1.0 }; break; case KGX_THEME_NIGHT: case KGX_THEME_AUTO: default: fg = (GdkRGBA) { 1.0, 1.0, 1.0, 1.0}; bg = (GdkRGBA) { 0.05, 0.05, 0.05, 0.96 }; break; } if (self->opaque) { bg.alpha = 1.0; } vte_terminal_set_colors (VTE_TERMINAL (self), &fg, &bg, palette, 16); } static void kgx_terminal_set_theme (KgxTerminal *self, KgxTheme theme, gboolean opaque) { if (self->theme == theme && self->opaque == opaque) { return; } if (self->theme != theme) { self->theme = theme; g_object_notify_by_pspec (G_OBJECT (self), pspecs[PROP_THEME]); } if (self->opaque != opaque) { self->opaque = opaque; g_object_notify_by_pspec (G_OBJECT (self), pspecs[PROP_OPAQUE]); } update_terminal_colors (self); } static void kgx_terminal_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { KgxTerminal *self = KGX_TERMINAL (object); switch (property_id) { case PROP_THEME: kgx_terminal_set_theme (self, g_value_get_enum (value), self->opaque); break; case PROP_OPAQUE: kgx_terminal_set_theme (self, self->theme, g_value_get_boolean (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void kgx_terminal_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { KgxTerminal *self = KGX_TERMINAL (object); const char *uri; g_autoptr (GFile) path = NULL; switch (property_id) { case PROP_THEME: g_value_set_enum (value, self->theme); break; case PROP_OPAQUE: g_value_set_boolean (value, self->opaque); break; case PROP_PATH: if ((uri = vte_terminal_get_current_file_uri (VTE_TERMINAL (self)))) { path = g_file_new_for_uri (uri); } else if ((uri = vte_terminal_get_current_directory_uri (VTE_TERMINAL (self)))) { path = g_file_new_for_uri (uri); } g_value_set_object (value, path); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static gboolean have_url_under_pointer (KgxTerminal *self, GdkEvent *event) { g_autofree char *hyperlink = NULL; g_autofree char *match = NULL; int match_id; g_clear_pointer (&self->current_url, g_free); hyperlink = vte_terminal_hyperlink_check_event (VTE_TERMINAL (self), event); if (G_UNLIKELY (hyperlink)) { self->current_url = g_steal_pointer (&hyperlink); } else { match = vte_terminal_match_check_event (VTE_TERMINAL (self), event, &match_id); for (int i = 0; i < KGX_TERMINAL_N_LINK_REGEX; i++) { if (self->match_id[i] == match_id) { self->current_url = g_steal_pointer (&match); break; } } } return self->current_url != NULL; } static void context_menu_detach (KgxTerminal *self, GtkMenu *menu) { self->menu = NULL; } static void context_menu (GtkWidget *widget, int x, int y, gboolean touch, GdkEvent *event) { KgxTerminal *self = KGX_TERMINAL (widget); GAction *act; GtkApplication *app; GMenu *model; gboolean value; value = have_url_under_pointer (self, event); act = g_action_map_lookup_action (G_ACTION_MAP (self->actions), "open-link"); g_simple_action_set_enabled (G_SIMPLE_ACTION (act), value); act = g_action_map_lookup_action (G_ACTION_MAP (self->actions), "copy-link"); g_simple_action_set_enabled (G_SIMPLE_ACTION (act), value); if (touch) { GdkRectangle rect = {x, y, 1, 1}; if (!self->touch_menu) { app = GTK_APPLICATION (g_application_get_default ()); model = gtk_application_get_menu_by_id (app, "context-menu"); self->touch_menu = gtk_popover_new_from_model (widget, G_MENU_MODEL (model)); } gtk_popover_set_pointing_to (GTK_POPOVER (self->touch_menu), &rect); gtk_popover_popup (GTK_POPOVER (self->touch_menu)); } else { if (!self->menu) { app = GTK_APPLICATION (g_application_get_default ()); model = gtk_application_get_menu_by_id (app, "context-menu"); self->menu = gtk_menu_new_from_model (G_MENU_MODEL (model)); gtk_style_context_add_class (gtk_widget_get_style_context (self->menu), GTK_STYLE_CLASS_CONTEXT_MENU); gtk_menu_attach_to_widget (GTK_MENU (self->menu), widget, (GtkMenuDetachFunc) context_menu_detach); } if (event && gdk_event_triggers_context_menu (event)) { gtk_menu_popup_at_pointer (GTK_MENU (self->menu), event); } else { gtk_menu_popup_at_widget (GTK_MENU (self->menu), widget, GDK_GRAVITY_SOUTH_WEST, GDK_GRAVITY_NORTH_WEST, event); gtk_menu_shell_select_first (GTK_MENU_SHELL (self->menu), FALSE); } } } static gboolean kgx_terminal_popup_menu (GtkWidget *self) { context_menu (self, 1, 1, FALSE, NULL); return TRUE; } static void open_link (KgxTerminal *self, guint32 timestamp) { g_autoptr (GError) error = NULL; gtk_show_uri_on_window (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))), self->current_url, timestamp, &error); if (error) { g_warning ("Failed to open link %s", error->message); } } static gboolean kgx_terminal_button_press_event (GtkWidget *widget, GdkEventButton *event) { KgxTerminal *self = KGX_TERMINAL (widget); GdkModifierType state; if (gdk_event_triggers_context_menu ((GdkEvent *) event) && event->type == GDK_BUTTON_PRESS) { context_menu (widget, event->x, event->y, FALSE, (GdkEvent *) event); return TRUE; } state = event->state & gtk_accelerator_get_default_mod_mask (); if (have_url_under_pointer (self, (GdkEvent *) event) && (event->button == 1 || event->button == 2) && state & GDK_CONTROL_MASK) { open_link (self, event->time); return GDK_EVENT_STOP; } return GTK_WIDGET_CLASS (kgx_terminal_parent_class)->button_press_event (widget, event); } static void kgx_terminal_class_init (KgxTerminalClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); object_class->dispose = kgx_terminal_dispose; object_class->set_property = kgx_terminal_set_property; object_class->get_property = kgx_terminal_get_property; widget_class->popup_menu = kgx_terminal_popup_menu; widget_class->button_press_event = kgx_terminal_button_press_event; /** * KgxTerminal:theme: * * The palette to use, one of the values of #KgxTheme * * Officially only "night" exists, "hacker" is just a little fun * * Bound to #KgxApplication:theme on the #KgxApplication * * Stability: Private */ pspecs[PROP_THEME] = g_param_spec_enum ("theme", "Theme", "Terminal theme", KGX_TYPE_THEME, KGX_THEME_NIGHT, G_PARAM_READWRITE); /** * KgxTerminal:opaque: * * Whether to disable transparency * * Bound to #GtkWindow:is-maximized on the #KgxWindow * * Stability: Private */ pspecs[PROP_OPAQUE] = g_param_spec_boolean ("opaque", "Opaque", "Terminal opaqueness", FALSE, G_PARAM_READWRITE); /** * KgxTerminal:path: * * * Stability: Private */ pspecs[PROP_PATH] = g_param_spec_object ("path", "Path", "Current path", G_TYPE_FILE, G_PARAM_READABLE); g_object_class_install_properties (object_class, LAST_PROP, pspecs); signals[SIZE_CHANGED] = g_signal_new ("size-changed", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_UINT); } static void open_link_activated (GSimpleAction *action, GVariant *parameter, gpointer data) { open_link (KGX_TERMINAL (data), GDK_CURRENT_TIME); } static void copy_link_activated (GSimpleAction *action, GVariant *parameter, gpointer data) { GtkClipboard *cb; KgxTerminal *self = KGX_TERMINAL (data); cb = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); gtk_clipboard_set_text (cb, self->current_url, -1); } static void copy_activated (GSimpleAction *action, GVariant *parameter, gpointer data) { vte_terminal_copy_clipboard_format (VTE_TERMINAL (data), VTE_FORMAT_TEXT); } struct Paste { VteTerminal *dest; char *text; }; static void paste_response (GtkDialog *dlg, int response, struct Paste *paste) { if (dlg && GTK_IS_DIALOG (dlg)) { gtk_widget_destroy (GTK_WIDGET (dlg)); } if (response == GTK_RESPONSE_ACCEPT) { vte_terminal_paste_text (paste->dest, paste->text); } g_free (paste->text); g_free (paste); } static void got_text (GtkClipboard *clipboard, const char *text, gpointer data) { kgx_terminal_accept_paste (KGX_TERMINAL (data), text); } static void paste_activated (GSimpleAction *action, GVariant *parameter, gpointer data) { GtkClipboard *cb; cb = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD); gtk_clipboard_request_text (cb, got_text, data); } static void select_all_activated (GSimpleAction *action, GVariant *parameter, gpointer data) { vte_terminal_select_all (VTE_TERMINAL (data)); } static void show_in_files_activated (GSimpleAction *action, GVariant *parameter, gpointer data) { KgxTerminal *self = KGX_TERMINAL (data); g_autoptr (GDBusProxy) proxy = NULL; g_autoptr (GVariant) retval = NULL; g_autoptr (GVariantBuilder) builder = NULL; g_autoptr (GError) error = NULL; const char *uri = NULL; const char *method; uri = vte_terminal_get_current_file_uri (VTE_TERMINAL (self)); method = "ShowItems"; if (uri == NULL) { uri = vte_terminal_get_current_directory_uri (VTE_TERMINAL (self)); method = "ShowFolders"; } if (uri == NULL) { g_warning ("win.show-in-files: no file"); return; } proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, G_DBUS_PROXY_FLAGS_NONE, NULL, "org.freedesktop.FileManager1", "/org/freedesktop/FileManager1", "org.freedesktop.FileManager1", NULL, &error); if (!proxy) { g_warning ("win.show-in-files: D-Bus connect failed %s", error->message); return; } builder = g_variant_builder_new (G_VARIANT_TYPE ("as")); g_variant_builder_add (builder, "s", uri); retval = g_dbus_proxy_call_sync (proxy, method, g_variant_new ("(ass)", builder, ""), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &error); if (!retval) { g_warning ("win.show-in-files: D-Bus call failed %s", error->message); return; } } static GActionEntry term_entries[] = { { "open-link", open_link_activated, NULL, NULL, NULL }, { "copy-link", copy_link_activated, NULL, NULL, NULL }, { "copy", copy_activated, NULL, NULL, NULL }, { "paste", paste_activated, NULL, NULL, NULL }, { "select-all", select_all_activated, NULL, NULL, NULL }, { "show-in-files", show_in_files_activated, NULL, NULL, NULL }, }; static void long_pressed (GtkGestureLongPress *gesture, gdouble x, gdouble y, KgxTerminal *self) { context_menu (GTK_WIDGET (self), (int) x, (int) y, TRUE, NULL); } static void selection_changed (KgxTerminal *self) { GAction *act; act = g_action_map_lookup_action (self->actions, "copy"); g_simple_action_set_enabled (G_SIMPLE_ACTION (act), vte_terminal_get_has_selection (VTE_TERMINAL (self))); } static void location_changed (KgxTerminal *self) { GAction *act; gboolean value; act = g_action_map_lookup_action (self->actions, "show-in-files"); value = vte_terminal_get_current_file_uri (VTE_TERMINAL (self)) || vte_terminal_get_current_directory_uri (VTE_TERMINAL (self)); g_simple_action_set_enabled (G_SIMPLE_ACTION (act), value); g_object_notify_by_pspec (G_OBJECT (self), pspecs[PROP_PATH]); } static void size_changed (GtkWidget *widget, GdkRectangle *allocation) { int rows; int cols; KgxTerminal *self = KGX_TERMINAL (widget); VteTerminal *term = VTE_TERMINAL (self); rows = vte_terminal_get_row_count (term); cols = vte_terminal_get_column_count (term); g_signal_emit (self, signals[SIZE_CHANGED], 0, rows, cols); } static void dark_changed (KgxTerminal *self) { if (self->theme == KGX_THEME_AUTO) { update_terminal_colors (self); } } static void kgx_terminal_init (KgxTerminal *self) { GAction *act; GtkGesture *gesture; self->actions = G_ACTION_MAP (g_simple_action_group_new ()); g_action_map_add_action_entries (self->actions, term_entries, G_N_ELEMENTS (term_entries), self); gtk_widget_insert_action_group (GTK_WIDGET (self), "term", G_ACTION_GROUP (self->actions)); gesture = gtk_gesture_long_press_new (GTK_WIDGET (self)); gtk_gesture_single_set_touch_only (GTK_GESTURE_SINGLE (gesture), TRUE); gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (gesture), GTK_PHASE_TARGET); g_signal_connect (gesture, "pressed", G_CALLBACK (long_pressed), self); self->long_press_gesture = gesture; act = g_action_map_lookup_action (self->actions, "open-link"); g_simple_action_set_enabled (G_SIMPLE_ACTION (act), FALSE); act = g_action_map_lookup_action (self->actions, "copy-link"); g_simple_action_set_enabled (G_SIMPLE_ACTION (act), FALSE); act = g_action_map_lookup_action (self->actions, "copy"); g_simple_action_set_enabled (G_SIMPLE_ACTION (act), FALSE); act = g_action_map_lookup_action (self->actions, "show-in-files"); g_simple_action_set_enabled (G_SIMPLE_ACTION (act), FALSE); vte_terminal_set_mouse_autohide (VTE_TERMINAL (self), TRUE); vte_terminal_search_set_wrap_around (VTE_TERMINAL (self), TRUE); vte_terminal_set_allow_hyperlink (VTE_TERMINAL (self), TRUE); vte_terminal_set_enable_fallback_scrolling (VTE_TERMINAL (self), FALSE); vte_terminal_set_scroll_unit_is_pixels (VTE_TERMINAL (self), TRUE); g_signal_connect (self, "selection-changed", G_CALLBACK (selection_changed), NULL); g_signal_connect (self, "current-directory-uri-changed", G_CALLBACK (location_changed), NULL); g_signal_connect (self, "current-file-uri-changed", G_CALLBACK (location_changed), NULL); g_signal_connect (self, "size-allocate", G_CALLBACK (size_changed), NULL); for (int i = 0; i < KGX_TERMINAL_N_LINK_REGEX; i++) { g_autoptr (VteRegex) regex = NULL; g_autoptr (GError) error = NULL; regex = vte_regex_new_for_match (links[i], -1, PCRE2_MULTILINE, &error); if (error) { g_warning ("link regex failed: %s", error->message); continue; } self->match_id[i] = vte_terminal_match_add_regex (VTE_TERMINAL (self), regex, 0); vte_terminal_match_set_cursor_name (VTE_TERMINAL (self), self->match_id[i], "pointer"); } g_signal_connect_object (hdy_style_manager_get_default (), "notify::dark", G_CALLBACK (dark_changed), self, G_CONNECT_SWAPPED); update_terminal_colors (self); } void kgx_terminal_accept_paste (KgxTerminal *self, const char *text) { g_autofree char *striped = g_strchug (g_strdup (text)); struct Paste *paste = g_new (struct Paste, 1); paste->dest = VTE_TERMINAL (self); paste->text = g_strdup (text); if (g_strstr_len (striped, -1, "sudo") != NULL && g_strstr_len (striped, -1, "\n") != NULL) { GtkWidget *accept = NULL; GtkWidget *dlg = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))), GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("You are pasting a command that runs as an administrator")); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dlg), // TRANSLATORS: %s is the command being pasted _("Make sure you know what the command does:\n%s"), text); g_signal_connect (dlg, "response", G_CALLBACK (paste_response), paste); gtk_dialog_add_button (GTK_DIALOG (dlg), _("_Cancel"), GTK_RESPONSE_DELETE_EVENT); accept = gtk_dialog_add_button (GTK_DIALOG (dlg), _("_Paste"), GTK_RESPONSE_ACCEPT); gtk_style_context_add_class (gtk_widget_get_style_context (accept), "destructive-action"); gtk_widget_show (dlg); } else { paste_response (NULL, GTK_RESPONSE_ACCEPT, paste); } } gnome-console-42~beta/src/kgx-terminal.h000066400000000000000000000055251420277463100204570ustar00rootroot00000000000000/* kgx-terminal.h * * Copyright 2019 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include #include #include "kgx-enums.h" G_BEGIN_DECLS /** * KgxTheme: * @KGX_THEME_AUTO: Matches %KGX_THEME_DAY or %KGX_THEME_NIGHT depending on the * system preferences * @KGX_THEME_NIGHT: The default, public, theme * @KGX_THEME_DAY: Alternate, light theme * @KGX_THEME_HACKER: Little easter egg theme * * Until [meson#1687](https://github.com/mesonbuild/meson/issues/1687) is * resolved this enum must be manually kept in sync with * the โ€˜Themeโ€™ enum in the gschema */ typedef enum /*< enum,prefix=KGX >*/ { KGX_THEME_AUTO = 0, /*< nick=auto >*/ KGX_THEME_NIGHT = 1, /*< nick=night >*/ KGX_THEME_DAY = 2, /*< nick=day >*/ KGX_THEME_HACKER = 3, /*< nick=hacker >*/ } KgxTheme; /** * KGX_TERMINAL_N_LINK_REGEX: * The number of regexs use to search for hyperlinks * * Stability: Private */ #define KGX_TERMINAL_N_LINK_REGEX 5 /** * KGX_FONT_SCALE_MIN: * The smallest font scale/zoom * * Stability: Private */ #define KGX_FONT_SCALE_MIN 0.5 /** * KGX_FONT_SCALE_MAX: * The largest font scale/zoom * * Stability: Private */ #define KGX_FONT_SCALE_MAX 4.0 /** * KGX_FONT_SCALE_DEFAULT: * The standard font scale/zoom * * Stability: Private */ #define KGX_FONT_SCALE_DEFAULT 1.0 #define KGX_TYPE_TERMINAL (kgx_terminal_get_type()) /** * KgxTerminal: * @theme: the palette to use, see #KgxTerminal:theme * @opaque: is transparency enabled, see #KgxTerminal:opaque * @actions: action map for the context menu * @current_url: the address under the cursor * @match_id: regex ids for finding hyperlinks * * Stability: Private */ struct _KgxTerminal { /*< private >*/ VteTerminal parent_instance; /*< public >*/ KgxTheme theme; gboolean opaque; GActionMap *actions; /* Hyperlinks */ char *current_url; int match_id[KGX_TERMINAL_N_LINK_REGEX]; /* Gestures */ GtkGesture *long_press_gesture; /* Menus */ GtkWidget *menu; GtkWidget *touch_menu; }; G_DECLARE_FINAL_TYPE (KgxTerminal, kgx_terminal, KGX, TERMINAL, VteTerminal) void kgx_terminal_accept_paste (KgxTerminal *self, const char *text); G_END_DECLS gnome-console-42~beta/src/kgx-theme-switcher.c000066400000000000000000000117731420277463100215710ustar00rootroot00000000000000/* kgx-theme-switcher.c * * Copyright 2021 Purism SPC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "kgx-config.h" #include "kgx-theme-switcher.h" #include "kgx-terminal.h" struct _KgxThemeSwitcher { GtkBin parent_instance; KgxTheme theme; GtkWidget *system_selector; GtkWidget *light_selector; GtkWidget *dark_selector; gboolean show_system; }; G_DEFINE_TYPE (KgxThemeSwitcher, kgx_theme_switcher, GTK_TYPE_BIN) enum { PROP_0, PROP_SHOW_SYSTEM, PROP_THEME, LAST_PROP }; static GParamSpec *pspecs[LAST_PROP] = { NULL, }; static void theme_radio_active_changed (KgxThemeSwitcher *self) { KgxTheme theme; if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->system_selector))) { theme = KGX_THEME_AUTO; } else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->light_selector))) { theme = KGX_THEME_DAY; } else { theme = KGX_THEME_NIGHT; } if (theme == self->theme) { return; } self->theme = theme; g_object_notify_by_pspec (G_OBJECT (self), pspecs[PROP_THEME]); } static void set_theme (KgxThemeSwitcher *self, KgxTheme theme) { if (self->theme == theme) return; switch (theme) { case KGX_THEME_AUTO: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->system_selector), TRUE); break; case KGX_THEME_DAY: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->light_selector), TRUE); break; case KGX_THEME_NIGHT: case KGX_THEME_HACKER: default: gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->dark_selector), TRUE); break; } self->theme = theme; g_object_notify_by_pspec (G_OBJECT (self), pspecs[PROP_THEME]); } static void kgx_theme_switcher_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { KgxThemeSwitcher *self = KGX_THEME_SWITCHER (object); switch (prop_id) { case PROP_THEME: g_value_set_enum (value, self->theme); break; case PROP_SHOW_SYSTEM: g_value_set_boolean (value, self->show_system); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void kgx_theme_switcher_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { KgxThemeSwitcher *self = KGX_THEME_SWITCHER (object); switch (prop_id) { case PROP_THEME: set_theme (self, g_value_get_enum (value)); break; case PROP_SHOW_SYSTEM: self->show_system = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } } static void kgx_theme_switcher_class_init (KgxThemeSwitcherClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); object_class->get_property = kgx_theme_switcher_get_property; object_class->set_property = kgx_theme_switcher_set_property; pspecs[PROP_THEME] = g_param_spec_enum ("theme", "Theme", "The selected theme.", KGX_TYPE_THEME, KGX_THEME_NIGHT, G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY); pspecs[PROP_SHOW_SYSTEM] = g_param_spec_boolean ("show-system", "Show System", "Whether to show the system setting", TRUE, G_PARAM_READWRITE); g_object_class_install_properties (object_class, LAST_PROP, pspecs); gtk_widget_class_set_template_from_resource (widget_class, KGX_APPLICATION_PATH "kgx-theme-switcher.ui"); gtk_widget_class_bind_template_child (widget_class, KgxThemeSwitcher, system_selector); gtk_widget_class_bind_template_child (widget_class, KgxThemeSwitcher, light_selector); gtk_widget_class_bind_template_child (widget_class, KgxThemeSwitcher, dark_selector); gtk_widget_class_bind_template_callback (widget_class, theme_radio_active_changed); gtk_widget_class_set_css_name (widget_class, "themeswitcher"); } static void kgx_theme_switcher_init (KgxThemeSwitcher *self) { self->show_system = TRUE; gtk_widget_init_template (GTK_WIDGET (self)); } gnome-console-42~beta/src/kgx-theme-switcher.h000066400000000000000000000016401420277463100215660ustar00rootroot00000000000000/* kgx-theme-switcher.h * * Copyright 2021 Purism SPC * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include G_BEGIN_DECLS #define KGX_TYPE_THEME_SWITCHER (kgx_theme_switcher_get_type()) G_DECLARE_FINAL_TYPE (KgxThemeSwitcher, kgx_theme_switcher, KGX, THEME_SWITCHER, GtkBin) G_END_DECLS gnome-console-42~beta/src/kgx-theme-switcher.ui000066400000000000000000000105141420277463100217540ustar00rootroot00000000000000 gnome-console-42~beta/src/kgx-window.c000066400000000000000000000526231420277463100201470ustar00rootroot00000000000000/* kgx-window.c * * Copyright 2019 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /** * SECTION:kgx-window * @title: KgxWindow * @short_description: Window * * The main #HdyApplicationWindow that acts as the terminal */ #include "kgx-config.h" #include #include #include #include #include "rgba.h" #include "kgx-window.h" #include "kgx-application.h" #include "kgx-process.h" #include "kgx-close-dialog.h" #include "kgx-pages.h" #include "kgx-tab-button.h" #include "kgx-tab-switcher.h" #include "kgx-theme-switcher.h" G_DEFINE_TYPE (KgxWindow, kgx_window, HDY_TYPE_APPLICATION_WINDOW) enum { PROP_0, PROP_APPLICATION, LAST_PROP }; static GParamSpec *pspecs[LAST_PROP] = { NULL, }; static void update_zoom (KgxWindow *self, KgxApplication *app) { g_autofree char *label = NULL; gdouble zoom; g_object_get (app, "font-scale", &zoom, NULL); label = g_strdup_printf ("%i%%", (int) round (zoom * 100)); gtk_label_set_label (GTK_LABEL (self->zoom_level), label); } static void zoomed (GObject *object, GParamSpec *pspec, gpointer data) { KgxWindow *self = KGX_WINDOW (data); update_zoom (self, KGX_APPLICATION (object)); } static void kgx_window_constructed (GObject *object) { KgxWindow *self = KGX_WINDOW (object); g_autoptr (GError) error = NULL; GtkApplication *application = NULL; HdyStyleManager *style_manager; G_OBJECT_CLASS (kgx_window_parent_class)->constructed (object); application = gtk_window_get_application (GTK_WINDOW (self)); style_manager = hdy_style_manager_get_default (); g_object_bind_property (application, "theme", self->pages, "theme", G_BINDING_SYNC_CREATE); g_object_bind_property (application, "theme", self->theme_switcher, "theme", G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL); g_object_bind_property (style_manager, "system-supports-color-schemes", self->theme_switcher, "show-system", G_BINDING_SYNC_CREATE); g_object_bind_property (application, "font", self->pages, "font", G_BINDING_SYNC_CREATE); g_object_bind_property (application, "font-scale", self->pages, "zoom", G_BINDING_SYNC_CREATE); g_object_bind_property (application, "scrollback-lines", self->pages, "scrollback-lines", G_BINDING_SYNC_CREATE); g_signal_connect_object (application, "notify::font-scale", G_CALLBACK (zoomed), self, 0); update_zoom (self, KGX_APPLICATION (application)); } static void kgx_window_dispose (GObject *object) { KgxWindow *self = KGX_WINDOW (object); g_clear_object (&self->tab_actions); G_OBJECT_CLASS (kgx_window_parent_class)->dispose (object); } static void kgx_window_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { KgxWindow *self = KGX_WINDOW (object); switch (property_id) { case PROP_APPLICATION: gtk_window_set_application (GTK_WINDOW (self), g_value_get_object (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void kgx_window_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { KgxWindow *self = KGX_WINDOW (object); switch (property_id) { case PROP_APPLICATION: g_value_set_object (value, gtk_window_get_application (GTK_WINDOW (self))); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; } } static void delete_response (GtkWidget *dlg, int response, KgxWindow *self) { gtk_widget_destroy (dlg); if (response == GTK_RESPONSE_OK) { self->close_anyway = TRUE; gtk_widget_destroy (GTK_WIDGET (self)); } } static gboolean kgx_window_delete_event (GtkWidget *widget, GdkEventAny *event) { KgxWindow *self = KGX_WINDOW (widget); GtkWidget *dlg; g_autoptr (GPtrArray) children = NULL; children = kgx_pages_get_children (KGX_PAGES (self->pages)); if (children->len < 1 || self->close_anyway) { return FALSE; // Aka no, I donโ€™t want to block closing } dlg = kgx_close_dialog_new (KGX_CONTEXT_WINDOW, children); gtk_window_set_transient_for (GTK_WINDOW (dlg), GTK_WINDOW (self)); g_signal_connect (dlg, "response", G_CALLBACK (delete_response), self); gtk_widget_show (dlg); return TRUE; // Block the close } static void active_changed (GObject *object, GParamSpec *pspec, gpointer data) { GtkApplication *app; app = gtk_window_get_application (GTK_WINDOW (object)); if (gtk_window_is_active (GTK_WINDOW (object))) { kgx_application_push_active (KGX_APPLICATION (app)); } else { kgx_application_pop_active (KGX_APPLICATION (app)); } } static gboolean key_press_event (GtkWidget *widget, GdkEventKey *event, KgxWindow *self) { GdkModifierType default_modifiers = gtk_accelerator_get_default_mod_mask (); guint keyval; GdkModifierType state; GdkModifierType consumed; GdkKeymap *keymap; gdk_event_get_state ((GdkEvent *) event, &state); keymap = gdk_keymap_get_for_display (gtk_widget_get_display (widget)); gdk_keymap_translate_keyboard_state (keymap, event->hardware_keycode, state, event->group, &keyval, NULL, NULL, &consumed); state &= ~consumed & default_modifiers; /* Override some shortcuts from HdyTabView:shortcut-widget back, as they are * needed for terminal apps. This should be fixed on libhandy side, but would * likely require API changes, so carry this for now. * * See https://gitlab.gnome.org/GNOME/libhandy/-/issues/422 */ if ((keyval == GDK_KEY_Page_Up || keyval == GDK_KEY_KP_Page_Up || keyval == GDK_KEY_Page_Down || keyval == GDK_KEY_KP_Page_Down || keyval == GDK_KEY_Home || keyval == GDK_KEY_KP_Home || keyval == GDK_KEY_End || keyval == GDK_KEY_KP_End) && (state == GDK_CONTROL_MASK || state == (GDK_CONTROL_MASK | GDK_SHIFT_MASK))) { return kgx_pages_key_press_event (KGX_PAGES (self->pages), (GdkEvent *) event); } return GDK_EVENT_PROPAGATE; } static void zoom (KgxPages *pages, KgxZoom dir, KgxWindow *self) { GAction *action = NULL; GtkApplication *app = gtk_window_get_application (GTK_WINDOW (self)); switch (dir) { case KGX_ZOOM_IN: action = g_action_map_lookup_action (G_ACTION_MAP (app), "zoom-in"); break; case KGX_ZOOM_OUT: action = g_action_map_lookup_action (G_ACTION_MAP (app), "zoom-out"); break; default: g_return_if_reached (); } g_action_activate (action, NULL); } static void status_changed (GObject *object, GParamSpec *pspec, gpointer data) { KgxWindow *self = KGX_WINDOW (object); GtkStyleContext *context; KgxStatus status; context = gtk_widget_get_style_context (GTK_WIDGET (self)); status = kgx_pages_current_status (KGX_PAGES (self->pages)); if (status & KGX_REMOTE) { gtk_style_context_add_class (context, KGX_WINDOW_STYLE_REMOTE); } else { gtk_style_context_remove_class (context, KGX_WINDOW_STYLE_REMOTE); } if (status & KGX_PRIVILEGED) { gtk_style_context_add_class (context, KGX_WINDOW_STYLE_ROOT); } else { gtk_style_context_remove_class (context, KGX_WINDOW_STYLE_ROOT); } } static void extra_drag_data_received (HdyTabBar *bar, HdyTabPage *page, GdkDragContext *context, GtkSelectionData *selection_data, guint info, guint time, KgxWindow *self) { KgxTab *tab = KGX_TAB (hdy_tab_page_get_child (page)); kgx_tab_accept_drop (tab, selection_data); } static void new_tab_activated (GSimpleAction *action, GVariant *parameter, gpointer data); static void new_tab_cb (KgxTabSwitcher *switcher, KgxWindow *self) { new_tab_activated (NULL, NULL, self); } static gboolean kgx_window_window_state_event (GtkWidget *widget, GdkEventWindowState *event) { KgxWindow *self = KGX_WINDOW (widget); self->is_maximized_or_tiled = (event->new_window_state & (GDK_WINDOW_STATE_FULLSCREEN | GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_TILED | GDK_WINDOW_STATE_TOP_TILED | GDK_WINDOW_STATE_RIGHT_TILED | GDK_WINDOW_STATE_BOTTOM_TILED | GDK_WINDOW_STATE_LEFT_TILED)) > 0; g_object_set (self->pages, "opaque", self->is_maximized_or_tiled, NULL); if (self->is_maximized_or_tiled) gtk_style_context_add_class (gtk_widget_get_style_context (widget), "opaque"); else gtk_style_context_remove_class (gtk_widget_get_style_context (widget), "opaque"); return GTK_WIDGET_CLASS (kgx_window_parent_class)->window_state_event (widget, event); } static void kgx_window_size_allocate (GtkWidget *widget, GtkAllocation *alloc) { KgxWindow *self = KGX_WINDOW (widget); GTK_WIDGET_CLASS (kgx_window_parent_class)->size_allocate (widget, alloc); if (!self->is_maximized_or_tiled) gtk_window_get_size (GTK_WINDOW (self), &self->current_width, &self->current_height); } static void kgx_window_class_init (KgxWindowClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); object_class->constructed = kgx_window_constructed; object_class->dispose = kgx_window_dispose; object_class->set_property = kgx_window_set_property; object_class->get_property = kgx_window_get_property; widget_class->delete_event = kgx_window_delete_event; widget_class->window_state_event = kgx_window_window_state_event; widget_class->size_allocate = kgx_window_size_allocate; /** * KgxWindow:application: * * Proxy for #GtkWindow #GtkWindow:application but with %G_PARAM_CONSTRUCT, * simple as that */ pspecs[PROP_APPLICATION] = g_param_spec_object ("application", "Application", "The application the window is part of", KGX_TYPE_APPLICATION, G_PARAM_READWRITE | G_PARAM_CONSTRUCT); g_object_class_install_properties (object_class, LAST_PROP, pspecs); gtk_widget_class_set_template_from_resource (widget_class, KGX_APPLICATION_PATH "kgx-window.ui"); gtk_widget_class_bind_template_child (widget_class, KgxWindow, header_bar); gtk_widget_class_bind_template_child (widget_class, KgxWindow, exit_info); gtk_widget_class_bind_template_child (widget_class, KgxWindow, exit_message); gtk_widget_class_bind_template_child (widget_class, KgxWindow, theme_switcher); gtk_widget_class_bind_template_child (widget_class, KgxWindow, zoom_level); gtk_widget_class_bind_template_child (widget_class, KgxWindow, tab_bar); gtk_widget_class_bind_template_child (widget_class, KgxWindow, tab_button); gtk_widget_class_bind_template_child (widget_class, KgxWindow, tab_switcher); gtk_widget_class_bind_template_child (widget_class, KgxWindow, pages); gtk_widget_class_bind_template_callback (widget_class, active_changed); gtk_widget_class_bind_template_callback (widget_class, key_press_event); gtk_widget_class_bind_template_callback (widget_class, zoom); gtk_widget_class_bind_template_callback (widget_class, status_changed); gtk_widget_class_bind_template_callback (widget_class, extra_drag_data_received); gtk_widget_class_bind_template_callback (widget_class, new_tab_cb); } static void new_activated (GSimpleAction *action, GVariant *parameter, gpointer data) { KgxWindow *self = data; guint32 timestamp = GDK_CURRENT_TIME; GtkApplication *application = NULL; g_autoptr (GFile) dir = NULL; application = gtk_window_get_application (GTK_WINDOW (self)); dir = kgx_window_get_working_dir (KGX_WINDOW (data)); kgx_application_add_terminal (KGX_APPLICATION (application), NULL, timestamp, dir, NULL, NULL); } static void new_tab_activated (GSimpleAction *action, GVariant *parameter, gpointer data) { KgxWindow *self = data; guint32 timestamp = GDK_CURRENT_TIME; GtkApplication *application = NULL; g_autoptr (GFile) dir = NULL; application = gtk_window_get_application (GTK_WINDOW (self)); dir = kgx_window_get_working_dir (KGX_WINDOW (data)); kgx_application_add_terminal (KGX_APPLICATION (application), self, timestamp, dir, NULL, NULL); } static void close_tab_activated (GSimpleAction *action, GVariant *parameter, gpointer data) { KgxWindow *self = data; kgx_pages_close_page (KGX_PAGES (self->pages)); } static void detach_tab_activated (GSimpleAction *action, GVariant *parameter, gpointer data) { KgxWindow *self = data; kgx_pages_detach_page (KGX_PAGES (self->pages)); } static void about_activated (GSimpleAction *action, GVariant *parameter, gpointer data) { const char *authors[] = { "Zander Brown ", NULL }; const char *artists[] = { "Tobias Bernard", NULL }; g_autofree char *copyright = NULL; /* Translators: %s is the year range */ copyright = g_strdup_printf (_("ยฉ %s Zander Brown"), "2019-2021"); gtk_show_about_dialog (GTK_WINDOW (data), "authors", authors, "artists", artists, /* Translators: Credit yourself here */ "translator-credits", _("translator-credits"), "copyright", copyright, "license-type", GTK_LICENSE_GPL_3_0, "logo-icon-name", KGX_APPLICATION_ID, "program-name", KGX_DISPLAY_NAME, "version", PACKAGE_VERSION, NULL); } static void tab_switcher_activated (GSimpleAction *action, GVariant *parameter, gpointer data) { KgxWindow *self = data; kgx_tab_switcher_open (KGX_TAB_SWITCHER (self->tab_switcher)); } static GActionEntry win_entries[] = { { "new-window", new_activated, NULL, NULL, NULL }, { "new-tab", new_tab_activated, NULL, NULL, NULL }, { "close-tab", close_tab_activated, NULL, NULL, NULL }, { "about", about_activated, NULL, NULL, NULL }, { "tab-switcher", tab_switcher_activated, NULL, NULL, NULL }, }; static GActionEntry tab_entries[] = { { "close", close_tab_activated, NULL, NULL, NULL }, { "detach", detach_tab_activated, NULL, NULL, NULL }, }; static gboolean update_title (GBinding *binding, const GValue *from_value, GValue *to_value, gpointer data) { const char *title = g_value_get_string (from_value); if (!title) { title = KGX_DISPLAY_NAME; } g_value_set_string (to_value, title); return TRUE; } static gboolean update_subtitle (GBinding *binding, const GValue *from_value, GValue *to_value, gpointer data) { g_autoptr (GFile) file = NULL; g_autofree char *path = NULL; const char *home = NULL; file = g_value_dup_object (from_value); if (file == NULL) { g_value_set_string (to_value, NULL); return TRUE; } path = g_file_get_path (file); if (path == NULL) { g_value_set_string (to_value, NULL); return TRUE; } home = g_get_home_dir (); if (g_str_has_prefix (path, home)) { g_autofree char *short_home = g_strdup_printf ("~%s", path + strlen (home)); g_value_set_string (to_value, short_home); return TRUE; } g_value_set_string (to_value, path); return TRUE; } static void kgx_window_init (KgxWindow *self) { g_autoptr (GtkWindowGroup) group = NULL; g_autoptr (GtkTargetList) target_list = NULL; g_autoptr (GPropertyAction) pact = NULL; #ifdef IS_DEVEL GtkStyleContext *context; #endif g_type_ensure (KGX_TYPE_TAB_BUTTON); g_type_ensure (KGX_TYPE_TAB_SWITCHER); g_type_ensure (KGX_TYPE_THEME_SWITCHER); gtk_widget_init_template (GTK_WIDGET (self)); g_action_map_add_action_entries (G_ACTION_MAP (self), win_entries, G_N_ELEMENTS (win_entries), self); pact = g_property_action_new ("find", G_OBJECT (self->pages), "search-mode-enabled"); g_action_map_add_action (G_ACTION_MAP (self), G_ACTION (pact)); #ifdef IS_DEVEL context = gtk_widget_get_style_context (GTK_WIDGET (self)); gtk_style_context_add_class (context, "devel"); #endif g_object_bind_property_full (self->pages, "title", self, "title", G_BINDING_SYNC_CREATE, update_title, NULL, NULL, NULL); g_object_bind_property (self, "title", self->header_bar, "title", G_BINDING_SYNC_CREATE); g_object_bind_property_full (self->pages, "path", self->header_bar, "subtitle", G_BINDING_SYNC_CREATE, update_subtitle, NULL, NULL, NULL); g_object_bind_property (self->pages, "tab-view", self->tab_bar, "view", G_BINDING_SYNC_CREATE); g_object_bind_property (self->pages, "tab-view", self->tab_button, "view", G_BINDING_SYNC_CREATE); g_object_bind_property (self->pages, "tab-view", self->tab_switcher, "view", G_BINDING_SYNC_CREATE); target_list = gtk_target_list_new (NULL, 0); gtk_target_list_add_text_targets (target_list, 0); hdy_tab_bar_set_extra_drag_dest_targets (HDY_TAB_BAR (self->tab_bar), target_list); group = gtk_window_group_new (); gtk_window_group_add_window (group, GTK_WINDOW (self)); kgx_pages_set_shortcut_widget (KGX_PAGES (self->pages), GTK_WIDGET (self)); self->tab_actions = G_ACTION_MAP (g_simple_action_group_new ()); g_action_map_add_action_entries (self->tab_actions, tab_entries, G_N_ELEMENTS (tab_entries), self); gtk_widget_insert_action_group (GTK_WIDGET (self), "tab", G_ACTION_GROUP (self->tab_actions)); } /** * kgx_window_get_working_dir: * @self: the #KgxWindow * * Get the working directory path of this window, used to open new windows * in the same directory */ GFile * kgx_window_get_working_dir (KgxWindow *self) { GFile *file = NULL; g_return_val_if_fail (KGX_IS_WINDOW (self), NULL); g_object_get (self->pages, "path", &file, NULL); return file; } /** * kgx_window_get_pages: * @self: the #KgxWindow * * Get the tabbed widget inside @self */ KgxPages * kgx_window_get_pages (KgxWindow *self) { g_return_val_if_fail (KGX_IS_WINDOW (self), NULL); return KGX_PAGES (self->pages); } void kgx_window_get_size (KgxWindow *self, int *width, int *height) { g_return_if_fail (KGX_IS_WINDOW (self)); if (width) *width = self->current_width; if (height) *height = self->current_height; } gnome-console-42~beta/src/kgx-window.h000066400000000000000000000072011420277463100201440ustar00rootroot00000000000000/* kgx-window.h * * Copyright 2019 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #pragma once #include #include "handy.h" #include "kgx-terminal.h" #include "kgx-process.h" #include "kgx-enums.h" #include "kgx-pages.h" G_BEGIN_DECLS #define KGX_WINDOW_STYLE_ROOT "root" #define KGX_WINDOW_STYLE_REMOTE "remote" /** * KgxZoom: * @KGX_ZOOM_IN: Make text bigger * @KGX_ZOOM_OUT: Shrink text * * Indicates the zoom direction the zoom action was triggered for * * See #KgxPage:zoom, #KgxPages:zoom * * Stability: Private */ typedef enum /*< enum,prefix=KGX >*/ { KGX_ZOOM_IN = 0, /*< nick=in >*/ KGX_ZOOM_OUT = 1, /*< nick=out >*/ } KgxZoom; #define KGX_TYPE_WINDOW (kgx_window_get_type()) /** * KgxWindow: * @theme: the palette * @working_dir: the working directory of the #KgxTerminal * @command: the command to run, %NULL for default shell * @close_on_zero: should the window close when the command exits with 0 * @last_cols: the column width last time we received #GtkWidget::size-allocate * @last_rows: the row count last time we received #GtkWidget::size-allocate * @timeout: the id of the #GSource used to hide the statusbar * @close_anyway: ignore running children and close without prompt * @header_bar: the #HdyHeaderBar that the styles are applied to * @search_entry: the #GtkSearchEntry inside @search_bar * @search_bar: the windows #GtkSearchBar * @exit_info: the #GtkRevealer hat wraps @exit_message * @exit_message: the #GtkLabel for showing important messages * @zoom_level: the #GtkLabel in the #GtkPopover showing the current zoom level * @pages: the #KgxPages of #KgxPage current in the window * @about_item: the #GtkModelButton for the about item */ struct _KgxWindow { /*< private >*/ HdyApplicationWindow parent_instance; /*< public >*/ KgxTheme theme; /* Size indicator */ int last_cols; int last_rows; guint timeout; gboolean close_anyway; /* Template widgets */ GtkWidget *header_bar; GtkWidget *exit_info; GtkWidget *exit_message; GtkWidget *theme_switcher; GtkWidget *zoom_level; GtkWidget *about_item; GtkWidget *tab_bar; GtkWidget *tab_button; GtkWidget *tab_switcher; GtkWidget *pages; int current_width; int current_height; gboolean is_maximized_or_tiled; GActionMap *tab_actions; }; G_DECLARE_FINAL_TYPE (KgxWindow, kgx_window, KGX, WINDOW, HdyApplicationWindow) GFile *kgx_window_get_working_dir (KgxWindow *self); void kgx_window_show_status (KgxWindow *self, const char *status); KgxPages *kgx_window_get_pages (KgxWindow *self); void kgx_window_get_size (KgxWindow *self, int *width, int *height); G_END_DECLS gnome-console-42~beta/src/kgx-window.ui000066400000000000000000000236771420277463100203510ustar00rootroot00000000000000 True 10 vertical True 12 True horizontal 6 True True app.zoom-out Shrink Text True zoom-out-symbolic True app.zoom-normal Reset Size True 5 True app.zoom-in Enlarge Text True zoom-in-symbolic True True _New Window win.new-window True True _Keyboard Shortcuts win.show-help-overlay True _About Console About this Program win.about gnome-console-42~beta/src/kgx.gresource.xml.in000066400000000000000000000032121420277463100216100ustar00rootroot00000000000000 kgx-window.ui kgx-close-dialog.ui kgx-pages.ui kgx-tab.ui kgx-tab-button.ui kgx-tab-switcher.ui kgx-tab-switcher-row.ui kgx-theme-switcher.ui kgx-simple-tab.ui styles-light.css styles-dark.css styles-hc.css styles-hc-dark.css logo.txt icons/scalable/status/status-privileged-symbolic.svg icons/scalable/status/status-regular-symbolic.svg icons/scalable/status/status-remote-symbolic.svg icons/scalable/status/tab-counter-symbolic.svg icons/scalable/status/tab-overflow-symbolic.svg icons/scalable/status/tab-switcher-collapse-symbolic.svg icons/scalable/status/theme-check-symbolic.svg menus.ui help-overlay.ui gnome-console-42~beta/src/kgx.h000066400000000000000000000016261420277463100166440ustar00rootroot00000000000000/* kgx.h * * Copyright 2019 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "kgx-config.h" #include "kgx-application.h" #include "kgx-window.h" #include "kgx-terminal.h" #include "kgx-enums.h" #include "kgx-process.h" #include "kgx-pages.h" #include "kgx-tab.h" #include "fp-vte-util.h" gnome-console-42~beta/src/logo.txt000066400000000000000000000172431420277463100174050ustar00rootroot00000000000000                                      โ–‚โ–ƒโ–„โ–…โ–…โ–…โ–…โ–„โ–ƒโ–‚                โ–‚โ–…โ•ด          โ•ดโ–…โ–‚           โ–—โ–˜โ”Š โ”Šโ–‚โŽฝโ–ƒโ–„โ–„โ–„โ–„โ–ƒโ–‚โ–‚โ”Š โ”Šโ–         โ–—โ•ด  โ•ดโ–„โ–†        โ–†โ–„โ––  โ•ดโ––     โ–†โ–†โ–†โ–†โ–†โ–†โ–†โ–†โ–†โ–†โ–†โ–†โ–†โ–†โ–†โ–†โ–†โ–†โ–†โ–†โ–†โ–†โ–†โ–†โ–†โ–†  โ–‰ โ–โ”โ–„โ”Š                     โ– โ–‰ โ–ชโ–„โ–†โ”Šโ–—โ–„โ–„โ–„                 โ–  โ–‚โ–ƒโ–ƒโ–‚โ–‚โ–‚โ–ƒโ–ƒโ–ƒโ–ƒโ–ƒโ–ƒโ–ƒโ–ƒโ–ƒโ–ƒโ–ƒโ–ƒโ–ƒโ–ƒโ–‚โ–‚โ–‚โ–ƒโ–ƒโ–ƒ     โ–Œโ”Š  โ–โ–‚          โ–—โ–˜โ”Š โ•ดโ–Œ        โ–„โ––โ”Š โ”Šโ–†โ–„โ–‚โŽฝ  โŽฝโ–‚โ–„โ–†โ”Š โ”Šโ–—โ–„          โ–โ–ƒโ–‚โ”Š          โ”Šโ–‚โ–ƒโ–˜              โ–…โ–ƒโ–‚โ–‚โ–ƒโ–ƒโ–ƒโ–ƒโ–‚โ–ƒโ–ƒโ–…                                      gnome-console-42~beta/src/main.c000066400000000000000000000030011420277463100167570ustar00rootroot00000000000000/* main.c * * Copyright 2019-2021 Zander Brown * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include int main (int argc, char *argv[]) { g_autoptr (GtkApplication) app = NULL; /* Set up gettext translations */ bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); textdomain (GETTEXT_PACKAGE); g_set_application_name (KGX_DISPLAY_NAME); gtk_window_set_default_icon_name (KGX_APPLICATION_ID); app = g_object_new (KGX_TYPE_APPLICATION, "application_id", KGX_APPLICATION_ID, "flags", G_APPLICATION_HANDLES_COMMAND_LINE | G_APPLICATION_HANDLES_OPEN | G_APPLICATION_CAN_OVERRIDE_APP_ID, "register-session", TRUE, NULL); return g_application_run (G_APPLICATION (app), argc, argv); } gnome-console-42~beta/src/menus.ui000066400000000000000000000030561420277463100173670ustar00rootroot00000000000000
_Open Link term.open-link action-disabled Copy _Link term.copy-link action-disabled
_Copy term.copy action-disabled _Paste term.paste action-disabled _Select All term.select-all action-disabled
Show in _Files term.show-in-files action-disabled
gnome-console-42~beta/src/meson.build000066400000000000000000000042471420277463100200460ustar00rootroot00000000000000subdir('styles') kgx_sources = [ 'kgx-application.c', 'kgx-application.h', 'fp-vte-util.c', 'fp-vte-util.h', 'kgx-terminal.c', 'kgx-terminal.h', 'kgx-tab.c', 'kgx-tab.h', 'kgx-tab-button.c', 'kgx-tab-button.h', 'kgx-tab-switcher.c', 'kgx-tab-switcher.h', 'kgx-tab-switcher-row.c', 'kgx-tab-switcher-row.h', 'kgx-theme-switcher.c', 'kgx-theme-switcher.h', 'kgx-simple-tab.c', 'kgx-simple-tab.h', 'kgx-pages.c', 'kgx-pages.h', 'kgx-proxy-info.c', 'kgx-proxy-info.h', 'kgx-close-dialog.c', 'kgx-close-dialog.h', 'kgx-window.c', 'kgx-window.h', 'kgx-process.c', 'kgx-process.h', ] kgx_deps = [ dependency('gio-2.0', version: '>= 2.66'), dependency('gtk+-3.0', version: '>= 3.24'), dependency('libhandy-1', version: '>= 1.5', fallback: ['handy', 'libhandy_dep']), dependency('vte-2.91', version: '>= 0.67', fallback: ['vte', 'libvte_gtk3_dep']), dependency('libgtop-2.0'), dependency('gsettings-desktop-schemas'), cc.find_library('m', required: false), ] kgx_sources += config_h resources_file = configure_file( input: 'kgx.gresource.xml.in', output: 'kgx.gresource.xml', configuration: conf ) kgx_sources += gnome.compile_resources('kgx-resources', resources_file, c_name: 'kgx', dependencies: style_deps ) kgx_enums = gnome.mkenums_simple('kgx-enums', sources: [ 'kgx-close-dialog.h', 'kgx-terminal.h', 'kgx-window.h', 'kgx-tab.h' ]) kgx_lib = static_library (bin_name, kgx_sources + kgx_enums, dependencies: kgx_deps, ) kgx_inc = include_directories('.') kgx_dep = declare_dependency (sources: [config_h, kgx_enums], include_directories: kgx_inc, link_with: kgx_lib, dependencies: kgx_deps) executable( bin_name, 'main.c', dependencies: kgx_dep, install: true, install_rpath: pkglibdir, ) gnome-console-42~beta/src/rgba.h000066400000000000000000000036271420277463100167710ustar00rootroot00000000000000/** * SECTION:rgba * @title: RGBA * @short_description: #GdkRGBA utils * @include: rgba.h * @author: chergert * * https://gist.github.com/chergert/acc7f41c4d5a45ba254188bb19764f72 */ #pragma once #include # define _GDK_RGBA_DECODE(c) ((unsigned)((c >= 'A' && c <= 'F') ? (c-'A'+10) : (c >= 'a' && c <= 'f') ? (c-'a'+10) : (c >= '0' && c <= '9') ? (c-'0') : -1)) # define _GDK_RGBA_HIGH(c) (_GDK_RGBA_DECODE(c) << 4) # define _GDK_RGBA_LOW(c) _GDK_RGBA_DECODE(c) # define _GDK_RGBA(r,g,b,a) ((GdkRGBA){(r)/255.,(g)/255.,(b)/255.,(a)/255.}) # define _GDK_RGBA8(str) \ _GDK_RGBA(_GDK_RGBA_HIGH(str[0]) | _GDK_RGBA_LOW(str[1]), \ _GDK_RGBA_HIGH(str[2]) | _GDK_RGBA_LOW(str[3]), \ _GDK_RGBA_HIGH(str[4]) | _GDK_RGBA_LOW(str[5]), \ _GDK_RGBA_HIGH(str[6]) | _GDK_RGBA_LOW(str[7])) # define _GDK_RGBA6(str) \ _GDK_RGBA(_GDK_RGBA_HIGH(str[0]) | _GDK_RGBA_LOW(str[1]), \ _GDK_RGBA_HIGH(str[2]) | _GDK_RGBA_LOW(str[3]), \ _GDK_RGBA_HIGH(str[4]) | _GDK_RGBA_LOW(str[5]), \ 0xFF) # define _GDK_RGBA4(str) \ _GDK_RGBA(_GDK_RGBA_HIGH(str[0]) | _GDK_RGBA_LOW(str[0]), \ _GDK_RGBA_HIGH(str[1]) | _GDK_RGBA_LOW(str[1]), \ _GDK_RGBA_HIGH(str[2]) | _GDK_RGBA_LOW(str[2]), \ _GDK_RGBA_HIGH(str[3]) | _GDK_RGBA_LOW(str[3])) # define _GDK_RGBA3(str) \ _GDK_RGBA(_GDK_RGBA_HIGH(str[0]) | _GDK_RGBA_LOW(str[0]), \ _GDK_RGBA_HIGH(str[1]) | _GDK_RGBA_LOW(str[1]), \ _GDK_RGBA_HIGH(str[2]) | _GDK_RGBA_LOW(str[2]), \ 0xFF) /** * GDK_RGBA: * @str: Hex string * * Compile time parsing of hex encoded colours */ # define GDK_RGBA(str) ((sizeof(str) == 9) ? _GDK_RGBA8(str) : \ (sizeof(str) == 7) ? _GDK_RGBA6(str) : \ (sizeof(str) == 5) ? _GDK_RGBA4(str) : \ (sizeof(str) == 4) ? _GDK_RGBA3(str) : \ ((GdkRGBA){0,0,0,0})) gnome-console-42~beta/src/styles/000077500000000000000000000000001420277463100172205ustar00rootroot00000000000000gnome-console-42~beta/src/styles/_definitions.scss000066400000000000000000000023321420277463100225670ustar00rootroot00000000000000/* Copy of Adwaita colors for _drawing.scss */ $base_color: if($variant == 'light', #ffffff, lighten(desaturate(#241f31, 100%), 2%)); $fg_color: if($variant == 'light', #2e3436, #eeeeec); $bg_color: if($variant == 'light', #f6f5f4, darken(desaturate(#3d3846, 100%), 4%)); $selected_bg_color: if($variant == 'light', #3584e4, darken(#3584e4, 20%)); $borders_color: if($variant == 'light', darken($bg_color, 18%), darken($bg_color, 10%)); $borders_edge: if($variant == 'light', transparentize(white, 0.2), transparentize($fg_color, 0.07)); $backdrop_borders_color: mix($borders_color, $bg_color, 80%); $shadow_color: transparentize(black, 0.9); $top_hilight: $borders_edge; $drop_target_color: #4e9a06; @if $high_contrast { $fg_color: if($variant == 'light', darken($fg_color, 3%), lighten($fg_color, 2%)); $bg_color: if($variant == 'light', lighten($bg_color, 3%), darken($bg_color, 2%)); $selected_bg_color: darken($selected_bg_color,10%); $borders_color: if($variant == 'light', darken($borders_color, 30%), lighten($borders_color, 30%)); } $backdrop_transition: 200ms ease-out; /* Helpers */ @function themecolor($s) { @return unquote("@" + "#{$s}"); } @function gtkalpha($c,$a) { @return unquote("alpha(#{$c},#{$a})"); } gnome-console-42~beta/src/styles/_drawing.scss000066400000000000000000000451111420277463100217110ustar00rootroot00000000000000// Drawing mixins // generic drawing of more complex things @function _widget_edge($c:$borders_edge) { // outer highlight "used" on most widgets @if $c == none { @return none; } @else { @return 0 1px $c; } } @mixin _shadows($list...) { // // Helper mixin to stack up to box-shadows; // $shadows: null; @each $shadow in $list { @if $shadow!=none { $shadows: $shadows, $shadow; } } box-shadow: $shadows; } // entries @function entry_focus_border($fc:$selected_bg_color) { @if $variant == 'light' { @return $fc; } @else { @return if($fc==$selected_bg_color, $selected_borders_color, darken($fc, 35%)); } } @function entry_focus_shadow($fc:$selected_bg_color) { @return inset 0 0 0 1px $fc; } @mixin entry($t, $fc:$selected_bg_color, $edge: none) { // // Entries drawing function // // $t: entry type // $fc: focus color // $edge: set to none to not draw the bottom edge or specify a color to not // use the default one // // possible $t values: // normal, focus, insensitive, backdrop, backdrop-insensitive, osd, osd-focus, osd-backdrop; // $_blank_edge: if($edge == none, none, 0 1px transparentize($edge, 1)); $_entry_edge: if($edge == none, none, _widget_edge($edge)); @if $t==normal { color: $text_color; border-color: $borders_color; background-color: $base_color; @include _shadows(entry_focus_shadow(transparentize($fc, 1)), $_entry_edge); // for the transition to work the number of shadows in different states needs to match, hence the transparent shadow here. } @if $t==focus { @include _shadows(entry_focus_shadow($fc), $_entry_edge); border-color: entry_focus_border($fc); } @if $t==insensitive { color: $insensitive_fg_color; border-color: $borders_color; background-color: $insensitive_bg_color; box-shadow: $_entry_edge; } @if $t==backdrop { color: $backdrop_text_color; border-color: $backdrop_borders_color; background-color: $backdrop_base_color; box-shadow: $_blank_edge; } @if $t==backdrop-insensitive { color: $backdrop_insensitive_color; border-color: $backdrop_borders_color; background-color: $insensitive_bg_color; box-shadow: $_blank_edge; } @if $t==osd { color: $osd_text_color; border-color: $osd_borders_color; background-color: transparentize(opacify($osd_borders_color, 1), 0.5); background-clip: padding-box; box-shadow: none; text-shadow: 0 1px black; -gtk-icon-shadow: 0 1px black; } @if $t==osd-focus { color: $osd_text_color; border-color: $selected_bg_color; background-color: transparentize(opacify($osd_borders_color, 1), 0.5); background-clip: padding-box; box-shadow: entry_focus_shadow($fc); text-shadow: 0 1px black; -gtk-icon-shadow: 0 1px black; } @if $t==osd-insensitive { color: $osd_insensitive_fg_color; border-color: $osd_borders_color; background-color: $osd_insensitive_bg_color; background-clip: padding-box; box-shadow: none; text-shadow: none; -gtk-icon-shadow: none; } @if $t==osd-backdrop { color: $osd_text_color; border-color: $osd_borders_color; background-color: transparentize(opacify($osd_borders_color, 1), 0.5); background-clip: padding-box; box-shadow: none; text-shadow: none; -gtk-icon-shadow: none; } } // buttons @function _border_color($c, $darker: false) { @if $darker == true { @return darken($c, 20%); } @else { @return darken($c, 10%); } } @function _text_shadow_color ($tc: $fg_color, $bg: $bg_color) { // // calculate the color of text shadows // // $tc is the text color // $bg is the background color // $_lbg: lightness($bg)/100%; @if lightness($tc)<50% { @return transparentize(white, 1-$_lbg/($_lbg*1.3)); } @else { @return transparentize(black, $_lbg*0.8); } } @function _button_hilight_color($c) { // // calculate the right top hilight color for buttons // // $c: base color; // @if lightness($c)>95% { @return white; } @else if lightness($c)>90% { @return transparentize(white, 0.2); } @else if lightness($c)>80% { @return transparentize(white, 0.5); } @else if lightness($c)>50% { @return transparentize(white, 0.8); } @else if lightness($c)>40% { @return transparentize(white, 0.9); } @else { @return transparentize(white, 0.98); } } @mixin _button_text_shadow ($tc:$fg_color, $bg:$bg_color) { // // helper function for the text emboss effect // // $tc is the optional text color, not the shadow color // // TODO: this functions needs a way to deal with special cases // $_shadow: _text_shadow_color($tc, $bg); @if lightness($tc)<50% { text-shadow: 0 1px $_shadow; -gtk-icon-shadow: 0 1px $_shadow; } @else { text-shadow: 0 -1px $_shadow; -gtk-icon-shadow: 0 -1px $_shadow; } } @mixin button($t, $c:$bg_color, $tc:$fg_color, $edge: none, $backimage: null) { // // Button drawing function // // $t: button type, // $c: base button color for colored* types // $tc: optional text color for colored* types // $edge: set to none to not draw the bottom edge or specify a color to not // use the default one // $backimage: additional background-image behind the default one // (for the button.circular hack) // // possible $t values: // normal, hover, active, insensitive, insensitive-active, // backdrop, backdrop-active, backdrop-insensitive, backdrop-insensitive-active, // osd, osd-hover, osd-active, osd-insensitive, osd-backdrop, undecorated // $_hilight_color: _button_hilight_color($c); $_button_edge: if($edge == none, none, _widget_edge($edge)); $_blank_edge: if($edge == none, none, _widget_edge(transparentize($edge,1))); $_button_shadow: 0 1px 2px transparentize($shadow_color, 0.03); @if $t==normal { // // normal button // color: $tc; outline-color: transparentize($tc, 0.7); border-color: if($c != $bg_color, _border_color($c), $borders_color); border-bottom-color: if($c != $bg_color, _border_color($c, true), $alt_borders_color); background-image: if($variant == 'light', linear-gradient(to top, darken($c, 4%) 2px, $c), linear-gradient(to top, darken($c,1%) 2px, $c)), $backimage; @include _button_text_shadow($tc, $c); @include _shadows(inset 0 1px $_hilight_color, $_button_edge, $_button_shadow); } @else if $t==hover { // // hovered button // color: $tc; outline-color: transparentize($tc, 0.7); border-color: if($c != $bg_color, _border_color($c), $borders_color); border-bottom-color: if($c != $bg_color, _border_color($c, true), $alt_borders_color); @if $variant == 'light' { background-image: linear-gradient(to top, $c, lighten($c, 1%) 1px), $backimage; @include _button_text_shadow($tc, lighten($c, 6%)); @include _shadows(inset 0 1px _button_hilight_color(lighten($c, 6%)), $_button_edge, $_button_shadow); } @else { background-image: linear-gradient(to top, darken($c,1%), lighten($c, 1%) 1px), $backimage; @include _button_text_shadow($tc,lighten($c, 6%)); @include _shadows(inset 0 1px _button_hilight_color(darken($c, 2%)), $_button_edge, $_button_shadow); } } @if $t==normal-alt { // // normal button alternative look // color: $tc; outline-color: transparentize($tc, 0.7); border-color: if($c != $bg_color, _border_color($c, true), $alt_borders_color); @include _button_text_shadow($tc, $c); @if $variant == 'light' { background-image: linear-gradient(to bottom, lighten($c, 5%) 20%, $c 90%); @include _shadows(inset 0 1px _button_hilight_color(lighten($c, 6%)), $_button_edge, $_button_shadow); } @else { background-image: linear-gradient(to bottom, darken($c, 3%) 20%, darken($c, 6%) 90%); @include _shadows(inset 0 1px $_hilight_color, $_button_edge, $_button_shadow); } } @else if $t==hover-alt { // // hovered button alternative look // color: $tc; outline-color: transparentize($tc, 0.7); border-color: if($c != $bg_color, _border_color($c, true), $alt_borders_color); @if $variant == 'light' { background-image: linear-gradient(to bottom, lighten($c, 9%) 10%, lighten($c, 4%) 90%); @include _shadows(inset 0 1px _button_hilight_color(lighten($c, 6%)), $_button_edge, $_button_shadow); } @else { background-image: linear-gradient(to bottom, $c 20%, darken($c, 4%) 90%); @include _shadows(inset 0 1px $_hilight_color, $_button_edge, $_button_shadow); } } @else if $t==active { // // pushed button // color: $tc; outline-color: transparentize($tc, 0.7); border-color: if($c != $bg_color, _border_color($c), $borders_color); background-image: if($variant == 'light', image(darken($c, 14%)), image(darken($c, 9%))); @include _shadows(inset 0 1px transparentize($_hilight_color, 1), $_button_edge); text-shadow: none; -gtk-icon-shadow: none; } @else if $t==insensitive { // // insensitive button // $_bg: if($c != $bg_color, mix($c, $base_color, 85%), $insensitive_bg_color); color: if($tc != $fg_color, mix($tc, $_bg, 50%), $insensitive_fg_color); border-color: if($c != $bg_color, _border_color($c), $insensitive_borders_color); background-image: image($_bg); text-shadow: none; -gtk-icon-shadow: none; // white with 0 alpha to avoid an ugly transition, since no color means // black with 0 alpha @include _shadows(inset 0 1px transparentize(white, 1), $_button_edge); } @else if $t==insensitive-active { // // insensitive pushed button // $_bg: if($variant == 'light', darken(mix($c, $base_color, 85%), 8%), darken(mix($c, $base_color, 85%), 6%)); $_bc: if($c != $bg_color, _border_color($c), $insensitive_borders_color); color: if($c != $bg_color, mix($tc, $_bg, 60%), $insensitive_fg_color); border-color: $_bc; background-image: image($_bg); // white with 0 alpha to avoid an ugly transition, since no color means // black with 0 alpha @include _shadows(inset 0 1px transparentize(white, 1), $_button_edge); } @else if $t==backdrop { // // backdrop button // $_bg: if($c != $bg_color, $c, $backdrop_bg_color); $_bc: if($variant == 'light', $c, _border_color($c)); color: if($tc != $fg_color, mix($tc, $_bg, 80%), $backdrop_fg_color); border-color: if($c != $bg_color, $_bc, $backdrop_borders_color); background-image: image($_bg); text-shadow: none; -gtk-icon-shadow: none; @include _shadows(inset 0 1px transparentize(white, 1), $_blank_edge); } @else if $t==backdrop-active { // // backdrop pushed button // $_bg: if($variant == 'light', darken(mix($c, $base_color, 85%), 8%), darken(mix($c, $base_color, 85%), 4%)); $_bc: if($variant == 'light', $_bg ,_border_color($c)); color: if($tc != $fg_color, mix($tc, $_bg, 80%), $backdrop_fg_color); border-color: if($c != $bg_color, $_bc, $backdrop_borders_color); background-image: image($_bg); @include _shadows(inset 0 1px transparentize(white, 1), $_blank_edge); } @else if $t==backdrop-insensitive { // // backdrop insensitive button // $_bg: if($c != $bg_color, mix($c, $base_color, 85%), $insensitive_bg_color); $_bc: if($variant == 'light', $_bg,_border_color($c)); color: if($c != $bg_color, mix($tc, $_bg, 35%), $backdrop_insensitive_color); border-color: if($c != $bg_color, $_bc, $backdrop_borders_color); background-image: image($_bg); text-shadow: none; -gtk-icon-shadow: none; // white with 0 alpha to avoid an ugly transition, since no color means // black with 0 alpha @include _shadows(inset 0 1px transparentize(white, 1), $_blank_edge); } @else if $t==backdrop-insensitive-active { // // backdrop insensitive pushed button // $_bg: if($variant == 'light', darken(mix($c, $base_color, 85%), 8%), darken(mix($c, $base_color, 85%), 4%)); $_bc: if($variant == 'light', $_bg, _border_color($c)); color: if($c != $bg_color, mix($tc, $_bg, 35%), $backdrop_insensitive_color); border-color: if($c != $bg_color, $_bc, $backdrop_borders_color); background-image: image($_bg); @include _shadows(inset 0 1px transparentize(white, 1), $_blank_edge); } @else if $t==osd { // // normal osd button // $_bg: if($c != $bg_color, transparentize($c, 0.5), $osd_bg_color); color: $osd_fg_color; border-color: $osd_borders_color; background-color: transparent; background-image: image($_bg); background-clip: padding-box; box-shadow: inset 0 1px transparentize(white, 0.9); text-shadow: 0 1px black; -gtk-icon-shadow: 0 1px black; outline-color: transparentize($osd_fg_color, 0.7); } @else if $t==osd-hover { // // active osd button // $_bg: if($c != $bg_color, transparentize($c, 0.3), lighten($osd_bg_color, 12%)); color: white; border-color: $osd_borders_color; background-color: transparent; background-image: image($_bg); background-clip: padding-box; box-shadow: inset 0 1px transparentize(white, 0.9); text-shadow: 0 1px black; -gtk-icon-shadow: 0 1px black; outline-color: transparentize($osd_fg_color, 0.7); } @else if $t==osd-active { // // active osd button // $_bg: if($c != $bg_color, $c, $osd_borders_color); color: white; border-color: $osd_borders_color; background-color: transparent; background-image: image($_bg); background-clip: padding-box; box-shadow: none; text-shadow: none; -gtk-icon-shadow: none; outline-color: transparentize($osd_fg_color, 0.7); } @else if $t==osd-insensitive { // // insensitive osd button // color: $osd_insensitive_fg_color; border-color: $osd_borders_color; background-color: transparent; background-image: image($osd_insensitive_bg_color); background-clip: padding-box; box-shadow: none; text-shadow: none; -gtk-icon-shadow: none; } @else if $t==osd-backdrop { // // backdrop osd button // $_bg: if($c != $bg_color, transparentize($c, 0.5), $osd_bg_color); color: $osd_fg_color; border-color: $osd_borders_color; background-color: transparent; background-image: image($_bg); background-clip: padding-box; box-shadow: none; text-shadow: none; -gtk-icon-shadow: none; } @else if $t==undecorated { // // reset // border-color: transparent; background-color: transparent; background-image: none; @include _shadows(inset 0 1px transparentize(white, 1), $_blank_edge); text-shadow: none; -gtk-icon-shadow: none; } } @mixin headerbar_fill($c:$headerbar_color, $hc:$top_hilight, $ov: none) { // // headerbar fill // // $c: base color // $hc: top highlight color // $ov: a background layer for background shorthand (hence no commas!) // $gradient: linear-gradient(to top, darken($c, 2%), lighten($c, 1%)); @if $variant == 'dark' { $gradient: linear-gradient(to top, lighten($c, 4%), lighten($c, 6%)); } @if $ov != none { background: $c $ov, $gradient; } @else { background: $c $gradient; } box-shadow: inset 0 1px $hc; // top highlight } @mixin overshoot($p, $t:normal, $c:$fg_color) { // // overshoot // // $p: position // $t: type // $c: base color // // possible $p values: // top, bottom, right, left // // possible $t values: // normal, backdrop // $_small_gradient_length: 5%; $_big_gradient_length: 100%; $_position: center top; $_small_gradient_size: 100% $_small_gradient_length; $_big_gradient_size: 100% $_big_gradient_length; @if $p==bottom { $_position: center bottom; $_linear_gradient_direction: to top; } @else if $p==right { $_position: right center; $_small_gradient_size: $_small_gradient_length 100%; $_big_gradient_size: $_big_gradient_length 100%; } @else if $p==left { $_position: left center; $_small_gradient_size: $_small_gradient_length 100%; $_big_gradient_size: $_big_gradient_length 100%; } $_small_gradient_color: $c; $_big_gradient_color: $c; @if $c==$fg_color { $_small_gradient_color: darken($borders_color, 10%); $_big_gradient_color: $fg_color; @if $t==backdrop { $_small_gradient_color: $backdrop_borders_color; } } $_small_gradient: -gtk-gradient(radial, $_position, 0, $_position, 0.5, to($_small_gradient_color), to(transparentize($_small_gradient_color, 1))); $_big_gradient: -gtk-gradient(radial, $_position, 0, $_position, 0.6, from(transparentize($_big_gradient_color, 0.93)), to(transparentize($_big_gradient_color, 1))); @if $t==normal { background-image: $_small_gradient, $_big_gradient; background-size: $_small_gradient_size, $_big_gradient_size; } @else if $t==backdrop { background-image: $_small_gradient; background-size: $_small_gradient_size; } background-repeat: no-repeat; background-position: $_position; background-color: transparent; // reset some properties to be sure to not inherit them somehow border: none; // box-shadow: none; // } /*************************** * Check and Radio buttons * ***************************/ @mixin check($t, $c:$bg_color, $tc:$fg_color, $checked: false) { // Check/Radio drawing function // // $t: check/radio type, // $c: base button color for colored* types // $tc: optional text color for colored* types // $checked: bool to chose between checked/unchecked // // possible $t values: // normal, hover, active, insensitive, backdrop, backdrop-insensitive $_border_color: if($c==$checkradio_bg_color, $c, $alt_borders_color); $_dim_border_color: transparentize($_border_color, if($variant == 'light', 0.3, 0.7)); @if $t==normal { background-clip: if($checked, border-box, padding-box); background-image: linear-gradient(to bottom, lighten($c, 5%) 20%, $c 90%); border-color: $_border_color; box-shadow: 0 1px transparentize(black, 0.95); color: $tc; } @if $t==hover { background-image: if($c == white, image(darken($c, 5%)), linear-gradient(to bottom, lighten($c, 9%) 10%, lighten($c, 4%) 90%)); } @if $t==active { box-shadow: inset 0 1px 1px 0px if($variant == 'light', rgba(0, 0, 0, 0.2), black); } @if $t==insensitive { box-shadow: none; color: transparentize($tc, 0.3); } @if $t==backdrop { background-image: image($c); box-shadow: none; color: $tc; } @if $t==backdrop-insensitive { box-shadow: none; color: transparentize($tc, 0.3); } } gnome-console-42~beta/src/styles/_recoloring.scss000066400000000000000000000125441420277463100224250ustar00rootroot00000000000000$fg_color: if($variant == 'light', #2e3436, #eeeeec); $selected_bg_color: if($variant == 'light', #3584e4, darken(#3584e4, 20%)); $base_color: lighten($window_color, 5%); $bg_color: lighten($window_color, 5%); $fg_color: hsl(hue($base_color), saturation($base_color), lightness($fg_color)); $selected_bg_color: hsl(hue($base_color), saturation($base_color), lightness($selected_bg_color)); $selected_borders_color: if($variant== 'light', darken($selected_bg_color, 15%), darken($selected_bg_color, 30%)); $borders_color: if($variant == 'light', darken($bg_color, 18%), darken($bg_color, 10%)); $alt_borders_color: if($variant == 'light', darken($bg_color, 24%), darken($bg_color, 18%)); $borders_edge: if($variant == 'light', transparentize(white, 0.2), transparentize($fg_color, 0.93)); $top_hilight: $borders_edge; $dark_fill: mix($borders_color, $bg_color, 50%); $insensitive_fg_color: mix($fg_color, $bg_color, 50%); $insensitive_bg_color: mix($bg_color, $base_color, 60%); $insensitive_borders_color: $borders_color; $backdrop_bg_color: $bg_color; $backdrop_fg_color: mix($fg_color, $backdrop_bg_color, 50%); $backdrop_borders_color: mix($borders_color, $bg_color, 80%); $backdrop_dark_fill: mix($backdrop_borders_color, $backdrop_bg_color, 35%); $backdrop_insensitive_color: if($variant == 'light', darken($backdrop_bg_color, 15%), lighten($backdrop_bg_color, 15%)); @if $high_contrast { $fg_color: if($variant == 'light', darken($fg_color, 3%), lighten($fg_color, 2%)); $bg_color: if($variant == 'light', lighten($bg_color, 3%), darken($bg_color, 2%)); $selected_bg_color: darken($selected_bg_color,10%); $selected_borders_color: darken($selected_borders_color, 10%); $borders_color: if($variant == 'light', darken($borders_color, 30%), lighten($borders_color, 30%)); $alt_borders_color: if($variant == 'light', darken($alt_borders_color, 33%), lighten($alt_borders_color, 28%)); //insensitive state derived colors $insensitive_fg_color: mix($fg_color, $bg_color, 50%); $insensitive_bg_color: mix($bg_color, $base_color, 60%); $insensitive_borders_color: mix($borders_color, $bg_color, 80%); } $tab_bg: darken($bg_color, if($variant == 'dark', 6%, 12%)); $tab_bg_backdrop: darken($backdrop_bg_color, 6%); @import 'drawing'; headerbar { @include headerbar_fill(darken($bg_color, 10%)); border-color: $alt_borders_color; color: $fg_color; &:backdrop { background-image: image($bg_color); border-color: $backdrop_borders_color; box-shadow: inset 0 1px $top_hilight; color: $backdrop_fg_color; } } actionbar { background: $bg_color; > revealer > box { border-color: $borders_color; } &:backdrop { background: $backdrop_bg_color; > revealer > box { border-color: $backdrop_borders_color; } } } headerbar, actionbar { button { @include button(normal); &.flat, &.titlebutton { @include button(undecorated); } &.titlebutton { @include _button_text_shadow($fg_color); } &:hover { @include button(hover); } &:active, &:checked { @include button(active); } &:disabled { @include button(insensitive); } &:backdrop { @include button(backdrop); &:active { @include button(backdrop-active); } &:disabled { @include button(backdrop-insensitive); } } &:checked { background: if($variant == 'light', image(darken($bg_color, 17%)), image(darken($bg_color, 9%))); border-color: darken($borders_color, 3%); border-top-color: darken($borders_color, 8%); &:backdrop { @include button(backdrop-active); } } &.flat:backdrop, &.titlebutton:backdrop { @include button(undecorated); } } } tabbar { .box { background: darken($tab_bg, 3%); border-bottom: 1px solid $alt_borders_color; &:backdrop { background-color: darken($tab_bg_backdrop, 3%); border-color: $backdrop_borders_color; } } scrolledwindow.pinned { undershoot { border-color: $alt_borders_color; } &:backdrop undershoot { border-color: $backdrop_borders_color; } tabbox { &:dir(ltr) { box-shadow: inset -1px 0 $alt_borders_color; &:backdrop { box-shadow: inset -1px 0 $backdrop_borders_color; } } &:dir(rtl) { box-shadow: inset 1px 0 $alt_borders_color; &:backdrop { box-shadow: inset 1px 0 $backdrop_borders_color; } } } } tab { border-color: $alt_borders_color; background-color: $tab_bg; &:checked { background-color: lighten($tab_bg, 6%); &:hover { background-color: lighten($tab_bg, 9%); } } &:hover { background-color: lighten($tab_bg, 3%); } &:backdrop { border-color: $backdrop_borders_color; background-color: $tab_bg_backdrop; &:checked { background-color: $backdrop_bg_color; } } &, .tab-close-button, .tab-indicator { color: $fg_color; &:backdrop { color: $backdrop_fg_color; } } .tab-close-button, .tab-indicator.clickable { &:hover { background: gtkalpha($fg_color, .15); } &:active { background: gtkalpha(black, .2); } } } .start-action, .end-action { background: $tab_bg; border-color: $alt_borders_color; &:backdrop { border-color: $backdrop_borders_color; background-color: $tab_bg_backdrop; } } } gnome-console-42~beta/src/styles/_styles.scss000066400000000000000000000132131420277463100215770ustar00rootroot00000000000000@import 'definitions'; @import 'drawing'; .terminal-window { background: transparent; &.root { $variant: 'dark'; $window_color: darken(#a51d2d, 15%); @import 'recoloring'; } &.remote { $variant: 'dark'; $window_color: darken(#613583, 10%); @import 'recoloring'; } scrolledwindow.terminal overshoot { $sides: "top", "bottom", "left", "right"; @each $side in $sides { &.#{$side} { @include overshoot($side, normal, #cccccc); &:backdrop { @include overshoot($side, backdrop, #cccccc); } } } } } // Taken from nautilus .floating-bar { padding: 6px; background-color: themecolor(theme_base_color); border-width: 1px; border-style: solid solid none; background-clip: padding-box; border-color: transparentize(black, if($variant == 'light', .8, .25)); border-radius: 6px 6px 0 0; &:backdrop { background-color: themecolor(theme_unfocused_base_color); } &:dir(rtl) { // axes left border and border radius border-left-style: none; border-top-left-radius: 0; } &:dir(ltr) { // axes right border and border radius border-right-style: none; border-top-right-radius: 0; } button { padding: 0px; } } .empty-state { /* Sync to KgxTerminal! */ @if $variant == 'light' { background: white; } @else { $bg: rgb(0.05 * 255, 0.05 * 255, 0.05 * 255); background: transparentize($bg, 0.04); window.opaque & { background: $bg; } } color: gtkalpha(currentColor, .5); } .exit-info { padding: 6px; border-top: 2px solid #1e78e4; background: rgba(13, 54, 104, 0.96); color: #ffffff; label:backdrop { color: #ffffff; } .error & { border-top: 2px solid #ed333b; background: rgba(104, 13, 13, 0.96); } } label.numeric { font-feature-settings: "tnum"; } box.tab:drop(active) { outline: 1px solid $drop_target_color; outline-offset: -1px; -gtk-outline-radius: 0; window:not(.tiled) :not(.tiled-top) :not(.tiled-bottom) :not(.tiled-left) :not(.tiled-right) :not(.maximized) & { -gtk-outline-bottom-left-radius: 8px; -gtk-outline-bottom-right-radius: 8px; } } .process-list row { .header { min-height: 0; } .title { font-family: Monospace; } } .tab-button label { font-weight: 800; font-size: 8pt; &.small { font-size: 6pt; } } @mixin flat_round_button() { background: none; border: none; box-shadow: none; -gtk-icon-shadow: none; text-shadow: none; border-radius: 99px; -gtk-outline-radius: 99px; color: inherit; padding: 0; &:hover { background: gtkalpha(currentColor, .15); &:active { background: gtkalpha(black, .2); } } } .tab-switcher { min-height: 180px; list { padding-top: 48px; padding-bottom: 84px; row { background: none; border: none; box-shadow: none; padding: 0; outline-color: transparent; color: themecolor(theme_text_color); .content { min-height: 40px; margin-left: 5px; margin-right: 5px; margin-bottom: 2px; padding: 3px; border-radius: 5px; -gtk-outline-radius: 5px; border: none; box-shadow: none; transition: 200ms cubic-bezier(0.25, 0.46, 0.45, 0.94); &:dir(ltr) { padding-left: 11px; } &:dir(rtl) { padding-right: 11px; } } &:selected .content { background: gtkalpha(currentColor, .06); } &:hover .content { background: gtkalpha(currentColor, .1); } &:active .content { background: gtkalpha(black, .15); } &.needs-attention { // Blue 4 | Blue 1 color: if($variant == 'light', #1c71d8, #99c1f1); } .close-btn, .indicator-btn { @include flat_round_button(); min-width: 36px; min-height: 36px; } } } .collapse-button { @include flat_round_button(); padding: 6px 30px; margin: 6px; } .new-tab-button { min-width: 48px; min-height: 48px; border-radius: 100%; -gtk-outline-radius: 100%; padding: 0; margin: 18px; } } themeswitcher { $_light_bg: white; $_light_fg: transparentize(black, .1); $_dark_bg: #2e3436; $_dark_fg: white; $_selected_color: #3584e4; .check { background: $_selected_color; color: white; padding: 2px; border-radius: 17px; } /* Adapted from https://gitlab.gnome.org/GNOME/gnome-text-editor/-/blob/bf8c0c249f06a0be69e65aed3b786ba02a9f999e/src/TextEditor.css#L51 */ radiobutton { -gtk-outline-radius: 100px; outline-offset: 1px; transition: none; radio { -gtk-icon-source: none; background: none; box-shadow: none; padding: 12px; min-height: 24px; min-width: 24px; border: none; outline-color: currentColor; transition: none; @if $high_contrast { @if $variant == 'light' { box-shadow: inset 0 0 0 1px transparentize(black, .3); } @else { box-shadow: inset 0 0 0 1px transparentize(white, .7); } } @else { @if $variant == 'light' { box-shadow: inset 0 0 0 1px transparentize(black, .8); } @else { box-shadow: 0 0 0 1px transparentize(black, .3); } } &:checked { box-shadow: inset 0 0 0 2px $_selected_color; } } &.system radio { color: $_light_fg; background: linear-gradient(-45deg, $_dark_bg 49.99%, $_light_bg 50.01%); } &.light radio { color: $_light_fg; background-color: $_light_bg; } &.dark radio { color: $_dark_fg; background-color: $_dark_bg; } } } gnome-console-42~beta/src/styles/meson.build000066400000000000000000000014521420277463100213640ustar00rootroot00000000000000sassc = find_program('sassc', required: false) if not sassc.found() and not get_option('sassc').disabled() subproject('sassc') sassc = find_program('sassc', required: get_option('sassc').enabled()) endif if sassc.found() styles = [ 'styles-light', 'styles-dark', 'styles-hc', 'styles-hc-dark', ] style_deps = [] sassc_opts = [ '-a', '-M', '-t', 'compact' ] foreach style: styles style_deps += [ custom_target(style, input: '@0@.scss'.format(style), output: '@0@.css'.format(style), command: [ sassc, sassc_opts, '@INPUT@', '@OUTPUT@', ], depend_files: files([ '_definitions.scss', '_drawing.scss', '_recoloring.scss', '_styles.scss', ]), ), ] endforeach endif gnome-console-42~beta/src/styles/styles-dark.scss000066400000000000000000000000741420277463100223600ustar00rootroot00000000000000$variant: 'dark'; $high_contrast: false; @import 'styles'; gnome-console-42~beta/src/styles/styles-hc-dark.scss000066400000000000000000000000731420277463100227470ustar00rootroot00000000000000$variant: 'dark'; $high_contrast: true; @import 'styles'; gnome-console-42~beta/src/styles/styles-hc.scss000066400000000000000000000000741420277463100220310ustar00rootroot00000000000000$variant: 'light'; $high_contrast: true; @import 'styles'; gnome-console-42~beta/src/styles/styles-light.scss000066400000000000000000000000751420277463100225470ustar00rootroot00000000000000$variant: 'light'; $high_contrast: false; @import 'styles'; gnome-console-42~beta/subprojects/000077500000000000000000000000001420277463100174515ustar00rootroot00000000000000gnome-console-42~beta/subprojects/handy.wrap000066400000000000000000000001401420277463100214420ustar00rootroot00000000000000[wrap-git] directory=handy url=https://gitlab.gnome.org/GNOME/libhandy.git revision=origin/main gnome-console-42~beta/subprojects/libsass.wrap000066400000000000000000000001351420277463100220030ustar00rootroot00000000000000[wrap-git] directory=libsass url=https://github.com/lazka/libsass.git revision=meson depth=1 gnome-console-42~beta/subprojects/sassc.wrap000066400000000000000000000001311420277463100214530ustar00rootroot00000000000000[wrap-git] directory=sassc url=https://github.com/lazka/sassc.git revision=meson depth=1 gnome-console-42~beta/subprojects/vte.wrap000066400000000000000000000001271420277463100211420ustar00rootroot00000000000000[wrap-git] directory=vte url=https://gitlab.gnome.org/GNOME/vte revision=origin/master gnome-console-42~beta/test_colours.py000077500000000000000000000006301420277463100202070ustar00rootroot00000000000000#!/usr/bin/python3 # pip3 install ansicolors --user from colors import color print('Colour Table') for i in range(8): print(color(' #%02d ' % i, fg=i), end='') print() for i in range(8,16): print(color(' #%02d ' % i, fg=i), end='') print() for i in range(8): print(color(' #%02d ' % i, bg=i), end='') print() for i in range(8,16): print(color(' #%02d ' % i, bg=i), end='') print()