cinnamon-6.6.8/0000775000175000017500000000000015167446463012301 5ustar fabiofabiocinnamon-6.6.8/.git-blame-ignore-revs0000664000175000017500000000031315167446463016376 0ustar fabiofabio# .git-blame-ignore-revs # Fix whitespace 19fa83fb64c300a4a3ca22b5e42ff082fe260bae # Cleanup whitespace 18d2377f8839c842232e096570d7b25a46953f39 # Fix whitespace 367ff2c0c9719495a85bc9100d75460003f43865 cinnamon-6.6.8/.github/0000775000175000017500000000000015167446463013641 5ustar fabiofabiocinnamon-6.6.8/.github/ISSUE_TEMPLATE/0000775000175000017500000000000015167446463016024 5ustar fabiofabiocinnamon-6.6.8/.github/ISSUE_TEMPLATE/bug_report.yaml0000664000175000017500000001011515167446463021056 0ustar fabiofabio--- name: Bug Report description: File a bug report labels: - BUG body: - type: markdown attributes: value: | ## STOP! Before continuing: ### Please try searching for [existing reports](https://github.com/linuxmint/cinnamon/issues?q=is%3Aissue+state%3Aall) that may match the behavior you're seeing. *If you find one, add to that issue instead of opening a new one*. Include any relevant details that may differ from the original author's. ### If this is specifically an issue with Wayland, please report it at the [Wayland issue tracker](https://github.com/linuxmint/wayland/issues/new?assignees=&labels=bug&projects=&template=bug_report.yaml). _______ ### Other troubleshooting suggestions: - If this is related to Cinnamon, sometimes third-party xlets (applets, desklets and extensions) can cause erroneous or unexpected behavior. Try disabling these first to see if the behavior goes away. After disabling, be sure to restart Cinnamon before continuing. Right-click an empty portion of the panel, select Troubleshooting, then 'Restart Cinnamon'. Alternately, you can open the run dialog - Alt-F2, type 'r' or 'restart', and enter. - Check your logs - there may be some obvious cause for your trouble - in Linux Mint you can check ~/.xsession-errors (a hidden file in your Home folder). - If this is a *crash*, provide information about it if possible (CoreDump file, stack trace, etc...). In Linux Mint you can check the System Reports program. - Have you tried rebooting? --- Thank you for taking the time to report this issue. To allow us to work as efficiently as possible at resolving this, we need some information from you. - type: input id: distro attributes: label: Distribution description: Which Linux distribution are you using? Please be as specific as possible. placeholder: "example: Mint 21.1" validations: required: true - type: input id: pkgver attributes: label: Package version description: Please provide the Cinnamon version. You can get this by running `cinnamon --version` in a terminal, or launching 'System Info" from the menu. placeholder: "example: 5.6.1" validations: required: true - type: input id: graphics attributes: label: Graphics hardware in use description: Please provide information about your graphics hardware, if known. If you are using a dual-gpu system please specify that also. placeholder: "example: NVIDIA GeForce GTX 1660 TI" validations: required: false - type: dropdown id: frequency attributes: label: Frequency description: How often does this behavior occur? options: - Always - Quite often - Only occasionally validations: required: true - type: textarea id: current-behavior attributes: label: Bug description description: Please describe what is happening validations: required: true - type: textarea id: steps attributes: label: Steps to reproduce description: Please try to provide **detailed** steps on the most direct way to reproduce this issue. The chances of a bug being fixed go up **considerably** if we are able to duplicate the behavior ourselves. validations: required: true - type: textarea id: expected-behavior attributes: label: Expected behavior description: Describe what you think should happen instead of the current behavior. validations: required: true - type: textarea id: more-info attributes: label: Additional information description: You can add any other information you think may be relevant. validations: required: false - type: markdown attributes: value: | #### By submitting this report you agree to behave respectfully and in a mature manner. If in doubt, refer to the [Golden Rule](https://en.wikipedia.org/wiki/Golden_Rule) and [GitHub's Community Guidelines](https://docs.github.com/en/site-policy/github-terms/github-community-guidelines). cinnamon-6.6.8/.github/ISSUE_TEMPLATE/feature_request.md0000664000175000017500000000042015167446463021545 0ustar fabiofabio--- name: Feature request (OBSOLETE) about: Feature requests are no longer accepted here, please use https://github.com/orgs/linuxmint/discussions instead. title: "" labels: ["FEATURE REQUEST"] assignees: '' --- Please use: https://github.com/orgs/linuxmint/discussionscinnamon-6.6.8/.github/workflows/0000775000175000017500000000000015167446463015676 5ustar fabiofabiocinnamon-6.6.8/.github/workflows/build.yml0000664000175000017500000000172715167446463017527 0ustar fabiofabioname: Build on: push: branches: - master pull_request: branches: - master workflow_dispatch: inputs: debug_enabled: type: boolean description: 'Start an SSH server on failure.' required: false default: false jobs: build: uses: linuxmint/github-actions/.github/workflows/do-builds.yml@master with: commit_id: master ############################## Comma separated list - like 'linuxmint/xapp, linuxmint/cinnamon-desktop' dependencies: > linuxmint/cinnamon-control-center, linuxmint/cinnamon-desktop, linuxmint/cinnamon-menus, linuxmint/cinnamon-screensaver, linuxmint/cinnamon-session, linuxmint/cinnamon-settings-daemon, linuxmint/cinnamon-translations, linuxmint/cjs, linuxmint/muffin, linuxmint/nemo, linuxmint/xapp, linuxmint/xdg-desktop-portal-xapp ############################## cinnamon-6.6.8/.gitignore0000664000175000017500000000040215167446463014265 0ustar fabiofabiodata/theme/cinnamon.css debian/*.debhelper debian/*.log debian/*.substvars debian/.debhelper/ debian/cinnamon-common/ debian/cinnamon-dbg/ debian/cinnamon-doc/ debian/cinnamon/ debian/debhelper-build-stamp debian/files debian/tmp/ obj-x86_64-linux-gnu *.pyc cinnamon-6.6.8/.project0000664000175000017500000000164015167446463013751 0ustar fabiofabio gnome-shell org.eclipse.wst.jsdt.core.javascriptValidator org.eclipse.linuxtools.cdt.autotools.genmakebuilder org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder org.eclipse.cdt.managedbuilder.core.ScannerConfigNature org.eclipse.linuxtools.cdt.autotools.autotoolsNature org.eclipse.cdt.managedbuilder.core.managedBuildNature org.eclipse.cdt.core.cnature org.eclipse.wst.jsdt.core.jsNature cinnamon-6.6.8/.pylintrc0000664000175000017500000003767215167446463014165 0ustar fabiofabio[MASTER] # A comma-separated list of package or module names from where C extensions may # be loaded. Extensions are loading into the active Python interpreter and may # run arbitrary code extension-pkg-whitelist=gi, pyinotify, setproctitle # Add files or directories to the blacklist. They should be base names, not # paths. ignore=CVS # Add files or directories matching the regex patterns to the blacklist. The # regex matches against base names, not paths. ignore-patterns= # Python code to execute, usually for sys.path manipulation such as # pygtk.require(). #init-hook= # Use multiple processes to speed up Pylint. jobs=1 # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. load-plugins= # Pickle collected data for later comparisons. persistent=yes # Specify a configuration file. #rcfile= # When enabled, pylint would attempt to guess common misconfiguration and emit # user-friendly hints instead of false-positive error messages suggestion-mode=yes # Allow loading of arbitrary C extensions. Extensions are imported into the # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no [MESSAGES CONTROL] # Only show warnings with the listed confidence levels. Leave empty to show # all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED confidence= # Disable the message, report, category or checker with the given id(s). You # can either give multiple identifiers separated by comma (,) or put this # option multiple times (only on the command line, not in the configuration # file where it should appear only once).You can also use "--disable=all" to # disable everything first and then reenable specific checks. For example, if # you want to run only the similarities checker, you can use "--disable=all # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use"--disable=all --enable=classes # --disable=W" disable=len-as-condition, missing-docstring, print-statement, parameter-unpacking, unpacking-in-except, old-raise-syntax, backtick, long-suffix, old-ne-operator, old-octal-literal, import-star-module-level, non-ascii-bytes-literal, raw-checker-failed, bad-inline-option, locally-disabled, locally-enabled, file-ignored, suppressed-message, useless-suppression, deprecated-pragma, apply-builtin, basestring-builtin, buffer-builtin, cmp-builtin, coerce-builtin, execfile-builtin, file-builtin, long-builtin, raw_input-builtin, reduce-builtin, standarderror-builtin, unicode-builtin, xrange-builtin, coerce-method, delslice-method, getslice-method, setslice-method, no-absolute-import, old-division, dict-iter-method, dict-view-method, next-method-called, metaclass-assignment, indexing-exception, raising-string, reload-builtin, oct-method, hex-method, nonzero-method, cmp-method, input-builtin, round-builtin, intern-builtin, unichr-builtin, map-builtin-not-iterating, zip-builtin-not-iterating, range-builtin-not-iterating, filter-builtin-not-iterating, using-cmp-argument, eq-without-hash, div-method, idiv-method, rdiv-method, exception-message-attribute, invalid-str-codec, sys-max-int, bad-python3-import, deprecated-string-function, deprecated-str-translate-call, deprecated-itertools-function, deprecated-types-field, next-method-defined, dict-items-not-iterating, dict-keys-not-iterating, dict-values-not-iterating, unused-argument, wrong-import-position # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option # multiple time (only on the command line, not in the configuration file where # it should appear only once). See also the "--disable" option for examples. enable=c-extension-no-member [REPORTS] # Python expression which should return a note less than 10 (10 is the highest # note). You have access to the variables errors warning, statement which # respectively contain the number of errors / warnings messages and the total # number of statements analyzed. This is used by the global evaluation report # (RP0004). evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) # Template used to display messages. This is a python new-style format string # used to format the message information. See doc for all details #msg-template= # Set the output format. Available formats are text, parseable, colorized, json # and msvs (visual studio).You can also give a reporter class, eg # mypackage.mymodule.MyReporterClass. output-format=text # Tells whether to display a full report or only the messages reports=no # Activate the evaluation score. score=yes [REFACTORING] # Maximum number of nested blocks for function / method body max-nested-blocks=5 [TYPECHECK] # List of decorators that produce context managers, such as # contextlib.contextmanager. Add to this list to register other decorators that # produce valid context managers. contextmanager-decorators=contextlib.contextmanager # List of members which are set dynamically and missed by pylint inference # system, and so shouldn't trigger E1101 when accessed. Python regular # expressions are accepted. generated-members= # Tells whether missing members accessed in mixin class should be ignored. A # mixin class is detected if its name ends with "mixin" (case insensitive). ignore-mixin-members=yes # This flag controls whether pylint should warn about no-member and similar # checks whenever an opaque object is returned when inferring. The inference # can return multiple potential results while evaluating a Python object, but # some branches might not be evaluated, which results in partial inference. In # that case, it might be useful to still emit no-member and other checks for # the rest of the inferred objects. ignore-on-opaque-inference=yes # List of class names for which member attributes should not be checked (useful # for classes with dynamically set attributes). This supports the use of # qualified names. ignored-classes=optparse.Values,thread._local,_thread._local # List of module names for which member attributes should not be checked # (useful for modules/projects where namespaces are manipulated during runtime # and thus existing member attributes cannot be deduced by static analysis. It # supports qualified module names, as well as Unix pattern matching. ignored-modules= # Show a hint with possible names when a member name was not found. The aspect # of finding the hint is based on edit distance. missing-member-hint=yes # The minimum edit distance a name should have in order to be considered a # similar match for a missing member name. missing-member-hint-distance=1 # The total number of similar names that should be taken in consideration when # showing a hint for a missing member. missing-member-max-choices=1 [FORMAT] # Expected format of line ending, e.g. empty (any line ending), LF or CRLF. expected-line-ending-format= # Regexp for a line that is allowed to be longer than the limit. ignore-long-lines=^\s*(# )??$ # Number of spaces of indent required inside a hanging or continued line. indent-after-paren=4 # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 # tab). indent-string=' ' # Maximum number of characters on a single line. max-line-length=100 # Maximum number of lines in a module max-module-lines=1000 # List of optional constructs for which whitespace checking is disabled. `dict- # separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. # `trailing-comma` allows a space between comma and closing bracket: (a, ). # `empty-line` allows space-only lines. no-space-check=trailing-comma, dict-separator # Allow the body of a class to be on the same line as the declaration if body # contains single statement. single-line-class-stmt=no # Allow the body of an if to be on the same line as the test if there is no # else. single-line-if-stmt=no [LOGGING] # Logging modules to check that the string format arguments are in logging # function parameter format logging-modules=logging [VARIABLES] # List of additional names supposed to be defined in builtins. Remember that # you should avoid to define new builtins when possible. additional-builtins= # Tells whether unused global variables should be treated as a violation. allow-global-unused-variables=yes # List of strings which can identify a callback function by name. A callback # name must start or end with one of those strings. callbacks=cb_, _cb # A regular expression matching the name of dummy variables (i.e. expectedly # not used). dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ # Argument names that match this expression will be ignored. Default to name # with leading underscore ignored-argument-names=_.*|^ignored_|^unused_ # Tells whether we should check for unused import in __init__ files. init-import=no # List of qualified module names which can have objects that can redefine # builtins. redefining-builtins-modules=six.moves,past.builtins,future.builtins [MISCELLANEOUS] # List of note tags to take in consideration, separated by a comma. notes=FIXME, XXX, TODO [SIMILARITIES] # Ignore comments when computing similarities. ignore-comments=yes # Ignore docstrings when computing similarities. ignore-docstrings=yes # Ignore imports when computing similarities. ignore-imports=no # Minimum lines number of a similarity. min-similarity-lines=4 [BASIC] # Naming style matching correct argument names argument-naming-style=snake_case # Regular expression matching correct argument names. Overrides argument- # naming-style #argument-rgx= # Naming style matching correct attribute names attr-naming-style=snake_case # Regular expression matching correct attribute names. Overrides attr-naming- # style #attr-rgx= # Bad variable names which should always be refused, separated by a comma bad-names=foo, bar, baz, toto, tutu, tata # Naming style matching correct class attribute names class-attribute-naming-style=any # Regular expression matching correct class attribute names. Overrides class- # attribute-naming-style #class-attribute-rgx= # Naming style matching correct class names class-naming-style=PascalCase # Regular expression matching correct class names. Overrides class-naming-style #class-rgx= # Naming style matching correct constant names const-naming-style=UPPER_CASE # Regular expression matching correct constant names. Overrides const-naming- # style #const-rgx= # Minimum line length for functions/classes that require docstrings, shorter # ones are exempt. docstring-min-length=-1 # Naming style matching correct function names function-naming-style=snake_case # Regular expression matching correct function names. Overrides function- # naming-style #function-rgx= # Good variable names which should always be accepted, separated by a comma good-names=i, j, k, ex, Run, _, x, y, w, h # Include a hint for the correct naming format with invalid-name include-naming-hint=no # Naming style matching correct inline iteration names inlinevar-naming-style=any # Regular expression matching correct inline iteration names. Overrides # inlinevar-naming-style #inlinevar-rgx= # Naming style matching correct method names method-naming-style=snake_case # Regular expression matching correct method names. Overrides method-naming- # style #method-rgx= # Naming style matching correct module names module-naming-style=snake_case # Regular expression matching correct module names. Overrides module-naming- # style #module-rgx= # Colon-delimited sets of names that determine each other's naming style when # the name regexes allow several styles. name-group= # Regular expression which should only match function or class names that do # not require a docstring. no-docstring-rgx=^_ # List of decorators that produce properties, such as abc.abstractproperty. Add # to this list to register other decorators that produce valid properties. property-classes=abc.abstractproperty # Naming style matching correct variable names variable-naming-style=snake_case # Regular expression matching correct variable names. Overrides variable- # naming-style #variable-rgx= [SPELLING] # Limits count of emitted suggestions for spelling mistakes max-spelling-suggestions=4 # Spelling dictionary name. Available dictionaries: none. To make it working # install python-enchant package. spelling-dict= # List of comma separated words that should not be checked. spelling-ignore-words= # A path to a file that contains private dictionary; one word per line. spelling-private-dict-file= # Tells whether to store unknown words to indicated private dictionary in # --spelling-private-dict-file option instead of raising a message. spelling-store-unknown-words=no [CLASSES] # List of method names used to declare (i.e. assign) instance attributes. defining-attr-methods=__init__, __new__, setUp, my_init # List of member names, which should be excluded from the protected access # warning. exclude-protected=_asdict, _fields, _replace, _source, _make # List of valid names for the first argument in a class method. valid-classmethod-first-arg=cls # List of valid names for the first argument in a metaclass class method. valid-metaclass-classmethod-first-arg=mcs [IMPORTS] # Allow wildcard imports from modules that define __all__. allow-wildcard-with-all=no # Analyse import fallback blocks. This can be used to support both Python 2 and # 3 compatible code, which means that the block might have code that exists # only in one or another interpreter, leading to false positives when analysed. analyse-fallback-blocks=no # Deprecated modules which should not be used, separated by a comma deprecated-modules=optparse,tkinter.tix # Create a graph of external dependencies in the given file (report RP0402 must # not be disabled) ext-import-graph= # Create a graph of every (i.e. internal and external) dependencies in the # given file (report RP0402 must not be disabled) import-graph= # Create a graph of internal dependencies in the given file (report RP0402 must # not be disabled) int-import-graph= # Force import order to recognize a module as part of the standard # compatibility libraries. known-standard-library= # Force import order to recognize a module as part of a third party library. known-third-party=enchant [DESIGN] # Maximum number of arguments for function / method max-args=5 # Maximum number of attributes for a class (see R0902). max-attributes=7 # Maximum number of boolean expressions in a if statement max-bool-expr=5 # Maximum number of branch for function / method body max-branches=16 # Maximum number of locals for function / method body max-locals=15 # Maximum number of parents for a class (see R0901). max-parents=7 # Maximum number of public methods for a class (see R0904). max-public-methods=20 # Maximum number of return / yield for function / method body max-returns=6 # Maximum number of statements in function / method body max-statements=75 # Minimum number of public methods for a class (see R0903). min-public-methods=2 [EXCEPTIONS] # Exceptions that will emit a warning when being caught. Defaults to # "Exception" overgeneral-exceptions=Exception cinnamon-6.6.8/AUTHORS0000664000175000017500000000007215167446463013350 0ustar fabiofabiohttps://github.com/linuxmint/Cinnamon/graphs/contributors cinnamon-6.6.8/COPYING0000664000175000017500000004310715167446463013341 0ustar fabiofabio GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. 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. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the 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 a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE 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. 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 convey 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 2 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, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision 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, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This 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 Library General Public License instead of this License. cinnamon-6.6.8/README.rst0000664000175000017500000000124515167446463013772 0ustar fabiofabioCinnamon is a Linux desktop that provides advanced innovative features and a traditional user experience. The desktop layout is similar to GNOME 2 with underlying technology forked from the GNOME Shell. Cinnamon makes users feel at home with an easy-to-use and comfortable desktop experience. Contributing ============ Cinnamon is on GitHub at https://github.com/linuxmint/cinnamon. Note that some issues may not be with Cinnamon itself. For a list of related components, please see https://projects.linuxmint.com/cinnamon/. License ======= Cinnamon is distributed under the terms of the GNU General Public License, version 2 or later. See the COPYING file for details. cinnamon-6.6.8/calendar-server/0000775000175000017500000000000015167446463015356 5ustar fabiofabiocinnamon-6.6.8/calendar-server/cinnamon-calendar-server.in0000775000175000017500000000024515167446463022567 0ustar fabiofabio#!/bin/sh export GI_TYPELIB_PATH="@PKGLIBDIR@:@MUFFINLIBDIR@" export LD_LIBRARY_PATH="@PKGLIBDIR@:@MUFFINLIBDIR@" exec @LIBEXECDIR@/cinnamon-calendar-server.py $@ cinnamon-6.6.8/calendar-server/cinnamon-calendar-server.py0000775000175000017500000004452415167446463022621 0ustar fabiofabio#!/usr/bin/python3 import os import sys import setproctitle import locale import gettext import functools import logging import time from setproctitle import setproctitle import signal import gi gi.require_version('EDataServer', '1.2') gi.require_version('ECal', '2.0') gi.require_version('ICal', '3.0') gi.require_version('Cinnamon', '0.1') from gi.repository import GLib, Gio, GObject from gi.repository import EDataServer, ECal, ICal, ICalGLib from gi.repository import Cinnamon BUS_NAME = "org.cinnamon.CalendarServer" BUS_PATH = "/org/cinnamon/CalendarServer" STATUS_UNKNOWN = 0 STATUS_NO_CALENDARS = 1 STATUS_HAS_CALENDARS = 2 class CalendarInfo(GObject.Object): __gsignals__ = { "color-changed": (GObject.SignalFlags.RUN_LAST, None, ()), } def __init__(self, source, client): super(CalendarInfo, self).__init__() # print(source, client) self.source = source self.client = client self.syncing = False self.extension = source.get_extension(EDataServer.SOURCE_EXTENSION_CALENDAR) self.color = self.extension.get_color() self.color_prop_listener_id = self.extension.connect("notify::color", self.ext_color_prop_changed) # This process generally won't stay running for more than 30 seconds or so, # but enabling refresh lets us force a timeout and re-poll. if self.client.check_capability(ECal.STATIC_CAPABILITY_REFRESH_SUPPORTED): self.refresh = self.source.get_extension(EDataServer.SOURCE_EXTENSION_REFRESH) self.refresh.set_enabled(True) self.refresh.set_interval_minutes(1) self.source.refresh_add_timeout(None, self.on_refresh_timeout) self.start = None self.end = None self.view = None self.view_cancellable = None self.events = [] def try_sync(self): if self.syncing: return if self.client.check_capability(ECal.STATIC_CAPABILITY_REFRESH_SUPPORTED): self.source.refresh_force_timeout() def on_refresh_timeout(self, source, data=None): self.client.refresh(None, self.on_sync_complete) def on_sync_complete(self, client, result, data=None): try: self.client.refresh_finish(result) except GLib.Error as e: print(f"Error refreshing calendar '{self.source.get_display_name()}':", e.message) self.syncing = False def destroy(self): self.extension.disconnect(self.color_prop_listener_id) self.extension = None self.disconnect(self.owner_color_signal_id) if self.view_cancellable is not None: self.view_cancellable.cancel() if self.view is not None: self.view.stop() self.view = None def ext_color_prop_changed(self, extension, pspect, data=None): self.color = self.extension.get_color() self.emit("color-changed") class Event: def __init__(self, uid, color, summary, all_day, start_timet, end_timet, mod_timet): self.__dict__.update(locals()) class CalendarServer(Gio.Application): def __init__(self, hold=False): Gio.Application.__init__(self, application_id=BUS_NAME, inactivity_timeout=20000, flags=Gio.ApplicationFlags.REPLACE | Gio.ApplicationFlags.ALLOW_REPLACEMENT | Gio.ApplicationFlags.IS_SERVICE) self._hold = hold self.bus_connection = None self.interface = None self.registry = None self.registry_watcher = None self.client_appeared_id = 0 self.client_disappeared_id = 0 self.calendars = {} self.current_month_start = 0 self.current_month_end = 0 self.zone = None self.update_timezone() try: self.session_bus = Gio.bus_get_sync(Gio.BusType.SESSION, None) except: print("Unable to get session connection, fatal!") exit(1) self.interface = Cinnamon.CalendarServerSkeleton.new() self.interface.connect("handle-set-time-range", self.handle_set_time_range) self.interface.connect("handle-exit", self.handle_exit) self.interface.export(self.session_bus, BUS_PATH) try: self.register(None) except GLib.Error as e: print("couldn't register on bus: ", e.message) def update_timezone(self): location = ECal.system_timezone_get_location() if location is None: self.zone = ICalGLib.Timezone.get_utc_timezone().copy() else: self.zone = ICalGLib.Timezone.get_builtin_timezone(location).copy() def do_startup(self): Gio.Application.do_startup(self) self.hold() EDataServer.SourceRegistry.new(None, self.got_registry_callback) def do_activate(self): pass def got_registry_callback(self, source, res): try: self.registry = EDataServer.SourceRegistry.new_finish(res) except GLib.Error as e: print(e) self.quit() return self.update_status() self.registry_watcher = EDataServer.SourceRegistryWatcher.new(self.registry, None) self.client_appeared_id = self.registry_watcher.connect("appeared", self.source_appeared) self.client_disappeared_id = self.registry_watcher.connect("disappeared", self.source_disappeared) self.registry_watcher.connect("filter", self.is_relevant_source) # This forces the watcher to notify about all pre-existing sources (so # the callbacks can process them) self.registry_watcher.reclaim() if not self._hold: self.release() def source_appeared(self, watcher, source): print("Discovered calendar: ", source.get_display_name()) self.hold() ECal.Client.connect(source, ECal.ClientSourceType.EVENTS, 10, None, self.ecal_client_connected, source) # ??? should be (self, source, res) but we get the client instead def ecal_client_connected(self, c, res, source): self.release() try: client = ECal.Client.connect_finish(res) client.set_default_timezone(self.zone) calendar = CalendarInfo(source, client) calendar.owner_color_signal_id = calendar.connect("color-changed", self.source_color_changed) self.calendars[source.get_uid()] = calendar self.update_status() if self.current_month_start != 0 and self.current_month_end != 0: self.create_view_for_calendar(calendar) except GLib.Error as e: # what to do print("couldn't connect to source", e.message) return def source_color_changed(self, calendar): self.create_view_for_calendar(calendar) def source_disappeared(self, watcher, source): try: calendar = self.calendars[source.get_uid()] except KeyError: # We had a source but it wasn't for a calendar. return self.interface.emit_client_disappeared(source.get_uid()) calendar.destroy() del self.calendars[source.get_uid()] self.update_status() def update_status(self): status = STATUS_NO_CALENDARS enabled_sources = self.registry.list_enabled(EDataServer.SOURCE_EXTENSION_CALENDAR) for source in enabled_sources: if self.is_relevant_source(None, source): status = STATUS_HAS_CALENDARS self.interface.set_property("status", status) if status == STATUS_NO_CALENDARS: self.exit() def is_relevant_source(self, watcher, source): relevant = source.has_extension(EDataServer.SOURCE_EXTENSION_CALENDAR) and \ source.get_extension(EDataServer.SOURCE_EXTENSION_CALENDAR).get_selected() return relevant def handle_set_time_range(self, iface, inv, time_since, time_until, force_reload): print("SET TIME: from %s to %s" % (GLib.DateTime.new_from_unix_local(time_since).format_iso8601(), GLib.DateTime.new_from_unix_local(time_until).format_iso8601())) self.hold() self.release() if time_since == self.current_month_start and time_until == self.current_month_end: if not force_reload: self.interface.complete_set_time_range(inv) return True for calendar in self.calendars.values(): calendar.try_sync() self.current_month_start = time_since self.current_month_end = time_until self.interface.set_property("since", time_since) self.interface.set_property("until", time_until) for uid in self.calendars.keys(): calendar = self.calendars[uid] self.create_view_for_calendar(calendar) self.interface.complete_set_time_range(inv) return True def handle_exit(self, iface, inv): self.exit() self.interface.complete_exit(inv) def create_view_for_calendar(self, calendar): self.hold() if calendar.view_cancellable is not None: calendar.view_cancellable.cancel() calendar.view_cancellable = Gio.Cancellable() if calendar.view is not None: calendar.view.stop() calendar.view = None from_iso = ECal.isodate_from_time_t(self.current_month_start) to_iso = ECal.isodate_from_time_t(self.current_month_end) calendar.start = self.current_month_start calendar.end = self.current_month_end query = "occur-in-time-range? (make-time \"%s\") (make-time \"%s\") \"%s\"" %\ (from_iso, to_iso, self.zone.get_location()) calendar.client.get_view(query, calendar.view_cancellable, self.got_calendar_view, calendar) def got_calendar_view(self, client, res, calendar): self.release() if calendar.view_cancellable.is_cancelled(): return try: success, view = client.get_view_finish(res) calendar.view = view except GLib.Error as e: print("get view failed: ", e.message) return view.set_flags(ECal.ClientViewFlags.NOTIFY_INITIAL) view.connect("objects-added", self.view_objects_added, calendar) view.connect("objects-modified", self.view_objects_modified, calendar) view.connect("objects-removed", self.view_objects_removed, calendar) view.start() def view_objects_added(self, view, objects, calendar): self.handle_new_or_modified_objects(view, objects, calendar) def view_objects_modified(self, view, objects, calendar): self.handle_new_or_modified_objects(view, objects, calendar) def view_objects_removed(self, view, component_ids, calendar): print("objects removed: ", component_ids) self.handle_removed_objects(view, component_ids, calendar) def handle_new_or_modified_objects(self, view, objects, calendar): if calendar.view_cancellable.is_cancelled(): return self.hold() events = [] for ical_comp in objects: if ical_comp.get_uid() is None: continue if (not ECal.util_component_is_instance (ical_comp)) and \ ECal.util_component_has_recurrences(ical_comp): calendar.client.generate_instances_for_object( ical_comp, calendar.start, calendar.end, calendar.view_cancellable, self.recurrence_generated, calendar ) else: comp = ECal.Component.new_from_icalcomponent(ical_comp) comptext = comp.get_summary() if comptext is not None: summary = comptext.get_value() else: summary = "" dts_prop = ical_comp.get_first_property(ICalGLib.PropertyKind.DTSTART_PROPERTY) ical_time_start = dts_prop.get_dtstart() start_timet = self.ical_time_get_timet(calendar.client, ical_time_start, dts_prop) all_day = ical_time_start.is_date() dte_prop = ical_comp.get_first_property(ICalGLib.PropertyKind.DTEND_PROPERTY) if dte_prop is not None: ical_time_end = dte_prop.get_dtend() end_timet = self.ical_time_get_timet(calendar.client, ical_time_end, dte_prop) else: end_timet = start_timet + (60 * 30) # Default to 30m if the end time is bad. mod_timet = self.get_mod_timet(ical_comp) event = Event( self.create_uid(calendar, comp), calendar.color, summary, all_day, start_timet, end_timet, mod_timet ) events.append(event) if len(events) > 0: self.emit_events_added_or_updated(calendar, events) self.release() def recurrence_generated(self, ical_comp, instance_start, instance_end, calendar, cancellable): if calendar.view_cancellable.is_cancelled(): return False comp = ECal.Component.new_from_icalcomponent(ical_comp) all_objects = GLib.VariantBuilder(GLib.VariantType.new("a(sssbxx)")) comptext = comp.get_summary() if comptext is not None: summary = comptext.get_value() else: summary = "" default_zone = calendar.client.get_default_timezone() dts_timezone = instance_start.get_timezone() if dts_timezone is None: dts_timezone = default_zone dte_timezone = instance_end.get_timezone() if dte_timezone is None: dte_timezone = default_zone all_day = instance_start.is_date() start_timet = instance_start.as_timet_with_zone(dts_timezone) end_timet = instance_end.as_timet_with_zone(dte_timezone) mod_timet = self.get_mod_timet(ical_comp) event = Event( self.create_uid(calendar, comp), calendar.color, summary, all_day, start_timet, end_timet, mod_timet ) self.emit_events_added_or_updated(calendar, [event]) return True def emit_events_added_or_updated(self, calendar, events): # print("package: ",len(events)) all_events = GLib.VariantBuilder(GLib.VariantType.new("a(sssbxxx)")) for event in events: if event.end_timet <= (calendar.start - 1) and event.start_timet >= calendar.end: continue event_var = GLib.Variant( "(sssbxxx)", [ event.uid, event.color, event.summary, event.all_day, event.start_timet, event.end_timet, event.mod_timet ] ) all_events.add_value(event_var) self.interface.emit_events_added_or_updated(all_events.end()) def get_mod_timet(self, ical_comp): # Both last-modified and created are optional. Try one, then the other, # then just return 0. The value isn't used except for comparison, when # checking if a received event is an update for an already existing one # in the applet. mod_timet = 0 mod_prop = ical_comp.get_first_property(ICalGLib.PropertyKind.LASTMODIFIED_PROPERTY) if mod_prop is not None: ical_time_modified = mod_prop.get_lastmodified() mod_timet = ical_time_modified.as_timet() else: created_prop = ical_comp.get_first_property(ICalGLib.PropertyKind.CREATED_PROPERTY) if created_prop is not None: ical_time_created = created_prop.get_created() mod_timet = ical_time_created.as_timet() return mod_timet def ical_time_get_timet(self, client, ical_time, prop): tzid = prop.get_first_parameter(ICalGLib.ParameterKind.TZID_PARAMETER) if tzid: timezone = ECal.TimezoneCache.get_timezone(client, tzid.get_tzid()) elif ical_time.is_utc(): timezone = ICalGLib.Timezone.get_utc_timezone() else: timezone = client.get_default_timezone() ical_time.set_timezone(timezone) return ical_time.as_timet_with_zone(timezone) def create_uid(self, calendar, ecal_comp): # format from gcal-event.c (gnome-calendar) source_id = calendar.source.get_uid() comp_id = ecal_comp.get_id() return self.get_id_from_comp_id(comp_id, source_id) def get_id_from_comp_id(self, comp_id, source_id): if comp_id.get_rid() is not None: return "%s:%s:%s" % (source_id, comp_id.get_uid(), comp_id.get_rid()) else: return "%s:%s" % (source_id, comp_id.get_uid()) def handle_removed_objects(self, view, component_ids, calendar): # what else? # print("handle: ", uuid_list) source_id = calendar.source.get_uid() uids = [] for comp_id in component_ids: uid = self.get_id_from_comp_id(comp_id, source_id) uids.append(uid) uids_string = "::".join(uids) if uids_string != "": self.interface.emit_events_removed(uids_string) def exit(self): if self.registry_watcher is not None: self.registry_watcher.disconnect(self.client_appeared_id) self.registry_watcher.disconnect(self.client_disappeared_id) for uid in self.calendars.keys(): self.calendars[uid].destroy() GLib.idle_add(self.quit) def main(): setproctitle("cinnamon-calendar-server") # For debugging, this will keep the process alive instead of exiting after 10s hold = False if len(sys.argv) > 1 and sys.argv[1] == "hold": print("idle exit disabled...") hold = True server = CalendarServer(hold) signal.signal(signal.SIGINT, lambda s, f: server.exit()) signal.signal(signal.SIGTERM, lambda s, f: server.exit()) # Only pass the first argument to the GApplication - or it will # complain the IS_SERVICE flag doesn't support arguments. server.run([sys.argv[0]]) return 0 if __name__ == "__main__": main() cinnamon-6.6.8/calendar-server/meson.build0000664000175000017500000000106515167446463017522 0ustar fabiofabio server_launcher_conf = configuration_data() server_launcher_conf.set('MUFFINLIBDIR', muffin_typelibdir) server_launcher_conf.set('PKGLIBDIR', join_paths(prefix, pkglibdir)) server_launcher_conf.set('LIBEXECDIR', join_paths(prefix, libexecdir)) launcher = configure_file( input: 'cinnamon-calendar-server.in', output: 'cinnamon-calendar-server', configuration: server_launcher_conf, install_dir: bindir, install_mode: 'rwxr-xr-x' ) install_data( 'cinnamon-calendar-server.py', install_dir: libexecdir, install_mode: 'rwxr-xr-x' ) cinnamon-6.6.8/cinnamon-wayland.session.in0000664000175000017500000000017015167446463017550 0ustar fabiofabio[Cinnamon Session] Name=Cinnamon RequiredComponents=cinnamon-wayland;nemo-autostart;@REQUIRED@ DesktopName=X-Cinnamon cinnamon-6.6.8/cinnamon.pot0000664000175000017500000103643315167446463014641 0ustar fabiofabio# 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. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-01-07 21:27+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: src/cinnamon-app.c:374 src/cinnamon-app.c:383 js/ui/endSessionDialog.js:290 #: js/ui/notificationDaemon.js:607 #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:46 #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:112 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:815 msgid "Unknown" msgstr "" #: src/cinnamon-app.c:660 #, c-format msgid "Failed to launch '%s'" msgstr "" #: src/cinnamon-keyring-prompt.c:765 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:324 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:461 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:462 msgid "Passwords do not match" msgstr "" #: src/cinnamon-keyring-prompt.c:773 msgid "Password cannot be blank" msgstr "" #: src/cinnamon-polkit-authentication-agent.c:348 msgid "Authentication dialog was dismissed by the user" msgstr "" #. menu@cinnamon.org->settings-schema.json->show-home->description #: src/cinnamon-util.c:96 msgid "Home" msgstr "" #: src/cinnamon-util.c:106 msgid "File System" msgstr "" #: src/cinnamon-util.c:259 #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2577 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:302 #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:446 #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:860 #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:225 msgid "Search" msgstr "" #: src/cinnamon-util.c:309 #, c-format msgid "%1$s: %2$s" msgstr "" #: src/main.c:284 msgid "Print version" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/input-sources-list.ui:9 msgid "Choose a Layout" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/input-sources-list.ui:24 msgid "Preview" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/input-sources-list.ui:39 #: js/ui/audioDeviceSelection.js:72 js/ui/endSessionDialog.js:108 #: js/ui/networkAgent.js:112 js/ui/polkitAuthenticationAgent.js:304 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:78 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:239 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:385 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:451 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:656 #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingWidgets.py:158 #: files/usr/share/cinnamon/cinnamon-settings/bin/XkbSettings.py:224 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:768 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:771 msgid "Cancel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/input-sources-list.ui:52 #: files/usr/share/cinnamon/cinnamon-settings/bin/input-sources-list.ui:221 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.ui:59 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.ui:163 #: files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js:54 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:385 #: files/usr/share/cinnamon/cinnamon-settings/bin/XkbSettings.py:176 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:55 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:79 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:763 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:425 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:775 msgid "Add" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/input-sources-list.ui:78 msgid "Type to search layouts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/input-sources-list.ui:130 msgid "Include less-common layouts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/input-sources-list.ui:165 msgid "Enabled layouts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/input-sources-list.ui:234 #: js/ui/panel.js:1746 #: files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js:62 #: files/usr/share/cinnamon/cinnamon-settings/bin/XkbSettings.py:181 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:56 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:80 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:438 msgid "Remove" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/input-sources-list.ui:287 msgid "View layout" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/input-sources-list.ui:301 #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:306 msgid "Configure" msgstr "" #. Display name ID Show it? Always False #. to start Icon #. menu@cinnamon.org->settings-schema.json->appearance->title #. printers@cinnamon.org->settings-schema.json->section1->description #: files/usr/share/cinnamon/cinnamon-settings/themes.ui:26 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:64 msgid "Appearance" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->tree->columns->title #: files/usr/share/cinnamon/cinnamon-settings/themes.ui:42 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:73 msgid "Color" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/themes.ui:56 msgid "" "In mixed mode most applications are light. Some desktop elements are dark to" " create contrast." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/themes.ui:100 msgid "Mixed" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/themes.ui:148 msgid "Dark" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/themes.ui:196 msgid "Light" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/themes.ui:241 msgid "Advanced settings..." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/themes.ui:257 msgid "Style" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/launcher-editor.ui:9 msgid "Launcher Properties" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/launcher-editor.ui:97 #: files/usr/share/cinnamon/cinnamon-desktop-editor/directory-editor.ui:97 #: files/usr/share/cinnamon/desklets/launcher@cinnamon.org/editorDialog.ui:104 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:772 msgid "Name:" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/launcher-editor.ui:112 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:773 msgid "Command:" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/launcher-editor.ui:127 #: files/usr/share/cinnamon/cinnamon-desktop-editor/directory-editor.ui:114 msgid "Comment:" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/launcher-editor.ui:171 msgid "Browse" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/launcher-editor.ui:202 msgid "Launch in Terminal?" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/launcher-editor.ui:216 msgid "Use dedicated GPU if available" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/directory-editor.ui:9 msgid "Directory Properties" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cinnamon-menu-editor.ui:8 msgid "Main Menu" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cinnamon-menu-editor.ui:28 msgid "Restore System Configuration" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cinnamon-menu-editor.ui:33 msgid "Restore the default menu layout" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cinnamon-menu-editor.ui:45 #: js/ui/workspace.js:1169 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:341 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:1031 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:483 msgid "Close" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cinnamon-menu-editor.ui:162 msgid "_New Menu" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cinnamon-menu-editor.ui:178 msgid "Ne_w Item" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cinnamon-menu-editor.ui:208 msgid "Cut" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cinnamon-menu-editor.ui:222 #: js/ui/cinnamonEntry.js:33 msgid "Copy" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cinnamon-menu-editor.ui:236 #: js/ui/cinnamonEntry.js:38 msgid "Paste" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cinnamon-menu-editor.ui:250 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.ui:72 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.ui:189 msgid "Delete" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cinnamon-menu-editor.ui:278 #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:534 msgid "Properties" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cinnamon-menu-editor.ui:292 msgid "Edit Desktop File" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.ui:176 #: files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js:58 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:431 msgid "Edit" msgstr "" #: files/usr/share/cinnamon/desklets/launcher@cinnamon.org/editorDialog.ui:7 msgid "Add/Edit Launcher" msgstr "" #: files/usr/share/cinnamon/desklets/launcher@cinnamon.org/editorDialog.ui:87 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:506 msgid "Type:" msgstr "" #: files/usr/share/cinnamon/desklets/launcher@cinnamon.org/editorDialog.ui:121 msgid "Title:" msgstr "" #: files/usr/share/cinnamon/desklets/launcher@cinnamon.org/editorDialog.ui:138 msgid "Program:" msgstr "" #: files/usr/share/cinnamon/desklets/launcher@cinnamon.org/editorDialog.ui:155 msgid "Icon Name" msgstr "" #: files/usr/share/cinnamon/desklets/launcher@cinnamon.org/editorDialog.ui:172 msgid "Application" msgstr "" #: files/usr/share/cinnamon/desklets/launcher@cinnamon.org/editorDialog.ui:173 msgid "Custom Application" msgstr "" #: js/misc/util.js:260 #, javascript-format msgid "Execution of '%s' failed:" msgstr "" #: js/ui/accessibility.js:139 msgid "Caps Lock On" msgstr "" #: js/ui/accessibility.js:140 msgid "Caps Lock Off" msgstr "" #: js/ui/accessibility.js:145 msgid "Number Lock On" msgstr "" #: js/ui/accessibility.js:146 msgid "Number Lock Off" msgstr "" #: js/ui/applet.js:570 js/ui/desklet.js:246 #, javascript-format msgid "Are you sure you want to remove '%s'?" msgstr "" #: js/ui/applet.js:583 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:167 #: files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js:79 #, javascript-format msgid "Remove '%s'" msgstr "" #: js/ui/applet.js:591 js/ui/desklet.js:230 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:159 #: files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js:71 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:959 msgid "About..." msgstr "" #: js/ui/applet.js:608 js/ui/desklet.js:235 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:163 #: files/usr/share/cinnamon/applets/nightlight@cinnamon.org/applet.js:18 #: files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js:75 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:963 msgid "Configure..." msgstr "" #: js/ui/appletManager.js:453 msgid "" "This applet does not support panels of that type. This can cause visual " "glitches in the panel. Would you like to continue using it anyway, remove it" " from the panel, or try to move it to a different panel?" msgstr "" #: js/ui/appletManager.js:462 msgid "Leave it" msgstr "" #: js/ui/appletManager.js:469 msgid "Remove it" msgstr "" #: js/ui/appletManager.js:476 msgid "Move to another panel" msgstr "" #: js/ui/appletManager.js:535 msgid "" "A suitable panel could not be found. The applet has been removed instead." msgstr "" #: js/ui/appletManager.js:812 msgid "" "Certain applets do not allow multiple instances or were at their max number " "of instances so were not copied" msgstr "" #: js/ui/audioDeviceSelection.js:58 msgid "Select Audio Device" msgstr "" #: js/ui/audioDeviceSelection.js:79 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:1526 msgid "Sound Settings" msgstr "" #: js/ui/audioDeviceSelection.js:86 #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:89 msgid "Headphones" msgstr "" #: js/ui/audioDeviceSelection.js:88 #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:85 msgid "Headset" msgstr "" #: js/ui/audioDeviceSelection.js:90 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:1084 msgid "Microphone" msgstr "" #: js/ui/cinnamonEntry.js:88 msgid "Show Text" msgstr "" #: js/ui/cinnamonEntry.js:90 msgid "Hide Text" msgstr "" #: js/ui/cinnamonEntry.js:176 msgid "Caps lock is on" msgstr "" #. Translators: %s is an application name #: js/ui/closeDialog.js:54 #, javascript-format msgid "%s is not responding" msgstr "" #: js/ui/closeDialog.js:55 msgid "" "You may choose to wait a short while for it to continue or force the app to " "quit entirely." msgstr "" #: js/ui/closeDialog.js:83 msgid "Wait" msgstr "" #: js/ui/closeDialog.js:88 msgid "Force Quit" msgstr "" #: js/ui/desklet.js:240 msgid "Remove this desklet" msgstr "" #: js/ui/endSessionDialog.js:71 msgid "Some applications are busy or have unsaved work." msgstr "" #: js/ui/endSessionDialog.js:135 #: files/usr/share/cinnamon/applets/user@cinnamon.org/applet.js:102 #: files/usr/share/cinnamon/applets/user@cinnamon.org/applet.js:111 #: files/usr/share/cinnamon/applets/user@cinnamon.org/applet.js:119 msgid "Switch User" msgstr "" #: js/ui/endSessionDialog.js:142 js/ui/endSessionDialog.js:149 #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2410 msgid "Log Out" msgstr "" #: js/ui/endSessionDialog.js:157 #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:212 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:12 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:607 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:616 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:624 msgid "Suspend" msgstr "" #: js/ui/endSessionDialog.js:167 #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:213 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:14 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:609 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:618 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:626 msgid "Hibernate" msgstr "" #: js/ui/endSessionDialog.js:177 js/ui/endSessionDialog.js:208 #: js/ui/endSessionDialog.js:215 msgid "Restart" msgstr "" #: js/ui/endSessionDialog.js:185 js/ui/endSessionDialog.js:193 #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2423 msgid "Shut Down" msgstr "" #: js/ui/endSessionDialog.js:254 #, javascript-format msgid "You will be logged out in %d second." msgid_plural "You will be logged out in %d seconds." msgstr[0] "" msgstr[1] "" #: js/ui/endSessionDialog.js:260 #, javascript-format msgid "The computer will shut down in %d second." msgid_plural "The computer will shut down in %d seconds." msgstr[0] "" msgstr[1] "" #: js/ui/endSessionDialog.js:266 #, javascript-format msgid "The computer will restart in %d second." msgid_plural "The computer will restart in %d seconds." msgstr[0] "" msgstr[1] "" #: js/ui/endSessionDialog.js:312 msgid "Ignore and continue" msgstr "" #: js/ui/expoThumbnail.js:946 #: files/usr/share/cinnamon/applets/workspace-switcher@cinnamon.org/applet.js:34 #, javascript-format msgid "" "Are you sure you want to remove workspace \"%s\"?\n" "\n" msgstr "" #: js/ui/extension.js:524 msgid "Initializing" msgstr "" #: js/ui/extension.js:526 msgid "Loaded" msgstr "" #: js/ui/extension.js:528 msgid "Error" msgstr "" #: js/ui/extension.js:530 msgid "Out of date" msgstr "" #: js/ui/extension.js:532 msgid "Not compatible with Wayland" msgstr "" #: js/ui/hotCorner.js:338 msgid "Invalid overview options: Incorrect number of corners" msgstr "" #: js/ui/lookingGlass.js:620 msgid "Execution time (ms): " msgstr "" #: js/ui/lookingGlass.js:703 msgid "Loaded successfully" msgstr "" #: js/ui/main.js:591 msgid "Check your video drivers" msgstr "" #: js/ui/main.js:592 msgid "Your system is currently running without video hardware acceleration." msgstr "" #: js/ui/main.js:594 msgid "You may experience poor performance and high CPU usage." msgstr "" #: js/ui/main.js:598 msgid "Launch Driver Manager" msgstr "" #: js/ui/main.js:607 msgid "Problems during Cinnamon startup" msgstr "" #: js/ui/main.js:608 msgid "" "Cinnamon started successfully, but one or more applets, desklets or extensions failed to load.\n" "\n" msgstr "" #: js/ui/main.js:609 msgid "" "Check your system log and the Cinnamon LookingGlass log for any issues. " msgstr "" #: js/ui/main.js:610 msgid "" "You can disable the offending extension(s) in Cinnamon Settings to prevent " "this message from recurring. " msgstr "" #: js/ui/main.js:611 msgid "Please contact the developer." msgstr "" #: js/ui/main.js:661 msgid "Workspace" msgstr "" #: js/ui/main.js:1621 msgid "Restarting Cinnamon..." msgstr "" #: js/ui/messageTray.js:1109 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:85 msgid "System Information" msgstr "" #: js/ui/modalDialog.js:392 msgid "Confirm" msgstr "" #: js/ui/modalDialog.js:400 files/usr/bin/cinnamon-launcher:172 msgid "No" msgstr "" #: js/ui/modalDialog.js:405 files/usr/bin/cinnamon-launcher:173 msgid "Yes" msgstr "" #: js/ui/modalDialog.js:438 msgid "Attention" msgstr "" #: js/ui/modalDialog.js:445 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:78 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:451 msgid "OK" msgstr "" #: js/ui/monitorLabeler.js:32 msgid "Mirrored Displays" msgstr "" #: js/ui/networkAgent.js:94 msgid "You can also connect by pushing the “WPS” button on your router." msgstr "" #: js/ui/networkAgent.js:106 msgid "Connect" msgstr "" #: js/ui/networkAgent.js:207 js/ui/networkAgent.js:219 #: js/ui/networkAgent.js:243 js/ui/networkAgent.js:264 #: js/ui/networkAgent.js:284 js/ui/networkAgent.js:294 #: js/ui/polkitAuthenticationAgent.js:454 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:591 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:93 msgid "Password" msgstr "" #: js/ui/networkAgent.js:212 msgid "Key" msgstr "" #: js/ui/networkAgent.js:239 js/ui/networkAgent.js:262 #: js/ui/networkAgent.js:280 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:376 msgid "Username" msgstr "" #: js/ui/networkAgent.js:247 js/ui/networkAgent.js:270 msgid "Private key password" msgstr "" #: js/ui/networkAgent.js:268 msgid "Identity" msgstr "" #: js/ui/networkAgent.js:282 msgid "Service" msgstr "" #: js/ui/networkAgent.js:311 js/ui/networkAgent.js:339 #: js/ui/networkAgent.js:651 js/ui/networkAgent.js:672 msgid "Authentication required" msgstr "" #: js/ui/networkAgent.js:312 js/ui/networkAgent.js:652 #, javascript-format msgid "" "Passwords or encryption keys are required to access the wireless network " "“%s”." msgstr "" #: js/ui/networkAgent.js:316 js/ui/networkAgent.js:656 msgid "Wired 802.1X authentication" msgstr "" #: js/ui/networkAgent.js:318 msgid "Network name" msgstr "" #: js/ui/networkAgent.js:323 js/ui/networkAgent.js:660 msgid "DSL authentication" msgstr "" #: js/ui/networkAgent.js:330 js/ui/networkAgent.js:665 msgid "PIN code required" msgstr "" #: js/ui/networkAgent.js:331 js/ui/networkAgent.js:666 msgid "PIN code is needed for the mobile broadband device" msgstr "" #: js/ui/networkAgent.js:332 msgid "PIN" msgstr "" #: js/ui/networkAgent.js:340 js/ui/networkAgent.js:657 #: js/ui/networkAgent.js:661 js/ui/networkAgent.js:673 #: js/ui/networkAgent.js:677 #, javascript-format msgid "A password is required to connect to “%s”." msgstr "" #. network@cinnamon.org->metadata.json->name #: js/ui/networkAgent.js:641 #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1784 msgid "Network Manager" msgstr "" #: js/ui/networkAgent.js:676 msgid "VPN password" msgstr "" #: js/ui/panel.js:407 msgid "Select position of new panel. Esc to cancel." msgstr "" #: js/ui/panel.js:408 msgid "Select new position of panel. Esc to cancel." msgstr "" #: js/ui/panel.js:1017 msgid "" "You don't have any panels added.\n" "Do you want to open panel settings?" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->section1->title #: js/ui/panel.js:1711 msgid "Panel settings" msgstr "" #: js/ui/panel.js:1714 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:34 msgid "Applets" msgstr "" #: js/ui/panel.js:1723 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:211 msgid "Panel edit mode" msgstr "" #: js/ui/panel.js:1739 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:54 msgid "Move" msgstr "" #: js/ui/panel.js:1748 msgid "Are you sure you want to remove this panel?" msgstr "" #: js/ui/panel.js:1756 msgid "Add a new panel" msgstr "" #: js/ui/panel.js:1798 msgid "Troubleshoot" msgstr "" #: js/ui/panel.js:1799 #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:214 msgid "Restart Cinnamon" msgstr "" #: js/ui/panel.js:1803 msgid "Looking Glass" msgstr "" #: js/ui/panel.js:1807 msgid "Restore all settings to default" msgstr "" #: js/ui/panel.js:1808 msgid "" "Are you sure you want to restore all settings to default?\n" "\n" msgstr "" #. i18n for menu item #. set up larger components. #: js/ui/panel.js:1820 #: files/usr/share/cinnamon/applets/user@cinnamon.org/applet.js:72 #: generate_additional_files.py:24 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:41 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:196 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:390 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:734 msgid "System Settings" msgstr "" #: js/ui/placesManager.js:168 msgid "Retry" msgstr "" #: js/ui/placesManager.js:192 #, javascript-format msgid "%s (%s) has just been stopped." msgstr "" #: js/ui/placesManager.js:193 #, javascript-format msgid "Device %s can be turned off, if necessary." msgstr "" #: js/ui/placesManager.js:199 js/ui/placesManager.js:232 #: js/ui/placesManager.js:279 #, javascript-format msgid "Device %s is busy, please wait." msgstr "" #: js/ui/placesManager.js:200 js/ui/placesManager.js:280 msgid "Do not disconnect or data loss may occur." msgstr "" #: js/ui/placesManager.js:207 #, javascript-format msgid "Unable to stop the drive %s (%s)" msgstr "" #: js/ui/placesManager.js:223 #, javascript-format msgid "%s (%s) can be safely unplugged." msgstr "" #: js/ui/placesManager.js:224 #, javascript-format msgid "Device %s can be removed." msgstr "" #: js/ui/placesManager.js:226 #, javascript-format msgid "%s (%s) has just been ejected." msgstr "" #: js/ui/placesManager.js:233 msgid "Do not remove or data loss may occur." msgstr "" #: js/ui/placesManager.js:240 #, javascript-format msgid "Unable to eject the drive %s (%s)" msgstr "" #: js/ui/placesManager.js:249 #, javascript-format msgid "Successfully unmounted %s (%s)" msgstr "" #: js/ui/placesManager.js:287 #, javascript-format msgid "Failed to unmount %s (%s)" msgstr "" #: js/ui/polkitAuthenticationAgent.js:54 #, javascript-format msgid "Superuser (%s)" msgstr "" #: js/ui/polkitAuthenticationAgent.js:144 msgid "Authentication Required" msgstr "" #: js/ui/polkitAuthenticationAgent.js:309 msgid "Authenticate" msgstr "" #. Translators: "that didn't work" refers to the fact that the #. * requested authentication was not gained; this can happen #. * because of an authentication error (like invalid password), #. * for instance. #: js/ui/polkitAuthenticationAgent.js:431 msgid "Sorry, that didn't work. Please try again." msgstr "" #: js/ui/runDialog.js:160 msgid "Run a Command" msgstr "" #: js/ui/runDialog.js:177 js/ui/runDialog.js:461 msgid "Press ESC to close" msgstr "" #. Translators: This string should be shorter than 30 characters #: js/ui/windowManager.js:73 msgid "Keep these display settings?" msgstr "" #. Translators: this and the following message should be limited in length, #. to avoid ellipsizing the labels. #: js/ui/windowManager.js:82 msgid "Revert" msgstr "" #: js/ui/windowManager.js:86 msgid "Keep changes" msgstr "" #: js/ui/windowManager.js:103 #, javascript-format msgid "Reverting to previous display settings in %d second." msgid_plural "Reverting to previous display settings in %d seconds." msgstr[0] "" msgstr[1] "" #. Translators: If a language-specific mnemonic doesn't make sense, add one #. after the label itself: #. i.e. (_n). See #. https://github.com/linuxmint/muffin/blob/b9a6f3fe43e/po .po files #: js/ui/windowMenu.js:196 msgid "Mi_nimize" msgstr "" #. Translators: If a language-specific mnemonic doesn't make sense, add one #. after the label itself: #. i.e. (_n). See #. https://github.com/linuxmint/muffin/blob/b9a6f3fe43e/po .po files #: js/ui/windowMenu.js:207 msgid "Unma_ximize" msgstr "" #. Translators: If a language-specific mnemonic doesn't make sense, add one #. after the label itself: #. i.e. (_n). See #. https://github.com/linuxmint/muffin/blob/b9a6f3fe43e/po .po files #: js/ui/windowMenu.js:213 msgid "Ma_ximize" msgstr "" #. Translators: If a language-specific mnemonic doesn't make sense, add one #. after the label itself: #. i.e. (_n). See #. https://github.com/linuxmint/muffin/blob/b9a6f3fe43e/po .po files #: js/ui/windowMenu.js:223 msgid "_Move" msgstr "" #. Translators: If a language-specific mnemonic doesn't make sense, add one #. after the label itself: #. i.e. (_n). See #. https://github.com/linuxmint/muffin/blob/b9a6f3fe43e/po .po files #: js/ui/windowMenu.js:231 msgid "_Resize" msgstr "" #. Translators: If a language-specific mnemonic doesn't make sense, add one #. after the label itself: #. i.e. (_n). See #. https://github.com/linuxmint/muffin/blob/b9a6f3fe43e/po .po files #: js/ui/windowMenu.js:240 msgid "Move Titlebar Onscreen" msgstr "" #. Translators: If a language-specific mnemonic doesn't make sense, add one #. after the label itself: #. i.e. (_n). See #. https://github.com/linuxmint/muffin/blob/b9a6f3fe43e/po .po files #: js/ui/windowMenu.js:249 msgid "Always on _Top" msgstr "" #. Translators: If a language-specific mnemonic doesn't make sense, add one #. after the label itself: #. i.e. (_n). See #. https://github.com/linuxmint/muffin/blob/b9a6f3fe43e/po .po files #: js/ui/windowMenu.js:271 msgid "_Always on Visible Workspace" msgstr "" #. Translators: If a language-specific mnemonic doesn't make sense, add one #. after the label itself: #. i.e. (_n). See #. https://github.com/linuxmint/muffin/blob/b9a6f3fe43e/po .po files #: js/ui/windowMenu.js:276 msgid "_Only on This Workspace" msgstr "" #. Translators: If a language-specific mnemonic doesn't make sense, add one #. after the label itself: #. i.e. (_n). See #. https://github.com/linuxmint/muffin/blob/b9a6f3fe43e/po .po files #: js/ui/windowMenu.js:289 msgid "Move to Another _Workspace" msgstr "" #. Translators: If a language-specific mnemonic doesn't make sense, add one #. after the label itself: #. i.e. (_n). See #. https://github.com/linuxmint/muffin/blob/b9a6f3fe43e/po .po files #: js/ui/windowMenu.js:339 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:950 msgid "_Close" msgstr "" #: js/ui/workspace.js:538 #: files/usr/share/cinnamon/applets/windows-quick-list@cinnamon.org/applet.js:141 msgid "No open windows" msgstr "" #: js/ui/workspace.js:1173 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:288 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:1005 msgid "Restore" msgstr "" #: js/ui/workspace.js:1175 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:293 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:1010 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:57 msgid "Minimize" msgstr "" #: js/ui/workspace.js:1178 js/ui/workspace.js:1252 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:306 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:1023 msgid "Maximize" msgstr "" #: js/ui/workspace.js:1181 msgid "Move to left workspace" msgstr "" #: js/ui/workspace.js:1184 msgid "Move to right workspace" msgstr "" #: js/ui/workspace.js:1187 js/ui/workspace.js:1237 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:121 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:927 msgid "Visible on all workspaces" msgstr "" #: js/ui/workspace.js:1190 msgid "Move to a new workspace" msgstr "" #: js/ui/workspace.js:1200 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:910 #, javascript-format msgid "Move to monitor %d" msgstr "" #: js/ui/workspace.js:1235 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:111 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:921 msgid "Only on this workspace" msgstr "" #: js/ui/workspace.js:1250 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:299 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:1018 msgid "Unmaximize" msgstr "" #. a11y@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:45 #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:149 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:31 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:41 msgid "Accessibility" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:54 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:38 msgid "Zoom" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:62 msgid "Screen Reader" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:67 msgid "Screen Keyboard" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:73 msgid "Sticky Keys" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:76 msgid "Slow Keys" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:79 msgid "Bounce Keys" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:84 msgid "Mouse Keys" msgstr "" #. Secondary click #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:87 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:364 msgid "Simulated secondary click" msgstr "" #. Hover Click #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:90 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:383 #: files/usr/bin/cinnamon-hover-click:29 msgid "Hover click" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:94 msgid "Universal Access Settings" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:186 msgid "High Contrast" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:231 msgid "Large Text" msgstr "" #: files/usr/share/cinnamon/applets/calendar@cinnamon.org/applet.js:18 msgid "%B %-e, %Y" msgstr "" #. Translators: This is the date which appears in the calendar #. applet, as a tooltip and as a title header inside the applet. #. The format uses the strftime syntax. #. %A, %B %-e, %Y is the American Date format (Saturday, January 4, 2020): #. %A is the name of the day, %B is the name of the month #. %-e is the non-padded day number, %Y is the year. #. for info on the strftime format visit: http://man7.org/linux/man- #. pages/man3/strftime.3.html #. for info on international date formats visit: #. http://www.localeplanet.com/compare/date-pattern.html?pat=FULL #: files/usr/share/cinnamon/applets/calendar@cinnamon.org/applet.js:19 #: files/usr/share/cinnamon/applets/calendar@cinnamon.org/eventView.js:26 #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:313 msgid "%A, %B %-e, %Y" msgstr "" #: files/usr/share/cinnamon/applets/calendar@cinnamon.org/applet.js:130 #: files/usr/share/cinnamon/desklets/clock@cinnamon.org/desklet.js:24 msgid "Date and Time Settings" msgstr "" #: files/usr/share/cinnamon/applets/calendar@cinnamon.org/eventView.js:66 msgid "Starting in a few minutes" msgstr "" #: files/usr/share/cinnamon/applets/calendar@cinnamon.org/eventView.js:70 #, javascript-format msgid "Starting in %d minutes" msgstr "" #: files/usr/share/cinnamon/applets/calendar@cinnamon.org/eventView.js:80 msgid "This evening" msgstr "" #: files/usr/share/cinnamon/applets/calendar@cinnamon.org/eventView.js:83 msgid "Starting later today" msgstr "" #: files/usr/share/cinnamon/applets/calendar@cinnamon.org/eventView.js:86 #, javascript-format msgid "In %d hour" msgid_plural "In %d hours" msgstr[0] "" msgstr[1] "" #: files/usr/share/cinnamon/applets/calendar@cinnamon.org/eventView.js:694 msgid "No Events" msgstr "" #: files/usr/share/cinnamon/applets/calendar@cinnamon.org/eventView.js:967 msgid "In progress" msgstr "" #: files/usr/share/cinnamon/applets/calendar@cinnamon.org/eventView.js:988 msgid "All day" msgstr "" #: files/usr/share/cinnamon/applets/calendar@cinnamon.org/eventView.js:1015 #: files/usr/share/cinnamon/applets/calendar@cinnamon.org/eventView.js:1038 #: files/usr/share/cinnamon/applets/calendar@cinnamon.org/eventView.js:1076 #: files/usr/share/cinnamon/applets/calendar@cinnamon.org/eventView.js:1098 #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:259 msgid "Today" msgstr "" #. Scale #. cornerbar@cinnamon.org->settings-schema.json->click-action->options #. cornerbar@cinnamon.org->settings-schema.json->middle-click-action->options #. cornerbar@cinnamon.org->settings-schema.json->shift-click-action->options #. cornerbar@cinnamon.org->settings-schema.json->shift-middle-click- #. action->options #: files/usr/share/cinnamon/applets/cornerbar@cinnamon.org/applet.js:61 #: files/usr/share/cinnamon/applets/cornerbar@cinnamon.org/applet.js:77 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_hotcorner.py:197 msgid "Show the desktop" msgstr "" #. cornerbar@cinnamon.org->settings-schema.json->click-action->options #. cornerbar@cinnamon.org->settings-schema.json->middle-click-action->options #. cornerbar@cinnamon.org->settings-schema.json->shift-click-action->options #. cornerbar@cinnamon.org->settings-schema.json->shift-middle-click- #. action->options #: files/usr/share/cinnamon/applets/cornerbar@cinnamon.org/applet.js:64 #: files/usr/share/cinnamon/applets/cornerbar@cinnamon.org/applet.js:79 msgid "Show the desklets" msgstr "" #. ["WORKSPACE_UP", _("Switch to the workspace above"), "none", ""], #. ["WORKSPACE_DOWN", _("Switch to the workspace below"), "none", ""], #. cornerbar@cinnamon.org->settings-schema.json->click-action->options #. cornerbar@cinnamon.org->settings-schema.json->middle-click-action->options #. cornerbar@cinnamon.org->settings-schema.json->shift-click-action->options #. cornerbar@cinnamon.org->settings-schema.json->shift-middle-click- #. action->options #: files/usr/share/cinnamon/applets/cornerbar@cinnamon.org/applet.js:67 #: files/usr/share/cinnamon/applets/cornerbar@cinnamon.org/applet.js:81 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:26 msgid "Show the workspace selector (Expo)" msgstr "" #. cornerbar@cinnamon.org->settings-schema.json->click-action->options #. cornerbar@cinnamon.org->settings-schema.json->middle-click-action->options #. cornerbar@cinnamon.org->settings-schema.json->shift-click-action->options #. cornerbar@cinnamon.org->settings-schema.json->shift-middle-click- #. action->options #: files/usr/share/cinnamon/applets/cornerbar@cinnamon.org/applet.js:70 #: files/usr/share/cinnamon/applets/cornerbar@cinnamon.org/applet.js:83 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:27 msgid "Show the window selector (Scale)" msgstr "" #. expo@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/expo@cinnamon.org/applet.js:12 msgid "Expo" msgstr "" #. menu@cinnamon.org->settings-schema.json->show-favorites->description #. favorites@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/favorites@cinnamon.org/applet.js:46 #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2284 msgid "Favorites" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:101 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:900 msgid "Move to the other monitor" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:102 msgid "Move to monitor " msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:128 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:933 msgid "Move to another workspace" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:156 #: files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js:68 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:956 msgid "Applet preferences" msgstr "" #. grouped-window-list@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:167 msgid "Grouped window list" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:188 msgid "Recent" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:209 #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:511 #: files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js:49 msgid "Run with dedicated GPU" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:254 msgid "Unpin from Panel" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:257 msgid "Pin to Panel" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:264 msgid "Remove from Autostart" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:264 msgid "Add to Autostart" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:271 msgid "Create Shortcut" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:282 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:997 msgid "Restore to full opacity" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:318 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:983 msgid "Close others" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:331 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:974 msgid "Close all" msgstr "" #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:54 msgid "Power management" msgstr "" #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:118 #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:483 msgid "Power management: Inhibited" msgstr "" #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:121 #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:482 msgid "Power management: Active" msgstr "" #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:125 msgid "Power management is already inhibited by another program" msgstr "" #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:126 msgid "Power management: inhibited by another program" msgstr "" #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:245 msgid "Apps inhibiting power management:" msgstr "" #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:395 msgid "Inhibit applet" msgstr "" #. notifications@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:398 #: files/usr/share/cinnamon/applets/notifications@cinnamon.org/applet.js:74 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:39 msgid "Notifications" msgstr "" #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:496 msgid "Notifications: Active" msgstr "" #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:497 msgid "Notifications: Inhibited" msgstr "" #: files/usr/share/cinnamon/applets/keyboard@cinnamon.org/applet.js:79 msgid "Show Keyboard Layout" msgstr "" #: files/usr/share/cinnamon/applets/keyboard@cinnamon.org/applet.js:80 msgid "Show Character Table" msgstr "" #: files/usr/share/cinnamon/applets/keyboard@cinnamon.org/applet.js:84 msgid "Manage keyboard layouts" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:414 #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:524 msgid "Remove from favorites" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:421 #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:527 msgid "Add to favorites" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:515 msgid "Add to panel" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:519 msgid "Add to desktop" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:539 #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:912 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_actions.py:84 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:57 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:81 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_extensions.py:56 msgid "Uninstall" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:782 #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:823 msgid "This file is no longer available" msgstr "" #. menu@cinnamon.org->metadata.json->name #. menu@cinnamon.org->settings-schema.json->behavior-menu->title #. sound@cinnamon.org->settings-schema.json->section1->description #. network@cinnamon.org->settings-schema.json->section1->description #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:1131 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:57 msgid "Menu" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:1136 msgid "Edit menu" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2221 msgid "Recent Files" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2237 #: files/usr/share/cinnamon/applets/recent@cinnamon.org/applet.js:125 msgid "Clear list" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2238 msgid "Clear all recent documents" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2254 #: files/usr/share/cinnamon/applets/recent@cinnamon.org/applet.js:130 msgid "No recent documents" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2302 msgid "No favorite documents" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2334 msgid "All Applications" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2384 #: files/usr/share/cinnamon/applets/user@cinnamon.org/applet.js:80 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:610 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:615 msgid "Lock Screen" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2385 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:11 msgid "Lock the screen" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2411 msgid "Leave the session" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2424 msgid "Shut down the computer" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2502 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:38 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:52 msgid "Account details" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:88 msgid "" msgstr "" #. Translators: this indicates that wireless or wwan is disabled by hardware #. killswitch #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:306 msgid "disabled" msgstr "" #. Translators: this is for network devices that are physically present but #. are not #. under NetworkManager's control (and thus cannot be used in the menu) #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:513 msgid "unmanaged" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:515 msgid "disconnecting..." msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:521 msgid "connecting..." msgstr "" #. Translators: this is for network connections that require some kind of key #. or password #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:524 msgid "authentication required" msgstr "" #. Translators: this is for devices that require some kind of firmware or #. kernel #. module, which is missing #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:534 msgid "firmware missing" msgstr "" #. Translators: this is for wired network devices that are physically #. disconnected #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:541 msgid "cable unplugged" msgstr "" #. Translators: this is for a network device that cannot be activated (for #. example it #. is disabled by rfkill, or it has no coverage #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:546 msgid "unavailable" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:548 msgid "connection failed" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:614 #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1745 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:458 msgid "More" msgstr "" #. Translators: this is the indication that a connection for another logged in #. user is active, #. and we cannot access its settings (including the name) #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:650 #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1030 #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1663 msgid "Connected (private)" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:711 msgid "Ethernet" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:712 msgid "Wifi" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:713 #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:81 msgid "Modem" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:714 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:99 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:100 msgid "Bluetooth" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:715 msgid "WireGuard" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:745 msgid "Auto Ethernet" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:827 msgid "Auto broadband" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:830 msgid "Auto dial-up" msgstr "" #. Translators: this the automatic wireless connection name (including the #. network name) #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:953 #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1676 #, javascript-format msgid "Auto %s" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:955 msgid "Auto bluetooth" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1678 msgid "Auto wireless" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1847 msgid "Enable networking" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1859 msgid "Wired" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1870 msgid "Wireless" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1880 msgid "Mobile broadband" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1890 msgid "VPN Connections" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1905 msgid "WIREGUARD Connections" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1917 msgid "Network Settings" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1918 msgid "Network Connections" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2098 msgid "Connection failed" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2099 msgid "Activation of network connection failed" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2385 msgid "Networking is disabled" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2403 msgid "No connection" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2409 msgid "Connecting to the cellular network..." msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2413 msgid "Connecting to the wireless network..." msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2417 msgid "Connecting to the wired network..." msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2421 #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2524 msgid "Connecting to the VPN..." msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2425 msgid "Connecting to WIREGUARD..." msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2431 msgid "Connecting to the network..." msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2450 msgid "Connected to the wireless network" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2454 #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2457 msgid "Wireless connection" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2454 #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2467 #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2489 msgid "(Limited connectivity)" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2467 #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2471 msgid "Connected to the wired network" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2483 #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2489 #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2492 msgid "Connected to the cellular network" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2500 #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2537 msgid "Connected to the VPN" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2506 #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2518 msgid "Connected to WIREGUARD" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2512 msgid "Connected to the network" msgstr "" #. notifications@cinnamon.org->settings-schema.json->keyClear->description #: files/usr/share/cinnamon/applets/notifications@cinnamon.org/applet.js:89 msgid "Clear notifications" msgstr "" #: files/usr/share/cinnamon/applets/notifications@cinnamon.org/applet.js:125 msgid "Notification Settings" msgstr "" #: files/usr/share/cinnamon/applets/notifications@cinnamon.org/applet.js:327 msgid "No notifications" msgstr "" #: files/usr/share/cinnamon/applets/notifications@cinnamon.org/applet.js:329 #, javascript-format msgid "%d notification" msgid_plural "%d notifications" msgstr[0] "" msgstr[1] "" #: files/usr/share/cinnamon/applets/notifications@cinnamon.org/applet.js:346 msgid "just now" msgstr "" #: files/usr/share/cinnamon/applets/notifications@cinnamon.org/applet.js:349 #, javascript-format msgid "%d second ago" msgid_plural "%d seconds ago" msgstr[0] "" msgstr[1] "" #: files/usr/share/cinnamon/applets/notifications@cinnamon.org/applet.js:353 #, javascript-format msgid "%d minute ago" msgid_plural "%d minutes ago" msgstr[0] "" msgstr[1] "" #: files/usr/share/cinnamon/applets/on-screen-keyboard@cinnamon.org/applet.js:14 msgid "Enable on-screen keyboard" msgstr "" #: files/usr/share/cinnamon/applets/on-screen-keyboard@cinnamon.org/applet.js:19 msgid "Virtual keyboard settings" msgstr "" #: files/usr/share/cinnamon/applets/on-screen-keyboard@cinnamon.org/applet.js:32 msgid "Click to toggle the on-screen keyboard" msgstr "" #: files/usr/share/cinnamon/applets/on-screen-keyboard@cinnamon.org/applet.js:36 msgid "Click to enable the on-screen keyboard" msgstr "" #: files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js:44 msgid "Launch" msgstr "" #. panel-launchers@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js:79 msgid "Panel launchers" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:28 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:49 msgid "Power Saver" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:29 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:50 msgid "Balanced" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:30 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:51 msgid "Performance" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:36 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:562 msgid "Battery full" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:38 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:564 msgid "Battery almost full" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:40 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:566 msgid "Battery good" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:42 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:568 msgid "Low battery" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:44 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:570 msgid "Critically low battery" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:53 msgid "AC adapter" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:55 msgid "Laptop battery" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:57 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:409 msgid "UPS" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:59 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:67 msgid "Monitor" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:61 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:325 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:84 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:86 msgid "Mouse" msgstr "" #. keyboard@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:63 #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:70 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:147 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:35 msgid "Keyboard" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:65 msgid "PDA" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:67 msgid "Cell phone" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:69 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:489 msgid "Media player" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:71 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:480 msgid "Tablet" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:73 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:492 msgid "Computer" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:75 msgid "Gaming input" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:77 msgid "Pen" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:79 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:138 msgid "Touchpad" msgstr "" #. Label Module ID Icon #. Category Keywords for filter #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:83 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:72 msgid "Network" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:87 msgid "Speakers" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:91 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:60 msgid "Video" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:93 msgid "Audio device" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:95 msgid "Remote control" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:97 msgid "Printer" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:99 msgid "Scanner" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:101 msgid "Camera" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:103 msgid "Wearable" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:105 msgid "Toy" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:107 msgid "Bluetooth device" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:386 #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:808 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:263 msgid "Brightness" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:387 #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:814 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:289 msgid "Keyboard backlight" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:441 msgid "Power Settings" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:526 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:440 msgid "Charging" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:530 #, javascript-format msgid "Charging - %d hour until fully charged" msgid_plural "Charging - %d hours until fully charged" msgstr[0] "" msgstr[1] "" #. Translators: this is a time string, as in "%d hours %d minutes remaining" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:534 #, javascript-format msgid "Charging - %d %s %d %s until fully charged" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:535 #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:556 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:89 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:97 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:100 msgid "hour" msgid_plural "hours" msgstr[0] "" msgstr[1] "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:535 #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:556 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:79 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:97 msgid "minute" msgid_plural "minutes" msgstr[0] "" msgstr[1] "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:539 #, javascript-format msgid "Charging - %d minute until fully charged" msgid_plural "Charging - %d minutes until fully charged" msgstr[0] "" msgstr[1] "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:543 msgid "Fully charged" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:547 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:444 msgid "Using battery power" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:551 #, javascript-format msgid "Using battery power - %d hour remaining" msgid_plural "Using battery power - %d hours remaining" msgstr[0] "" msgstr[1] "" #. Translators: this is a time string, as in "%d hours %d minutes remaining" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:555 #, javascript-format msgid "Using battery power - %d %s %d %s remaining" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:560 #, javascript-format msgid "Using battery power - %d minute remaining" msgid_plural "Using battery power - %d minutes remaining" msgstr[0] "" msgstr[1] "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:564 msgid "Fully discharged" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:567 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:442 msgid "Not charging" msgstr "" #. Label Executable #. Icon Category Keywords for filter #. printers@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/printers@cinnamon.org/applet.js:22 #: files/usr/share/cinnamon/applets/printers@cinnamon.org/applet.js:132 #: files/usr/share/cinnamon/applets/printers@cinnamon.org/applet.js:246 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:79 msgid "Printers" msgstr "" #: files/usr/share/cinnamon/applets/printers@cinnamon.org/applet.js:167 msgid "Cancel all jobs" msgstr "" #: files/usr/share/cinnamon/applets/printers@cinnamon.org/applet.js:197 #, javascript-format msgid "'%s' on %s" msgstr "" #: files/usr/share/cinnamon/applets/printers@cinnamon.org/applet.js:214 msgid "Send to front" msgstr "" #. recent@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/recent@cinnamon.org/applet.js:39 msgid "Recent documents" msgstr "" #. removable-drives@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/removable-drives@cinnamon.org/applet.js:45 msgid "Removable drives" msgstr "" #: files/usr/share/cinnamon/applets/removable-drives@cinnamon.org/applet.js:59 msgid "Open file manager" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->launcher-animation- #. effect->options #. scale@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/scale@cinnamon.org/applet.js:12 msgid "Scale" msgstr "" #. show-desktop@cinnamon.org->settings-schema.json->head->description #. favorites@cinnamon.org->settings-schema.json->head->description #. cornerbar@cinnamon.org->settings-schema.json->head->description #: files/usr/share/cinnamon/applets/settings@cinnamon.org/applet.js:8 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:291 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:47 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:48 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:244 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:73 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:270 msgid "Settings" msgstr "" #: files/usr/share/cinnamon/applets/settings-example@cinnamon.org/applet.js:63 msgid "Hi there!" msgstr "" #: files/usr/share/cinnamon/applets/settings-example@cinnamon.org/applet.js:96 msgid "YOU PRESSED THE BUTTON!!!" msgstr "" #: files/usr/share/cinnamon/applets/settings-example@cinnamon.org/applet.js:117 msgid "YOU USED THE HOTKEY!!!" msgstr "" #: files/usr/share/cinnamon/applets/show-desktop@cinnamon.org/applet.js:37 msgid "Click to show the desktop or middle-click to show the desklets" msgstr "" #: files/usr/share/cinnamon/applets/show-desktop@cinnamon.org/applet.js:40 #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:60 msgid "Show Desklets" msgstr "" #: files/usr/share/cinnamon/applets/slideshow@cinnamon.org/applet.js:19 #: files/usr/share/cinnamon/applets/slideshow@cinnamon.org/applet.js:72 #: files/usr/share/cinnamon/applets/slideshow@cinnamon.org/applet.js:85 #: files/usr/share/cinnamon/applets/slideshow@cinnamon.org/applet.js:93 #: files/usr/share/cinnamon/applets/slideshow@cinnamon.org/applet.js:107 msgid "Click to pause the slideshow" msgstr "" #: files/usr/share/cinnamon/applets/slideshow@cinnamon.org/applet.js:22 #: files/usr/share/cinnamon/applets/slideshow@cinnamon.org/applet.js:68 #: files/usr/share/cinnamon/applets/slideshow@cinnamon.org/applet.js:104 msgid "Click to resume the slideshow" msgstr "" #: files/usr/share/cinnamon/applets/slideshow@cinnamon.org/applet.js:26 #: files/usr/share/cinnamon/applets/slideshow@cinnamon.org/applet.js:81 #: files/usr/share/cinnamon/applets/slideshow@cinnamon.org/applet.js:97 msgid "The slideshow is disabled" msgstr "" #: files/usr/share/cinnamon/applets/slideshow@cinnamon.org/applet.js:32 msgid "Slideshow" msgstr "" #: files/usr/share/cinnamon/applets/slideshow@cinnamon.org/applet.js:44 msgid "Next Background" msgstr "" #: files/usr/share/cinnamon/applets/slideshow@cinnamon.org/applet.js:52 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:287 msgid "Background Settings" msgstr "" #: files/usr/share/cinnamon/applets/slideshow@cinnamon.org/applet.js:119 msgid "Current background: " msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:33 msgid "Playing" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:34 msgid "Paused" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:35 msgid "Stopped" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:97 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:1381 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:1520 msgid "Volume" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:570 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:740 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:743 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:746 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:1388 msgid "Unknown Artist" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:571 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:753 msgid "Unknown Album" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:572 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:758 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:1391 msgid "Unknown Title" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:600 msgid "Previous" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:603 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:828 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:834 #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:244 msgid "Play" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:606 msgid "Stop" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:609 msgid "Next" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:623 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:860 msgid "Consecutive Playing" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:626 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:876 msgid "No Shuffle" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:673 msgid "Open Player" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:687 msgid "Quit Player" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:822 msgid "Pause" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:862 msgid "Repeat Single" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:864 msgid "Repeat All" msgstr "" #. photoframe@cinnamon.org->settings-schema.json->shuffle->description #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:876 #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:253 msgid "Shuffle" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:1065 msgid "Mute output" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:1066 msgid "Mute input" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:1076 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:614 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:620 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:910 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:251 msgid "Applications" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:1077 msgid "Output device" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:1086 msgid "Input device" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:1509 msgid "Launch player" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:1514 msgid "Choose player controls" msgstr "" #: files/usr/share/cinnamon/applets/trash@cinnamon.org/applet.js:11 msgid "Are you sure you want to delete all items from the trash?" msgstr "" #: files/usr/share/cinnamon/applets/trash@cinnamon.org/applet.js:11 msgid "This operation cannot be undone." msgstr "" #. trash@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/trash@cinnamon.org/applet.js:18 msgid "Trash" msgstr "" #: files/usr/share/cinnamon/applets/trash@cinnamon.org/applet.js:37 msgid "Empty Trash" msgstr "" #: files/usr/share/cinnamon/applets/trash@cinnamon.org/applet.js:43 msgid "Open Trash" msgstr "" #: files/usr/share/cinnamon/applets/user@cinnamon.org/applet.js:128 msgid "Log Out..." msgstr "" #: files/usr/share/cinnamon/applets/user@cinnamon.org/applet.js:136 msgid "Power Off..." msgstr "" #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:967 msgid "Remove 'Window list'" msgstr "" #: files/usr/share/cinnamon/applets/windows-quick-list@cinnamon.org/applet.js:32 msgid "All windows" msgstr "" #: files/usr/share/cinnamon/applets/workspace-switcher@cinnamon.org/applet.js:516 msgid "Manage workspaces (Expo)" msgstr "" #: files/usr/share/cinnamon/applets/workspace-switcher@cinnamon.org/applet.js:523 msgid "Add a new workspace" msgstr "" #: files/usr/share/cinnamon/applets/workspace-switcher@cinnamon.org/applet.js:529 msgid "Remove the current workspace" msgstr "" #. workspace-switcher@cinnamon.org->settings-schema.json->scroll- #. behavior->options #: files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js:15 msgid "Normal" msgstr "" #: files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js:16 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:318 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:274 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:40 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:44 msgid "Left" msgstr "" #: files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js:17 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:318 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:275 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:41 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:43 msgid "Right" msgstr "" #: files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js:18 msgid "Upside-down" msgstr "" #. window-list@cinnamon.org->settings-schema.json->section2->description #. notifications@cinnamon.org->settings-schema.json->section2->description #. calendar@cinnamon.org->settings-schema.json->section1->description #. xrandr@cinnamon.org->metadata.json->name #. power@cinnamon.org->settings-schema.json->labelinfo->description #: files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js:26 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:15 msgid "Display" msgstr "" #: files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js:87 msgid "Configure display settings..." msgstr "" #: files/usr/share/cinnamon/desklets/clock@cinnamon.org/desklet.js:13 msgid "Clock" msgstr "" #: files/usr/share/cinnamon/desklets/launcher@cinnamon.org/desklet.js:30 msgid "Edit launcher" msgstr "" #: files/usr/share/cinnamon/desklets/photoframe@cinnamon.org/desklet.js:33 msgid "Photo Frame" msgstr "" #: generate_additional_files.py:24 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:42 msgid "Control Center" msgstr "" #: generate_additional_files.py:37 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:98 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:472 msgid "Users and Groups" msgstr "" #: generate_additional_files.py:37 msgid "Add or remove users and groups" msgstr "" #. Virtual keyboard #: generate_additional_files.py:49 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:151 msgid "Virtual keyboard" msgstr "" #: generate_additional_files.py:49 #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:262 msgid "Turn on-screen keyboard on or off" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/cinnamon-desktop-editor.py:106 msgid "Valid name" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/cinnamon-desktop-editor.py:110 msgid "The name cannot be empty." msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/cinnamon-desktop-editor.py:115 msgid "Valid executable" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/cinnamon-desktop-editor.py:119 msgid "" "The executable is not valid. It cannot be empty and spaces in the path must " "be escaped with backslash (\\)." msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/cinnamon-desktop-editor.py:186 msgid "" "Cannot create the launcher at this location. Add to the desktop instead?" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/cinnamon-desktop-editor.py:235 #: files/usr/share/cinnamon/cinnamon-desktop-editor/cinnamon-desktop-editor.py:350 msgid "Choose a command" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/cinnamon-desktop-editor.py:439 msgid "" "Would you like to add this launcher to the menu also? It will be placed in " "the Other category initially." msgstr "" #: files/usr/share/cinnamon/cinnamon-screensaver-lock-dialog/cinnamon-screensaver-lock-dialog.py:38 msgid "Screen Locker" msgstr "" #: files/usr/share/cinnamon/cinnamon-screensaver-lock-dialog/cinnamon-screensaver-lock-dialog.py:41 msgid "Please type an away message for the lock screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:65 msgid "Preferences" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:66 #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:180 msgid "Hardware" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:67 msgid "Administration" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:72 msgid "network, wireless, wifi, ethernet, broadband, internet" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:73 msgid "color, profile, display, printer, output" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:74 msgid "Graphics Tablet" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:74 msgid "wacom, digitize, tablet, graphics, calibrate, stylus" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:79 msgid "printers, laser, inkjet" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:80 msgid "Fingerprints" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:80 msgid "fingerprint" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:81 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:82 msgid "Firewall" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:81 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:82 msgid "firewall, block, filter, programs" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:83 msgid "Languages" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:83 msgid "language, install, foreign" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:84 msgid "Input Method" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:84 msgid "" "language, install, foreign, input, method, chinese, korean, japanese, typing" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:85 msgid "info, usb, pci, gpu, bios, report, crash, system" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:86 msgid "System Administration" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:86 msgid "adminitration, grub, boot, system" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:87 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:88 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:89 msgid "Login Window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:87 msgid "login, lightdm, mdm, gdm, manager, user, password, startup, switch" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:88 msgid "login, lightdm, manager, settings, editor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:89 msgid "login, gdm, manager, user, startup, switch" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:90 msgid "Driver Manager" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:90 msgid "" "video, driver, wifi, card, hardware, proprietary, nvidia, radeon, nouveau, " "fglrx" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:91 msgid "Nvidia Settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:91 msgid "video, driver, proprietary, nvidia, settings" msgstr "" #. Label Executable Icon #. Category Keywords for filter #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:92 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:108 msgid "Software Sources" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:92 msgid "ppa, repository, package, source, download" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:93 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:94 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:95 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:96 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:97 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:109 msgid "Package Management" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:93 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:94 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:95 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:96 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:97 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:109 msgid "update, install, repository, package, source, download" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:98 msgid "user, users, account, accounts, group, groups, password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:99 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:100 msgid "bluetooth, dongle, transfer, mobile" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:101 msgid "Manage Services and Units" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:101 msgid "systemd, units, services, systemctl, init" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:102 msgid "Disks" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:102 msgid "" "disks, manage, hardware, management, hard, hdd, pendrive, format, erase, " "test, create, iso, ISO, disk, image" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:103 msgid "Online Accounts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:103 msgid "google, microsoft, nextcloud, owncloud" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:108 msgid "" "ppa, repository, package, source, download, video, driver, wifi, card, " "hardware, proprietary, nvidia, radeon, nouveau, fglrx" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:295 msgid "Back to all settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:88 msgid "The group name cannot contain upper-case or space characters" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:195 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:253 msgid "Change Password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:198 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:264 msgid "New password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:198 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:268 msgid "Confirm password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:202 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:279 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:280 msgid "Generate a password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:208 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:214 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:286 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:292 msgid "Your new password needs to be at least 8 characters long" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:222 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:300 msgid "Show password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:234 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:312 msgid "An error occurred. Your password was not changed." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:239 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:317 msgid "Change" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:328 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:467 msgid "Too short" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:331 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:470 msgid "Weak" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:334 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:473 msgid "Fair" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:337 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:476 msgid "Good" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:340 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:479 msgid "Strong" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:365 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:561 msgid "Standard" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:366 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:562 msgid "Administrator" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:376 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:591 msgid "Account Type" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:376 msgid "Full Name" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:406 msgid "Invalid username" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:410 #, python-format msgid "A user with the name '%s' already exists." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:473 msgid "Users" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:474 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:591 msgid "Groups" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:526 msgid "Click to change the picture" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:531 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:63 msgid "Browse for more pictures..." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:567 msgid "Click to change the name" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:574 msgid "Click to change the password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:584 msgid "Click to change the groups" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:591 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:75 msgid "Picture" msgstr "" #. bool is unused, just a placeholder #. so object is the same index for #. settings-example@cinnamon.org->settings-schema.json->tree->columns->title #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:591 #: files/usr/share/cinnamon/cinnamon-menu-editor/cme/MainWindow.py:179 #: files/usr/share/cinnamon/cinnamon-settings/bin/AddKeyboardLayout.py:79 #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:849 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:792 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:83 msgid "Name" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:656 msgid "Open" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:658 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:204 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:181 msgid "Images" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:806 msgid "No password set" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:808 msgid "Set at login" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:853 msgid "This user is currently logged in" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:860 msgid "" "The user's home directory is encrypted. To preserve access to the encrypted " "directory, only the user should change this password." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:870 #, python-format msgid "" "Are you sure you want to permanently delete %s and all the files associated " "with this user?" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:928 #, python-format msgid "This group is set as %s's primary group" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:940 #, python-format msgid "Are you sure you want to permanently delete %s?" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:955 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:966 msgid "Group Name" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:167 msgid "Previous instance" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:171 msgid "Next instance" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:180 msgid "More options" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:186 msgid "Import from a file" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:191 msgid "Export to a file" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:196 msgid "Reset to defaults" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:205 #, python-format msgid "Reload %s" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:395 #, python-format msgid "Settings for %s" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:487 msgid "Select or enter file to export to" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:495 #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:516 msgid "JSON files" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:509 msgid "Select a JSON file to import" msgstr "" #: files/usr/share/cinnamon/applets/printers@cinnamon.org/cancel-print-dialog.py:31 #: files/usr/share/cinnamon/applets/printers@cinnamon.org/cancel-print-dialog.py:33 msgid "Cancel Job" msgstr "" #: files/usr/share/cinnamon/applets/printers@cinnamon.org/cancel-print-dialog.py:32 msgid "Do you really want to cancel this job?" msgstr "" #: files/usr/share/cinnamon/applets/printers@cinnamon.org/cancel-print-dialog.py:34 msgid "Keep Printing" msgstr "" #: files/usr/share/cinnamon/applets/printers@cinnamon.org/cancel-print-dialog.py:36 msgid "Do you really want to cancel all jobs?" msgstr "" #: files/usr/share/cinnamon/applets/printers@cinnamon.org/cancel-print-dialog.py:37 msgid "Cancel All Jobs" msgstr "" #: files/usr/share/cinnamon/applets/settings-example@cinnamon.org/CustomWidget.py:17 msgid "Random" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cme/MainWindow.py:192 msgid "Show" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cme/MainWindow.py:200 msgid "Item" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/AddKeyboardLayout.py:87 msgid "Input method" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/AddKeyboardLayout.py:211 msgid "IBus" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:247 msgid "Select a date" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:389 msgid "%R:%S" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:391 msgid "%R" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:394 msgid "%l:%M:%S %p" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:396 msgid "%l:%M %p" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:402 msgid "Select a time" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:418 msgid "Hour" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:420 msgid "Minute" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:426 msgid "Second" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:231 msgid "This applet is currently enabled" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:233 msgid "This desklet is currently enabled" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:235 msgid "This extension is currently enabled" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:274 #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:743 #, python-format msgid "by %s" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:313 msgid "This is a system applet. It cannot be removed." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:315 msgid "This is a system desklet. It cannot be removed." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:317 msgid "This is a system extension. It cannot be removed." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:420 msgid "" "This applet contains function calls that could potentially cause Cinnamon to" " crash or freeze. If you are experiencing crashes or freezing, please try " "removing it." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:422 msgid "" "This desklet contains function calls that could potentially cause Cinnamon " "to crash or freeze. If you are experiencing crashes or freezing, please try " "removing it." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:424 msgid "" "This extension contains function calls that could potentially cause Cinnamon" " to crash or freeze. If you are experiencing crashes or freezing, please try" " removing it." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:532 msgid "About" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:591 #, python-format msgid "Extension %s is not compatible with your version of Cinnamon." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:603 msgid "" "There are multiple instances enabled. Are you sure you want to remove all of" " them?" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:611 #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:1011 #, python-format msgid "Are you sure you want to completely remove %s?" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:618 msgid "" "This will restore the default set of enabled applets. Are you sure you want " "to do this?" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:619 msgid "" "This will restore the default set of enabled desklets. Are you sure you want" " to do this?" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:620 msgid "" "This will disable all active extensions. Are you sure you want to do this?" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:621 msgid "This will remove all actions. Are you sure you want to do this?" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:668 #, python-format msgid "" "Something went wrong while loading %s. Please make sure you are using the " "latest version, and then report the issue to its developer." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:723 #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:852 msgid "Installed" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:790 msgid "Install" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:796 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:761 msgid "Update" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:839 msgid "Sort by" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:850 msgid "Popularity" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:851 msgid "Date" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:853 msgid "Upgradable" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:905 #: files/usr/bin/xlet-about-dialog:46 msgid "More info" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:925 msgid "Refresh" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:1041 msgid "Update all" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:1041 #, python-format msgid "%d update available" msgid_plural "%d updates available" msgstr[0] "" msgstr[1] "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:1043 msgid "No updates available" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/eyedropper.py:17 msgid "" "Click the eyedropper, then click a color anywhere on your screen to select " "that color" msgstr "" #. menu@cinnamon.org->settings-schema.json->appearance-menu->title #: files/usr/share/cinnamon/cinnamon-settings/bin/InputSources.py:59 msgid "Options" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/InputSources.py:61 msgid "Remember the last layout used for each window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/InputSources.py:67 msgid "Use a country flag, if available, to represent keyboard layouts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/InputSources.py:72 msgid "Use the layout name, not the group name, to represent a layout" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/InputSources.py:77 msgid "Use upper-case when using text to represent a layout" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/InputSources.py:82 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:94 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:140 msgid "Shortcuts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/InputSources.py:84 #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:72 msgid "Switch to next layout" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/InputSources.py:90 #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:73 msgid "Switch to previous layout" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/InputSources.py:96 #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:74 msgid "Switch to first layout" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/InputSources.py:102 #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:75 msgid "Switch to second layout" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/InputSources.py:108 #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:76 msgid "Switch to third layout" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/InputSources.py:114 #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:77 msgid "Switch to fourth layout" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->generalPage->title #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:42 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:15 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:248 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:33 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:103 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:143 msgid "General" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:44 msgid "Pointer" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:46 msgid "Move pointer to the next monitor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:47 msgid "Move pointer to the previous monitor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:50 msgid "Troubleshooting" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:52 msgid "Toggle Looking Glass" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:57 msgid "Show the window selection screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:58 msgid "Show the workspace selection screen" msgstr "" #. show-desktop@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:59 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:39 msgid "Show desktop" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:61 msgid "Cycle through open windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:62 msgid "Cycle backwards through open windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:63 msgid "Cycle through windows from all workspaces" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:64 msgid "Cycle backwards through windows from all workspaces" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:65 msgid "Cycle through open windows of the same application" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:66 msgid "Cycle backwards through open windows of the same application" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:67 msgid "Run dialog" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:80 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:19 msgid "Windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:82 msgid "Positioning" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:84 msgid "Resize window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:85 msgid "Move window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:86 msgid "Center window in screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:87 msgid "Move window to upper-right" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:88 msgid "Move window to upper-left" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:89 msgid "Move window to lower-right" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:90 msgid "Move window to lower-left" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:91 msgid "Move window to right edge" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:92 msgid "Move window to top edge" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:93 msgid "Move window to bottom edge" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:94 msgid "Move window to left edge" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:97 msgid "Tiling and Snapping" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:99 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:37 msgid "Push tile left" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:100 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:38 msgid "Push tile right" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:101 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:35 msgid "Push tile up" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:102 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:36 msgid "Push tile down" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:105 msgid "Inter-workspace" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:107 msgid "Move window to new workspace" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:108 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:32 msgid "Move window to left workspace" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:109 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:31 msgid "Move window to right workspace" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:110 msgid "Move window to workspace above" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:111 msgid "Move window to workspace below" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:112 msgid "Move window to workspace 1" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:113 msgid "Move window to workspace 2" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:114 msgid "Move window to workspace 3" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:115 msgid "Move window to workspace 4" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:116 msgid "Move window to workspace 5" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:117 msgid "Move window to workspace 6" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:118 msgid "Move window to workspace 7" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:119 msgid "Move window to workspace 8" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:120 msgid "Move window to workspace 9" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:121 msgid "Move window to workspace 10" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:122 msgid "Move window to workspace 11" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:123 msgid "Move window to workspace 12" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:126 msgid "Inter-monitor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:128 msgid "Move window to left monitor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:129 msgid "Move window to right monitor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:130 msgid "Move window to monitor above" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:131 msgid "Move window to monitor below" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:136 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:29 msgid "Maximize window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:137 msgid "Unmaximize window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:138 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:28 msgid "Minimize window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:139 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:30 msgid "Close window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:140 msgid "Activate window menu" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:141 msgid "Raise window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:142 msgid "Lower window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:143 msgid "Toggle maximization state" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:144 msgid "Toggle fullscreen state" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:145 msgid "Toggle shaded state" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:146 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:56 msgid "Toggle always on top" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:147 msgid "Toggle showing window on all workspaces" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:148 msgid "Increase opacity" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:149 msgid "Decrease opacity" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:150 msgid "Toggle vertical maximization" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:151 msgid "Toggle horizontal maximization" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:154 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:14 msgid "Workspaces" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:156 msgid "Direct Navigation" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:158 msgid "Switch to workspace 1" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:159 msgid "Switch to workspace 2" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:160 msgid "Switch to workspace 3" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:161 msgid "Switch to workspace 4" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:162 msgid "Switch to workspace 5" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:163 msgid "Switch to workspace 6" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:164 msgid "Switch to workspace 7" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:165 msgid "Switch to workspace 8" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:166 msgid "Switch to workspace 9" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:167 msgid "Switch to workspace 10" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:168 msgid "Switch to workspace 11" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:169 msgid "Switch to workspace 12" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:174 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:23 msgid "Switch to left workspace" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:175 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:22 msgid "Switch to right workspace" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:178 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:45 msgid "System" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:182 msgid "Switch monitor configurations" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:183 msgid "Rotate display" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:184 msgid "Orientation Lock" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:185 msgid "Increase screen brightness" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:186 msgid "Decrease screen brightness" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:187 msgid "Toggle keyboard backlight" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:188 msgid "Increase keyboard backlight level" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:189 msgid "Decrease keyboard backlight level" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:190 msgid "Toggle touchpad state" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:191 msgid "Turn touchpad on" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:192 msgid "Turn touchpad off" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:193 msgid "Show power statistics" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:196 msgid "Screenshots and Recording" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:198 msgid "Take a screenshot of an area" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:199 msgid "Copy a screenshot of an area to clipboard" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:200 msgid "Take a screenshot" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:201 msgid "Copy a screenshot to clipboard" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:202 msgid "Take a screenshot of a window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:203 msgid "Copy a screenshot of a window to clipboard" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:204 msgid "Toggle recording desktop (must restart Cinnamon)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:209 msgid "Log out" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:210 msgid "Shut down" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:211 msgid "Lock screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:217 msgid "Launchers" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:219 msgid "Launch terminal" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:220 msgid "Launch help browser" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:221 msgid "Launch calculator" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:222 msgid "Launch email client" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:223 msgid "Launch web browser" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:224 msgid "Home folder" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:228 msgid "Sound and Media" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:230 msgid "Quiet Keys" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:232 msgid "Volume mute (Quiet)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:233 msgid "Volume down (Quiet)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:234 msgid "Volume up (Quiet)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:239 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:42 msgid "Volume mute" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:240 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:41 msgid "Volume down" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:241 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:40 msgid "Volume up" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:242 msgid "Mic mute" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:243 msgid "Launch media player" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:245 msgid "Pause playback" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:246 msgid "Stop playback" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:247 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:45 msgid "Previous track" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:248 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:44 msgid "Next track" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:249 msgid "Eject" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:250 msgid "Rewind" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:251 msgid "Fast-forward" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:252 msgid "Repeat" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:256 msgid "Universal Access" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:258 msgid "Zoom in" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:259 msgid "Zoom out" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:260 msgid "Reset zoom" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:261 msgid "Turn screen reader on or off" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:263 msgid "Increase text size" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:264 msgid "Decrease text size" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:265 msgid "High contrast on or off" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:268 msgid "Spices" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:698 #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:702 msgid "Instance" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:747 #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:766 msgid "Custom Shortcuts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:846 #, python-format msgid "" "This key combination, %(combination)s is currently in use by " "%(old)s. " msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:847 #, python-format msgid "" "If you continue, the combination will be reassigned to %(new)s.\n" "\n" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:848 msgid "Do you want to continue with this operation?" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:909 #, python-format msgid "" "This key combination, %(combination)s is currently assigned to " "multiple actions. " msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingTable.py:910 msgid "Choose the assignment you wish to keep. The others will be cleared." msgstr "" #. l10n constants - get them translated here so they use Cinnamon's gettext #. context #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingWidgets.py:150 msgid "Click to set a new accelerator key." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingWidgets.py:151 msgid "Press Escape or click again to cancel the operation." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingWidgets.py:152 msgid "Press Backspace to clear the existing keybinding." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingWidgets.py:153 msgid "unassigned" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingWidgets.py:154 msgid "Pick an accelerator" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingWidgets.py:155 #, python-format msgid "" "\n" "This key combination, '%s' should not be used because it would become impossible to type using this key. " msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingWidgets.py:156 msgid "" "Please try again using a modifier key such as Control, Alt or Super (Windows key).\n" "\n" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingWidgets.py:157 msgid "" "Continue only if you are certain this is what you want, otherwise press " "cancel.\n" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingWidgets.py:159 msgid "Continue" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/SettingsWidgets.py:179 msgid "Checking dependencies" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/SettingsWidgets.py:180 #, python-format msgid "Please install: %s" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/SettingsWidgets.py:379 msgid "_Cancel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/SettingsWidgets.py:380 msgid "_Open" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/SettingsWidgets.py:393 msgid "Sound files" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py:328 msgid "Downloading images:" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py:402 msgid "" "An error occurred while trying to access the server. Please try again in a " "little while." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py:590 msgid "" "Something went wrong with the spices download. Please try refreshing the " "list again." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py:605 msgid "Refreshing the cache" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py:685 #, python-format msgid "Installing %s" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py:713 #, python-format msgid "" "An error occurred during the installation of %s. Please report this incident" " to its developer." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py:789 #, python-format msgid "Uninstalling %s" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py:823 #, python-format msgid "A problem occurred while removing %s." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py:845 #, python-format msgid "" "\n" "\n" "Details: %s" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/TreeListWidgets.py:183 #: files/usr/share/cinnamon/cinnamon-settings/bin/TreeListWidgets.py:278 msgid "Add new entry" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/TreeListWidgets.py:187 msgid "Remove selected entry" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/TreeListWidgets.py:192 msgid "Edit selected entry" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/TreeListWidgets.py:197 msgid "Move selected entry up" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/TreeListWidgets.py:202 msgid "Move selected entry down" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/TreeListWidgets.py:280 msgid "Edit entry" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/XkbSettings.py:195 #: files/usr/share/cinnamon/cinnamon-settings/bin/XkbSettings.py:380 #: files/usr/share/cinnamon/cinnamon-settings/bin/XkbSettings.py:468 msgid "Select an option" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/XkbSettings.py:219 msgid "Back" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:26 msgid "Configure accessibility features" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:30 msgid "magnifier, talk, access, zoom, keys, contrast" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:48 msgid "Visual" msgstr "" #. Visual Aids #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:52 msgid "Visual Aids" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:54 msgid "High contrast" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:62 msgid "Large text" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:70 msgid "Screen reader" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:81 msgid "Configure screen reader" msgstr "" #. Desktop Zoom #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:86 msgid "Desktop Zoom" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:88 msgid "Enable zoom" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:91 msgid "Magnification" msgstr "" #. Action, Label, Allow phase selection, extra widget type #. [entry|slider|none], default custom val #. workspace-switcher@cinnamon.org->settings-schema.json->scroll- #. behavior->options #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:94 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:21 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:92 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:114 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:153 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:141 msgid "Disabled" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:95 msgid "Mouse wheel modifier" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:96 msgid "" "While this modifier is pressed, mouse scrolling will increase or decrease " "zoom." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:99 msgid "Scroll at screen edges" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:102 msgid "Keep cursor centered" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:103 msgid "Cursor moves with contents" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:104 msgid "Cursor pushes contents around" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:106 msgid "Mouse tracking mode" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:109 msgid "Lens mode" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:115 msgid "Square" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:116 msgid "Horizontal strip" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:117 msgid "Vertical strip" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:119 msgid "Lens shape" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:122 msgid "Full screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:123 msgid "Top half" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:124 msgid "Bottom half" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:125 msgid "Left half" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:126 msgid "Right half" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:128 msgid "Screen position" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:153 msgid "Enable the on-screen keyboard" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:160 msgid "At the bottom of the screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:161 msgid "At the top of the screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:162 msgid "Keyboard position" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:165 msgid "A quarter of the screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:166 msgid "A third of the screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:168 msgid "Keyboard size" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:171 msgid "Show the keyboard any time something expects input" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:172 msgid "Show keyboard only when the user activates it" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:174 msgid "Activation mode" msgstr "" #. Keyboard indicators #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:179 msgid "Keyboard indicators" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:181 msgid "Use visual indicator on Caps and Num Lock" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:187 msgid "Use audio indicator on Caps and Num Lock" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:193 msgid "Sound to use Caps or Num Lock on" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:198 msgid "Sound to use Caps or Num Lock off" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:203 msgid "Event feedback (required for typing assistance alerts)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:205 msgid "Enable visual alerts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:210 msgid "Flash the entire monitor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:211 msgid "Flash the active window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:213 msgid "Visual style" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:216 msgid "Enable audio alerts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:221 msgid "Sound to use for window alerts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:229 msgid "Typing assistance" msgstr "" #. Stickykeys #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:233 msgid "Sticky keys" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:235 msgid "Treat a sequence of modifier keys as a combination" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:242 msgid "Disable if two modifiers are pressed together" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:249 msgid "Alert when a modifier key is pressed" msgstr "" #. Slowkeys #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:258 msgid "Slow keys" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:260 msgid "Put a delay between when a key is pressed and when it is accepted" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:267 msgid "Alert when a key is pressed" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:274 msgid "Alert when a key is accepted" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:281 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:307 msgid "Alert when a key is rejected" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:288 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:314 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:373 msgid "Acceptance delay" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:291 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:317 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:395 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:77 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:75 msgid "Short" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:291 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:317 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:395 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:77 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:75 msgid "Long" msgstr "" #. Bouncekeys #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:298 msgid "Bounce keys" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:300 msgid "Ignore fast duplicate keypresses" msgstr "" #. Mousekeys #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:329 msgid "Mouse keys" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:331 msgid "Control the pointer using the keypad" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:338 msgid "Initial delay" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:341 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:349 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:376 msgid "Shorter" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:341 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:349 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:376 msgid "Longer" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:346 msgid "Acceleration time" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:354 msgid "Maximum speed" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:357 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:77 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:59 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:134 msgid "Slower" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:357 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:77 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:59 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:134 msgid "Faster" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:366 msgid "Trigger a secondary click by holding down the primary button" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:385 msgid "Trigger a click when the pointer hovers" msgstr "" #. photoframe@cinnamon.org->settings-schema.json->delay->description #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:392 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:296 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:715 msgid "Delay" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:400 msgid "Motion threshold" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->thumbnail- #. size->options #. window-list@cinnamon.org->settings-schema.json->window-preview- #. scale->options #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:403 msgid "Small" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->thumbnail- #. size->options #. window-list@cinnamon.org->settings-schema.json->window-preview- #. scale->options #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:403 msgid "Large" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_actions.py:13 msgid "Manage your actions" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_actions.py:35 msgid "action" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_actions.py:37 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:52 msgid "Actions" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_actions.py:50 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:46 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:45 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_extensions.py:45 msgid "Manage" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_actions.py:53 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:49 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:48 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_extensions.py:48 msgid "Download" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_actions.py:67 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:26 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:29 msgid "Layout" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_actions.py:81 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_extensions.py:54 msgid "Enable" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_actions.py:82 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_extensions.py:55 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:130 msgid "Disable" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_actions.py:83 msgid "Installed actions" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_actions.py:85 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:82 msgid "Remove all" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:13 msgid "Manage Cinnamon applets" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:32 msgid "" "You can remove specific instances in panel edit mode via the context menu." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:34 msgid "applet" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:54 msgid "Installed applets" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:58 msgid "Reset all" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:73 msgid "Previous Panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:77 msgid "Next Panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:27 msgid "Solid color" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:28 msgid "Horizontal gradient" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:29 msgid "Vertical gradient" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:33 msgid "No picture" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:34 msgid "Mosaic" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:35 msgid "Centered" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:36 msgid "Scaled" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:37 msgid "Stretched" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:39 msgid "Spanned" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:142 msgid "Background color" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:166 msgid "Change your desktop's background" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:169 msgid "background, picture, slideshow" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:170 msgid "Backgrounds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:184 msgid "Add Folder" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:223 msgid "Add new folder" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:227 msgid "Remove selected folder" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:293 msgid "Play backgrounds as a slideshow" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:296 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:81 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:100 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:103 msgid "minutes" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:299 msgid "Play images in random order" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:302 msgid "Picture aspect" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:20 msgid "Manage date and time settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:24 msgid "time, date, calendar, format, network, sync" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:25 msgid "Date & Time" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:34 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:101 msgid "Date and Time" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:44 msgid "Network time" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:50 msgid "Manually set date and time" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:58 msgid "Format" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:59 msgid "Use 24h clock" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:60 msgid "Display the date" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:61 msgid "Display seconds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:62 msgid "Use locale default" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:62 msgid "Sunday" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:62 msgid "Monday" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:63 msgid "First day of week" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:228 msgid "Region" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:231 msgid "City" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:250 msgid "Africa" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:251 msgid "America" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:252 msgid "Antarctica" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:253 msgid "Arctic" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:254 msgid "Asia" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:255 msgid "Atlantic Ocean" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:256 msgid "Australia" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:257 msgid "Canada" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:258 msgid "Europe" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:259 msgid "Indian Ocean" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:260 msgid "Pacific Ocean" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:261 msgid "USA" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:42 msgid "Internet" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:43 msgid "Multimedia" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:44 msgid "Office" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:54 msgid "Web" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:55 msgid "Mail" msgstr "" #. menu@cinnamon.org->settings-schema.json->show-music->description #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:59 msgid "Music" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:61 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:181 msgid "Photos" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:65 msgid "Word" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:66 msgid "Spreadsheet" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:67 msgid "PDF" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:68 msgid "Source Code" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:72 msgid "File Manager" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:73 msgid "Plain Text" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:178 msgid "Audio CD" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:178 msgid "Select an application for audio CDs" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:179 msgid "Video DVD" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:179 msgid "Select an application for video DVDs" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:180 msgid "Music player" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:180 msgid "Select an application to run when a music player is connected" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:181 msgid "Select an application to run when a camera is connected" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:182 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:202 msgid "Software" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:182 msgid "Select an application for software CDs" msgstr "" #. translators: these strings are duplicates of shared-mime-info #. strings, just here to fix capitalization of the English originals. #. If the shared-mime-info translation works for your language, #. simply leave these untranslated. #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:190 msgid "Audio DVD" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:191 msgid "Blank Blu-ray disc" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:192 msgid "Blank CD disc" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:193 msgid "Blank DVD disc" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:194 msgid "Blank HD DVD disc" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:195 msgid "Blu-ray video disc" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:196 msgid "E-book reader" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:197 msgid "HD DVD video disc" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:198 msgid "Picture CD" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:199 msgid "Super Video CD" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:200 msgid "Video CD" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:201 msgid "Windows software" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:203 msgid "OSTree Software Updates" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:353 msgid "Command-line option for your terminal to execute a passed-in command." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:417 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:15 msgid "Ask what to do" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:419 msgid "Open folder" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:421 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:16 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:611 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:620 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:627 msgid "Do nothing" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:479 msgid "Other Media" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:509 msgid "Select how other media should be handled" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:581 msgid "_Action:" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:586 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:590 msgid "Preferred Applications" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:589 msgid "" "media, defaults, applications, programs, removable, browser, email, " "calendar, music, videos, photos, images, cd, autoplay, favorite, apps" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:606 msgid "Preferred applications" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:631 msgid "Calculator" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:640 msgid "Terminal" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:641 msgid "Arguments" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:662 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:669 msgid "Removable media" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:665 msgid "Prompt or start programs on media insertion" msgstr "" #. FIXMEEEEEEEE?? #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:685 msgid "_Other Media..." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:10 msgid "Manage your Cinnamon desklets" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:30 msgid "" "You can remove specific instances from the desktop via that desklet's " "context menu" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:31 msgid "desklet, desktop, slideshow" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:33 msgid "Desklets" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:51 msgid "General Settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:53 msgid "General Desklets Settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:55 msgid "No decoration" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:55 msgid "Border only" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:55 msgid "Border and header" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:57 msgid "Decoration of desklets" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:60 msgid "Note: Some desklets require the border/header to be always present" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:64 msgid "Such requirements override the settings selected here" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:69 msgid "Snap desklets to grid" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:70 msgid "Width of desklet snap grid" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:73 msgid "Lock desklets in their current position" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:78 msgid "Installed desklets" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desktop.py:19 msgid "Manage your desktop icons" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desktop.py:22 msgid "desktop, home, button, trash" msgstr "" #. menu@cinnamon.org->settings-schema.json->show-desktop->description #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desktop.py:23 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:257 msgid "Desktop" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:10 msgid "Manage display settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:14 msgid "display, screen, monitor, layout, resolution, dual, lcd" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:50 msgid "Disable automatic screen rotation" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:51 msgid "" "Select this option to disable automatic screen rotation on hardware equipped" " with supported accelerometers." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:54 msgid "Enable fractional scaling controls (experimental)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:55 msgid "" "Select this option to display additional layout controls for per-monitor " "scaling." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:64 msgid "Scale content up" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:65 msgid "Scale content down" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:67 msgid "Fractional scaling mode" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:11 msgid "Control Cinnamon visual effects." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:14 msgid "effects, window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:15 msgid "Effects" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:28 msgid "Desktop and window effects" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:34 msgid "Effects on dialog boxes" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:37 msgid "Effects on menus" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:40 msgid "Session startup animation" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:43 msgid "Fade effect on Cinnamon scrollboxes (like the Menu application list)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:47 msgid "Window effects" msgstr "" #. MAPPING WINDOWS #. CLOSING WINDOWS #. MINIMIZING WINDOWS #. grouped-window-list@cinnamon.org->settings-schema.json->scroll- #. behavior->options #. grouped-window-list@cinnamon.org->settings-schema.json->left-click- #. action->options #. grouped-window-list@cinnamon.org->settings-schema.json->middle-click- #. action->options #. grouped-window-list@cinnamon.org->settings-schema.json->title- #. display->options #. grouped-window-list@cinnamon.org->settings-schema.json->launcher-animation- #. effect->options #. grouped-window-list@cinnamon.org->settings-schema.json->hover-peek-time- #. out->options #. photoframe@cinnamon.org->settings-schema.json->effect->options #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:51 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:59 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:66 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:49 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:50 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:57 msgid "None" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:52 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:60 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:67 msgid "Traditional" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:53 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:61 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:68 msgid "Fly" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:55 msgid "New windows or unminimizing existing ones" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:62 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:22 msgid "Closing windows" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->launcher-animation- #. effect->options #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:69 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:277 msgid "Fade" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:70 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:23 msgid "Minimizing windows" msgstr "" #. MAXIMIZING/TILING WINDOWS #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:74 msgid "Resizing and tiling windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:77 msgid "Window animation speed" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_extensions.py:12 msgid "Manage your Cinnamon extensions" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_extensions.py:31 msgid "extension, addon" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_extensions.py:33 msgid "Extensions" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_extensions.py:53 msgid "Installed extensions" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_extensions.py:57 msgid "Disable all" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:14 msgid "Configure system fonts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:17 msgid "font, size, small, large" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:18 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:28 msgid "Font Selection" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:32 msgid "Default font" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:35 msgid "Desktop font" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:38 msgid "Document font" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:41 msgid "Monospace font" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:44 msgid "Window title font" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:47 msgid "Font Settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:49 msgid "Grayscale" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:49 msgid "Rgba" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:50 msgid "Slight" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->thumbnail- #. size->options #. window-list@cinnamon.org->settings-schema.json->window-preview- #. scale->options #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:50 msgid "Medium" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:50 msgid "Full" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:51 msgid "RGBA" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:51 msgid "RGB" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:51 msgid "BGR" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:51 msgid "Vertical RGB" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:51 msgid "Vertical BGR" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:54 msgid "Text scaling factor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:57 msgid "Hinting" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:58 msgid "Hinting allows for producing clear, legible text on screen." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:61 msgid "Antialiasing" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:62 msgid "Antialiasing makes on screen text smoother and easier to read" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:65 msgid "RGBA Order" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_fonts.py:66 msgid "" "The order of subpixel elements on an LCD screen, only used when antialiasing" " is set to 'rgba'" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:10 msgid "Miscellaneous Cinnamon preferences" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:14 msgid "logging, click" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:25 msgid "Compositor Options" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:29 msgid "Disable compositing for full-screen windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:30 msgid "" "Select this option to let full-screen applications skip the compositing " "manager and run at maximum speed. Unselect it if you're experiencing screen-" "tearing in full screen mode." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:33 msgid "Miscellaneous Options" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:35 msgid "Enable timer when logging out or shutting down" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:38 msgid "Timer delay" msgstr "" #. photoframe@cinnamon.org->settings-schema.json->delay->units #. photoframe@cinnamon.org->settings-schema.json->fade-delay->units #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:38 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:50 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:75 msgid "seconds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:42 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:47 msgid "Memory limit" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:44 msgid "Restart Cinnamon when it uses too much memory" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:47 msgid "MB" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:50 msgid "Check frequency" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:33 msgid "Make window fullscreen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:34 msgid "Exit window fullscreen" msgstr "" #. sound@cinnamon.org->settings-schema.json->middleClickAction->options #. sound@cinnamon.org->settings-schema.json->middleShiftClickAction->options #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:43 msgid "Toggle Play / Pause" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:46 msgid "Zoom desktop in" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:47 msgid "Zoom desktop out" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:48 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_hotcorner.py:198 msgid "Run a command" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:54 msgid "Trigger at gesture start" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:55 msgid "Trigger at gesture end" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:82 msgid "Manage touch gestures" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:85 msgid "gesture, swipe, pinch, touch" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:86 msgid "Gestures" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:126 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:285 msgid "Check again" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:158 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:255 msgid "Swipe" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:161 msgid "Swipe with 2 fingers" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:161 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:191 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:216 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:231 msgid "Touchscreen only" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:171 msgid "Swipe with 3 fingers" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:181 msgid "Swipe with 4 fingers" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:191 msgid "Swipe with 5 fingers" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:202 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:258 msgid "Pinch" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:206 #, python-format msgid "Pinch with %d fingers" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:216 msgid "Pinch with 5 fingers" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:228 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:231 msgid "Tap" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:249 msgid "Enable gestures" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:252 msgid "Activation thresholds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:253 msgid "In percentage of the touch surface" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:255 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:258 msgid "20%" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:255 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:258 msgid "80%" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:267 msgid "The touchegg package must be installed for gesture support." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:271 msgid "Gestures are disabled" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:273 msgid "The Touchegg service is not running" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:319 msgid "Up" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:319 msgid "Down" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:320 msgid "In" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:320 msgid "Out" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:329 #, python-format msgid "Tap with %d fingers" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:422 msgid "Enter a command" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:452 msgid "Sensitivity" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_gestures.py:456 msgid "Less" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_hotcorner.py:18 msgid "Manage hotcorner settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_hotcorner.py:23 msgid "hotcorner, overview, scale, expo" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_hotcorner.py:24 msgid "Hot Corners" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_hotcorner.py:49 msgid "Allow hot corners in fullscreen." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_hotcorner.py:195 msgid "Show all workspaces" msgstr "" #. Expo #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_hotcorner.py:196 msgid "Show all windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_hotcorner.py:201 msgid "Enable this corner" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_hotcorner.py:212 msgid "Type a command..." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_hotcorner.py:217 msgid "Activation delay (ms)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:60 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:89 msgid "Unknown size" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:87 msgid "Unknown CPU" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:110 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:116 msgid "Operating System" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:119 msgid "Cinnamon Version" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:120 msgid "Kernel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:121 msgid "Processor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:123 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:125 msgid "Memory" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:123 msgid "GiB" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:129 msgid "Hard Drives" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:131 msgid "Hard Drive" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:133 msgid "GB" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:138 msgid "Graphics Card" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:140 msgid "X11" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:143 msgid "Wayland" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:145 msgid "Display Server" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:153 msgid "Display system information" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:156 msgid "system, information, details, graphic, sound, kernel, version, about" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:157 msgid "System Info" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:202 msgid "Upload system information" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:203 msgid "No personal information included" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:214 msgid "Copy to clipboard" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:29 msgid "Manage keyboard settings and shortcuts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:34 msgid "keyboard, shortcut, hotkey" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:70 msgid "Key repeat" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:72 msgid "Typing" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:74 msgid "Enable key repeat" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:77 msgid "Repeat delay:" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:80 msgid "Repeat speed:" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:80 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:88 msgid "Slow" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:80 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:88 msgid "Fast" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:83 msgid "Text cursor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:85 msgid "Text cursor blinks" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:88 msgid "Blink speed:" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:100 msgid "" "To edit a keyboard binding, click it and press the new keys, or press " "backspace to clear it." msgstr "" #. Text entry search field #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:115 msgid "Type to search shortcuts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:128 msgid "Press Escape to cancel the search." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:130 msgid "Click to search by accelerator" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:141 msgid "Bindings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:201 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:764 msgid "Add custom shortcut" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:203 msgid "Remove custom shortcut" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:228 msgid "Categories" msgstr "" #. notifications@cinnamon.org->settings-schema.json->section3->description #. inhibit@cinnamon.org->settings-schema.json->section1->description #. calendar@cinnamon.org->settings-schema.json->section2->description #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:248 msgid "Keyboard shortcuts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:260 msgid "Keyboard bindings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:303 msgid "Layouts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:306 msgid "XKB Options" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:679 msgid "Reset to default" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:781 msgid "Select a file" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:13 msgid "Control mouse and touchpad settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:18 msgid "mouse, touchpad, synaptic, double-click" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:19 msgid "Mouse and Touchpad" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:35 msgid "Left handed (mouse buttons inverted)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:38 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:125 msgid "Reverse scrolling direction" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:41 msgid "Show position of pointer when the Control key is pressed" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:44 msgid "Emulate middle click by clicking both left and right buttons" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:47 msgid "Paste the current selection when middle-click is pressed" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:50 msgid "Drag-and-drop threshold" msgstr "" #. window-list@cinnamon.org->settings-schema.json->button-width->units #. settings-example@cinnamon.org->settings-schema.json->spinner-number->units #. photoframe@cinnamon.org->settings-schema.json->height->units #. photoframe@cinnamon.org->settings-schema.json->width->units #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:50 msgid "pixels" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:53 msgid "Pointer size and speed" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:55 msgid "Size" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:55 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:73 msgid "Smaller" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:55 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:73 msgid "Larger" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:59 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:134 msgid "Speed" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:65 msgid "Device default" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:66 msgid "Constant" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:67 msgid "Adaptive" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:70 msgid "Acceleration" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:73 msgid "Double-Click timeout" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:75 msgid "Timeout" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:79 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:147 msgid "Double-click test" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:91 msgid "Enabled" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:93 msgid "Disabled when a mouse is attached" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:96 msgid "Touchpad is" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:106 msgid "Tap to click" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:109 msgid "Disable touchpad while typing" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:113 msgid "Default device behavior" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:115 msgid "Virtual button areas along bottom of touchpad" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:116 msgid "Use multiple fingers for right and middle click" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:119 msgid "Click actions" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:122 msgid "Scrolling" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:142 msgid "Success!" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:154 msgid "Two-finger scrolling" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:155 msgid "Edge scrolling" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:158 msgid "Scrolling method" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_nightlight.py:11 msgid "Reduce exposure to blue light" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_nightlight.py:15 msgid "redshift, color, blue, light, filter, temperature" msgstr "" #. nightlight@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_nightlight.py:16 msgid "Night Light" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_nightlight.py:27 msgid "Enable night light" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_nightlight.py:28 msgid "" "This feature makes the screen color warmer in the evening and during the " "night. By reducing blue light, it can prevent eye strain, headaches and " "improve sleep quality." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_nightlight.py:43 msgid "Color temperature" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_nightlight.py:55 msgid "Click to preview" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_nightlight.py:61 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:137 msgid "Automatic" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_nightlight.py:61 msgid "Specify start and end times" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_nightlight.py:61 msgid "Always on" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_nightlight.py:62 msgid "Schedule" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_nightlight.py:166 msgid "to" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:26 msgid "Primary monitor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:27 msgid "Active monitor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:28 msgid "The monitor specified below" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:34 msgid "Notification preferences" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:38 msgid "notifications" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:53 msgid "Notification settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:55 msgid "Enable notifications" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:58 msgid "Remove notifications after their timeout is reached" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:61 msgid "Show notifications on the bottom side of the screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:64 msgid "Monitor to use for displaying notifications" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:72 msgid "Display notifications over fullscreen windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:75 msgid "Notification duration" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:78 msgid "Display a test notification" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:81 msgid "Media keys OSD" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:83 msgid "Show media keys OSD" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:87 msgid "This is a test notification" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:39 msgid "Center Zone" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:42 msgid "Panel height:" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:43 msgid "Left Zone" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:44 msgid "Right Zone" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:46 msgid "Panel width:" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:47 msgid "Top Zone" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:48 msgid "Bottom Zone" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:55 msgid "Panel Visibility" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:60 msgid "Auto hide panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:60 msgid "Always show panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:60 msgid "Intelligently hide panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:61 msgid "Auto-hide panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:64 msgid "Show delay" msgstr "" #. menu@cinnamon.org->settings-schema.json->hover-delay->units #. grouped-window-list@cinnamon.org->settings-schema.json->show-apps-order- #. timeout->units #. show-desktop@cinnamon.org->settings-schema.json->peek-delay->units #. cornerbar@cinnamon.org->settings-schema.json->peek-delay->units #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:64 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:67 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:177 msgid "milliseconds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:67 msgid "Hide delay" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:70 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:99 msgid "Customize" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:77 msgid "Panel appearance" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:120 msgid "Allow theme to determine font size" msgstr "" #. clock@cinnamon.org->settings-schema.json->font-size->description #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:128 msgid "Font size" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:134 msgid "Scale to panel size exactly" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:135 msgid "Scale to panel size optimally" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:143 msgid "Colored icon size" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:148 msgid "Symbolic icon size" msgstr "" #. menu@cinnamon.org->settings-schema.json->menu-icon-size->units #. menu@cinnamon.org->settings-schema.json->category-icon-size->units #. menu@cinnamon.org->settings-schema.json->application-icon-size->units #. menu@cinnamon.org->settings-schema.json->sidebar-icon-size->units #. clock@cinnamon.org->settings-schema.json->font-size->units #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:150 msgid "px" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:158 msgid "Manage Cinnamon panel settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:161 msgid "panel, height, bottom, top, autohide, size, layout" msgstr "" #. menu@cinnamon.org->settings-schema.json->behavior-panel->title #. menu@cinnamon.org->settings-schema.json->appearance-panel->title #. sound@cinnamon.org->settings-schema.json->section2->description #. grouped-window-list@cinnamon.org->settings-schema.json->panelPage->title #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:162 msgid "Panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:181 msgid "Previous panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:182 msgid "Next panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:205 msgid "General Panel Options" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:208 msgid "Add new panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:217 msgid "Allow the pointer to pass through the edges of panels" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:13 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:608 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:617 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:625 msgid "Shut down immediately" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:20 msgid "5%" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:21 msgid "10%" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:22 msgid "30%" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:23 msgid "50%" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:24 msgid "75%" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:28 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:18 msgid "30 seconds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:29 msgid "60 seconds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:30 msgid "90 seconds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:31 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:20 msgid "2 minutes" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:32 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:37 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:22 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:31 msgid "5 minutes" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:33 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:38 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:23 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:32 msgid "10 minutes" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:39 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:33 msgid "15 minutes" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:40 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:24 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:34 msgid "30 minutes" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:41 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:35 msgid "45 minutes" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:42 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:25 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:36 msgid "1 hour" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:43 msgid "2 hours" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:44 msgid "3 hours" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:45 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:29 msgid "Never" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:74 msgid "Unknown time" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:92 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:103 msgid "hours" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:113 msgid "Manage power settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:116 msgid "power, suspend, hibernate, laptop, desktop, brightness, screensaver" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:117 msgid "Power Management" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:149 msgid "Power options" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:158 msgid "On A/C power" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:161 msgid "On battery power" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:168 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:176 msgid "Turn off the screen when inactive for" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:170 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:178 msgid "Suspend when inactive for" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:173 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:181 msgid "When the lid is closed" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:183 msgid "Extra options" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:187 msgid "When the power button is pressed" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:190 msgid "Perform lid-closed action even with external monitors attached" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:193 msgid "When the battery is critically low" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:196 msgid "Enable Hybrid Sleep" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:197 msgid "Replaces Suspend with Hybrid Sleep" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:202 msgid "Enable Hibernate after suspend" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:203 msgid "" "First suspend the machine and hibernate it after a certain amount of time." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:224 msgid "" "Power mode controls the power usage of your computer. It can impact " "performance, battery life and fan noise." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:252 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:258 msgid "Power" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:253 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:260 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:342 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:349 msgid "Batteries" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:267 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:268 msgid "Screen brightness" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:270 msgid "On battery, dim screen when inactive" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:272 msgid "Brightness level when inactive" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:274 msgid "Dim screen after inactive for" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:290 msgid "Backlight brightness" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:354 msgid "Devices" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:367 msgid "Low battery notifications" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:369 msgid "For wireless keyboard" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:371 msgid "For wireless mouse" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:373 msgid "For other connected devices" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:395 #, python-format msgid "Caution low UPS, %s remaining" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:397 #, python-format msgid "Using UPS power - %s remaining" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:403 msgid "Caution low UPS" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:405 msgid "Using UPS power" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:430 #, python-format msgid "Charging - %s until fully charged" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:433 #, python-format msgid "Caution low battery, %s remaining" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:435 #, python-format msgid "Using battery power - %s remaining" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:446 msgid "Not discharging" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:448 msgid "Charging - fully charged" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:450 msgid "Empty" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:454 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:495 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:498 msgid "Battery" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:471 msgid "Uninterruptible power supply" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:474 msgid "Wireless mouse" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:477 msgid "Wireless Keyboard" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:483 msgid "Personal digital assistant" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:486 msgid "Cellphone" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:619 msgid "Ask" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:845 msgid "Power mode" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:16 msgid "Cinnamon privacy settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:20 msgid "privacy, recent, gtk, private" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:21 msgid "Privacy" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:46 msgid "Remember recently accessed files" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:50 msgid "Recent files" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:52 msgid "Never forget old files" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:57 msgid "Number of days to remember old files" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:90 msgid "Internet connectivity" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:91 msgid "Check connectivity" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:95 msgid "" "Check that network connections can reach the Internet. This makes it " "possible to detect captive portals, but also generates periodic network " "traffic." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:13 msgid "Lock immediately" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:14 msgid "2 seconds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:15 msgid "5 seconds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:16 msgid "10 seconds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:17 msgid "15 seconds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:19 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:30 msgid "1 minute" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:21 msgid "3 minutes" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:49 msgid "Manage screen lock settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:52 msgid "screensaver, lock, away, message" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:53 msgid "Screensaver" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:75 msgid "Screensaver settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:79 msgid "Delay before starting the screensaver" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:80 msgid "" "This option defines the amount of time to wait before starting the " "screensaver, when the computer is not being used" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:83 msgid "Lock settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:85 msgid "Lock the computer when put to sleep" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:86 msgid "" "Enable this option to require a password when the computer wakes up from " "suspend" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:89 msgid "Lock the computer after the screensaver starts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:90 msgid "" "Enable this option to require a password when the screen turns itself off, " "or when the screensaver activates after a period of inactivity" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:93 msgid "Delay before locking" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:94 msgid "" "This option defines the amount of time to wait before locking the screen, " "after showing the screensaver or after turning off the screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:105 msgid "Always show the clock" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:106 msgid "Show the clock on the wallpaper instead of just on the unlock screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:109 msgid "Use a custom date and time format" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:112 msgid "Time Format" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:115 msgid "Date Format: " msgstr "" #. calendar@cinnamon.org->settings-schema.json->format-button->description #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:119 msgid "Show information on date format syntax" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:124 msgid "Time Font" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:127 msgid "Date Font" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:130 msgid "Away message" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:132 msgid "Show this message when the screen is locked" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:134 msgid "This is the default message displayed on your lock screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:137 msgid "Font" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:139 msgid "Ask for a custom message when locking the screen from the menu" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:140 msgid "" "This option allows you to type a message each time you lock the screen from " "the menu" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:145 msgid "Allow keyboard shortcuts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:146 msgid "" "Allow shortcuts like volume-control and media keys to be used on the lock " "screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:149 msgid "Show media player controls" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:150 msgid "For compatible players, show playback controls while media is playing" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:153 msgid "Show album art" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:154 msgid "If available, show album art while media is playing" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:157 msgid "Show info panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:158 msgid "Show the number of missed notifications and the battery status" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:161 msgid "Allow floating clock and album art widgets" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:162 msgid "" "When the default screensaver is active, allow the clock and album art " "widgets to float around randomly" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:18 msgid "Starting Cinnamon" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:19 msgid "Leaving Cinnamon" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:20 msgid "Switching workspace" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:21 msgid "Opening new windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:24 msgid "Maximizing windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:25 msgid "Unmaximizing windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:26 msgid "Tiling and snapping windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:27 msgid "Inserting a device" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:28 msgid "Removing a device" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:29 msgid "Showing notifications" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:30 msgid "Changing the sound volume" msgstr "" #. name, position, icon name, row, col, #. pa id #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:35 msgid "Front Left" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:36 msgid "Front Right" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:37 msgid "Front Center" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:38 msgid "Rear Left" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:39 msgid "Rear Right" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:40 msgid "Rear Center" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:41 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:281 msgid "Subwoofer" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:42 msgid "Side Left" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:43 msgid "Side Right" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:154 msgid "Volume: " msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:165 msgid "Softer" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:165 msgid "Louder" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:259 msgid "Muted" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:260 msgid "Click to unmute" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:264 msgid "Click to mute" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:273 msgid "Balance" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:278 msgid "Rear" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:279 msgid "Front" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:282 msgid "Soft" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:283 msgid "Loud" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:326 msgid "Input level" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:372 msgid "Output profile" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:373 msgid "Test sound" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:416 msgid "Test Sound" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:489 msgid "Manage sound settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:492 msgid "sound, media, music, speakers, audio, microphone, headphone" msgstr "" #. sound@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:493 msgid "Sound" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:526 msgid "Output" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:529 msgid "Device" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:532 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:572 msgid "Device settings" msgstr "" #. overamplification #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:555 msgid "Overamplification" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:556 msgid "Allow the volume to exceed 100%, with reduced sound quality." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:561 msgid "Input" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:592 msgid "No inputs sources are currently available." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:600 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:606 msgid "Sounds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:602 msgid "Sounds Volume" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:630 msgid "No application is currently playing or recording audio." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:53 msgid "Manage your startup applications" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:57 msgid "startup, programs, boot, init, session, autostart, apps" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:58 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:71 msgid "Startup Applications" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:143 msgid "Unavailable" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:144 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:317 msgid "No description" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:315 msgid "No name" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:445 msgid "Run now" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:486 #, python-format msgid "" "Could not execute '%s'\n" "%s" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:507 msgid "Custom command" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:512 msgid "Choose application" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:720 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:747 #, python-format msgid "%s s" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:774 msgid "Add Startup Program" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:777 msgid "Edit Startup Program" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:778 msgid "Save" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:802 msgid "Command" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:815 msgid "Browse..." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:820 msgid "Comment" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:830 msgid "Startup delay" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:853 msgid "The startup command cannot be empty" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:861 msgid "The startup command is not valid" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:892 msgid "Select Command" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:915 msgid "Search Applications..." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:951 msgid "Add Application" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:93 msgid "Manage themes to change how your desktop looks" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:98 msgid "themes, style" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:101 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:244 msgid "Themes" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:248 msgid "Mouse Pointer" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:254 msgid "Icons" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:261 msgid "Simplified settings..." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:267 msgid "Add/Remove" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:272 msgid "Miscellaneous options" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:274 msgid "Let applications decide" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:275 msgid "Prefer dark mode" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:276 msgid "Prefer light mode" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:277 msgid "Dark mode" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:278 msgid "This setting only affects applications which support dark mode" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:281 msgid "Show icons in menus" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:284 msgid "Show icons on buttons" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:287 msgid "Scrollbar behavior" msgstr "" #. Translators: The 'trough' is the part of the scrollbar that the 'handle' #. rides in. This setting determines whether clicking in that trough #. somewhere #. jumps directly to the new position, or if it only scrolls towards it. #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:292 msgid "Jump to position when clicking in a trough" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:295 msgid "Use overlay scroll bars" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:300 msgid "Override the current theme's scrollbar width" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:304 msgid "Scrollbar width" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:325 msgid "" "Changes may not apply to already-running programs, and may not affect all " "applications." msgstr "" #. Position style combo on "Custom" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:526 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:580 msgid "Custom" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:155 msgid "Details" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:157 msgid "Authorize" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:159 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:225 msgid "Trust" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:173 msgid "Generation" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:175 msgid "Bandwidth" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:177 msgid "Type" msgstr "" #. Update the status label #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:204 msgid "Disconnected" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:206 msgid "Connected" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:208 msgid "Authorized" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:210 msgid "Trusted" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:223 msgid "Forget" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:234 msgid "lanes" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:243 msgid "Manage Thunderbolt and USB4 devices" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:246 msgid "thunderbolt, usb, docking, station, hub, dock" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:295 msgid "No Thunderbolt or USB4 devices found." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:305 msgid "Thunderbolt or USB4 is not detected on your system." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:309 msgid "" "The 'bolt' package must be installed to manage Thunderbolt and USB4 devices." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_thunderbolt.py:314 msgid "The boltd service is not running." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:34 msgid "Change your user preferences and password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:37 msgid "user, account, information, details, password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:58 msgid "Click to change your picture" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:60 msgid "Take a photo..." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:88 msgid "Click to change your name" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:101 msgid "Click to change your password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:260 msgid "Current password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:409 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:410 msgid "Wrong password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:414 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:415 msgid "Internal Error" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:15 msgid "Manage window preferences" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:18 msgid "" "windows, titlebar, edge, switcher, window list, attention, focus, tile, " "tiling, snap, snapping" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:32 msgid "Titlebar" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:36 msgid "Buttons" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:45 msgid "Gnome" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:46 msgid "Gnome Left" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:47 msgid "Classic Mac" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:49 msgid "Buttons layout" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:54 msgid "Toggle Shade" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:54 msgid "Toggle Maximize" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:55 msgid "Toggle Maximize Horizontally" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:55 msgid "Toggle Maximize Vertically" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:56 msgid "Toggle on all workspaces" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:57 msgid "Lower" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:59 msgid "Action on title bar double-click" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:62 msgid "Action on title bar middle-click" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:65 msgid "Action on title bar right-click" msgstr "" #. cornerbar@cinnamon.org->settings-schema.json->scroll-behavior->options #. window-list@cinnamon.org->settings-schema.json->window-hover->options #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:68 msgid "Nothing" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:68 msgid "Shade and unshade" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:68 msgid "Adjust opacity" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:70 msgid "Action on title bar with mouse scroll" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:73 msgid "Minimum opacity" msgstr "" #. show-desktop@cinnamon.org->settings-schema.json->peek-opacity->units #. cornerbar@cinnamon.org->settings-schema.json->peek-opacity->units #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:73 msgid "%" msgstr "" #. menu@cinnamon.org->settings-schema.json->behavior->title #. grouped-window-list@cinnamon.org->settings- #. schema.json->generalSection->title #. window-list@cinnamon.org->settings-schema.json->section1->description #. expo@cinnamon.org->settings-schema.json->section1->description #. panel-launchers@cinnamon.org->settings-schema.json->section1->description #. notifications@cinnamon.org->settings-schema.json->section1->description #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:82 msgid "Behavior" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:84 msgid "Window Focus" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:86 msgid "Click" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:86 msgid "Sloppy" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:87 msgid "Window focus mode" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:88 msgid "" "The window focus mode indicates how windows are activated. It has three " "possible values; \"click\" means windows must be clicked in order to focus " "them, \"sloppy\" means windows are focused when the mouse enters the window," " and \"mouse\" means windows are focused when the mouse enters the window " "and unfocused when the mouse leaves the window." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:91 msgid "Automatically raise focused windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:97 msgid "Bring windows which require attention to the current workspace" msgstr "" #. It's weird to show a combo for two items. For now this is simpler to #. explain as a switch... #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:101 msgid "Give focus to new windows launched from a terminal" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:102 msgid "" "Normally, all windows created by the user are given initial focus. This " "controls whether or not to include programs launched from a terminal." msgstr "" #. ###### #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:130 msgid "Attach dialog windows to the parent window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:133 msgid "Moving and Resizing Windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:137 msgid "Cursor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:137 msgid "Manual" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:137 msgid "Center" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:138 msgid "Location of newly opened windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:142 msgid "Special key to move and resize windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:143 msgid "" "While the special key is pressed, windows can be dragged with the left mouse" " button and resized with the right mouse button." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:146 msgid "Draggable border width" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:146 msgid "Narrower" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:146 msgid "Wider" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:148 msgid "" "This adjusts the width of that portion of the window border used for " "resizing." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:155 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:157 msgid "Alt-Tab" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:160 msgid "Icons only" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:161 msgid "Thumbnails only" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:162 msgid "Icons and thumbnails" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:163 msgid "Icons and window preview" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:164 msgid "Window preview (no icons)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:165 msgid "Coverflow (3D)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:166 msgid "Timeline (3D)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:168 msgid "Alt-Tab switcher style" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:171 msgid "" "Display the alt-tab switcher on the primary monitor instead of the active " "one" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:174 msgid "Move minimized windows to the end of the alt-tab switcher" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:177 msgid "Delay before displaying the alt-tab switcher" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->show-all- #. workspaces->description #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:180 msgid "Show windows from all workspaces" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:183 msgid "Show windows from current monitor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:186 msgid "Warp mouse pointer to the new focused window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:191 msgid "Tiling" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:193 msgid "Tiling Preferences" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:194 msgid "Enable window tiling" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:196 msgid "Maximize, instead of tile, when dragging a window to the top edge" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:10 msgid "Manage workspace preferences" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:13 msgid "workspace, osd, expo, monitor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:27 msgid "Workspace Options" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:29 msgid "Enable workspace OSD" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:32 msgid "Allow cycling through workspaces" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:35 msgid "Only use workspaces on primary monitor (requires Cinnamon restart)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:38 msgid "Display Expo view as a grid" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:41 msgid "Always show Expo on the primary monitor" msgstr "" #: files/usr/bin/cinnamon-hover-click:82 msgid "Single Click" msgstr "" #: files/usr/bin/cinnamon-hover-click:84 msgid "Double Click" msgstr "" #: files/usr/bin/cinnamon-hover-click:86 msgid "Drag" msgstr "" #: files/usr/bin/cinnamon-hover-click:88 msgid "Secondary Click" msgstr "" #: files/usr/bin/cinnamon-hover-click:166 msgid "_Text" msgstr "" #: files/usr/bin/cinnamon-hover-click:170 msgid "_Icons" msgstr "" #: files/usr/bin/cinnamon-hover-click:174 msgid "_Both" msgstr "" #: files/usr/bin/cinnamon-hover-click:184 msgid "_Horizontal" msgstr "" #: files/usr/bin/cinnamon-hover-click:188 msgid "_Vertical" msgstr "" #: files/usr/bin/cinnamon-launcher:176 msgid "Cinnamon just crashed" msgstr "" #: files/usr/bin/cinnamon-launcher:178 msgid "Disable downloaded applets, desklets and extensions" msgstr "" #: files/usr/bin/cinnamon-launcher:181 msgid "You are currently running in fallback mode." msgstr "" #: files/usr/bin/cinnamon-launcher:182 msgid "" "If you suspect the source of the crash is a local extension, applet or " "desklet, you can disable downloaded add-ons using the checkbox below." msgstr "" #: files/usr/bin/cinnamon-launcher:183 msgid "Do you want to restart Cinnamon?" msgstr "" #: files/usr/bin/xlet-about-dialog:30 #, python-format msgid "Version %s (%s)" msgstr "" #: files/usr/bin/xlet-about-dialog:32 #, python-format msgid "Version %s" msgstr "" #: files/usr/bin/xlet-about-dialog:35 #, python-format msgid "Updated on %s" msgstr "" #: files/usr/bin/xlet-about-dialog:55 #, python-format msgid "About %s" msgstr "" #: files/usr/bin/xlet-about-dialog:101 msgid "the type of the Spice" msgstr "" #: files/usr/bin/xlet-about-dialog:105 msgid "the UUID of the Spice" msgstr "" #: files/usr/bin/xlet-about-dialog:121 #, python-format msgid "Unable to locate %s %s" msgstr "" #. nightlight@cinnamon.org->metadata.json->description msgid "Activate/deactivate Night Light mode." msgstr "" #. menu@cinnamon.org->metadata.json->description msgid "Main Cinnamon menu" msgstr "" #. menu@cinnamon.org->settings-schema.json->content->title #. menu@cinnamon.org->settings-schema.json->content-content->title msgid "Content" msgstr "" #. menu@cinnamon.org->settings-schema.json->content-places->title msgid "Places" msgstr "" #. menu@cinnamon.org->settings-schema.json->overlay-key->description msgid "Keyboard shortcut to open and close the menu" msgstr "" #. menu@cinnamon.org->settings-schema.json->menu-custom->description msgid "Use a custom icon and label" msgstr "" #. menu@cinnamon.org->settings-schema.json->menu-icon->description #. settings-example@cinnamon.org->settings-schema.json->tree->columns->title msgid "Icon" msgstr "" #. menu@cinnamon.org->settings-schema.json->menu-icon-size->description msgid "Icon size" msgstr "" #. menu@cinnamon.org->settings-schema.json->menu-label->description msgid "Text" msgstr "" #. menu@cinnamon.org->settings-schema.json->symbolic-category- #. icons->description msgid "Use symbolic icons for categories" msgstr "" #. menu@cinnamon.org->settings-schema.json->category-icon-size->description msgid "Categories icon size" msgstr "" #. menu@cinnamon.org->settings-schema.json->application-icon-size->description msgid "Applications icon size" msgstr "" #. menu@cinnamon.org->settings-schema.json->show-sidebar->description msgid "Sidebar" msgstr "" #. menu@cinnamon.org->settings-schema.json->show-avatar->description msgid "Avatar" msgstr "" #. menu@cinnamon.org->settings-schema.json->show-documents->description msgid "Documents" msgstr "" #. menu@cinnamon.org->settings-schema.json->show-downloads->description msgid "Downloads" msgstr "" #. menu@cinnamon.org->settings-schema.json->show-pictures->description msgid "Pictures" msgstr "" #. menu@cinnamon.org->settings-schema.json->show-videos->description msgid "Videos" msgstr "" #. menu@cinnamon.org->settings-schema.json->show-bookmarks->description msgid "Other bookmarks" msgstr "" #. menu@cinnamon.org->settings-schema.json->system-position->description msgid "Position of the system buttons" msgstr "" #. menu@cinnamon.org->settings-schema.json->system-position->options msgid "In the sidebar" msgstr "" #. menu@cinnamon.org->settings-schema.json->system-position->options msgid "Alongside the search bar" msgstr "" #. menu@cinnamon.org->settings-schema.json->search-position->description msgid "Position of the search bar" msgstr "" #. menu@cinnamon.org->settings-schema.json->search-position->options msgid "At the top" msgstr "" #. menu@cinnamon.org->settings-schema.json->search-position->options msgid "At the bottom" msgstr "" #. menu@cinnamon.org->settings-schema.json->sidebar-icon-size->description msgid "Sidebar icon size" msgstr "" #. menu@cinnamon.org->settings-schema.json->sidebar-max-width->description msgid "Maximum sidebar width (px)" msgstr "" #. menu@cinnamon.org->settings-schema.json->show-recents->description msgid "Recents" msgstr "" #. menu@cinnamon.org->settings-schema.json->show-description->description msgid "Show application descriptions" msgstr "" #. menu@cinnamon.org->settings-schema.json->category-hover->description msgid "Change categories on hover" msgstr "" #. menu@cinnamon.org->settings-schema.json->enable-autoscroll->description msgid "Enable autoscrolling in application list" msgstr "" #. menu@cinnamon.org->settings-schema.json->force-show-panel->description msgid "Force the panel to be visible when opening the menu" msgstr "" #. menu@cinnamon.org->settings-schema.json->force-show-panel->tooltip msgid "" "Opening the menu will also show the main panel (which may be auto-hidden)." msgstr "" #. menu@cinnamon.org->settings-schema.json->activate-on-hover->description msgid "Open the menu when I move my mouse over it" msgstr "" #. menu@cinnamon.org->settings-schema.json->activate-on-hover->tooltip msgid "Enable opening the menu when the mouse enters the applet" msgstr "" #. menu@cinnamon.org->settings-schema.json->hover-delay->description msgid "Menu hover delay" msgstr "" #. menu@cinnamon.org->settings-schema.json->hover-delay->tooltip msgid "Delay before the menu opens when hovered" msgstr "" #. menu@cinnamon.org->settings-schema.json->enable-animation->description msgid "Use menu animations" msgstr "" #. menu@cinnamon.org->settings-schema.json->enable-animation->tooltip msgid "Allow the menu to animate on open and close" msgstr "" #. menu@cinnamon.org->settings-schema.json->menu-editor-button->description msgid "Open the menu editor" msgstr "" #. menu@cinnamon.org->settings-schema.json->menu-editor-button->tooltip msgid "Press this button to customize your menu entries." msgstr "" #. menu@cinnamon.org->settings-schema.json->reset-menu-size- #. button->description msgid "Restore the menu to its original size" msgstr "" #. xapp-status@cinnamon.org->metadata.json->name msgid "XApp Status Applet" msgstr "" #. xapp-status@cinnamon.org->metadata.json->description msgid "" "An applet which hosts all the system tray icons for applications which use " "XAppStatusIcons" msgstr "" #. sound@cinnamon.org->metadata.json->description msgid "A Cinnamon applet to control sound and music" msgstr "" #. sound@cinnamon.org->settings-schema.json->playerControl->description msgid "Control Players" msgstr "" #. sound@cinnamon.org->settings- #. schema.json->extendedPlayerControl->description msgid "Show Loop and Shuffle controls" msgstr "" #. sound@cinnamon.org->settings-schema.json->keyOpen->description #. network@cinnamon.org->settings-schema.json->keyOpen->description msgid "Show menu" msgstr "" #. sound@cinnamon.org->settings-schema.json->keyOpen->tooltip msgid "Set keybinding(s) to show the sound applet menu." msgstr "" #. sound@cinnamon.org->settings-schema.json->alwaysShowMuteInput->description msgid "Always show input switch" msgstr "" #. sound@cinnamon.org->settings-schema.json->alwaysShowMuteInput->tooltip msgid "Always show the 'Mute input' switch in the context menu." msgstr "" #. sound@cinnamon.org->settings-schema.json->showtrack->description msgid "Show song information on the panel" msgstr "" #. sound@cinnamon.org->settings-schema.json->truncatetext->units msgid "characters" msgstr "" #. sound@cinnamon.org->settings-schema.json->truncatetext->description msgid "Limit song information to" msgstr "" #. sound@cinnamon.org->settings-schema.json->middleClickAction->options #. sound@cinnamon.org->settings-schema.json->middleShiftClickAction->options msgid "Toggle Mute" msgstr "" #. sound@cinnamon.org->settings-schema.json->middleClickAction->options #. sound@cinnamon.org->settings-schema.json->middleShiftClickAction->options msgid "Toggle Mute output" msgstr "" #. sound@cinnamon.org->settings-schema.json->middleClickAction->options #. sound@cinnamon.org->settings-schema.json->middleShiftClickAction->options msgid "Toggle Mute input" msgstr "" #. sound@cinnamon.org->settings-schema.json->middleClickAction->description msgid "Action on middle click" msgstr "" #. sound@cinnamon.org->settings- #. schema.json->middleShiftClickAction->description msgid "Action on shift+middle click" msgstr "" #. sound@cinnamon.org->settings-schema.json->horizontalScroll->description msgid "Use horizontal scrolling to move between tracks" msgstr "" #. sound@cinnamon.org->settings-schema.json->showalbum->description msgid "Show album art as icon" msgstr "" #. sound@cinnamon.org->settings-schema.json->hideSystray->description msgid "Hide system tray icons for compatible players" msgstr "" #. sound@cinnamon.org->settings-schema.json->section3->description msgid "Tooltip" msgstr "" #. sound@cinnamon.org->settings-schema.json->tooltipShowVolume->description msgid "Show volume in tooltip" msgstr "" #. sound@cinnamon.org->settings-schema.json->tooltipShowPlayer->description msgid "Show player in tooltip" msgstr "" #. sound@cinnamon.org->settings- #. schema.json->tooltipShowArtistTitle->description msgid "Show song artist and title in tooltip" msgstr "" #. systray@cinnamon.org->metadata.json->name msgid "System Tray" msgstr "" #. systray@cinnamon.org->metadata.json->description msgid "An applet which hosts all the system tray icons" msgstr "" #. grouped-window-list@cinnamon.org->metadata.json->description msgid "Main Cinnamon window list with app grouping" msgstr "" #. grouped-window-list@cinnamon.org->settings- #. schema.json->thumbnailsPage->title #. grouped-window-list@cinnamon.org->settings- #. schema.json->thumbnailsSection->title msgid "Thumbnails" msgstr "" #. grouped-window-list@cinnamon.org->settings- #. schema.json->contextMenuPage->title msgid "Context Menu" msgstr "" #. grouped-window-list@cinnamon.org->settings- #. schema.json->hotKeysSection->title msgid "Hot Keys" msgstr "" #. grouped-window-list@cinnamon.org->settings- #. schema.json->appButtonsSection->title msgid "Application Buttons" msgstr "" #. grouped-window-list@cinnamon.org->settings- #. schema.json->hoverPeekSection->title msgid "Hover Peek" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->group- #. apps->description msgid "Group windows by application" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->scroll- #. behavior->description msgid "Mouse wheel scroll action" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->scroll- #. behavior->options msgid "Cycle apps" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->scroll- #. behavior->options #. grouped-window-list@cinnamon.org->settings-schema.json->left-click- #. action->options msgid "Cycle windows" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->left-click- #. action->description msgid "Left click action" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->left-click- #. action->options msgid "Toggle activation of last focused window" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->middle-click- #. action->description #. cornerbar@cinnamon.org->settings-schema.json->middle-click- #. action->description msgid "Middle click action" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->middle-click- #. action->options msgid "Launch new app instance" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->middle-click- #. action->options msgid "Close last focused window in group" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->window-display- #. settings->description msgid "Show windows from other monitors" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->window-display- #. settings->options msgid "Only from monitors without a window list" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->window-display- #. settings->options msgid "From all monitors" msgstr "" #. grouped-window-list@cinnamon.org->settings- #. schema.json->cycleMenusHotkey->description msgid "Global hotkey for cycling through thumbnail menus" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->show-apps-order- #. hotkey->description msgid "Global hotkey to show the order of apps" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->show-apps-order- #. timeout->description msgid "Duration of the apps order display on hotkey press" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->super-num- #. hotkeys->description msgid "Enable Super+ shortcut to switch/open apps" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->title- #. display->description msgid "Button label" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->title- #. display->options msgid "Application name" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->title- #. display->options msgid "Window title" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->title- #. display->options msgid "Window title (only for the focused window)" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->launcher-animation- #. effect->description msgid "Launcher animation" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->enable-window- #. count-badges->description msgid "Show window count badges" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->enable-window- #. count-badges->tooltip msgid "Indicate on the panel the number of open windows an application has" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->enable- #. notification-badges->description #. window-list@cinnamon.org->settings-schema.json->enable- #. notifications->description msgid "Show notification badges" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->enable- #. notification-badges->tooltip msgid "Indicate on the panel when an application has notifications" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->enable-app-button- #. dragging->description msgid "Enable app button dragging" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->thumbnail-scroll- #. behavior->description msgid "Cycle windows on mouse wheel scroll" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->show- #. thumbnails->description msgid "Show thumbnails" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->animate- #. thumbnails->description msgid "Animate thumbnails" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->vertical- #. thumbnails->description msgid "Enable vertical thumbnails" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->sort- #. thumbnails->description msgid "Sort thumbnails according to the last focused windows" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->highlight-last- #. focused-thumbnail->description msgid "Highlight the thumbnail of the last focused window" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->onclick- #. thumbnails->description msgid "Click to show thumbnails" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->thumbnail- #. timeout->description msgid "Delay before showing thumbnails" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->thumbnail- #. timeout->options msgid "50 ms" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->thumbnail- #. timeout->options msgid "250 ms" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->thumbnail- #. timeout->options msgid "500 ms" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->thumbnail- #. size->description #. window-list@cinnamon.org->settings-schema.json->window-preview- #. scale->description msgid "Thumbnail size" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->thumbnail- #. size->options #. window-list@cinnamon.org->settings-schema.json->window-preview- #. scale->options msgid "Largest" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->enable-hover- #. peek->description msgid "Show the window when hovering its thumbnail" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->hover-peek-time- #. in->description msgid "Window fade-in time" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->hover-peek-time- #. in->options #. grouped-window-list@cinnamon.org->settings-schema.json->hover-peek-time- #. out->options msgid "150 ms" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->hover-peek-time- #. in->options #. grouped-window-list@cinnamon.org->settings-schema.json->hover-peek-time- #. out->options msgid "300 ms" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->hover-peek-time- #. in->options #. grouped-window-list@cinnamon.org->settings-schema.json->hover-peek-time- #. out->options msgid "450 ms" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->hover-peek-time- #. out->description msgid "Window fade-out time" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->hover-peek- #. opacity->units msgid "percent" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->hover-peek- #. opacity->description #. show-desktop@cinnamon.org->settings-schema.json->peek-opacity->description #. cornerbar@cinnamon.org->settings-schema.json->peek-opacity->description msgid "Window opacity" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->show- #. recent->description msgid "Show recent items" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->autostart-menu- #. item->description msgid "Show autostart option" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->monitor-move-all- #. windows->description msgid "Apply the monitor move option to all windows" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->monitor-move-all- #. windows->tooltip msgid "" "When clicking \"Move to monitor\" in the context menu, this option will move" " all of an app's windows instead of just the last focused window from the " "app." msgstr "" #. network@cinnamon.org->metadata.json->description msgid "Network manager applet" msgstr "" #. network@cinnamon.org->settings-schema.json->keyOpen->tooltip msgid "Set keybinding(s) to show the network applet menu." msgstr "" #. workspace-switcher@cinnamon.org->metadata.json->name msgid "Workspace switcher" msgstr "" #. workspace-switcher@cinnamon.org->metadata.json->description msgid "Select the workspace from the panel" msgstr "" #. workspace-switcher@cinnamon.org->settings-schema.json->display- #. type->description msgid "Type of display" msgstr "" #. workspace-switcher@cinnamon.org->settings-schema.json->display- #. type->tooltip msgid "" "Note that the visual representation will only work if your panel is large " "enough to display it properly, otherwise the simple style will be used." msgstr "" #. workspace-switcher@cinnamon.org->settings-schema.json->display- #. type->options msgid "A visual representation of the workspaces" msgstr "" #. workspace-switcher@cinnamon.org->settings-schema.json->display- #. type->options msgid "Simple buttons" msgstr "" #. workspace-switcher@cinnamon.org->settings-schema.json->scroll- #. behavior->description #. cornerbar@cinnamon.org->settings-schema.json->scroll-behavior->description msgid "Scroll wheel behavior" msgstr "" #. workspace-switcher@cinnamon.org->settings-schema.json->scroll- #. behavior->tooltip msgid "Reverse or disable the direction of the scroll in the workspace list." msgstr "" #. workspace-switcher@cinnamon.org->settings-schema.json->scroll- #. behavior->options msgid "Reversed" msgstr "" #. show-desktop@cinnamon.org->metadata.json->description msgid "Minimize all windows" msgstr "" #. show-desktop@cinnamon.org->settings-schema.json->peek-at- #. desktop->description #. cornerbar@cinnamon.org->settings-schema.json->peek-at-desktop->description msgid "Peek at the desktop on hover" msgstr "" #. show-desktop@cinnamon.org->settings-schema.json->peek-at-desktop->tooltip #. cornerbar@cinnamon.org->settings-schema.json->peek-at-desktop->tooltip msgid "Peek at the desktop when hovering the applet" msgstr "" #. show-desktop@cinnamon.org->settings-schema.json->peek-blur->description #. cornerbar@cinnamon.org->settings-schema.json->peek-blur->description msgid "Blur effect" msgstr "" #. show-desktop@cinnamon.org->settings-schema.json->peek-blur->tooltip #. cornerbar@cinnamon.org->settings-schema.json->peek-blur->tooltip msgid "Blur windows when peeking at the desktop" msgstr "" #. show-desktop@cinnamon.org->settings-schema.json->peek-delay->description #. cornerbar@cinnamon.org->settings-schema.json->peek-delay->description msgid "Hover delay" msgstr "" #. show-desktop@cinnamon.org->settings-schema.json->peek-delay->tooltip #. cornerbar@cinnamon.org->settings-schema.json->peek-delay->tooltip msgid "Delay before Peek shows desktop" msgstr "" #. show-desktop@cinnamon.org->settings-schema.json->peek-opacity->tooltip #. cornerbar@cinnamon.org->settings-schema.json->peek-opacity->tooltip msgid "Change the opacity of windows when peeking at the desktop" msgstr "" #. favorites@cinnamon.org->metadata.json->description msgid "Access your favorite files" msgstr "" #. favorites@cinnamon.org->settings-schema.json->show-full-uri->description msgid "Display full paths in the list" msgstr "" #. trash@cinnamon.org->metadata.json->description msgid "Control the trash from the panel" msgstr "" #. settings@cinnamon.org->metadata.json->name msgid "Settings Applet" msgstr "" #. settings@cinnamon.org->metadata.json->description msgid "Cinnamon Settings" msgstr "" #. removable-drives@cinnamon.org->metadata.json->description msgid "Access removable drives" msgstr "" #. recent@cinnamon.org->metadata.json->description msgid "Access the documents you recently opened" msgstr "" #. cornerbar@cinnamon.org->metadata.json->name msgid "Corner bar" msgstr "" #. cornerbar@cinnamon.org->metadata.json->description msgid "" "A bar designed to be placed in the corner, used to show the desktop, " "desklets, the workspace selector or the window selector." msgstr "" #. cornerbar@cinnamon.org->settings-schema.json->click-action->description msgid "Click action" msgstr "" #. cornerbar@cinnamon.org->settings-schema.json->shift-click- #. action->description msgid "Shift + click action" msgstr "" #. cornerbar@cinnamon.org->settings-schema.json->shift-middle-click- #. action->description msgid "Shift + middle click action" msgstr "" #. cornerbar@cinnamon.org->settings-schema.json->scroll-behavior->options msgid "Switch workspaces" msgstr "" #. cornerbar@cinnamon.org->settings-schema.json->scroll-behavior->options msgid "Switch workspaces (reversed)" msgstr "" #. window-list@cinnamon.org->metadata.json->name msgid "Window list" msgstr "" #. window-list@cinnamon.org->metadata.json->description msgid "Main Cinnamon window list" msgstr "" #. window-list@cinnamon.org->settings-schema.json->enable-alerts->description msgid "" "Show an alert in the window list when a window from another workspace " "requires attention" msgstr "" #. window-list@cinnamon.org->settings-schema.json->enable- #. scrolling->description msgid "Enable mouse-wheel scrolling in the window list" msgstr "" #. window-list@cinnamon.org->settings-schema.json->reverse- #. scrolling->description msgid "Reverse the direction of mouse-wheel scrolling in the window list" msgstr "" #. window-list@cinnamon.org->settings-schema.json->left-click- #. minimize->description msgid "Left click to minimize window" msgstr "" #. window-list@cinnamon.org->settings-schema.json->middle-click- #. close->description msgid "Middle click to close window" msgstr "" #. window-list@cinnamon.org->settings-schema.json->panel-show- #. label->description msgid "Show window names in the panel" msgstr "" #. window-list@cinnamon.org->settings-schema.json->button-width->description msgid "Window button width in the panel" msgstr "" #. window-list@cinnamon.org->settings-schema.json->buttons-use-entire- #. space->description msgid "" "Window buttons can have different sizes and use the entire space available" msgstr "" #. window-list@cinnamon.org->settings-schema.json->window-hover->description msgid "Choose what to show when hovering over a window button" msgstr "" #. window-list@cinnamon.org->settings-schema.json->window-hover->options msgid "Title" msgstr "" #. window-list@cinnamon.org->settings-schema.json->window-hover->options msgid "Thumbnail" msgstr "" #. window-list@cinnamon.org->settings-schema.json->window-preview-show- #. label->description msgid "Show title above thumbnail" msgstr "" #. spacer@cinnamon.org->metadata.json->name msgid "Spacer" msgstr "" #. spacer@cinnamon.org->metadata.json->description msgid "Add some space between your other applets" msgstr "" #. spacer@cinnamon.org->settings-schema.json->width->description msgid "Amount of space in pixels" msgstr "" #. spacer@cinnamon.org->settings-schema.json->width->tooltip msgid "Adjust this to increase or decrease the width of this spacer" msgstr "" #. scale@cinnamon.org->metadata.json->description msgid "Click or hover to activate Scale view" msgstr "" #. scale@cinnamon.org->settings-schema.json->activate-on-hover->description msgid "Activate scale on hover" msgstr "" #. printers@cinnamon.org->metadata.json->description msgid "Manage print jobs" msgstr "" #. printers@cinnamon.org->settings-schema.json->show-icon->description msgid "Show printer icon" msgstr "" #. printers@cinnamon.org->settings-schema.json->show-icon->options msgid "Always" msgstr "" #. printers@cinnamon.org->settings-schema.json->show-icon->options msgid "When printers exist" msgstr "" #. printers@cinnamon.org->settings-schema.json->show-icon->options msgid "When printing" msgstr "" #. printers@cinnamon.org->settings-schema.json->show-icon->tooltip msgid "Choose when to show the printer icon in the panel" msgstr "" #. settings-example@cinnamon.org->metadata.json->name msgid "Settings API Demo" msgstr "" #. settings-example@cinnamon.org->metadata.json->description msgid "" "A sample applet for demonstrating the capabilities and usage of the applet " "and desklet settings API" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->page1->title msgid "Visible settings" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->page2->title msgid "Choosers" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->page3->title #. settings-example@cinnamon.org->settings-schema.json->section5->title msgid "Command settings" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->page4->title msgid "Editable list settings" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->page5->title msgid "Dependencies" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->section0->title msgid "Info" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->section3->title msgid "File choosers" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->section2->title msgid "Menu settings" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->section6->title msgid "Other choosers" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->section7->title msgid "My list" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->section8->title msgid "Show dependencies section" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->section9->title msgid "Dependencies section" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->label- #. info->description msgid "" "Play with these widgets and see the automatic reaction in the panel applet.\n" "\n" "This is a label, and the content can't be modified nor accessed. You may want to use a label to show additional hints or instructions, for example." msgstr "" #. settings-example@cinnamon.org->settings-schema.json->icon-name->description msgid "The icon to use in the panel" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->icon-name->tooltip msgid "Select an icon file, or you can type an icon name into the entry box" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->color->description msgid "The background color for the applet" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->color->tooltip msgid "Click the button to select a new background color for this applet" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->spinner- #. number->description msgid "Applet width in the panel" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->spinner- #. number->tooltip msgid "" "Increase or decrease this spinner value to make the applet wider or narrower" " in the panel" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->combo- #. selection->description msgid "Please pick an option" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->combo- #. selection->options msgid "First Choice" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->combo- #. selection->options msgid "Second Choice" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->combo- #. selection->options msgid "Third Choice" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->combo- #. selection->options msgid "Fourth Choice" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->combo- #. selection->tooltip msgid "" "A combo selection can select between int, boolean, float, and string values" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->scale- #. demo->description msgid "Here is a demonstration of bidirectional control" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->scale-demo->tooltip msgid "" "If you adjust this scale, it updates in the applet. If you adjust the scale" " in the applet, it updates here" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->use-custom- #. label->description msgid "Check this to use a custom label" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->use-custom- #. label->tooltip msgid "" "Checking this box allows you to set a custom label in the field below - this" " demonstrates setting dependencies" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->custom- #. label->description msgid "Custom Applet Label" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->custom-label->tooltip msgid "" "Set your custom label here. This field is unavailable unless the switch " "above is enabled" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->demo- #. button->description msgid "Don't Press This Button!!!" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->demo-button->tooltip msgid "" "Pressing this button activates a callback method in the applet - go ahead, " "press it." msgstr "" #. settings-example@cinnamon.org->settings-schema.json->signal- #. test->description msgid "This is a test widget for individual key signal firing" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->keybinding- #. test->description msgid "Set the keybinding here to activate an action" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->file- #. select->description msgid "Choose a file" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->directory- #. select->description msgid "Choose a directory" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->sound- #. select->description msgid "Choose a sound" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->font- #. select->description msgid "Choose a font" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->long-text->description msgid "You can type paragraphs and lists here" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->long-text->tooltip msgid "" "This setting type is useful for multi-line lists, and text that is too long to fit in an entry widget.\n" "You can manually set the height of the text view with the 'height' property. This one is set to 150. Default is 200." msgstr "" #. settings-example@cinnamon.org->settings-schema.json->date- #. select->description msgid "Choose a Date" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->time- #. select->description msgid "Choose a Time" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->tree->description msgid "Custom tree widget" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->tree->columns->title msgid "Resident" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->tree->columns->title msgid "Address" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->tree->columns->title msgid "Id number" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->tree->columns->title msgid "Shortcut key" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->tree->columns->title msgid "File Path" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->show-deps- #. section->description msgid "Show the dependencies section" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->show-deps- #. section->tooltip msgid "" "Checking this box shows the Dependencies section below. Unchecking hides it." msgstr "" #. settings-example@cinnamon.org->settings-schema.json->deps-info->description msgid "" "You can see this section because the switch above is on. Try switching it " "off and see what happens." msgstr "" #. settings-example@cinnamon.org->settings-schema.json->dep-combo->description msgid "Show info" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->dep-combo->options msgid "Show info #1" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->dep-combo->options msgid "Show info #2" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->dep-combo->options msgid "Don't show info #1 or #2" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->dep-combo- #. info1->description msgid "" "Info #1: You are seeing this info because the first option is selected in " "the combo box above. Try selecting different options to see different " "information." msgstr "" #. settings-example@cinnamon.org->settings-schema.json->dep-combo- #. info2->description msgid "" "Info #2: You are seeing different text now because you selected the second " "option in the combo box above." msgstr "" #. settings-example@cinnamon.org->settings-schema.json->dep-spin->description msgid "Number value" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->dep-spin- #. info1->description msgid "The value of the spinner above is less than 5" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->dep-spin- #. info2->description msgid "The value of the spinner above is greater than or equal to 5" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->custom- #. widget->description msgid "Try out this custom widget!" msgstr "" #. expo@cinnamon.org->metadata.json->description msgid "Click or hover to activate Expo view" msgstr "" #. expo@cinnamon.org->settings-schema.json->activate-on-hover->description msgid "Activate expo on hover" msgstr "" #. slideshow@cinnamon.org->metadata.json->name msgid "Slideshow Controls" msgstr "" #. slideshow@cinnamon.org->metadata.json->description msgid "Basic controls for the Cinnamon slideshow" msgstr "" #. user@cinnamon.org->metadata.json->description msgid "" "An applet to access your account details, switch users and quickly logout or" " power off the computer" msgstr "" #. user@cinnamon.org->metadata.json->name msgid "User Applet" msgstr "" #. user@cinnamon.org->settings-schema.json->display-name->description msgid "Display user name on panel" msgstr "" #. user@cinnamon.org->settings-schema.json->display-image->description msgid "Display the user image on the panel" msgstr "" #. panel-launchers@cinnamon.org->metadata.json->description msgid "Launch applications from the panel" msgstr "" #. panel-launchers@cinnamon.org->settings-schema.json->allow- #. dragging->description msgid "Allow dragging of launchers" msgstr "" #. notifications@cinnamon.org->metadata.json->description msgid "Click to display and manage system notifications" msgstr "" #. notifications@cinnamon.org->settings- #. schema.json->ignoreTransientNotifications->description msgid "Ignore transient notifications" msgstr "" #. notifications@cinnamon.org->settings- #. schema.json->ignoreTransientNotifications->tooltip msgid "Check this to ignore transient notifications." msgstr "" #. notifications@cinnamon.org->settings- #. schema.json->showEmptyTray->description msgid "Show empty tray" msgstr "" #. notifications@cinnamon.org->settings-schema.json->showEmptyTray->tooltip msgid "Check this to show the tray even when there are no new notifications." msgstr "" #. notifications@cinnamon.org->settings- #. schema.json->showNotificationCount->description msgid "Show the number of notifications" msgstr "" #. notifications@cinnamon.org->settings- #. schema.json->showNewestFirst->description msgid "Show newest notifications first" msgstr "" #. notifications@cinnamon.org->settings-schema.json->keyOpen->description msgid "Show notifications" msgstr "" #. notifications@cinnamon.org->settings-schema.json->keyOpen->tooltip msgid "Set keybinding(s) to show the notification popup menu." msgstr "" #. notifications@cinnamon.org->settings-schema.json->keyClear->tooltip msgid "Set keybinding(s) to clear all notifications." msgstr "" #. notifications@cinnamon.org->settings- #. schema.json->btnSystemSettings->description #. inhibit@cinnamon.org->settings- #. schema.json->btnSystemNotificationSettings->description msgid "Open notification settings" msgstr "" #. inhibit@cinnamon.org->metadata.json->name msgid "Inhibit Applet" msgstr "" #. inhibit@cinnamon.org->metadata.json->description msgid "" "This applet is used to disable notifications and power management (including" " the screensaver and the session from going idle)" msgstr "" #. inhibit@cinnamon.org->settings-schema.json->keyPower->description msgid "Inhibit power management" msgstr "" #. inhibit@cinnamon.org->settings-schema.json->keyPower->tooltip msgid "Set keybinding(s) to inhibit power management." msgstr "" #. inhibit@cinnamon.org->settings-schema.json->keyNotifications->description msgid "Inhibit notifications" msgstr "" #. inhibit@cinnamon.org->settings-schema.json->keyNotifications->tooltip msgid "Set keybinding(s) to inhibit notifications." msgstr "" #. inhibit@cinnamon.org->settings- #. schema.json->btnSystemPowerSettings->description msgid "Open power settings" msgstr "" #. on-screen-keyboard@cinnamon.org->metadata.json->name msgid "On-Screen keyboard" msgstr "" #. on-screen-keyboard@cinnamon.org->metadata.json->description msgid "A Cinnamon applet to launch the on-screen keyboard" msgstr "" #. calendar@cinnamon.org->metadata.json->name msgid "Calendar" msgstr "" #. calendar@cinnamon.org->metadata.json->description msgid "The Cinnamon calendar applet" msgstr "" #. calendar@cinnamon.org->settings-schema.json->show-events->description msgid "Show calendar events" msgstr "" #. calendar@cinnamon.org->settings-schema.json->show-events->tooltip msgid "Check this to display events in the calendar." msgstr "" #. calendar@cinnamon.org->settings-schema.json->show-week-numbers->description msgid "Show week numbers in calendar" msgstr "" #. calendar@cinnamon.org->settings-schema.json->show-week-numbers->tooltip msgid "Check this to show week numbers in the calendar." msgstr "" #. calendar@cinnamon.org->settings-schema.json->use-custom-format->description #. clock@cinnamon.org->settings-schema.json->use-custom-format->description msgid "Use a custom date format" msgstr "" #. calendar@cinnamon.org->settings-schema.json->use-custom-format->tooltip msgid "" "Check this to define a custom format for the date in the calendar applet." msgstr "" #. calendar@cinnamon.org->settings-schema.json->custom-format->description #. clock@cinnamon.org->settings-schema.json->date-format->description msgid "Date format" msgstr "" #. calendar@cinnamon.org->settings-schema.json->custom-format->tooltip #. clock@cinnamon.org->settings-schema.json->date-format->tooltip msgid "Set your custom format here." msgstr "" #. calendar@cinnamon.org->settings-schema.json->custom-tooltip- #. format->description msgid "Date format for tooltip" msgstr "" #. calendar@cinnamon.org->settings-schema.json->custom-tooltip-format->tooltip msgid "Set your custom tooltip format here." msgstr "" #. calendar@cinnamon.org->settings-schema.json->format-button->tooltip msgid "Click this button to know more about the syntax for date formats." msgstr "" #. calendar@cinnamon.org->settings-schema.json->keyOpen->description msgid "Show calendar" msgstr "" #. calendar@cinnamon.org->settings-schema.json->keyOpen->tooltip msgid "Set keybinding(s) to show the calendar." msgstr "" #. xrandr@cinnamon.org->metadata.json->description msgid "XRandR monitor control applet" msgstr "" #. keyboard@cinnamon.org->metadata.json->description msgid "Keyboard layout" msgstr "" #. a11y@cinnamon.org->metadata.json->description msgid "Accessibility applet" msgstr "" #. windows-quick-list@cinnamon.org->metadata.json->name msgid "Windows Quick List" msgstr "" #. windows-quick-list@cinnamon.org->metadata.json->description msgid "Quickly access windows from all workspaces" msgstr "" #. separator@cinnamon.org->metadata.json->name msgid "Separator" msgstr "" #. separator@cinnamon.org->metadata.json->description msgid "A separator icon which can be added multiple times" msgstr "" #. power@cinnamon.org->metadata.json->name msgid "Power Manager" msgstr "" #. power@cinnamon.org->metadata.json->description msgid "Cinnamon power management applet" msgstr "" #. power@cinnamon.org->settings-schema.json->labelinfo->options msgid "Show percentage" msgstr "" #. power@cinnamon.org->settings-schema.json->labelinfo->options msgid "Show time remaining" msgstr "" #. power@cinnamon.org->settings-schema.json->labelinfo->options msgid "Show percentage and time remaining" msgstr "" #. power@cinnamon.org->settings-schema.json->labelinfo->options msgid "Hide label" msgstr "" #. power@cinnamon.org->settings-schema.json->showmulti->description msgid "Always show all batteries" msgstr "" #. power@cinnamon.org->settings-schema.json->showmulti->tooltip msgid "" "Check this to always show multiple batteries in the panel, regardless of " "whether one of them is marked primary." msgstr "" #. photoframe@cinnamon.org->metadata.json->name msgid "Digital photo frame" msgstr "" #. photoframe@cinnamon.org->metadata.json->description msgid "A digital photo frame desklet" msgstr "" #. photoframe@cinnamon.org->settings-schema.json->directory->description msgid "Folder" msgstr "" #. photoframe@cinnamon.org->settings-schema.json->height->description msgid "Height" msgstr "" #. photoframe@cinnamon.org->settings-schema.json->width->description msgid "Width" msgstr "" #. photoframe@cinnamon.org->settings-schema.json->fade-delay->description msgid "Fade delay" msgstr "" #. photoframe@cinnamon.org->settings-schema.json->effect->description msgid "Special effect" msgstr "" #. photoframe@cinnamon.org->settings-schema.json->effect->options msgid "Sepia" msgstr "" #. photoframe@cinnamon.org->settings-schema.json->effect->options msgid "Black and White" msgstr "" #. launcher@cinnamon.org->metadata.json->name msgid "Launcher desklet" msgstr "" #. launcher@cinnamon.org->metadata.json->description msgid "A desklet that launches a program" msgstr "" #. clock@cinnamon.org->metadata.json->name msgid "Clock desklet" msgstr "" #. clock@cinnamon.org->metadata.json->description msgid "A desklet that displays the time" msgstr "" #. clock@cinnamon.org->settings-schema.json->text-color->description msgid "Text color" msgstr "" #. clock@cinnamon.org->settings-schema.json->text-color->tooltip msgid "Click the button to select a new text color" msgstr "" #. clock@cinnamon.org->settings-schema.json->use-custom-format->tooltip msgid "" "Check this to define a custom format for the time in the clock desklet." msgstr "" cinnamon-6.6.8/cinnamon.session.in0000664000175000017500000000024015167446463016111 0ustar fabiofabio[Cinnamon Session] Name=Cinnamon RequiredComponents=cinnamon;org.cinnamon.ScreenSaver;nemo-autostart;@REQUIRED@cinnamon-killer-daemon; DesktopName=X-Cinnamon cinnamon-6.6.8/cinnamon2d.session.in0000664000175000017500000000026715167446463016350 0ustar fabiofabio[Cinnamon Session] Name=Cinnamon (Software Rendering) RequiredComponents=cinnamon2d;org.cinnamon.ScreenSaver;nemo-autostart;@REQUIRED@cinnamon-killer-daemon; DesktopName=X-Cinnamon cinnamon-6.6.8/data/0000775000175000017500000000000015167446463013212 5ustar fabiofabiocinnamon-6.6.8/data/README.osk-layouts0000664000175000017500000000200315167446463016356 0ustar fabiofabioGnome-shell OSK layouts are extracted from CLDR layout definitions: https://www.unicode.org/cldr/charts/latest/keyboards/layouts/index.html Updating these involves several steps: 1) Downloading and unzipping the tarball found at: http://www.unicode.org/Public/cldr/latest/keyboards.zip This file contains XML files describing the keyboard layouts. 2) Cloning the cldr2json script at: git://repo.or.cz/cldr2json.git It will be used to convert the XML files into JSON that can be directly consumed by gnome-shell. 3) Running the script to produce the files: ./cldr2json We shall usually use the "android" folder, since that's most complete, and similar to our UI and target sizes. And the target directory must be data/osk-layouts in this repository. 4) Modify gnome-shell-osk-layouts.gresource.xml to include the files 5) Do git add on the updated/new files, and git commit. Or alternatively: 1) Run update-osk-layouts.sh 2) Do git add and git commit cinnamon-6.6.8/data/cinnamon-osk-layouts.gresource.xml0000664000175000017500000000322315167446463022023 0ustar fabiofabio am.json ara.json be.json bg.json by.json ca.json cz.json de.json dk.json ee.json epo.json es+cat.json es.json fi.json fr.json ge.json gr.json hr.json hu.json id.json il.json in+bolnagri.json in+mal.json ir.json is.json it.json ke.json kg.json kh.json la.json latam.json lt.json lv.json mk.json mn.json my.json nl.json no.json ph.json pl.json pt.json ro.json rs.json ru.json se.json si.json sk.json th.json tr.json ua.json uk.json us.json vn.json za.json emoji.json keyboard-caps-lock-filled-symbolic.svg keyboard-enter-symbolic.svg keyboard-shift-filled-symbolic.svg cinnamon-6.6.8/data/cinnamon-wayland.desktop.in.in0000664000175000017500000000074115167446463021060 0ustar fabiofabio[Desktop Entry] Type=Application Name=Cinnamon (Wayland session) Comment=Window management and application launching Exec=cinnamon --replace X-GNOME-Bugzilla-Bugzilla=GNOME X-GNOME-Bugzilla-Product=cinnamon X-GNOME-Bugzilla-Component=general X-GNOME-Bugzilla-Version=@VERSION@ Categories=GNOME;GTK;System;Core; OnlyShowIn=X-Cinnamon; NoDisplay=true X-GNOME-Autostart-Phase=DisplayServer X-GNOME-Provides=panel;windowmanager; X-GNOME-Autostart-Notify=true X-GNOME-AutoRestart=false cinnamon-6.6.8/data/cinnamon.desktop.in.in0000664000175000017500000000072715167446463017427 0ustar fabiofabio[Desktop Entry] Type=Application Name=Cinnamon Comment=Window management and application launching Exec=@bindir@/cinnamon-launcher X-GNOME-Bugzilla-Bugzilla=GNOME X-GNOME-Bugzilla-Product=cinnamon X-GNOME-Bugzilla-Component=general X-GNOME-Bugzilla-Version=@VERSION@ Categories=GNOME;GTK;System;Core; OnlyShowIn=X-Cinnamon; NoDisplay=true X-GNOME-Autostart-Phase=WindowManager X-GNOME-Provides=panel;windowmanager; X-GNOME-Autostart-Notify=true X-GNOME-AutoRestart=false cinnamon-6.6.8/data/cinnamon2d.desktop.in.in0000664000175000017500000000055315167446463017652 0ustar fabiofabio[Desktop Entry] Type=Application Name=Cinnamon 2D Comment=Window management and application launching Exec=@bindir@/cinnamon2d Categories=GNOME;GTK;System;Core; OnlyShowIn=X-Cinnamon; NoDisplay=true X-GNOME-Autostart-Phase=WindowManager X-GNOME-Provides=panel;windowmanager; X-GNOME-Autostart-Notify=true X-GNOME-AutoRestart=true X-Ubuntu-Gettext-Domain=cinnamon cinnamon-6.6.8/data/cldr2json/0000775000175000017500000000000015167446463015112 5ustar fabiofabiocinnamon-6.6.8/data/cldr2json/README.md0000664000175000017500000000235115167446463016372 0ustar fabiofabiocldr2json ========= This script converts Unicode CLDR android keyboard layouts to JSON usable by GNOME Shell. CLDR keyboard layouts can be found at Usage ===== ./cldr2json example: ./cldr2json cldr/keyboards/android/ json_layouts/ Keyboard layout mapping ======================= Unicode CLDR layout identifiers are language codes, while XKB layout identifiers are... something else. The mapping between the two currently uses heuristic based on the layout descriptions, in this order: - if the CLDR layout description matches an XKB layout description, chose its XKB identifier - if one word of the CLDR layout description matches an XKB layout description, chose its XKB identifier - if the CLDR layout description matches one word of an XKB layout description, chose its XKB identifier That doesn't always work. For instance it fails for "en" language, that should match "us" XKB identifier. For such cases, there is a mapping in LOCALE_TO_XKB_OVERRIDES at the top of the script. If you discover a weird mapping of if you get a "failed to find XKB mapping for " warning then please consider adding an override there. cinnamon-6.6.8/data/cldr2json/cldr2json.py0000775000175000017500000001437415167446463017400 0ustar fabiofabio#!/usr/bin/python3 # # Copyright 2015 Daiki Ueno # 2016 Parag Nemade # 2017 Alan # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2 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 # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this program; if not, see # . import glob import json import locale import logging import os import re import sys import xml.etree.ElementTree import gi gi.require_version('GnomeDesktop', '3.0') # NOQA: E402 from gi.repository import GnomeDesktop ESCAPE_PATTERN = re.compile(r'\\u\{([0-9A-Fa-f]+?)\}') ISO_PATTERN = re.compile(r'[A-E]([0-9]+)') LOCALE_TO_XKB_OVERRIDES = { 'af': 'za', 'en': 'us', 'en-GB': 'uk', 'es-US': 'latam', 'fr-CA': 'ca', 'hi': 'in+bolnagri', 'ky': 'kg', 'nl-BE': 'be', 'zu': None } def parse_single_key(value): def unescape(m): return chr(int(m.group(1), 16)) value = ESCAPE_PATTERN.sub(unescape, value) return value def parse_rows(keymap): unsorted_rows = {} for _map in keymap.iter('map'): value = _map.get('to') key = [parse_single_key(value)] iso = _map.get('iso') if not ISO_PATTERN.match(iso): sys.stderr.write('invalid ISO key name: %s\n' % iso) continue if not iso[0] in unsorted_rows: unsorted_rows[iso[0]] = [] unsorted_rows[iso[0]].append((int(iso[1:]), key)) # add subkeys longPress = _map.get('longPress') if longPress: for value in longPress.split(' '): subkey = parse_single_key(value) key.append(subkey) rows = [] for k, v in sorted(list(unsorted_rows.items()), key=lambda x: x[0], reverse=True): row = [] for key in sorted(v, key=lambda x: x): row.append(key[1]) rows.append(row) return rows def convert_xml(tree): root = {} for xml_keyboard in tree.iter("keyboard"): locale_full = xml_keyboard.get("locale") locale, sep, end = locale_full.partition("-t-") root["locale"] = locale for xml_name in tree.iter("name"): name = xml_name.get("value") root["name"] = name root["levels"] = [] # parse levels for index, keymap in enumerate(tree.iter('keyMap')): # FIXME: heuristics here modifiers = keymap.get('modifiers') if not modifiers: mode = 'default' modifiers = '' elif 'shift' in modifiers.split(' '): mode = 'latched' modifiers = 'shift' else: mode = 'locked' level = {} level["level"] = modifiers level["mode"] = mode level["rows"] = parse_rows(keymap) root["levels"].append(level) return root def locale_to_xkb(locale, name): if locale in sorted(LOCALE_TO_XKB_OVERRIDES.keys()): xkb = LOCALE_TO_XKB_OVERRIDES[locale] logging.debug("override for %s → %s", locale, xkb) if xkb: return xkb else: raise KeyError("layout %s explicitely disabled in overrides" % locale) xkb_names = sorted(name_to_xkb.keys()) if name in xkb_names: return name_to_xkb[name] else: logging.debug("name %s failed" % name) for sub_name in name.split(' '): if sub_name in xkb_names: xkb = name_to_xkb[sub_name] logging.debug("dumb mapping failed but match with locale word: " "%s (%s) → %s (%s)", locale, name, xkb, sub_name) return xkb else: logging.debug("sub_name failed") for xkb_name in xkb_names: for xkb_sub_name in xkb_name.split(' '): if xkb_sub_name.strip('()') == name: xkb = name_to_xkb[xkb_name] logging.debug("dumb mapping failed but match with xkb word: " "%s (%s) → %s (%s)", locale, name, xkb, xkb_name) return xkb raise KeyError("failed to find XKB mapping for %s" % locale) def convert_file(source_file, destination_path): logging.info("Parsing %s", source_file) itree = xml.etree.ElementTree.ElementTree() itree.parse(source_file) root = convert_xml(itree) try: xkb_name = locale_to_xkb(root["locale"], root["name"]) except KeyError as e: logging.warning(e) return False destination_file = os.path.join(destination_path, xkb_name + ".json") try: with open(destination_file, 'x', encoding="utf-8") as dest_fd: json.dump(root, dest_fd, ensure_ascii=False, indent=2, sort_keys=True) except FileExistsError as e: logging.info("File %s exists, not updating", destination_file) return False logging.debug("written %s", destination_file) def load_xkb_mappings(): xkb = GnomeDesktop.XkbInfo() layouts = xkb.get_all_layouts() name_to_xkb = {} for layout in layouts: name = xkb.get_layout_info(layout).display_name name_to_xkb[name] = layout return name_to_xkb locale.setlocale(locale.LC_ALL, "C") name_to_xkb = load_xkb_mappings() if __name__ == "__main__": if "DEBUG" in os.environ: logging.basicConfig(level=logging.DEBUG) if len(sys.argv) < 2: print("supply a CLDR keyboard file") sys.exit(1) if len(sys.argv) < 3: print("supply an output directory") sys.exit(1) source = sys.argv[1] destination = sys.argv[2] if os.path.isfile(source): convert_file(source, destination) elif os.path.isdir(source): for path in glob.glob(source + "/*-t-k0-android.xml"): convert_file(path, destination) cinnamon-6.6.8/data/cldr2json/test/0000775000175000017500000000000015167446463016071 5ustar fabiofabiocinnamon-6.6.8/data/cldr2json/test/__init__.py0000664000175000017500000000000015167446463020170 0ustar fabiofabiocinnamon-6.6.8/data/cldr2json/test/data/0000775000175000017500000000000015167446463017002 5ustar fabiofabiocinnamon-6.6.8/data/cldr2json/test/data/fr-t-k0-android.xml0000664000175000017500000001360315167446463022325 0ustar fabiofabio cinnamon-6.6.8/data/cldr2json/test/data/fr.json0000664000175000017500000002161615167446463020312 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "a", "à", "â", "%", "æ", "á", "ä", "ã", "å", "ā", "ª" ], [ "z" ], [ "e", "é", "è", "ê", "ë", "%", "ę", "ė", "ē" ], [ "r" ], [ "t" ], [ "y", "%", "ÿ" ], [ "u", "ù", "û", "%", "ü", "ú", "ū" ], [ "i", "î", "%", "ï", "ì", "í", "į", "ī" ], [ "o", "ô", "œ", "%", "ö", "ò", "ó", "õ", "ø", "ō", "º" ], [ "p" ] ], [ [ "q" ], [ "s" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ], [ "m" ] ], [ [ "w" ], [ "x" ], [ "c", "ç", "ć", "č" ], [ "v" ], [ "b" ], [ "n" ], [ "'", "‘", "’", "‹", "›" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "A", "À", "Â", "%", "Æ", "Á", "Ä", "Ã", "Å", "Ā", "ª" ], [ "Z" ], [ "E", "É", "È", "Ê", "Ë", "%", "Ę", "Ė", "Ē" ], [ "R" ], [ "T" ], [ "Y", "%", "Ÿ" ], [ "U", "Ù", "Û", "%", "Ü", "Ú", "Ū" ], [ "I", "Î", "%", "Ï", "Ì", "Í", "Į", "Ī" ], [ "O", "Ô", "Œ", "%", "Ö", "Ò", "Ó", "Õ", "Ø", "Ō", "º" ], [ "P" ] ], [ [ "Q" ], [ "S" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ], [ "M" ] ], [ [ "W" ], [ "X" ], [ "C", "Ç", "Ć", "Č" ], [ "V" ], [ "B" ], [ "N" ], [ "'", "‘", "’", "‹", "›" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "€", "¢", "£", "$", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¥" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "fr", "name": "French" } cinnamon-6.6.8/data/cldr2json/test/test_cldr2json.py0000775000175000017500000001600615167446463021410 0ustar fabiofabio#!/usr/bin/python3 import json import tempfile import unittest import xml.etree.ElementTree import cldr2json class TestParseSingleKey(unittest.TestCase): def test_ascii(self): self.assertEqual(cldr2json.parse_single_key("a"), "a") def test_nonascii(self): self.assertEqual(cldr2json.parse_single_key("Æ"), "Æ") def test_twochars(self): self.assertEqual(cldr2json.parse_single_key("ԵՒ"), "ԵՒ") def test_decode(self): self.assertEqual(cldr2json.parse_single_key("\\u{200D}"), "\u200d") def test_decode_threechars(self): self.assertEqual(cldr2json.parse_single_key("ज\\u{94D}ञ"), "ज\u094Dञ") class TestParseRow(unittest.TestCase): def test_parse_row(self): xml_string = """ """ xml_tree = xml.etree.ElementTree.XML(xml_string) json = [[ ['a', 'à', 'â', '%', 'æ', 'á', 'ä', 'ã', 'å', 'ā', 'ª'], ['z'], ['e', 'é', 'è', 'ê', 'ë', '%', 'ę', 'ė', 'ē'], ['r'], ['t'], ['y', '%', 'ÿ'], ['u', 'ù', 'û', '%', 'ü', 'ú', 'ū'], ['i', 'î', '%', 'ï', 'ì', 'í', 'į', 'ī'], ['o', 'ô', 'œ', '%', 'ö', 'ò', 'ó', 'õ', 'ø', 'ō', 'º'], ['p'] ], [ ['q'], ['s'], ['d'], ['f'], ['g'], ['h'], ['j'], ['k'], ['l'], ['m'] ], [ ['w'], ['x'], ['c', 'ç', 'ć', 'č'], ['v'], ['b'], ['n'], ["'", '‘', '’', '‹', '›'] ], [ [','], [' '], ['.', '#', '!', ',', '?', '-', ':', "'", '@'] ]] self.assertEqual(cldr2json.parse_rows(xml_tree), json) class TestConvertXml(unittest.TestCase): def test_convert_xml(self): xml_string = """ """ xml_tree = xml.etree.ElementTree.XML(xml_string) json = { "locale": "fr", "name": "French", "levels": [ { "level": "", "mode": "default", "rows": [ [ ['a', 'à', 'â', '%', 'æ', 'á', 'ä', 'ã', 'å', 'ā', 'ª'], ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ ['A', 'À', 'Â', '%', 'Æ', 'Á', 'Ä', 'Ã', 'Å', 'Ā', 'ª'], ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ ["1", "¹", "½", "⅓", "¼", "⅛"], ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ ["~"], ] ] } ] } self.assertEqual(cldr2json.convert_xml(xml_tree), json) class TestConvertFile(unittest.TestCase): def test_fr(self): outdir = tempfile.mkdtemp() cldr2json.convert_file("test/data/fr-t-k0-android.xml", outdir) with open("test/data/fr.json", encoding="utf-8") as expected_json_fd: expected_json = json.load(expected_json_fd) with open(outdir + "/fr.json", encoding="utf-8") as actual_json_fd: actual_json = json.load(actual_json_fd) self.assertEqual(expected_json, actual_json) class TestLocaleToXKB(unittest.TestCase): def test_simple(self): self.assertEqual(cldr2json.locale_to_xkb("fr", "French"), "fr") def test_fallback(self): self.assertEqual(cldr2json.locale_to_xkb("nb", "Norwegian Bokmål"), "no") def test_fallback2(self): self.assertEqual(cldr2json.locale_to_xkb("km", "Khmer"), "kh") def test_override(self): self.assertEqual(cldr2json.locale_to_xkb("en-GB", "English Great Britain"), "uk") class LoadXKBMapplings(unittest.TestCase): def test_dictionnary(self): self.assertIsInstance(cldr2json.load_xkb_mappings(), dict) def test_mapping(self): mapping = cldr2json.load_xkb_mappings() self.assertEqual(mapping["French"], "fr") if __name__ == '__main__': unittest.main() cinnamon-6.6.8/data/emoji.json0000664000175000017500000110465715167446463015226 0ustar fabiofabio[ { "no": 1, "code": "1F600", "char": "😀", "name": "grinning face" }, { "no": 2, "code": "1F601", "char": "😁", "name": "beaming face with smiling eyes" }, { "no": 3, "code": "1F602", "char": "😂", "name": "face with tears of joy" }, { "no": 4, "code": "1F923", "char": "🤣", "name": "rolling on the floor laughing" }, { "no": 5, "code": "1F603", "char": "😃", "name": "grinning face with big eyes" }, { "no": 6, "code": "1F604", "char": "😄", "name": "grinning face with smiling eyes" }, { "no": 7, "code": "1F605", "char": "😅", "name": "grinning face with sweat" }, { "no": 8, "code": "1F606", "char": "😆", "name": "grinning squinting face" }, { "no": 9, "code": "1F609", "char": "😉", "name": "winking face" }, { "no": 10, "code": "1F60A", "char": "😊", "name": "smiling face with smiling eyes" }, { "no": 11, "code": "1F60B", "char": "😋", "name": "face savoring food" }, { "no": 12, "code": "1F60E", "char": "😎", "name": "smiling face with sunglasses" }, { "no": 13, "code": "1F60D", "char": "😍", "name": "smiling face with heart-eyes" }, { "no": 14, "code": "1F618", "char": "😘", "name": "face blowing a kiss" }, { "no": 15, "code": "1F617", "char": "😗", "name": "kissing face" }, { "no": 16, "code": "1F619", "char": "😙", "name": "kissing face with smiling eyes" }, { "no": 17, "code": "1F61A", "char": "😚", "name": "kissing face with closed eyes" }, { "no": 18, "code": "263A", "char": "☺", "name": "smiling face" }, { "no": 19, "code": "1F642", "char": "🙂", "name": "slightly smiling face" }, { "no": 20, "code": "1F917", "char": "🤗", "name": "hugging face" }, { "no": 21, "code": "1F929", "char": "🤩", "name": "⊛ star-struck" }, { "no": 22, "code": "1F914", "char": "🤔", "name": "thinking face" }, { "no": 23, "code": "1F928", "char": "🤨", "name": "⊛ face with raised eyebrow" }, { "no": 24, "code": "1F610", "char": "😐", "name": "neutral face" }, { "no": 25, "code": "1F611", "char": "😑", "name": "expressionless face" }, { "no": 26, "code": "1F636", "char": "😶", "name": "face without mouth" }, { "no": 27, "code": "1F644", "char": "🙄", "name": "face with rolling eyes" }, { "no": 28, "code": "1F60F", "char": "😏", "name": "smirking face" }, { "no": 29, "code": "1F623", "char": "😣", "name": "persevering face" }, { "no": 30, "code": "1F625", "char": "😥", "name": "sad but relieved face" }, { "no": 31, "code": "1F62E", "char": "😮", "name": "face with open mouth" }, { "no": 32, "code": "1F910", "char": "🤐", "name": "zipper-mouth face" }, { "no": 33, "code": "1F62F", "char": "😯", "name": "hushed face" }, { "no": 34, "code": "1F62A", "char": "😪", "name": "sleepy face" }, { "no": 35, "code": "1F62B", "char": "😫", "name": "tired face" }, { "no": 36, "code": "1F634", "char": "😴", "name": "sleeping face" }, { "no": 37, "code": "1F60C", "char": "😌", "name": "relieved face" }, { "no": 38, "code": "1F61B", "char": "😛", "name": "face with tongue" }, { "no": 39, "code": "1F61C", "char": "😜", "name": "winking face with tongue" }, { "no": 40, "code": "1F61D", "char": "😝", "name": "squinting face with tongue" }, { "no": 41, "code": "1F924", "char": "🤤", "name": "drooling face" }, { "no": 42, "code": "1F612", "char": "😒", "name": "unamused face" }, { "no": 43, "code": "1F613", "char": "😓", "name": "downcast face with sweat" }, { "no": 44, "code": "1F614", "char": "😔", "name": "pensive face" }, { "no": 45, "code": "1F615", "char": "😕", "name": "confused face" }, { "no": 46, "code": "1F643", "char": "🙃", "name": "upside-down face" }, { "no": 47, "code": "1F911", "char": "🤑", "name": "money-mouth face" }, { "no": 48, "code": "1F632", "char": "😲", "name": "astonished face" }, { "no": 49, "code": "2639", "char": "☹", "name": "frowning face" }, { "no": 50, "code": "1F641", "char": "🙁", "name": "slightly frowning face" }, { "no": 51, "code": "1F616", "char": "😖", "name": "confounded face" }, { "no": 52, "code": "1F61E", "char": "😞", "name": "disappointed face" }, { "no": 53, "code": "1F61F", "char": "😟", "name": "worried face" }, { "no": 54, "code": "1F624", "char": "😤", "name": "face with steam from nose" }, { "no": 55, "code": "1F622", "char": "😢", "name": "crying face" }, { "no": 56, "code": "1F62D", "char": "😭", "name": "loudly crying face" }, { "no": 57, "code": "1F626", "char": "😦", "name": "frowning face with open mouth" }, { "no": 58, "code": "1F627", "char": "😧", "name": "anguished face" }, { "no": 59, "code": "1F628", "char": "😨", "name": "fearful face" }, { "no": 60, "code": "1F629", "char": "😩", "name": "weary face" }, { "no": 61, "code": "1F92F", "char": "🤯", "name": "⊛ exploding head" }, { "no": 62, "code": "1F62C", "char": "😬", "name": "grimacing face" }, { "no": 63, "code": "1F630", "char": "😰", "name": "anxious face with sweat" }, { "no": 64, "code": "1F631", "char": "😱", "name": "face screaming in fear" }, { "no": 65, "code": "1F633", "char": "😳", "name": "flushed face" }, { "no": 66, "code": "1F92A", "char": "🤪", "name": "⊛ crazy face" }, { "no": 67, "code": "1F635", "char": "😵", "name": "dizzy face" }, { "no": 68, "code": "1F621", "char": "😡", "name": "pouting face" }, { "no": 69, "code": "1F620", "char": "😠", "name": "angry face" }, { "no": 70, "code": "1F92C", "char": "🤬", "name": "⊛ face with symbols on mouth" }, { "no": 71, "code": "1F637", "char": "😷", "name": "face with medical mask" }, { "no": 72, "code": "1F912", "char": "🤒", "name": "face with thermometer" }, { "no": 73, "code": "1F915", "char": "🤕", "name": "face with head-bandage" }, { "no": 74, "code": "1F922", "char": "🤢", "name": "nauseated face" }, { "no": 75, "code": "1F92E", "char": "🤮", "name": "⊛ face vomiting" }, { "no": 76, "code": "1F927", "char": "🤧", "name": "sneezing face" }, { "no": 77, "code": "1F607", "char": "😇", "name": "smiling face with halo" }, { "no": 78, "code": "1F920", "char": "🤠", "name": "cowboy hat face" }, { "no": 79, "code": "1F921", "char": "🤡", "name": "clown face" }, { "no": 80, "code": "1F925", "char": "🤥", "name": "lying face" }, { "no": 81, "code": "1F92B", "char": "🤫", "name": "⊛ shushing face" }, { "no": 82, "code": "1F92D", "char": "🤭", "name": "⊛ face with hand over mouth" }, { "no": 83, "code": "1F9D0", "char": "🧐", "name": "⊛ face with monocle" }, { "no": 84, "code": "1F913", "char": "🤓", "name": "nerd face" }, { "no": 85, "code": "1F608", "char": "😈", "name": "smiling face with horns" }, { "no": 86, "code": "1F47F", "char": "👿", "name": "angry face with horns" }, { "no": 87, "code": "1F479", "char": "👹", "name": "ogre" }, { "no": 88, "code": "1F47A", "char": "👺", "name": "goblin" }, { "no": 89, "code": "1F480", "char": "💀", "name": "skull" }, { "no": 90, "code": "2620", "char": "☠", "name": "skull and crossbones" }, { "no": 91, "code": "1F47B", "char": "👻", "name": "ghost" }, { "no": 92, "code": "1F47D", "char": "👽", "name": "alien" }, { "no": 93, "code": "1F47E", "char": "👾", "name": "alien monster" }, { "no": 94, "code": "1F916", "char": "🤖", "name": "robot face" }, { "no": 95, "code": "1F4A9", "char": "💩", "name": "pile of poo" }, { "no": 96, "code": "1F63A", "char": "😺", "name": "grinning cat face" }, { "no": 97, "code": "1F638", "char": "😸", "name": "grinning cat face with smiling eyes" }, { "no": 98, "code": "1F639", "char": "😹", "name": "cat face with tears of joy" }, { "no": 99, "code": "1F63B", "char": "😻", "name": "smiling cat face with heart-eyes" }, { "no": 100, "code": "1F63C", "char": "😼", "name": "cat face with wry smile" }, { "no": 101, "code": "1F63D", "char": "😽", "name": "kissing cat face" }, { "no": 102, "code": "1F640", "char": "🙀", "name": "weary cat face" }, { "no": 103, "code": "1F63F", "char": "😿", "name": "crying cat face" }, { "no": 104, "code": "1F63E", "char": "😾", "name": "pouting cat face" }, { "no": 105, "code": "1F648", "char": "🙈", "name": "see-no-evil monkey" }, { "no": 106, "code": "1F649", "char": "🙉", "name": "hear-no-evil monkey" }, { "no": 107, "code": "1F64A", "char": "🙊", "name": "speak-no-evil monkey" }, { "no": 108, "code": "1F476", "char": "👶", "name": "baby" }, { "no": 109, "code": "1F476 1F3FB", "char": "👶🏻", "name": "baby: light skin tone" }, { "no": 110, "code": "1F476 1F3FC", "char": "👶🏼", "name": "baby: medium-light skin tone" }, { "no": 111, "code": "1F476 1F3FD", "char": "👶🏽", "name": "baby: medium skin tone" }, { "no": 112, "code": "1F476 1F3FE", "char": "👶🏾", "name": "baby: medium-dark skin tone" }, { "no": 113, "code": "1F476 1F3FF", "char": "👶🏿", "name": "baby: dark skin tone" }, { "no": 114, "code": "1F9D2", "char": "🧒", "name": "⊛ child" }, { "no": 115, "code": "1F9D2 1F3FB", "char": "🧒🏻", "name": "⊛ child: light skin tone" }, { "no": 116, "code": "1F9D2 1F3FC", "char": "🧒🏼", "name": "⊛ child: medium-light skin tone" }, { "no": 117, "code": "1F9D2 1F3FD", "char": "🧒🏽", "name": "⊛ child: medium skin tone" }, { "no": 118, "code": "1F9D2 1F3FE", "char": "🧒🏾", "name": "⊛ child: medium-dark skin tone" }, { "no": 119, "code": "1F9D2 1F3FF", "char": "🧒🏿", "name": "⊛ child: dark skin tone" }, { "no": 120, "code": "1F466", "char": "👦", "name": "boy" }, { "no": 121, "code": "1F466 1F3FB", "char": "👦🏻", "name": "boy: light skin tone" }, { "no": 122, "code": "1F466 1F3FC", "char": "👦🏼", "name": "boy: medium-light skin tone" }, { "no": 123, "code": "1F466 1F3FD", "char": "👦🏽", "name": "boy: medium skin tone" }, { "no": 124, "code": "1F466 1F3FE", "char": "👦🏾", "name": "boy: medium-dark skin tone" }, { "no": 125, "code": "1F466 1F3FF", "char": "👦🏿", "name": "boy: dark skin tone" }, { "no": 126, "code": "1F467", "char": "👧", "name": "girl" }, { "no": 127, "code": "1F467 1F3FB", "char": "👧🏻", "name": "girl: light skin tone" }, { "no": 128, "code": "1F467 1F3FC", "char": "👧🏼", "name": "girl: medium-light skin tone" }, { "no": 129, "code": "1F467 1F3FD", "char": "👧🏽", "name": "girl: medium skin tone" }, { "no": 130, "code": "1F467 1F3FE", "char": "👧🏾", "name": "girl: medium-dark skin tone" }, { "no": 131, "code": "1F467 1F3FF", "char": "👧🏿", "name": "girl: dark skin tone" }, { "no": 132, "code": "1F9D1", "char": "🧑", "name": "⊛ adult" }, { "no": 133, "code": "1F9D1 1F3FB", "char": "🧑🏻", "name": "⊛ adult: light skin tone" }, { "no": 134, "code": "1F9D1 1F3FC", "char": "🧑🏼", "name": "⊛ adult: medium-light skin tone" }, { "no": 135, "code": "1F9D1 1F3FD", "char": "🧑🏽", "name": "⊛ adult: medium skin tone" }, { "no": 136, "code": "1F9D1 1F3FE", "char": "🧑🏾", "name": "⊛ adult: medium-dark skin tone" }, { "no": 137, "code": "1F9D1 1F3FF", "char": "🧑🏿", "name": "⊛ adult: dark skin tone" }, { "no": 138, "code": "1F468", "char": "👨", "name": "man" }, { "no": 139, "code": "1F468 1F3FB", "char": "👨🏻", "name": "man: light skin tone" }, { "no": 140, "code": "1F468 1F3FC", "char": "👨🏼", "name": "man: medium-light skin tone" }, { "no": 141, "code": "1F468 1F3FD", "char": "👨🏽", "name": "man: medium skin tone" }, { "no": 142, "code": "1F468 1F3FE", "char": "👨🏾", "name": "man: medium-dark skin tone" }, { "no": 143, "code": "1F468 1F3FF", "char": "👨🏿", "name": "man: dark skin tone" }, { "no": 144, "code": "1F469", "char": "👩", "name": "woman" }, { "no": 145, "code": "1F469 1F3FB", "char": "👩🏻", "name": "woman: light skin tone" }, { "no": 146, "code": "1F469 1F3FC", "char": "👩🏼", "name": "woman: medium-light skin tone" }, { "no": 147, "code": "1F469 1F3FD", "char": "👩🏽", "name": "woman: medium skin tone" }, { "no": 148, "code": "1F469 1F3FE", "char": "👩🏾", "name": "woman: medium-dark skin tone" }, { "no": 149, "code": "1F469 1F3FF", "char": "👩🏿", "name": "woman: dark skin tone" }, { "no": 150, "code": "1F9D3", "char": "🧓", "name": "⊛ older adult" }, { "no": 151, "code": "1F9D3 1F3FB", "char": "🧓🏻", "name": "⊛ older adult: light skin tone" }, { "no": 152, "code": "1F9D3 1F3FC", "char": "🧓🏼", "name": "⊛ older adult: medium-light skin tone" }, { "no": 153, "code": "1F9D3 1F3FD", "char": "🧓🏽", "name": "⊛ older adult: medium skin tone" }, { "no": 154, "code": "1F9D3 1F3FE", "char": "🧓🏾", "name": "⊛ older adult: medium-dark skin tone" }, { "no": 155, "code": "1F9D3 1F3FF", "char": "🧓🏿", "name": "⊛ older adult: dark skin tone" }, { "no": 156, "code": "1F474", "char": "👴", "name": "old man" }, { "no": 157, "code": "1F474 1F3FB", "char": "👴🏻", "name": "old man: light skin tone" }, { "no": 158, "code": "1F474 1F3FC", "char": "👴🏼", "name": "old man: medium-light skin tone" }, { "no": 159, "code": "1F474 1F3FD", "char": "👴🏽", "name": "old man: medium skin tone" }, { "no": 160, "code": "1F474 1F3FE", "char": "👴🏾", "name": "old man: medium-dark skin tone" }, { "no": 161, "code": "1F474 1F3FF", "char": "👴🏿", "name": "old man: dark skin tone" }, { "no": 162, "code": "1F475", "char": "👵", "name": "old woman" }, { "no": 163, "code": "1F475 1F3FB", "char": "👵🏻", "name": "old woman: light skin tone" }, { "no": 164, "code": "1F475 1F3FC", "char": "👵🏼", "name": "old woman: medium-light skin tone" }, { "no": 165, "code": "1F475 1F3FD", "char": "👵🏽", "name": "old woman: medium skin tone" }, { "no": 166, "code": "1F475 1F3FE", "char": "👵🏾", "name": "old woman: medium-dark skin tone" }, { "no": 167, "code": "1F475 1F3FF", "char": "👵🏿", "name": "old woman: dark skin tone" }, { "no": 168, "code": "1F468 200D 2695 FE0F", "char": "👨‍⚕️", "name": "man health worker" }, { "no": 169, "code": "1F468 1F3FB 200D 2695 FE0F", "char": "👨🏻‍⚕️", "name": "man health worker: light skin tone" }, { "no": 170, "code": "1F468 1F3FC 200D 2695 FE0F", "char": "👨🏼‍⚕️", "name": "man health worker: medium-light skin tone" }, { "no": 171, "code": "1F468 1F3FD 200D 2695 FE0F", "char": "👨🏽‍⚕️", "name": "man health worker: medium skin tone" }, { "no": 172, "code": "1F468 1F3FE 200D 2695 FE0F", "char": "👨🏾‍⚕️", "name": "man health worker: medium-dark skin tone" }, { "no": 173, "code": "1F468 1F3FF 200D 2695 FE0F", "char": "👨🏿‍⚕️", "name": "man health worker: dark skin tone" }, { "no": 174, "code": "1F469 200D 2695 FE0F", "char": "👩‍⚕️", "name": "woman health worker" }, { "no": 175, "code": "1F469 1F3FB 200D 2695 FE0F", "char": "👩🏻‍⚕️", "name": "woman health worker: light skin tone" }, { "no": 176, "code": "1F469 1F3FC 200D 2695 FE0F", "char": "👩🏼‍⚕️", "name": "woman health worker: medium-light skin tone" }, { "no": 177, "code": "1F469 1F3FD 200D 2695 FE0F", "char": "👩🏽‍⚕️", "name": "woman health worker: medium skin tone" }, { "no": 178, "code": "1F469 1F3FE 200D 2695 FE0F", "char": "👩🏾‍⚕️", "name": "woman health worker: medium-dark skin tone" }, { "no": 179, "code": "1F469 1F3FF 200D 2695 FE0F", "char": "👩🏿‍⚕️", "name": "woman health worker: dark skin tone" }, { "no": 180, "code": "1F468 200D 1F393", "char": "👨‍🎓", "name": "man student" }, { "no": 181, "code": "1F468 1F3FB 200D 1F393", "char": "👨🏻‍🎓", "name": "man student: light skin tone" }, { "no": 182, "code": "1F468 1F3FC 200D 1F393", "char": "👨🏼‍🎓", "name": "man student: medium-light skin tone" }, { "no": 183, "code": "1F468 1F3FD 200D 1F393", "char": "👨🏽‍🎓", "name": "man student: medium skin tone" }, { "no": 184, "code": "1F468 1F3FE 200D 1F393", "char": "👨🏾‍🎓", "name": "man student: medium-dark skin tone" }, { "no": 185, "code": "1F468 1F3FF 200D 1F393", "char": "👨🏿‍🎓", "name": "man student: dark skin tone" }, { "no": 186, "code": "1F469 200D 1F393", "char": "👩‍🎓", "name": "woman student" }, { "no": 187, "code": "1F469 1F3FB 200D 1F393", "char": "👩🏻‍🎓", "name": "woman student: light skin tone" }, { "no": 188, "code": "1F469 1F3FC 200D 1F393", "char": "👩🏼‍🎓", "name": "woman student: medium-light skin tone" }, { "no": 189, "code": "1F469 1F3FD 200D 1F393", "char": "👩🏽‍🎓", "name": "woman student: medium skin tone" }, { "no": 190, "code": "1F469 1F3FE 200D 1F393", "char": "👩🏾‍🎓", "name": "woman student: medium-dark skin tone" }, { "no": 191, "code": "1F469 1F3FF 200D 1F393", "char": "👩🏿‍🎓", "name": "woman student: dark skin tone" }, { "no": 192, "code": "1F468 200D 1F3EB", "char": "👨‍🏫", "name": "man teacher" }, { "no": 193, "code": "1F468 1F3FB 200D 1F3EB", "char": "👨🏻‍🏫", "name": "man teacher: light skin tone" }, { "no": 194, "code": "1F468 1F3FC 200D 1F3EB", "char": "👨🏼‍🏫", "name": "man teacher: medium-light skin tone" }, { "no": 195, "code": "1F468 1F3FD 200D 1F3EB", "char": "👨🏽‍🏫", "name": "man teacher: medium skin tone" }, { "no": 196, "code": "1F468 1F3FE 200D 1F3EB", "char": "👨🏾‍🏫", "name": "man teacher: medium-dark skin tone" }, { "no": 197, "code": "1F468 1F3FF 200D 1F3EB", "char": "👨🏿‍🏫", "name": "man teacher: dark skin tone" }, { "no": 198, "code": "1F469 200D 1F3EB", "char": "👩‍🏫", "name": "woman teacher" }, { "no": 199, "code": "1F469 1F3FB 200D 1F3EB", "char": "👩🏻‍🏫", "name": "woman teacher: light skin tone" }, { "no": 200, "code": "1F469 1F3FC 200D 1F3EB", "char": "👩🏼‍🏫", "name": "woman teacher: medium-light skin tone" }, { "no": 201, "code": "1F469 1F3FD 200D 1F3EB", "char": "👩🏽‍🏫", "name": "woman teacher: medium skin tone" }, { "no": 202, "code": "1F469 1F3FE 200D 1F3EB", "char": "👩🏾‍🏫", "name": "woman teacher: medium-dark skin tone" }, { "no": 203, "code": "1F469 1F3FF 200D 1F3EB", "char": "👩🏿‍🏫", "name": "woman teacher: dark skin tone" }, { "no": 204, "code": "1F468 200D 2696 FE0F", "char": "👨‍⚖️", "name": "man judge" }, { "no": 205, "code": "1F468 1F3FB 200D 2696 FE0F", "char": "👨🏻‍⚖️", "name": "man judge: light skin tone" }, { "no": 206, "code": "1F468 1F3FC 200D 2696 FE0F", "char": "👨🏼‍⚖️", "name": "man judge: medium-light skin tone" }, { "no": 207, "code": "1F468 1F3FD 200D 2696 FE0F", "char": "👨🏽‍⚖️", "name": "man judge: medium skin tone" }, { "no": 208, "code": "1F468 1F3FE 200D 2696 FE0F", "char": "👨🏾‍⚖️", "name": "man judge: medium-dark skin tone" }, { "no": 209, "code": "1F468 1F3FF 200D 2696 FE0F", "char": "👨🏿‍⚖️", "name": "man judge: dark skin tone" }, { "no": 210, "code": "1F469 200D 2696 FE0F", "char": "👩‍⚖️", "name": "woman judge" }, { "no": 211, "code": "1F469 1F3FB 200D 2696 FE0F", "char": "👩🏻‍⚖️", "name": "woman judge: light skin tone" }, { "no": 212, "code": "1F469 1F3FC 200D 2696 FE0F", "char": "👩🏼‍⚖️", "name": "woman judge: medium-light skin tone" }, { "no": 213, "code": "1F469 1F3FD 200D 2696 FE0F", "char": "👩🏽‍⚖️", "name": "woman judge: medium skin tone" }, { "no": 214, "code": "1F469 1F3FE 200D 2696 FE0F", "char": "👩🏾‍⚖️", "name": "woman judge: medium-dark skin tone" }, { "no": 215, "code": "1F469 1F3FF 200D 2696 FE0F", "char": "👩🏿‍⚖️", "name": "woman judge: dark skin tone" }, { "no": 216, "code": "1F468 200D 1F33E", "char": "👨‍🌾", "name": "man farmer" }, { "no": 217, "code": "1F468 1F3FB 200D 1F33E", "char": "👨🏻‍🌾", "name": "man farmer: light skin tone" }, { "no": 218, "code": "1F468 1F3FC 200D 1F33E", "char": "👨🏼‍🌾", "name": "man farmer: medium-light skin tone" }, { "no": 219, "code": "1F468 1F3FD 200D 1F33E", "char": "👨🏽‍🌾", "name": "man farmer: medium skin tone" }, { "no": 220, "code": "1F468 1F3FE 200D 1F33E", "char": "👨🏾‍🌾", "name": "man farmer: medium-dark skin tone" }, { "no": 221, "code": "1F468 1F3FF 200D 1F33E", "char": "👨🏿‍🌾", "name": "man farmer: dark skin tone" }, { "no": 222, "code": "1F469 200D 1F33E", "char": "👩‍🌾", "name": "woman farmer" }, { "no": 223, "code": "1F469 1F3FB 200D 1F33E", "char": "👩🏻‍🌾", "name": "woman farmer: light skin tone" }, { "no": 224, "code": "1F469 1F3FC 200D 1F33E", "char": "👩🏼‍🌾", "name": "woman farmer: medium-light skin tone" }, { "no": 225, "code": "1F469 1F3FD 200D 1F33E", "char": "👩🏽‍🌾", "name": "woman farmer: medium skin tone" }, { "no": 226, "code": "1F469 1F3FE 200D 1F33E", "char": "👩🏾‍🌾", "name": "woman farmer: medium-dark skin tone" }, { "no": 227, "code": "1F469 1F3FF 200D 1F33E", "char": "👩🏿‍🌾", "name": "woman farmer: dark skin tone" }, { "no": 228, "code": "1F468 200D 1F373", "char": "👨‍🍳", "name": "man cook" }, { "no": 229, "code": "1F468 1F3FB 200D 1F373", "char": "👨🏻‍🍳", "name": "man cook: light skin tone" }, { "no": 230, "code": "1F468 1F3FC 200D 1F373", "char": "👨🏼‍🍳", "name": "man cook: medium-light skin tone" }, { "no": 231, "code": "1F468 1F3FD 200D 1F373", "char": "👨🏽‍🍳", "name": "man cook: medium skin tone" }, { "no": 232, "code": "1F468 1F3FE 200D 1F373", "char": "👨🏾‍🍳", "name": "man cook: medium-dark skin tone" }, { "no": 233, "code": "1F468 1F3FF 200D 1F373", "char": "👨🏿‍🍳", "name": "man cook: dark skin tone" }, { "no": 234, "code": "1F469 200D 1F373", "char": "👩‍🍳", "name": "woman cook" }, { "no": 235, "code": "1F469 1F3FB 200D 1F373", "char": "👩🏻‍🍳", "name": "woman cook: light skin tone" }, { "no": 236, "code": "1F469 1F3FC 200D 1F373", "char": "👩🏼‍🍳", "name": "woman cook: medium-light skin tone" }, { "no": 237, "code": "1F469 1F3FD 200D 1F373", "char": "👩🏽‍🍳", "name": "woman cook: medium skin tone" }, { "no": 238, "code": "1F469 1F3FE 200D 1F373", "char": "👩🏾‍🍳", "name": "woman cook: medium-dark skin tone" }, { "no": 239, "code": "1F469 1F3FF 200D 1F373", "char": "👩🏿‍🍳", "name": "woman cook: dark skin tone" }, { "no": 240, "code": "1F468 200D 1F527", "char": "👨‍🔧", "name": "man mechanic" }, { "no": 241, "code": "1F468 1F3FB 200D 1F527", "char": "👨🏻‍🔧", "name": "man mechanic: light skin tone" }, { "no": 242, "code": "1F468 1F3FC 200D 1F527", "char": "👨🏼‍🔧", "name": "man mechanic: medium-light skin tone" }, { "no": 243, "code": "1F468 1F3FD 200D 1F527", "char": "👨🏽‍🔧", "name": "man mechanic: medium skin tone" }, { "no": 244, "code": "1F468 1F3FE 200D 1F527", "char": "👨🏾‍🔧", "name": "man mechanic: medium-dark skin tone" }, { "no": 245, "code": "1F468 1F3FF 200D 1F527", "char": "👨🏿‍🔧", "name": "man mechanic: dark skin tone" }, { "no": 246, "code": "1F469 200D 1F527", "char": "👩‍🔧", "name": "woman mechanic" }, { "no": 247, "code": "1F469 1F3FB 200D 1F527", "char": "👩🏻‍🔧", "name": "woman mechanic: light skin tone" }, { "no": 248, "code": "1F469 1F3FC 200D 1F527", "char": "👩🏼‍🔧", "name": "woman mechanic: medium-light skin tone" }, { "no": 249, "code": "1F469 1F3FD 200D 1F527", "char": "👩🏽‍🔧", "name": "woman mechanic: medium skin tone" }, { "no": 250, "code": "1F469 1F3FE 200D 1F527", "char": "👩🏾‍🔧", "name": "woman mechanic: medium-dark skin tone" }, { "no": 251, "code": "1F469 1F3FF 200D 1F527", "char": "👩🏿‍🔧", "name": "woman mechanic: dark skin tone" }, { "no": 252, "code": "1F468 200D 1F3ED", "char": "👨‍🏭", "name": "man factory worker" }, { "no": 253, "code": "1F468 1F3FB 200D 1F3ED", "char": "👨🏻‍🏭", "name": "man factory worker: light skin tone" }, { "no": 254, "code": "1F468 1F3FC 200D 1F3ED", "char": "👨🏼‍🏭", "name": "man factory worker: medium-light skin tone" }, { "no": 255, "code": "1F468 1F3FD 200D 1F3ED", "char": "👨🏽‍🏭", "name": "man factory worker: medium skin tone" }, { "no": 256, "code": "1F468 1F3FE 200D 1F3ED", "char": "👨🏾‍🏭", "name": "man factory worker: medium-dark skin tone" }, { "no": 257, "code": "1F468 1F3FF 200D 1F3ED", "char": "👨🏿‍🏭", "name": "man factory worker: dark skin tone" }, { "no": 258, "code": "1F469 200D 1F3ED", "char": "👩‍🏭", "name": "woman factory worker" }, { "no": 259, "code": "1F469 1F3FB 200D 1F3ED", "char": "👩🏻‍🏭", "name": "woman factory worker: light skin tone" }, { "no": 260, "code": "1F469 1F3FC 200D 1F3ED", "char": "👩🏼‍🏭", "name": "woman factory worker: medium-light skin tone" }, { "no": 261, "code": "1F469 1F3FD 200D 1F3ED", "char": "👩🏽‍🏭", "name": "woman factory worker: medium skin tone" }, { "no": 262, "code": "1F469 1F3FE 200D 1F3ED", "char": "👩🏾‍🏭", "name": "woman factory worker: medium-dark skin tone" }, { "no": 263, "code": "1F469 1F3FF 200D 1F3ED", "char": "👩🏿‍🏭", "name": "woman factory worker: dark skin tone" }, { "no": 264, "code": "1F468 200D 1F4BC", "char": "👨‍💼", "name": "man office worker" }, { "no": 265, "code": "1F468 1F3FB 200D 1F4BC", "char": "👨🏻‍💼", "name": "man office worker: light skin tone" }, { "no": 266, "code": "1F468 1F3FC 200D 1F4BC", "char": "👨🏼‍💼", "name": "man office worker: medium-light skin tone" }, { "no": 267, "code": "1F468 1F3FD 200D 1F4BC", "char": "👨🏽‍💼", "name": "man office worker: medium skin tone" }, { "no": 268, "code": "1F468 1F3FE 200D 1F4BC", "char": "👨🏾‍💼", "name": "man office worker: medium-dark skin tone" }, { "no": 269, "code": "1F468 1F3FF 200D 1F4BC", "char": "👨🏿‍💼", "name": "man office worker: dark skin tone" }, { "no": 270, "code": "1F469 200D 1F4BC", "char": "👩‍💼", "name": "woman office worker" }, { "no": 271, "code": "1F469 1F3FB 200D 1F4BC", "char": "👩🏻‍💼", "name": "woman office worker: light skin tone" }, { "no": 272, "code": "1F469 1F3FC 200D 1F4BC", "char": "👩🏼‍💼", "name": "woman office worker: medium-light skin tone" }, { "no": 273, "code": "1F469 1F3FD 200D 1F4BC", "char": "👩🏽‍💼", "name": "woman office worker: medium skin tone" }, { "no": 274, "code": "1F469 1F3FE 200D 1F4BC", "char": "👩🏾‍💼", "name": "woman office worker: medium-dark skin tone" }, { "no": 275, "code": "1F469 1F3FF 200D 1F4BC", "char": "👩🏿‍💼", "name": "woman office worker: dark skin tone" }, { "no": 276, "code": "1F468 200D 1F52C", "char": "👨‍🔬", "name": "man scientist" }, { "no": 277, "code": "1F468 1F3FB 200D 1F52C", "char": "👨🏻‍🔬", "name": "man scientist: light skin tone" }, { "no": 278, "code": "1F468 1F3FC 200D 1F52C", "char": "👨🏼‍🔬", "name": "man scientist: medium-light skin tone" }, { "no": 279, "code": "1F468 1F3FD 200D 1F52C", "char": "👨🏽‍🔬", "name": "man scientist: medium skin tone" }, { "no": 280, "code": "1F468 1F3FE 200D 1F52C", "char": "👨🏾‍🔬", "name": "man scientist: medium-dark skin tone" }, { "no": 281, "code": "1F468 1F3FF 200D 1F52C", "char": "👨🏿‍🔬", "name": "man scientist: dark skin tone" }, { "no": 282, "code": "1F469 200D 1F52C", "char": "👩‍🔬", "name": "woman scientist" }, { "no": 283, "code": "1F469 1F3FB 200D 1F52C", "char": "👩🏻‍🔬", "name": "woman scientist: light skin tone" }, { "no": 284, "code": "1F469 1F3FC 200D 1F52C", "char": "👩🏼‍🔬", "name": "woman scientist: medium-light skin tone" }, { "no": 285, "code": "1F469 1F3FD 200D 1F52C", "char": "👩🏽‍🔬", "name": "woman scientist: medium skin tone" }, { "no": 286, "code": "1F469 1F3FE 200D 1F52C", "char": "👩🏾‍🔬", "name": "woman scientist: medium-dark skin tone" }, { "no": 287, "code": "1F469 1F3FF 200D 1F52C", "char": "👩🏿‍🔬", "name": "woman scientist: dark skin tone" }, { "no": 288, "code": "1F468 200D 1F4BB", "char": "👨‍💻", "name": "man technologist" }, { "no": 289, "code": "1F468 1F3FB 200D 1F4BB", "char": "👨🏻‍💻", "name": "man technologist: light skin tone" }, { "no": 290, "code": "1F468 1F3FC 200D 1F4BB", "char": "👨🏼‍💻", "name": "man technologist: medium-light skin tone" }, { "no": 291, "code": "1F468 1F3FD 200D 1F4BB", "char": "👨🏽‍💻", "name": "man technologist: medium skin tone" }, { "no": 292, "code": "1F468 1F3FE 200D 1F4BB", "char": "👨🏾‍💻", "name": "man technologist: medium-dark skin tone" }, { "no": 293, "code": "1F468 1F3FF 200D 1F4BB", "char": "👨🏿‍💻", "name": "man technologist: dark skin tone" }, { "no": 294, "code": "1F469 200D 1F4BB", "char": "👩‍💻", "name": "woman technologist" }, { "no": 295, "code": "1F469 1F3FB 200D 1F4BB", "char": "👩🏻‍💻", "name": "woman technologist: light skin tone" }, { "no": 296, "code": "1F469 1F3FC 200D 1F4BB", "char": "👩🏼‍💻", "name": "woman technologist: medium-light skin tone" }, { "no": 297, "code": "1F469 1F3FD 200D 1F4BB", "char": "👩🏽‍💻", "name": "woman technologist: medium skin tone" }, { "no": 298, "code": "1F469 1F3FE 200D 1F4BB", "char": "👩🏾‍💻", "name": "woman technologist: medium-dark skin tone" }, { "no": 299, "code": "1F469 1F3FF 200D 1F4BB", "char": "👩🏿‍💻", "name": "woman technologist: dark skin tone" }, { "no": 300, "code": "1F468 200D 1F3A4", "char": "👨‍🎤", "name": "man singer" }, { "no": 301, "code": "1F468 1F3FB 200D 1F3A4", "char": "👨🏻‍🎤", "name": "man singer: light skin tone" }, { "no": 302, "code": "1F468 1F3FC 200D 1F3A4", "char": "👨🏼‍🎤", "name": "man singer: medium-light skin tone" }, { "no": 303, "code": "1F468 1F3FD 200D 1F3A4", "char": "👨🏽‍🎤", "name": "man singer: medium skin tone" }, { "no": 304, "code": "1F468 1F3FE 200D 1F3A4", "char": "👨🏾‍🎤", "name": "man singer: medium-dark skin tone" }, { "no": 305, "code": "1F468 1F3FF 200D 1F3A4", "char": "👨🏿‍🎤", "name": "man singer: dark skin tone" }, { "no": 306, "code": "1F469 200D 1F3A4", "char": "👩‍🎤", "name": "woman singer" }, { "no": 307, "code": "1F469 1F3FB 200D 1F3A4", "char": "👩🏻‍🎤", "name": "woman singer: light skin tone" }, { "no": 308, "code": "1F469 1F3FC 200D 1F3A4", "char": "👩🏼‍🎤", "name": "woman singer: medium-light skin tone" }, { "no": 309, "code": "1F469 1F3FD 200D 1F3A4", "char": "👩🏽‍🎤", "name": "woman singer: medium skin tone" }, { "no": 310, "code": "1F469 1F3FE 200D 1F3A4", "char": "👩🏾‍🎤", "name": "woman singer: medium-dark skin tone" }, { "no": 311, "code": "1F469 1F3FF 200D 1F3A4", "char": "👩🏿‍🎤", "name": "woman singer: dark skin tone" }, { "no": 312, "code": "1F468 200D 1F3A8", "char": "👨‍🎨", "name": "man artist" }, { "no": 313, "code": "1F468 1F3FB 200D 1F3A8", "char": "👨🏻‍🎨", "name": "man artist: light skin tone" }, { "no": 314, "code": "1F468 1F3FC 200D 1F3A8", "char": "👨🏼‍🎨", "name": "man artist: medium-light skin tone" }, { "no": 315, "code": "1F468 1F3FD 200D 1F3A8", "char": "👨🏽‍🎨", "name": "man artist: medium skin tone" }, { "no": 316, "code": "1F468 1F3FE 200D 1F3A8", "char": "👨🏾‍🎨", "name": "man artist: medium-dark skin tone" }, { "no": 317, "code": "1F468 1F3FF 200D 1F3A8", "char": "👨🏿‍🎨", "name": "man artist: dark skin tone" }, { "no": 318, "code": "1F469 200D 1F3A8", "char": "👩‍🎨", "name": "woman artist" }, { "no": 319, "code": "1F469 1F3FB 200D 1F3A8", "char": "👩🏻‍🎨", "name": "woman artist: light skin tone" }, { "no": 320, "code": "1F469 1F3FC 200D 1F3A8", "char": "👩🏼‍🎨", "name": "woman artist: medium-light skin tone" }, { "no": 321, "code": "1F469 1F3FD 200D 1F3A8", "char": "👩🏽‍🎨", "name": "woman artist: medium skin tone" }, { "no": 322, "code": "1F469 1F3FE 200D 1F3A8", "char": "👩🏾‍🎨", "name": "woman artist: medium-dark skin tone" }, { "no": 323, "code": "1F469 1F3FF 200D 1F3A8", "char": "👩🏿‍🎨", "name": "woman artist: dark skin tone" }, { "no": 324, "code": "1F468 200D 2708 FE0F", "char": "👨‍✈️", "name": "man pilot" }, { "no": 325, "code": "1F468 1F3FB 200D 2708 FE0F", "char": "👨🏻‍✈️", "name": "man pilot: light skin tone" }, { "no": 326, "code": "1F468 1F3FC 200D 2708 FE0F", "char": "👨🏼‍✈️", "name": "man pilot: medium-light skin tone" }, { "no": 327, "code": "1F468 1F3FD 200D 2708 FE0F", "char": "👨🏽‍✈️", "name": "man pilot: medium skin tone" }, { "no": 328, "code": "1F468 1F3FE 200D 2708 FE0F", "char": "👨🏾‍✈️", "name": "man pilot: medium-dark skin tone" }, { "no": 329, "code": "1F468 1F3FF 200D 2708 FE0F", "char": "👨🏿‍✈️", "name": "man pilot: dark skin tone" }, { "no": 330, "code": "1F469 200D 2708 FE0F", "char": "👩‍✈️", "name": "woman pilot" }, { "no": 331, "code": "1F469 1F3FB 200D 2708 FE0F", "char": "👩🏻‍✈️", "name": "woman pilot: light skin tone" }, { "no": 332, "code": "1F469 1F3FC 200D 2708 FE0F", "char": "👩🏼‍✈️", "name": "woman pilot: medium-light skin tone" }, { "no": 333, "code": "1F469 1F3FD 200D 2708 FE0F", "char": "👩🏽‍✈️", "name": "woman pilot: medium skin tone" }, { "no": 334, "code": "1F469 1F3FE 200D 2708 FE0F", "char": "👩🏾‍✈️", "name": "woman pilot: medium-dark skin tone" }, { "no": 335, "code": "1F469 1F3FF 200D 2708 FE0F", "char": "👩🏿‍✈️", "name": "woman pilot: dark skin tone" }, { "no": 336, "code": "1F468 200D 1F680", "char": "👨‍🚀", "name": "man astronaut" }, { "no": 337, "code": "1F468 1F3FB 200D 1F680", "char": "👨🏻‍🚀", "name": "man astronaut: light skin tone" }, { "no": 338, "code": "1F468 1F3FC 200D 1F680", "char": "👨🏼‍🚀", "name": "man astronaut: medium-light skin tone" }, { "no": 339, "code": "1F468 1F3FD 200D 1F680", "char": "👨🏽‍🚀", "name": "man astronaut: medium skin tone" }, { "no": 340, "code": "1F468 1F3FE 200D 1F680", "char": "👨🏾‍🚀", "name": "man astronaut: medium-dark skin tone" }, { "no": 341, "code": "1F468 1F3FF 200D 1F680", "char": "👨🏿‍🚀", "name": "man astronaut: dark skin tone" }, { "no": 342, "code": "1F469 200D 1F680", "char": "👩‍🚀", "name": "woman astronaut" }, { "no": 343, "code": "1F469 1F3FB 200D 1F680", "char": "👩🏻‍🚀", "name": "woman astronaut: light skin tone" }, { "no": 344, "code": "1F469 1F3FC 200D 1F680", "char": "👩🏼‍🚀", "name": "woman astronaut: medium-light skin tone" }, { "no": 345, "code": "1F469 1F3FD 200D 1F680", "char": "👩🏽‍🚀", "name": "woman astronaut: medium skin tone" }, { "no": 346, "code": "1F469 1F3FE 200D 1F680", "char": "👩🏾‍🚀", "name": "woman astronaut: medium-dark skin tone" }, { "no": 347, "code": "1F469 1F3FF 200D 1F680", "char": "👩🏿‍🚀", "name": "woman astronaut: dark skin tone" }, { "no": 348, "code": "1F468 200D 1F692", "char": "👨‍🚒", "name": "man firefighter" }, { "no": 349, "code": "1F468 1F3FB 200D 1F692", "char": "👨🏻‍🚒", "name": "man firefighter: light skin tone" }, { "no": 350, "code": "1F468 1F3FC 200D 1F692", "char": "👨🏼‍🚒", "name": "man firefighter: medium-light skin tone" }, { "no": 351, "code": "1F468 1F3FD 200D 1F692", "char": "👨🏽‍🚒", "name": "man firefighter: medium skin tone" }, { "no": 352, "code": "1F468 1F3FE 200D 1F692", "char": "👨🏾‍🚒", "name": "man firefighter: medium-dark skin tone" }, { "no": 353, "code": "1F468 1F3FF 200D 1F692", "char": "👨🏿‍🚒", "name": "man firefighter: dark skin tone" }, { "no": 354, "code": "1F469 200D 1F692", "char": "👩‍🚒", "name": "woman firefighter" }, { "no": 355, "code": "1F469 1F3FB 200D 1F692", "char": "👩🏻‍🚒", "name": "woman firefighter: light skin tone" }, { "no": 356, "code": "1F469 1F3FC 200D 1F692", "char": "👩🏼‍🚒", "name": "woman firefighter: medium-light skin tone" }, { "no": 357, "code": "1F469 1F3FD 200D 1F692", "char": "👩🏽‍🚒", "name": "woman firefighter: medium skin tone" }, { "no": 358, "code": "1F469 1F3FE 200D 1F692", "char": "👩🏾‍🚒", "name": "woman firefighter: medium-dark skin tone" }, { "no": 359, "code": "1F469 1F3FF 200D 1F692", "char": "👩🏿‍🚒", "name": "woman firefighter: dark skin tone" }, { "no": 360, "code": "1F46E", "char": "👮", "name": "police officer" }, { "no": 361, "code": "1F46E 1F3FB", "char": "👮🏻", "name": "police officer: light skin tone" }, { "no": 362, "code": "1F46E 1F3FC", "char": "👮🏼", "name": "police officer: medium-light skin tone" }, { "no": 363, "code": "1F46E 1F3FD", "char": "👮🏽", "name": "police officer: medium skin tone" }, { "no": 364, "code": "1F46E 1F3FE", "char": "👮🏾", "name": "police officer: medium-dark skin tone" }, { "no": 365, "code": "1F46E 1F3FF", "char": "👮🏿", "name": "police officer: dark skin tone" }, { "no": 366, "code": "1F46E 200D 2642 FE0F", "char": "👮‍♂️", "name": "man police officer" }, { "no": 367, "code": "1F46E 1F3FB 200D 2642 FE0F", "char": "👮🏻‍♂️", "name": "man police officer: light skin tone" }, { "no": 368, "code": "1F46E 1F3FC 200D 2642 FE0F", "char": "👮🏼‍♂️", "name": "man police officer: medium-light skin tone" }, { "no": 369, "code": "1F46E 1F3FD 200D 2642 FE0F", "char": "👮🏽‍♂️", "name": "man police officer: medium skin tone" }, { "no": 370, "code": "1F46E 1F3FE 200D 2642 FE0F", "char": "👮🏾‍♂️", "name": "man police officer: medium-dark skin tone" }, { "no": 371, "code": "1F46E 1F3FF 200D 2642 FE0F", "char": "👮🏿‍♂️", "name": "man police officer: dark skin tone" }, { "no": 372, "code": "1F46E 200D 2640 FE0F", "char": "👮‍♀️", "name": "woman police officer" }, { "no": 373, "code": "1F46E 1F3FB 200D 2640 FE0F", "char": "👮🏻‍♀️", "name": "woman police officer: light skin tone" }, { "no": 374, "code": "1F46E 1F3FC 200D 2640 FE0F", "char": "👮🏼‍♀️", "name": "woman police officer: medium-light skin tone" }, { "no": 375, "code": "1F46E 1F3FD 200D 2640 FE0F", "char": "👮🏽‍♀️", "name": "woman police officer: medium skin tone" }, { "no": 376, "code": "1F46E 1F3FE 200D 2640 FE0F", "char": "👮🏾‍♀️", "name": "woman police officer: medium-dark skin tone" }, { "no": 377, "code": "1F46E 1F3FF 200D 2640 FE0F", "char": "👮🏿‍♀️", "name": "woman police officer: dark skin tone" }, { "no": 378, "code": "1F575", "char": "🕵", "name": "detective" }, { "no": 379, "code": "1F575 1F3FB", "char": "🕵🏻", "name": "detective: light skin tone" }, { "no": 380, "code": "1F575 1F3FC", "char": "🕵🏼", "name": "detective: medium-light skin tone" }, { "no": 381, "code": "1F575 1F3FD", "char": "🕵🏽", "name": "detective: medium skin tone" }, { "no": 382, "code": "1F575 1F3FE", "char": "🕵🏾", "name": "detective: medium-dark skin tone" }, { "no": 383, "code": "1F575 1F3FF", "char": "🕵🏿", "name": "detective: dark skin tone" }, { "no": 384, "code": "1F575 FE0F 200D 2642 FE0F", "char": "🕵️‍♂️", "name": "man detective" }, { "no": 385, "code": "1F575 1F3FB 200D 2642 FE0F", "char": "🕵🏻‍♂️", "name": "man detective: light skin tone" }, { "no": 386, "code": "1F575 1F3FC 200D 2642 FE0F", "char": "🕵🏼‍♂️", "name": "man detective: medium-light skin tone" }, { "no": 387, "code": "1F575 1F3FD 200D 2642 FE0F", "char": "🕵🏽‍♂️", "name": "man detective: medium skin tone" }, { "no": 388, "code": "1F575 1F3FE 200D 2642 FE0F", "char": "🕵🏾‍♂️", "name": "man detective: medium-dark skin tone" }, { "no": 389, "code": "1F575 1F3FF 200D 2642 FE0F", "char": "🕵🏿‍♂️", "name": "man detective: dark skin tone" }, { "no": 390, "code": "1F575 FE0F 200D 2640 FE0F", "char": "🕵️‍♀️", "name": "woman detective" }, { "no": 391, "code": "1F575 1F3FB 200D 2640 FE0F", "char": "🕵🏻‍♀️", "name": "woman detective: light skin tone" }, { "no": 392, "code": "1F575 1F3FC 200D 2640 FE0F", "char": "🕵🏼‍♀️", "name": "woman detective: medium-light skin tone" }, { "no": 393, "code": "1F575 1F3FD 200D 2640 FE0F", "char": "🕵🏽‍♀️", "name": "woman detective: medium skin tone" }, { "no": 394, "code": "1F575 1F3FE 200D 2640 FE0F", "char": "🕵🏾‍♀️", "name": "woman detective: medium-dark skin tone" }, { "no": 395, "code": "1F575 1F3FF 200D 2640 FE0F", "char": "🕵🏿‍♀️", "name": "woman detective: dark skin tone" }, { "no": 396, "code": "1F482", "char": "💂", "name": "guard" }, { "no": 397, "code": "1F482 1F3FB", "char": "💂🏻", "name": "guard: light skin tone" }, { "no": 398, "code": "1F482 1F3FC", "char": "💂🏼", "name": "guard: medium-light skin tone" }, { "no": 399, "code": "1F482 1F3FD", "char": "💂🏽", "name": "guard: medium skin tone" }, { "no": 400, "code": "1F482 1F3FE", "char": "💂🏾", "name": "guard: medium-dark skin tone" }, { "no": 401, "code": "1F482 1F3FF", "char": "💂🏿", "name": "guard: dark skin tone" }, { "no": 402, "code": "1F482 200D 2642 FE0F", "char": "💂‍♂️", "name": "man guard" }, { "no": 403, "code": "1F482 1F3FB 200D 2642 FE0F", "char": "💂🏻‍♂️", "name": "man guard: light skin tone" }, { "no": 404, "code": "1F482 1F3FC 200D 2642 FE0F", "char": "💂🏼‍♂️", "name": "man guard: medium-light skin tone" }, { "no": 405, "code": "1F482 1F3FD 200D 2642 FE0F", "char": "💂🏽‍♂️", "name": "man guard: medium skin tone" }, { "no": 406, "code": "1F482 1F3FE 200D 2642 FE0F", "char": "💂🏾‍♂️", "name": "man guard: medium-dark skin tone" }, { "no": 407, "code": "1F482 1F3FF 200D 2642 FE0F", "char": "💂🏿‍♂️", "name": "man guard: dark skin tone" }, { "no": 408, "code": "1F482 200D 2640 FE0F", "char": "💂‍♀️", "name": "woman guard" }, { "no": 409, "code": "1F482 1F3FB 200D 2640 FE0F", "char": "💂🏻‍♀️", "name": "woman guard: light skin tone" }, { "no": 410, "code": "1F482 1F3FC 200D 2640 FE0F", "char": "💂🏼‍♀️", "name": "woman guard: medium-light skin tone" }, { "no": 411, "code": "1F482 1F3FD 200D 2640 FE0F", "char": "💂🏽‍♀️", "name": "woman guard: medium skin tone" }, { "no": 412, "code": "1F482 1F3FE 200D 2640 FE0F", "char": "💂🏾‍♀️", "name": "woman guard: medium-dark skin tone" }, { "no": 413, "code": "1F482 1F3FF 200D 2640 FE0F", "char": "💂🏿‍♀️", "name": "woman guard: dark skin tone" }, { "no": 414, "code": "1F477", "char": "👷", "name": "construction worker" }, { "no": 415, "code": "1F477 1F3FB", "char": "👷🏻", "name": "construction worker: light skin tone" }, { "no": 416, "code": "1F477 1F3FC", "char": "👷🏼", "name": "construction worker: medium-light skin tone" }, { "no": 417, "code": "1F477 1F3FD", "char": "👷🏽", "name": "construction worker: medium skin tone" }, { "no": 418, "code": "1F477 1F3FE", "char": "👷🏾", "name": "construction worker: medium-dark skin tone" }, { "no": 419, "code": "1F477 1F3FF", "char": "👷🏿", "name": "construction worker: dark skin tone" }, { "no": 420, "code": "1F477 200D 2642 FE0F", "char": "👷‍♂️", "name": "man construction worker" }, { "no": 421, "code": "1F477 1F3FB 200D 2642 FE0F", "char": "👷🏻‍♂️", "name": "man construction worker: light skin tone" }, { "no": 422, "code": "1F477 1F3FC 200D 2642 FE0F", "char": "👷🏼‍♂️", "name": "man construction worker: medium-light skin tone" }, { "no": 423, "code": "1F477 1F3FD 200D 2642 FE0F", "char": "👷🏽‍♂️", "name": "man construction worker: medium skin tone" }, { "no": 424, "code": "1F477 1F3FE 200D 2642 FE0F", "char": "👷🏾‍♂️", "name": "man construction worker: medium-dark skin tone" }, { "no": 425, "code": "1F477 1F3FF 200D 2642 FE0F", "char": "👷🏿‍♂️", "name": "man construction worker: dark skin tone" }, { "no": 426, "code": "1F477 200D 2640 FE0F", "char": "👷‍♀️", "name": "woman construction worker" }, { "no": 427, "code": "1F477 1F3FB 200D 2640 FE0F", "char": "👷🏻‍♀️", "name": "woman construction worker: light skin tone" }, { "no": 428, "code": "1F477 1F3FC 200D 2640 FE0F", "char": "👷🏼‍♀️", "name": "woman construction worker: medium-light skin tone" }, { "no": 429, "code": "1F477 1F3FD 200D 2640 FE0F", "char": "👷🏽‍♀️", "name": "woman construction worker: medium skin tone" }, { "no": 430, "code": "1F477 1F3FE 200D 2640 FE0F", "char": "👷🏾‍♀️", "name": "woman construction worker: medium-dark skin tone" }, { "no": 431, "code": "1F477 1F3FF 200D 2640 FE0F", "char": "👷🏿‍♀️", "name": "woman construction worker: dark skin tone" }, { "no": 432, "code": "1F934", "char": "🤴", "name": "prince" }, { "no": 433, "code": "1F934 1F3FB", "char": "🤴🏻", "name": "prince: light skin tone" }, { "no": 434, "code": "1F934 1F3FC", "char": "🤴🏼", "name": "prince: medium-light skin tone" }, { "no": 435, "code": "1F934 1F3FD", "char": "🤴🏽", "name": "prince: medium skin tone" }, { "no": 436, "code": "1F934 1F3FE", "char": "🤴🏾", "name": "prince: medium-dark skin tone" }, { "no": 437, "code": "1F934 1F3FF", "char": "🤴🏿", "name": "prince: dark skin tone" }, { "no": 438, "code": "1F478", "char": "👸", "name": "princess" }, { "no": 439, "code": "1F478 1F3FB", "char": "👸🏻", "name": "princess: light skin tone" }, { "no": 440, "code": "1F478 1F3FC", "char": "👸🏼", "name": "princess: medium-light skin tone" }, { "no": 441, "code": "1F478 1F3FD", "char": "👸🏽", "name": "princess: medium skin tone" }, { "no": 442, "code": "1F478 1F3FE", "char": "👸🏾", "name": "princess: medium-dark skin tone" }, { "no": 443, "code": "1F478 1F3FF", "char": "👸🏿", "name": "princess: dark skin tone" }, { "no": 444, "code": "1F473", "char": "👳", "name": "person wearing turban" }, { "no": 445, "code": "1F473 1F3FB", "char": "👳🏻", "name": "person wearing turban: light skin tone" }, { "no": 446, "code": "1F473 1F3FC", "char": "👳🏼", "name": "person wearing turban: medium-light skin tone" }, { "no": 447, "code": "1F473 1F3FD", "char": "👳🏽", "name": "person wearing turban: medium skin tone" }, { "no": 448, "code": "1F473 1F3FE", "char": "👳🏾", "name": "person wearing turban: medium-dark skin tone" }, { "no": 449, "code": "1F473 1F3FF", "char": "👳🏿", "name": "person wearing turban: dark skin tone" }, { "no": 450, "code": "1F473 200D 2642 FE0F", "char": "👳‍♂️", "name": "man wearing turban" }, { "no": 451, "code": "1F473 1F3FB 200D 2642 FE0F", "char": "👳🏻‍♂️", "name": "man wearing turban: light skin tone" }, { "no": 452, "code": "1F473 1F3FC 200D 2642 FE0F", "char": "👳🏼‍♂️", "name": "man wearing turban: medium-light skin tone" }, { "no": 453, "code": "1F473 1F3FD 200D 2642 FE0F", "char": "👳🏽‍♂️", "name": "man wearing turban: medium skin tone" }, { "no": 454, "code": "1F473 1F3FE 200D 2642 FE0F", "char": "👳🏾‍♂️", "name": "man wearing turban: medium-dark skin tone" }, { "no": 455, "code": "1F473 1F3FF 200D 2642 FE0F", "char": "👳🏿‍♂️", "name": "man wearing turban: dark skin tone" }, { "no": 456, "code": "1F473 200D 2640 FE0F", "char": "👳‍♀️", "name": "woman wearing turban" }, { "no": 457, "code": "1F473 1F3FB 200D 2640 FE0F", "char": "👳🏻‍♀️", "name": "woman wearing turban: light skin tone" }, { "no": 458, "code": "1F473 1F3FC 200D 2640 FE0F", "char": "👳🏼‍♀️", "name": "woman wearing turban: medium-light skin tone" }, { "no": 459, "code": "1F473 1F3FD 200D 2640 FE0F", "char": "👳🏽‍♀️", "name": "woman wearing turban: medium skin tone" }, { "no": 460, "code": "1F473 1F3FE 200D 2640 FE0F", "char": "👳🏾‍♀️", "name": "woman wearing turban: medium-dark skin tone" }, { "no": 461, "code": "1F473 1F3FF 200D 2640 FE0F", "char": "👳🏿‍♀️", "name": "woman wearing turban: dark skin tone" }, { "no": 462, "code": "1F472", "char": "👲", "name": "man with Chinese cap" }, { "no": 463, "code": "1F472 1F3FB", "char": "👲🏻", "name": "man with Chinese cap: light skin tone" }, { "no": 464, "code": "1F472 1F3FC", "char": "👲🏼", "name": "man with Chinese cap: medium-light skin tone" }, { "no": 465, "code": "1F472 1F3FD", "char": "👲🏽", "name": "man with Chinese cap: medium skin tone" }, { "no": 466, "code": "1F472 1F3FE", "char": "👲🏾", "name": "man with Chinese cap: medium-dark skin tone" }, { "no": 467, "code": "1F472 1F3FF", "char": "👲🏿", "name": "man with Chinese cap: dark skin tone" }, { "no": 468, "code": "1F9D5", "char": "🧕", "name": "⊛ woman with headscarf" }, { "no": 469, "code": "1F9D5 1F3FB", "char": "🧕🏻", "name": "⊛ woman with headscarf: light skin tone" }, { "no": 470, "code": "1F9D5 1F3FC", "char": "🧕🏼", "name": "⊛ woman with headscarf: medium-light skin tone" }, { "no": 471, "code": "1F9D5 1F3FD", "char": "🧕🏽", "name": "⊛ woman with headscarf: medium skin tone" }, { "no": 472, "code": "1F9D5 1F3FE", "char": "🧕🏾", "name": "⊛ woman with headscarf: medium-dark skin tone" }, { "no": 473, "code": "1F9D5 1F3FF", "char": "🧕🏿", "name": "⊛ woman with headscarf: dark skin tone" }, { "no": 474, "code": "1F9D4", "char": "🧔", "name": "⊛ bearded person" }, { "no": 475, "code": "1F9D4 1F3FB", "char": "🧔🏻", "name": "⊛ bearded person: light skin tone" }, { "no": 476, "code": "1F9D4 1F3FC", "char": "🧔🏼", "name": "⊛ bearded person: medium-light skin tone" }, { "no": 477, "code": "1F9D4 1F3FD", "char": "🧔🏽", "name": "⊛ bearded person: medium skin tone" }, { "no": 478, "code": "1F9D4 1F3FE", "char": "🧔🏾", "name": "⊛ bearded person: medium-dark skin tone" }, { "no": 479, "code": "1F9D4 1F3FF", "char": "🧔🏿", "name": "⊛ bearded person: dark skin tone" }, { "no": 480, "code": "1F471", "char": "👱", "name": "blond-haired person" }, { "no": 481, "code": "1F471 1F3FB", "char": "👱🏻", "name": "blond-haired person: light skin tone" }, { "no": 482, "code": "1F471 1F3FC", "char": "👱🏼", "name": "blond-haired person: medium-light skin tone" }, { "no": 483, "code": "1F471 1F3FD", "char": "👱🏽", "name": "blond-haired person: medium skin tone" }, { "no": 484, "code": "1F471 1F3FE", "char": "👱🏾", "name": "blond-haired person: medium-dark skin tone" }, { "no": 485, "code": "1F471 1F3FF", "char": "👱🏿", "name": "blond-haired person: dark skin tone" }, { "no": 486, "code": "1F471 200D 2642 FE0F", "char": "👱‍♂️", "name": "blond-haired man" }, { "no": 487, "code": "1F471 1F3FB 200D 2642 FE0F", "char": "👱🏻‍♂️", "name": "blond-haired man: light skin tone" }, { "no": 488, "code": "1F471 1F3FC 200D 2642 FE0F", "char": "👱🏼‍♂️", "name": "blond-haired man: medium-light skin tone" }, { "no": 489, "code": "1F471 1F3FD 200D 2642 FE0F", "char": "👱🏽‍♂️", "name": "blond-haired man: medium skin tone" }, { "no": 490, "code": "1F471 1F3FE 200D 2642 FE0F", "char": "👱🏾‍♂️", "name": "blond-haired man: medium-dark skin tone" }, { "no": 491, "code": "1F471 1F3FF 200D 2642 FE0F", "char": "👱🏿‍♂️", "name": "blond-haired man: dark skin tone" }, { "no": 492, "code": "1F471 200D 2640 FE0F", "char": "👱‍♀️", "name": "blond-haired woman" }, { "no": 493, "code": "1F471 1F3FB 200D 2640 FE0F", "char": "👱🏻‍♀️", "name": "blond-haired woman: light skin tone" }, { "no": 494, "code": "1F471 1F3FC 200D 2640 FE0F", "char": "👱🏼‍♀️", "name": "blond-haired woman: medium-light skin tone" }, { "no": 495, "code": "1F471 1F3FD 200D 2640 FE0F", "char": "👱🏽‍♀️", "name": "blond-haired woman: medium skin tone" }, { "no": 496, "code": "1F471 1F3FE 200D 2640 FE0F", "char": "👱🏾‍♀️", "name": "blond-haired woman: medium-dark skin tone" }, { "no": 497, "code": "1F471 1F3FF 200D 2640 FE0F", "char": "👱🏿‍♀️", "name": "blond-haired woman: dark skin tone" }, { "no": 498, "code": "1F935", "char": "🤵", "name": "man in tuxedo" }, { "no": 499, "code": "1F935 1F3FB", "char": "🤵🏻", "name": "man in tuxedo: light skin tone" }, { "no": 500, "code": "1F935 1F3FC", "char": "🤵🏼", "name": "man in tuxedo: medium-light skin tone" }, { "no": 501, "code": "1F935 1F3FD", "char": "🤵🏽", "name": "man in tuxedo: medium skin tone" }, { "no": 502, "code": "1F935 1F3FE", "char": "🤵🏾", "name": "man in tuxedo: medium-dark skin tone" }, { "no": 503, "code": "1F935 1F3FF", "char": "🤵🏿", "name": "man in tuxedo: dark skin tone" }, { "no": 504, "code": "1F470", "char": "👰", "name": "bride with veil" }, { "no": 505, "code": "1F470 1F3FB", "char": "👰🏻", "name": "bride with veil: light skin tone" }, { "no": 506, "code": "1F470 1F3FC", "char": "👰🏼", "name": "bride with veil: medium-light skin tone" }, { "no": 507, "code": "1F470 1F3FD", "char": "👰🏽", "name": "bride with veil: medium skin tone" }, { "no": 508, "code": "1F470 1F3FE", "char": "👰🏾", "name": "bride with veil: medium-dark skin tone" }, { "no": 509, "code": "1F470 1F3FF", "char": "👰🏿", "name": "bride with veil: dark skin tone" }, { "no": 510, "code": "1F930", "char": "🤰", "name": "pregnant woman" }, { "no": 511, "code": "1F930 1F3FB", "char": "🤰🏻", "name": "pregnant woman: light skin tone" }, { "no": 512, "code": "1F930 1F3FC", "char": "🤰🏼", "name": "pregnant woman: medium-light skin tone" }, { "no": 513, "code": "1F930 1F3FD", "char": "🤰🏽", "name": "pregnant woman: medium skin tone" }, { "no": 514, "code": "1F930 1F3FE", "char": "🤰🏾", "name": "pregnant woman: medium-dark skin tone" }, { "no": 515, "code": "1F930 1F3FF", "char": "🤰🏿", "name": "pregnant woman: dark skin tone" }, { "no": 516, "code": "1F931", "char": "🤱", "name": "⊛ breast-feeding" }, { "no": 517, "code": "1F931 1F3FB", "char": "🤱🏻", "name": "⊛ breast-feeding: light skin tone" }, { "no": 518, "code": "1F931 1F3FC", "char": "🤱🏼", "name": "⊛ breast-feeding: medium-light skin tone" }, { "no": 519, "code": "1F931 1F3FD", "char": "🤱🏽", "name": "⊛ breast-feeding: medium skin tone" }, { "no": 520, "code": "1F931 1F3FE", "char": "🤱🏾", "name": "⊛ breast-feeding: medium-dark skin tone" }, { "no": 521, "code": "1F931 1F3FF", "char": "🤱🏿", "name": "⊛ breast-feeding: dark skin tone" }, { "no": 522, "code": "1F47C", "char": "👼", "name": "baby angel" }, { "no": 523, "code": "1F47C 1F3FB", "char": "👼🏻", "name": "baby angel: light skin tone" }, { "no": 524, "code": "1F47C 1F3FC", "char": "👼🏼", "name": "baby angel: medium-light skin tone" }, { "no": 525, "code": "1F47C 1F3FD", "char": "👼🏽", "name": "baby angel: medium skin tone" }, { "no": 526, "code": "1F47C 1F3FE", "char": "👼🏾", "name": "baby angel: medium-dark skin tone" }, { "no": 527, "code": "1F47C 1F3FF", "char": "👼🏿", "name": "baby angel: dark skin tone" }, { "no": 528, "code": "1F385", "char": "🎅", "name": "Santa Claus" }, { "no": 529, "code": "1F385 1F3FB", "char": "🎅🏻", "name": "Santa Claus: light skin tone" }, { "no": 530, "code": "1F385 1F3FC", "char": "🎅🏼", "name": "Santa Claus: medium-light skin tone" }, { "no": 531, "code": "1F385 1F3FD", "char": "🎅🏽", "name": "Santa Claus: medium skin tone" }, { "no": 532, "code": "1F385 1F3FE", "char": "🎅🏾", "name": "Santa Claus: medium-dark skin tone" }, { "no": 533, "code": "1F385 1F3FF", "char": "🎅🏿", "name": "Santa Claus: dark skin tone" }, { "no": 534, "code": "1F936", "char": "🤶", "name": "Mrs. Claus" }, { "no": 535, "code": "1F936 1F3FB", "char": "🤶🏻", "name": "Mrs. Claus: light skin tone" }, { "no": 536, "code": "1F936 1F3FC", "char": "🤶🏼", "name": "Mrs. Claus: medium-light skin tone" }, { "no": 537, "code": "1F936 1F3FD", "char": "🤶🏽", "name": "Mrs. Claus: medium skin tone" }, { "no": 538, "code": "1F936 1F3FE", "char": "🤶🏾", "name": "Mrs. Claus: medium-dark skin tone" }, { "no": 539, "code": "1F936 1F3FF", "char": "🤶🏿", "name": "Mrs. Claus: dark skin tone" }, { "no": 540, "code": "1F9D9", "char": "🧙", "name": "⊛ mage" }, { "no": 541, "code": "1F9D9 1F3FB", "char": "🧙🏻", "name": "⊛ mage: light skin tone" }, { "no": 542, "code": "1F9D9 1F3FC", "char": "🧙🏼", "name": "⊛ mage: medium-light skin tone" }, { "no": 543, "code": "1F9D9 1F3FD", "char": "🧙🏽", "name": "⊛ mage: medium skin tone" }, { "no": 544, "code": "1F9D9 1F3FE", "char": "🧙🏾", "name": "⊛ mage: medium-dark skin tone" }, { "no": 545, "code": "1F9D9 1F3FF", "char": "🧙🏿", "name": "⊛ mage: dark skin tone" }, { "no": 546, "code": "1F9D9 200D 2640 FE0F", "char": "🧙‍♀️", "name": "⊛ woman mage" }, { "no": 547, "code": "1F9D9 1F3FB 200D 2640 FE0F", "char": "🧙🏻‍♀️", "name": "⊛ woman mage: light skin tone" }, { "no": 548, "code": "1F9D9 1F3FC 200D 2640 FE0F", "char": "🧙🏼‍♀️", "name": "⊛ woman mage: medium-light skin tone" }, { "no": 549, "code": "1F9D9 1F3FD 200D 2640 FE0F", "char": "🧙🏽‍♀️", "name": "⊛ woman mage: medium skin tone" }, { "no": 550, "code": "1F9D9 1F3FE 200D 2640 FE0F", "char": "🧙🏾‍♀️", "name": "⊛ woman mage: medium-dark skin tone" }, { "no": 551, "code": "1F9D9 1F3FF 200D 2640 FE0F", "char": "🧙🏿‍♀️", "name": "⊛ woman mage: dark skin tone" }, { "no": 552, "code": "1F9D9 200D 2642 FE0F", "char": "🧙‍♂️", "name": "⊛ man mage" }, { "no": 553, "code": "1F9D9 1F3FB 200D 2642 FE0F", "char": "🧙🏻‍♂️", "name": "⊛ man mage: light skin tone" }, { "no": 554, "code": "1F9D9 1F3FC 200D 2642 FE0F", "char": "🧙🏼‍♂️", "name": "⊛ man mage: medium-light skin tone" }, { "no": 555, "code": "1F9D9 1F3FD 200D 2642 FE0F", "char": "🧙🏽‍♂️", "name": "⊛ man mage: medium skin tone" }, { "no": 556, "code": "1F9D9 1F3FE 200D 2642 FE0F", "char": "🧙🏾‍♂️", "name": "⊛ man mage: medium-dark skin tone" }, { "no": 557, "code": "1F9D9 1F3FF 200D 2642 FE0F", "char": "🧙🏿‍♂️", "name": "⊛ man mage: dark skin tone" }, { "no": 558, "code": "1F9DA", "char": "🧚", "name": "⊛ fairy" }, { "no": 559, "code": "1F9DA 1F3FB", "char": "🧚🏻", "name": "⊛ fairy: light skin tone" }, { "no": 560, "code": "1F9DA 1F3FC", "char": "🧚🏼", "name": "⊛ fairy: medium-light skin tone" }, { "no": 561, "code": "1F9DA 1F3FD", "char": "🧚🏽", "name": "⊛ fairy: medium skin tone" }, { "no": 562, "code": "1F9DA 1F3FE", "char": "🧚🏾", "name": "⊛ fairy: medium-dark skin tone" }, { "no": 563, "code": "1F9DA 1F3FF", "char": "🧚🏿", "name": "⊛ fairy: dark skin tone" }, { "no": 564, "code": "1F9DA 200D 2640 FE0F", "char": "🧚‍♀️", "name": "⊛ woman fairy" }, { "no": 565, "code": "1F9DA 1F3FB 200D 2640 FE0F", "char": "🧚🏻‍♀️", "name": "⊛ woman fairy: light skin tone" }, { "no": 566, "code": "1F9DA 1F3FC 200D 2640 FE0F", "char": "🧚🏼‍♀️", "name": "⊛ woman fairy: medium-light skin tone" }, { "no": 567, "code": "1F9DA 1F3FD 200D 2640 FE0F", "char": "🧚🏽‍♀️", "name": "⊛ woman fairy: medium skin tone" }, { "no": 568, "code": "1F9DA 1F3FE 200D 2640 FE0F", "char": "🧚🏾‍♀️", "name": "⊛ woman fairy: medium-dark skin tone" }, { "no": 569, "code": "1F9DA 1F3FF 200D 2640 FE0F", "char": "🧚🏿‍♀️", "name": "⊛ woman fairy: dark skin tone" }, { "no": 570, "code": "1F9DA 200D 2642 FE0F", "char": "🧚‍♂️", "name": "⊛ man fairy" }, { "no": 571, "code": "1F9DA 1F3FB 200D 2642 FE0F", "char": "🧚🏻‍♂️", "name": "⊛ man fairy: light skin tone" }, { "no": 572, "code": "1F9DA 1F3FC 200D 2642 FE0F", "char": "🧚🏼‍♂️", "name": "⊛ man fairy: medium-light skin tone" }, { "no": 573, "code": "1F9DA 1F3FD 200D 2642 FE0F", "char": "🧚🏽‍♂️", "name": "⊛ man fairy: medium skin tone" }, { "no": 574, "code": "1F9DA 1F3FE 200D 2642 FE0F", "char": "🧚🏾‍♂️", "name": "⊛ man fairy: medium-dark skin tone" }, { "no": 575, "code": "1F9DA 1F3FF 200D 2642 FE0F", "char": "🧚🏿‍♂️", "name": "⊛ man fairy: dark skin tone" }, { "no": 576, "code": "1F9DB", "char": "🧛", "name": "⊛ vampire" }, { "no": 577, "code": "1F9DB 1F3FB", "char": "🧛🏻", "name": "⊛ vampire: light skin tone" }, { "no": 578, "code": "1F9DB 1F3FC", "char": "🧛🏼", "name": "⊛ vampire: medium-light skin tone" }, { "no": 579, "code": "1F9DB 1F3FD", "char": "🧛🏽", "name": "⊛ vampire: medium skin tone" }, { "no": 580, "code": "1F9DB 1F3FE", "char": "🧛🏾", "name": "⊛ vampire: medium-dark skin tone" }, { "no": 581, "code": "1F9DB 1F3FF", "char": "🧛🏿", "name": "⊛ vampire: dark skin tone" }, { "no": 582, "code": "1F9DB 200D 2640 FE0F", "char": "🧛‍♀️", "name": "⊛ woman vampire" }, { "no": 583, "code": "1F9DB 1F3FB 200D 2640 FE0F", "char": "🧛🏻‍♀️", "name": "⊛ woman vampire: light skin tone" }, { "no": 584, "code": "1F9DB 1F3FC 200D 2640 FE0F", "char": "🧛🏼‍♀️", "name": "⊛ woman vampire: medium-light skin tone" }, { "no": 585, "code": "1F9DB 1F3FD 200D 2640 FE0F", "char": "🧛🏽‍♀️", "name": "⊛ woman vampire: medium skin tone" }, { "no": 586, "code": "1F9DB 1F3FE 200D 2640 FE0F", "char": "🧛🏾‍♀️", "name": "⊛ woman vampire: medium-dark skin tone" }, { "no": 587, "code": "1F9DB 1F3FF 200D 2640 FE0F", "char": "🧛🏿‍♀️", "name": "⊛ woman vampire: dark skin tone" }, { "no": 588, "code": "1F9DB 200D 2642 FE0F", "char": "🧛‍♂️", "name": "⊛ man vampire" }, { "no": 589, "code": "1F9DB 1F3FB 200D 2642 FE0F", "char": "🧛🏻‍♂️", "name": "⊛ man vampire: light skin tone" }, { "no": 590, "code": "1F9DB 1F3FC 200D 2642 FE0F", "char": "🧛🏼‍♂️", "name": "⊛ man vampire: medium-light skin tone" }, { "no": 591, "code": "1F9DB 1F3FD 200D 2642 FE0F", "char": "🧛🏽‍♂️", "name": "⊛ man vampire: medium skin tone" }, { "no": 592, "code": "1F9DB 1F3FE 200D 2642 FE0F", "char": "🧛🏾‍♂️", "name": "⊛ man vampire: medium-dark skin tone" }, { "no": 593, "code": "1F9DB 1F3FF 200D 2642 FE0F", "char": "🧛🏿‍♂️", "name": "⊛ man vampire: dark skin tone" }, { "no": 594, "code": "1F9DC", "char": "🧜", "name": "⊛ merperson" }, { "no": 595, "code": "1F9DC 1F3FB", "char": "🧜🏻", "name": "⊛ merperson: light skin tone" }, { "no": 596, "code": "1F9DC 1F3FC", "char": "🧜🏼", "name": "⊛ merperson: medium-light skin tone" }, { "no": 597, "code": "1F9DC 1F3FD", "char": "🧜🏽", "name": "⊛ merperson: medium skin tone" }, { "no": 598, "code": "1F9DC 1F3FE", "char": "🧜🏾", "name": "⊛ merperson: medium-dark skin tone" }, { "no": 599, "code": "1F9DC 1F3FF", "char": "🧜🏿", "name": "⊛ merperson: dark skin tone" }, { "no": 600, "code": "1F9DC 200D 2640 FE0F", "char": "🧜‍♀️", "name": "⊛ mermaid" }, { "no": 601, "code": "1F9DC 1F3FB 200D 2640 FE0F", "char": "🧜🏻‍♀️", "name": "⊛ mermaid: light skin tone" }, { "no": 602, "code": "1F9DC 1F3FC 200D 2640 FE0F", "char": "🧜🏼‍♀️", "name": "⊛ mermaid: medium-light skin tone" }, { "no": 603, "code": "1F9DC 1F3FD 200D 2640 FE0F", "char": "🧜🏽‍♀️", "name": "⊛ mermaid: medium skin tone" }, { "no": 604, "code": "1F9DC 1F3FE 200D 2640 FE0F", "char": "🧜🏾‍♀️", "name": "⊛ mermaid: medium-dark skin tone" }, { "no": 605, "code": "1F9DC 1F3FF 200D 2640 FE0F", "char": "🧜🏿‍♀️", "name": "⊛ mermaid: dark skin tone" }, { "no": 606, "code": "1F9DC 200D 2642 FE0F", "char": "🧜‍♂️", "name": "⊛ merman" }, { "no": 607, "code": "1F9DC 1F3FB 200D 2642 FE0F", "char": "🧜🏻‍♂️", "name": "⊛ merman: light skin tone" }, { "no": 608, "code": "1F9DC 1F3FC 200D 2642 FE0F", "char": "🧜🏼‍♂️", "name": "⊛ merman: medium-light skin tone" }, { "no": 609, "code": "1F9DC 1F3FD 200D 2642 FE0F", "char": "🧜🏽‍♂️", "name": "⊛ merman: medium skin tone" }, { "no": 610, "code": "1F9DC 1F3FE 200D 2642 FE0F", "char": "🧜🏾‍♂️", "name": "⊛ merman: medium-dark skin tone" }, { "no": 611, "code": "1F9DC 1F3FF 200D 2642 FE0F", "char": "🧜🏿‍♂️", "name": "⊛ merman: dark skin tone" }, { "no": 612, "code": "1F9DD", "char": "🧝", "name": "⊛ elf" }, { "no": 613, "code": "1F9DD 1F3FB", "char": "🧝🏻", "name": "⊛ elf: light skin tone" }, { "no": 614, "code": "1F9DD 1F3FC", "char": "🧝🏼", "name": "⊛ elf: medium-light skin tone" }, { "no": 615, "code": "1F9DD 1F3FD", "char": "🧝🏽", "name": "⊛ elf: medium skin tone" }, { "no": 616, "code": "1F9DD 1F3FE", "char": "🧝🏾", "name": "⊛ elf: medium-dark skin tone" }, { "no": 617, "code": "1F9DD 1F3FF", "char": "🧝🏿", "name": "⊛ elf: dark skin tone" }, { "no": 618, "code": "1F9DD 200D 2640 FE0F", "char": "🧝‍♀️", "name": "⊛ woman elf" }, { "no": 619, "code": "1F9DD 1F3FB 200D 2640 FE0F", "char": "🧝🏻‍♀️", "name": "⊛ woman elf: light skin tone" }, { "no": 620, "code": "1F9DD 1F3FC 200D 2640 FE0F", "char": "🧝🏼‍♀️", "name": "⊛ woman elf: medium-light skin tone" }, { "no": 621, "code": "1F9DD 1F3FD 200D 2640 FE0F", "char": "🧝🏽‍♀️", "name": "⊛ woman elf: medium skin tone" }, { "no": 622, "code": "1F9DD 1F3FE 200D 2640 FE0F", "char": "🧝🏾‍♀️", "name": "⊛ woman elf: medium-dark skin tone" }, { "no": 623, "code": "1F9DD 1F3FF 200D 2640 FE0F", "char": "🧝🏿‍♀️", "name": "⊛ woman elf: dark skin tone" }, { "no": 624, "code": "1F9DD 200D 2642 FE0F", "char": "🧝‍♂️", "name": "⊛ man elf" }, { "no": 625, "code": "1F9DD 1F3FB 200D 2642 FE0F", "char": "🧝🏻‍♂️", "name": "⊛ man elf: light skin tone" }, { "no": 626, "code": "1F9DD 1F3FC 200D 2642 FE0F", "char": "🧝🏼‍♂️", "name": "⊛ man elf: medium-light skin tone" }, { "no": 627, "code": "1F9DD 1F3FD 200D 2642 FE0F", "char": "🧝🏽‍♂️", "name": "⊛ man elf: medium skin tone" }, { "no": 628, "code": "1F9DD 1F3FE 200D 2642 FE0F", "char": "🧝🏾‍♂️", "name": "⊛ man elf: medium-dark skin tone" }, { "no": 629, "code": "1F9DD 1F3FF 200D 2642 FE0F", "char": "🧝🏿‍♂️", "name": "⊛ man elf: dark skin tone" }, { "no": 630, "code": "1F9DE", "char": "🧞", "name": "⊛ genie" }, { "no": 631, "code": "1F9DE 200D 2640 FE0F", "char": "🧞‍♀️", "name": "⊛ woman genie" }, { "no": 632, "code": "1F9DE 200D 2642 FE0F", "char": "🧞‍♂️", "name": "⊛ man genie" }, { "no": 633, "code": "1F9DF", "char": "🧟", "name": "⊛ zombie" }, { "no": 634, "code": "1F9DF 200D 2640 FE0F", "char": "🧟‍♀️", "name": "⊛ woman zombie" }, { "no": 635, "code": "1F9DF 200D 2642 FE0F", "char": "🧟‍♂️", "name": "⊛ man zombie" }, { "no": 636, "code": "1F64D", "char": "🙍", "name": "person frowning" }, { "no": 637, "code": "1F64D 1F3FB", "char": "🙍🏻", "name": "person frowning: light skin tone" }, { "no": 638, "code": "1F64D 1F3FC", "char": "🙍🏼", "name": "person frowning: medium-light skin tone" }, { "no": 639, "code": "1F64D 1F3FD", "char": "🙍🏽", "name": "person frowning: medium skin tone" }, { "no": 640, "code": "1F64D 1F3FE", "char": "🙍🏾", "name": "person frowning: medium-dark skin tone" }, { "no": 641, "code": "1F64D 1F3FF", "char": "🙍🏿", "name": "person frowning: dark skin tone" }, { "no": 642, "code": "1F64D 200D 2642 FE0F", "char": "🙍‍♂️", "name": "man frowning" }, { "no": 643, "code": "1F64D 1F3FB 200D 2642 FE0F", "char": "🙍🏻‍♂️", "name": "man frowning: light skin tone" }, { "no": 644, "code": "1F64D 1F3FC 200D 2642 FE0F", "char": "🙍🏼‍♂️", "name": "man frowning: medium-light skin tone" }, { "no": 645, "code": "1F64D 1F3FD 200D 2642 FE0F", "char": "🙍🏽‍♂️", "name": "man frowning: medium skin tone" }, { "no": 646, "code": "1F64D 1F3FE 200D 2642 FE0F", "char": "🙍🏾‍♂️", "name": "man frowning: medium-dark skin tone" }, { "no": 647, "code": "1F64D 1F3FF 200D 2642 FE0F", "char": "🙍🏿‍♂️", "name": "man frowning: dark skin tone" }, { "no": 648, "code": "1F64D 200D 2640 FE0F", "char": "🙍‍♀️", "name": "woman frowning" }, { "no": 649, "code": "1F64D 1F3FB 200D 2640 FE0F", "char": "🙍🏻‍♀️", "name": "woman frowning: light skin tone" }, { "no": 650, "code": "1F64D 1F3FC 200D 2640 FE0F", "char": "🙍🏼‍♀️", "name": "woman frowning: medium-light skin tone" }, { "no": 651, "code": "1F64D 1F3FD 200D 2640 FE0F", "char": "🙍🏽‍♀️", "name": "woman frowning: medium skin tone" }, { "no": 652, "code": "1F64D 1F3FE 200D 2640 FE0F", "char": "🙍🏾‍♀️", "name": "woman frowning: medium-dark skin tone" }, { "no": 653, "code": "1F64D 1F3FF 200D 2640 FE0F", "char": "🙍🏿‍♀️", "name": "woman frowning: dark skin tone" }, { "no": 654, "code": "1F64E", "char": "🙎", "name": "person pouting" }, { "no": 655, "code": "1F64E 1F3FB", "char": "🙎🏻", "name": "person pouting: light skin tone" }, { "no": 656, "code": "1F64E 1F3FC", "char": "🙎🏼", "name": "person pouting: medium-light skin tone" }, { "no": 657, "code": "1F64E 1F3FD", "char": "🙎🏽", "name": "person pouting: medium skin tone" }, { "no": 658, "code": "1F64E 1F3FE", "char": "🙎🏾", "name": "person pouting: medium-dark skin tone" }, { "no": 659, "code": "1F64E 1F3FF", "char": "🙎🏿", "name": "person pouting: dark skin tone" }, { "no": 660, "code": "1F64E 200D 2642 FE0F", "char": "🙎‍♂️", "name": "man pouting" }, { "no": 661, "code": "1F64E 1F3FB 200D 2642 FE0F", "char": "🙎🏻‍♂️", "name": "man pouting: light skin tone" }, { "no": 662, "code": "1F64E 1F3FC 200D 2642 FE0F", "char": "🙎🏼‍♂️", "name": "man pouting: medium-light skin tone" }, { "no": 663, "code": "1F64E 1F3FD 200D 2642 FE0F", "char": "🙎🏽‍♂️", "name": "man pouting: medium skin tone" }, { "no": 664, "code": "1F64E 1F3FE 200D 2642 FE0F", "char": "🙎🏾‍♂️", "name": "man pouting: medium-dark skin tone" }, { "no": 665, "code": "1F64E 1F3FF 200D 2642 FE0F", "char": "🙎🏿‍♂️", "name": "man pouting: dark skin tone" }, { "no": 666, "code": "1F64E 200D 2640 FE0F", "char": "🙎‍♀️", "name": "woman pouting" }, { "no": 667, "code": "1F64E 1F3FB 200D 2640 FE0F", "char": "🙎🏻‍♀️", "name": "woman pouting: light skin tone" }, { "no": 668, "code": "1F64E 1F3FC 200D 2640 FE0F", "char": "🙎🏼‍♀️", "name": "woman pouting: medium-light skin tone" }, { "no": 669, "code": "1F64E 1F3FD 200D 2640 FE0F", "char": "🙎🏽‍♀️", "name": "woman pouting: medium skin tone" }, { "no": 670, "code": "1F64E 1F3FE 200D 2640 FE0F", "char": "🙎🏾‍♀️", "name": "woman pouting: medium-dark skin tone" }, { "no": 671, "code": "1F64E 1F3FF 200D 2640 FE0F", "char": "🙎🏿‍♀️", "name": "woman pouting: dark skin tone" }, { "no": 672, "code": "1F645", "char": "🙅", "name": "person gesturing NO" }, { "no": 673, "code": "1F645 1F3FB", "char": "🙅🏻", "name": "person gesturing NO: light skin tone" }, { "no": 674, "code": "1F645 1F3FC", "char": "🙅🏼", "name": "person gesturing NO: medium-light skin tone" }, { "no": 675, "code": "1F645 1F3FD", "char": "🙅🏽", "name": "person gesturing NO: medium skin tone" }, { "no": 676, "code": "1F645 1F3FE", "char": "🙅🏾", "name": "person gesturing NO: medium-dark skin tone" }, { "no": 677, "code": "1F645 1F3FF", "char": "🙅🏿", "name": "person gesturing NO: dark skin tone" }, { "no": 678, "code": "1F645 200D 2642 FE0F", "char": "🙅‍♂️", "name": "man gesturing NO" }, { "no": 679, "code": "1F645 1F3FB 200D 2642 FE0F", "char": "🙅🏻‍♂️", "name": "man gesturing NO: light skin tone" }, { "no": 680, "code": "1F645 1F3FC 200D 2642 FE0F", "char": "🙅🏼‍♂️", "name": "man gesturing NO: medium-light skin tone" }, { "no": 681, "code": "1F645 1F3FD 200D 2642 FE0F", "char": "🙅🏽‍♂️", "name": "man gesturing NO: medium skin tone" }, { "no": 682, "code": "1F645 1F3FE 200D 2642 FE0F", "char": "🙅🏾‍♂️", "name": "man gesturing NO: medium-dark skin tone" }, { "no": 683, "code": "1F645 1F3FF 200D 2642 FE0F", "char": "🙅🏿‍♂️", "name": "man gesturing NO: dark skin tone" }, { "no": 684, "code": "1F645 200D 2640 FE0F", "char": "🙅‍♀️", "name": "woman gesturing NO" }, { "no": 685, "code": "1F645 1F3FB 200D 2640 FE0F", "char": "🙅🏻‍♀️", "name": "woman gesturing NO: light skin tone" }, { "no": 686, "code": "1F645 1F3FC 200D 2640 FE0F", "char": "🙅🏼‍♀️", "name": "woman gesturing NO: medium-light skin tone" }, { "no": 687, "code": "1F645 1F3FD 200D 2640 FE0F", "char": "🙅🏽‍♀️", "name": "woman gesturing NO: medium skin tone" }, { "no": 688, "code": "1F645 1F3FE 200D 2640 FE0F", "char": "🙅🏾‍♀️", "name": "woman gesturing NO: medium-dark skin tone" }, { "no": 689, "code": "1F645 1F3FF 200D 2640 FE0F", "char": "🙅🏿‍♀️", "name": "woman gesturing NO: dark skin tone" }, { "no": 690, "code": "1F646", "char": "🙆", "name": "person gesturing OK" }, { "no": 691, "code": "1F646 1F3FB", "char": "🙆🏻", "name": "person gesturing OK: light skin tone" }, { "no": 692, "code": "1F646 1F3FC", "char": "🙆🏼", "name": "person gesturing OK: medium-light skin tone" }, { "no": 693, "code": "1F646 1F3FD", "char": "🙆🏽", "name": "person gesturing OK: medium skin tone" }, { "no": 694, "code": "1F646 1F3FE", "char": "🙆🏾", "name": "person gesturing OK: medium-dark skin tone" }, { "no": 695, "code": "1F646 1F3FF", "char": "🙆🏿", "name": "person gesturing OK: dark skin tone" }, { "no": 696, "code": "1F646 200D 2642 FE0F", "char": "🙆‍♂️", "name": "man gesturing OK" }, { "no": 697, "code": "1F646 1F3FB 200D 2642 FE0F", "char": "🙆🏻‍♂️", "name": "man gesturing OK: light skin tone" }, { "no": 698, "code": "1F646 1F3FC 200D 2642 FE0F", "char": "🙆🏼‍♂️", "name": "man gesturing OK: medium-light skin tone" }, { "no": 699, "code": "1F646 1F3FD 200D 2642 FE0F", "char": "🙆🏽‍♂️", "name": "man gesturing OK: medium skin tone" }, { "no": 700, "code": "1F646 1F3FE 200D 2642 FE0F", "char": "🙆🏾‍♂️", "name": "man gesturing OK: medium-dark skin tone" }, { "no": 701, "code": "1F646 1F3FF 200D 2642 FE0F", "char": "🙆🏿‍♂️", "name": "man gesturing OK: dark skin tone" }, { "no": 702, "code": "1F646 200D 2640 FE0F", "char": "🙆‍♀️", "name": "woman gesturing OK" }, { "no": 703, "code": "1F646 1F3FB 200D 2640 FE0F", "char": "🙆🏻‍♀️", "name": "woman gesturing OK: light skin tone" }, { "no": 704, "code": "1F646 1F3FC 200D 2640 FE0F", "char": "🙆🏼‍♀️", "name": "woman gesturing OK: medium-light skin tone" }, { "no": 705, "code": "1F646 1F3FD 200D 2640 FE0F", "char": "🙆🏽‍♀️", "name": "woman gesturing OK: medium skin tone" }, { "no": 706, "code": "1F646 1F3FE 200D 2640 FE0F", "char": "🙆🏾‍♀️", "name": "woman gesturing OK: medium-dark skin tone" }, { "no": 707, "code": "1F646 1F3FF 200D 2640 FE0F", "char": "🙆🏿‍♀️", "name": "woman gesturing OK: dark skin tone" }, { "no": 708, "code": "1F481", "char": "💁", "name": "person tipping hand" }, { "no": 709, "code": "1F481 1F3FB", "char": "💁🏻", "name": "person tipping hand: light skin tone" }, { "no": 710, "code": "1F481 1F3FC", "char": "💁🏼", "name": "person tipping hand: medium-light skin tone" }, { "no": 711, "code": "1F481 1F3FD", "char": "💁🏽", "name": "person tipping hand: medium skin tone" }, { "no": 712, "code": "1F481 1F3FE", "char": "💁🏾", "name": "person tipping hand: medium-dark skin tone" }, { "no": 713, "code": "1F481 1F3FF", "char": "💁🏿", "name": "person tipping hand: dark skin tone" }, { "no": 714, "code": "1F481 200D 2642 FE0F", "char": "💁‍♂️", "name": "man tipping hand" }, { "no": 715, "code": "1F481 1F3FB 200D 2642 FE0F", "char": "💁🏻‍♂️", "name": "man tipping hand: light skin tone" }, { "no": 716, "code": "1F481 1F3FC 200D 2642 FE0F", "char": "💁🏼‍♂️", "name": "man tipping hand: medium-light skin tone" }, { "no": 717, "code": "1F481 1F3FD 200D 2642 FE0F", "char": "💁🏽‍♂️", "name": "man tipping hand: medium skin tone" }, { "no": 718, "code": "1F481 1F3FE 200D 2642 FE0F", "char": "💁🏾‍♂️", "name": "man tipping hand: medium-dark skin tone" }, { "no": 719, "code": "1F481 1F3FF 200D 2642 FE0F", "char": "💁🏿‍♂️", "name": "man tipping hand: dark skin tone" }, { "no": 720, "code": "1F481 200D 2640 FE0F", "char": "💁‍♀️", "name": "woman tipping hand" }, { "no": 721, "code": "1F481 1F3FB 200D 2640 FE0F", "char": "💁🏻‍♀️", "name": "woman tipping hand: light skin tone" }, { "no": 722, "code": "1F481 1F3FC 200D 2640 FE0F", "char": "💁🏼‍♀️", "name": "woman tipping hand: medium-light skin tone" }, { "no": 723, "code": "1F481 1F3FD 200D 2640 FE0F", "char": "💁🏽‍♀️", "name": "woman tipping hand: medium skin tone" }, { "no": 724, "code": "1F481 1F3FE 200D 2640 FE0F", "char": "💁🏾‍♀️", "name": "woman tipping hand: medium-dark skin tone" }, { "no": 725, "code": "1F481 1F3FF 200D 2640 FE0F", "char": "💁🏿‍♀️", "name": "woman tipping hand: dark skin tone" }, { "no": 726, "code": "1F64B", "char": "🙋", "name": "person raising hand" }, { "no": 727, "code": "1F64B 1F3FB", "char": "🙋🏻", "name": "person raising hand: light skin tone" }, { "no": 728, "code": "1F64B 1F3FC", "char": "🙋🏼", "name": "person raising hand: medium-light skin tone" }, { "no": 729, "code": "1F64B 1F3FD", "char": "🙋🏽", "name": "person raising hand: medium skin tone" }, { "no": 730, "code": "1F64B 1F3FE", "char": "🙋🏾", "name": "person raising hand: medium-dark skin tone" }, { "no": 731, "code": "1F64B 1F3FF", "char": "🙋🏿", "name": "person raising hand: dark skin tone" }, { "no": 732, "code": "1F64B 200D 2642 FE0F", "char": "🙋‍♂️", "name": "man raising hand" }, { "no": 733, "code": "1F64B 1F3FB 200D 2642 FE0F", "char": "🙋🏻‍♂️", "name": "man raising hand: light skin tone" }, { "no": 734, "code": "1F64B 1F3FC 200D 2642 FE0F", "char": "🙋🏼‍♂️", "name": "man raising hand: medium-light skin tone" }, { "no": 735, "code": "1F64B 1F3FD 200D 2642 FE0F", "char": "🙋🏽‍♂️", "name": "man raising hand: medium skin tone" }, { "no": 736, "code": "1F64B 1F3FE 200D 2642 FE0F", "char": "🙋🏾‍♂️", "name": "man raising hand: medium-dark skin tone" }, { "no": 737, "code": "1F64B 1F3FF 200D 2642 FE0F", "char": "🙋🏿‍♂️", "name": "man raising hand: dark skin tone" }, { "no": 738, "code": "1F64B 200D 2640 FE0F", "char": "🙋‍♀️", "name": "woman raising hand" }, { "no": 739, "code": "1F64B 1F3FB 200D 2640 FE0F", "char": "🙋🏻‍♀️", "name": "woman raising hand: light skin tone" }, { "no": 740, "code": "1F64B 1F3FC 200D 2640 FE0F", "char": "🙋🏼‍♀️", "name": "woman raising hand: medium-light skin tone" }, { "no": 741, "code": "1F64B 1F3FD 200D 2640 FE0F", "char": "🙋🏽‍♀️", "name": "woman raising hand: medium skin tone" }, { "no": 742, "code": "1F64B 1F3FE 200D 2640 FE0F", "char": "🙋🏾‍♀️", "name": "woman raising hand: medium-dark skin tone" }, { "no": 743, "code": "1F64B 1F3FF 200D 2640 FE0F", "char": "🙋🏿‍♀️", "name": "woman raising hand: dark skin tone" }, { "no": 744, "code": "1F647", "char": "🙇", "name": "person bowing" }, { "no": 745, "code": "1F647 1F3FB", "char": "🙇🏻", "name": "person bowing: light skin tone" }, { "no": 746, "code": "1F647 1F3FC", "char": "🙇🏼", "name": "person bowing: medium-light skin tone" }, { "no": 747, "code": "1F647 1F3FD", "char": "🙇🏽", "name": "person bowing: medium skin tone" }, { "no": 748, "code": "1F647 1F3FE", "char": "🙇🏾", "name": "person bowing: medium-dark skin tone" }, { "no": 749, "code": "1F647 1F3FF", "char": "🙇🏿", "name": "person bowing: dark skin tone" }, { "no": 750, "code": "1F647 200D 2642 FE0F", "char": "🙇‍♂️", "name": "man bowing" }, { "no": 751, "code": "1F647 1F3FB 200D 2642 FE0F", "char": "🙇🏻‍♂️", "name": "man bowing: light skin tone" }, { "no": 752, "code": "1F647 1F3FC 200D 2642 FE0F", "char": "🙇🏼‍♂️", "name": "man bowing: medium-light skin tone" }, { "no": 753, "code": "1F647 1F3FD 200D 2642 FE0F", "char": "🙇🏽‍♂️", "name": "man bowing: medium skin tone" }, { "no": 754, "code": "1F647 1F3FE 200D 2642 FE0F", "char": "🙇🏾‍♂️", "name": "man bowing: medium-dark skin tone" }, { "no": 755, "code": "1F647 1F3FF 200D 2642 FE0F", "char": "🙇🏿‍♂️", "name": "man bowing: dark skin tone" }, { "no": 756, "code": "1F647 200D 2640 FE0F", "char": "🙇‍♀️", "name": "woman bowing" }, { "no": 757, "code": "1F647 1F3FB 200D 2640 FE0F", "char": "🙇🏻‍♀️", "name": "woman bowing: light skin tone" }, { "no": 758, "code": "1F647 1F3FC 200D 2640 FE0F", "char": "🙇🏼‍♀️", "name": "woman bowing: medium-light skin tone" }, { "no": 759, "code": "1F647 1F3FD 200D 2640 FE0F", "char": "🙇🏽‍♀️", "name": "woman bowing: medium skin tone" }, { "no": 760, "code": "1F647 1F3FE 200D 2640 FE0F", "char": "🙇🏾‍♀️", "name": "woman bowing: medium-dark skin tone" }, { "no": 761, "code": "1F647 1F3FF 200D 2640 FE0F", "char": "🙇🏿‍♀️", "name": "woman bowing: dark skin tone" }, { "no": 762, "code": "1F926", "char": "🤦", "name": "person facepalming" }, { "no": 763, "code": "1F926 1F3FB", "char": "🤦🏻", "name": "person facepalming: light skin tone" }, { "no": 764, "code": "1F926 1F3FC", "char": "🤦🏼", "name": "person facepalming: medium-light skin tone" }, { "no": 765, "code": "1F926 1F3FD", "char": "🤦🏽", "name": "person facepalming: medium skin tone" }, { "no": 766, "code": "1F926 1F3FE", "char": "🤦🏾", "name": "person facepalming: medium-dark skin tone" }, { "no": 767, "code": "1F926 1F3FF", "char": "🤦🏿", "name": "person facepalming: dark skin tone" }, { "no": 768, "code": "1F926 200D 2642 FE0F", "char": "🤦‍♂️", "name": "man facepalming" }, { "no": 769, "code": "1F926 1F3FB 200D 2642 FE0F", "char": "🤦🏻‍♂️", "name": "man facepalming: light skin tone" }, { "no": 770, "code": "1F926 1F3FC 200D 2642 FE0F", "char": "🤦🏼‍♂️", "name": "man facepalming: medium-light skin tone" }, { "no": 771, "code": "1F926 1F3FD 200D 2642 FE0F", "char": "🤦🏽‍♂️", "name": "man facepalming: medium skin tone" }, { "no": 772, "code": "1F926 1F3FE 200D 2642 FE0F", "char": "🤦🏾‍♂️", "name": "man facepalming: medium-dark skin tone" }, { "no": 773, "code": "1F926 1F3FF 200D 2642 FE0F", "char": "🤦🏿‍♂️", "name": "man facepalming: dark skin tone" }, { "no": 774, "code": "1F926 200D 2640 FE0F", "char": "🤦‍♀️", "name": "woman facepalming" }, { "no": 775, "code": "1F926 1F3FB 200D 2640 FE0F", "char": "🤦🏻‍♀️", "name": "woman facepalming: light skin tone" }, { "no": 776, "code": "1F926 1F3FC 200D 2640 FE0F", "char": "🤦🏼‍♀️", "name": "woman facepalming: medium-light skin tone" }, { "no": 777, "code": "1F926 1F3FD 200D 2640 FE0F", "char": "🤦🏽‍♀️", "name": "woman facepalming: medium skin tone" }, { "no": 778, "code": "1F926 1F3FE 200D 2640 FE0F", "char": "🤦🏾‍♀️", "name": "woman facepalming: medium-dark skin tone" }, { "no": 779, "code": "1F926 1F3FF 200D 2640 FE0F", "char": "🤦🏿‍♀️", "name": "woman facepalming: dark skin tone" }, { "no": 780, "code": "1F937", "char": "🤷", "name": "person shrugging" }, { "no": 781, "code": "1F937 1F3FB", "char": "🤷🏻", "name": "person shrugging: light skin tone" }, { "no": 782, "code": "1F937 1F3FC", "char": "🤷🏼", "name": "person shrugging: medium-light skin tone" }, { "no": 783, "code": "1F937 1F3FD", "char": "🤷🏽", "name": "person shrugging: medium skin tone" }, { "no": 784, "code": "1F937 1F3FE", "char": "🤷🏾", "name": "person shrugging: medium-dark skin tone" }, { "no": 785, "code": "1F937 1F3FF", "char": "🤷🏿", "name": "person shrugging: dark skin tone" }, { "no": 786, "code": "1F937 200D 2642 FE0F", "char": "🤷‍♂️", "name": "man shrugging" }, { "no": 787, "code": "1F937 1F3FB 200D 2642 FE0F", "char": "🤷🏻‍♂️", "name": "man shrugging: light skin tone" }, { "no": 788, "code": "1F937 1F3FC 200D 2642 FE0F", "char": "🤷🏼‍♂️", "name": "man shrugging: medium-light skin tone" }, { "no": 789, "code": "1F937 1F3FD 200D 2642 FE0F", "char": "🤷🏽‍♂️", "name": "man shrugging: medium skin tone" }, { "no": 790, "code": "1F937 1F3FE 200D 2642 FE0F", "char": "🤷🏾‍♂️", "name": "man shrugging: medium-dark skin tone" }, { "no": 791, "code": "1F937 1F3FF 200D 2642 FE0F", "char": "🤷🏿‍♂️", "name": "man shrugging: dark skin tone" }, { "no": 792, "code": "1F937 200D 2640 FE0F", "char": "🤷‍♀️", "name": "woman shrugging" }, { "no": 793, "code": "1F937 1F3FB 200D 2640 FE0F", "char": "🤷🏻‍♀️", "name": "woman shrugging: light skin tone" }, { "no": 794, "code": "1F937 1F3FC 200D 2640 FE0F", "char": "🤷🏼‍♀️", "name": "woman shrugging: medium-light skin tone" }, { "no": 795, "code": "1F937 1F3FD 200D 2640 FE0F", "char": "🤷🏽‍♀️", "name": "woman shrugging: medium skin tone" }, { "no": 796, "code": "1F937 1F3FE 200D 2640 FE0F", "char": "🤷🏾‍♀️", "name": "woman shrugging: medium-dark skin tone" }, { "no": 797, "code": "1F937 1F3FF 200D 2640 FE0F", "char": "🤷🏿‍♀️", "name": "woman shrugging: dark skin tone" }, { "no": 798, "code": "1F486", "char": "💆", "name": "person getting massage" }, { "no": 799, "code": "1F486 1F3FB", "char": "💆🏻", "name": "person getting massage: light skin tone" }, { "no": 800, "code": "1F486 1F3FC", "char": "💆🏼", "name": "person getting massage: medium-light skin tone" }, { "no": 801, "code": "1F486 1F3FD", "char": "💆🏽", "name": "person getting massage: medium skin tone" }, { "no": 802, "code": "1F486 1F3FE", "char": "💆🏾", "name": "person getting massage: medium-dark skin tone" }, { "no": 803, "code": "1F486 1F3FF", "char": "💆🏿", "name": "person getting massage: dark skin tone" }, { "no": 804, "code": "1F486 200D 2642 FE0F", "char": "💆‍♂️", "name": "man getting massage" }, { "no": 805, "code": "1F486 1F3FB 200D 2642 FE0F", "char": "💆🏻‍♂️", "name": "man getting massage: light skin tone" }, { "no": 806, "code": "1F486 1F3FC 200D 2642 FE0F", "char": "💆🏼‍♂️", "name": "man getting massage: medium-light skin tone" }, { "no": 807, "code": "1F486 1F3FD 200D 2642 FE0F", "char": "💆🏽‍♂️", "name": "man getting massage: medium skin tone" }, { "no": 808, "code": "1F486 1F3FE 200D 2642 FE0F", "char": "💆🏾‍♂️", "name": "man getting massage: medium-dark skin tone" }, { "no": 809, "code": "1F486 1F3FF 200D 2642 FE0F", "char": "💆🏿‍♂️", "name": "man getting massage: dark skin tone" }, { "no": 810, "code": "1F486 200D 2640 FE0F", "char": "💆‍♀️", "name": "woman getting massage" }, { "no": 811, "code": "1F486 1F3FB 200D 2640 FE0F", "char": "💆🏻‍♀️", "name": "woman getting massage: light skin tone" }, { "no": 812, "code": "1F486 1F3FC 200D 2640 FE0F", "char": "💆🏼‍♀️", "name": "woman getting massage: medium-light skin tone" }, { "no": 813, "code": "1F486 1F3FD 200D 2640 FE0F", "char": "💆🏽‍♀️", "name": "woman getting massage: medium skin tone" }, { "no": 814, "code": "1F486 1F3FE 200D 2640 FE0F", "char": "💆🏾‍♀️", "name": "woman getting massage: medium-dark skin tone" }, { "no": 815, "code": "1F486 1F3FF 200D 2640 FE0F", "char": "💆🏿‍♀️", "name": "woman getting massage: dark skin tone" }, { "no": 816, "code": "1F487", "char": "💇", "name": "person getting haircut" }, { "no": 817, "code": "1F487 1F3FB", "char": "💇🏻", "name": "person getting haircut: light skin tone" }, { "no": 818, "code": "1F487 1F3FC", "char": "💇🏼", "name": "person getting haircut: medium-light skin tone" }, { "no": 819, "code": "1F487 1F3FD", "char": "💇🏽", "name": "person getting haircut: medium skin tone" }, { "no": 820, "code": "1F487 1F3FE", "char": "💇🏾", "name": "person getting haircut: medium-dark skin tone" }, { "no": 821, "code": "1F487 1F3FF", "char": "💇🏿", "name": "person getting haircut: dark skin tone" }, { "no": 822, "code": "1F487 200D 2642 FE0F", "char": "💇‍♂️", "name": "man getting haircut" }, { "no": 823, "code": "1F487 1F3FB 200D 2642 FE0F", "char": "💇🏻‍♂️", "name": "man getting haircut: light skin tone" }, { "no": 824, "code": "1F487 1F3FC 200D 2642 FE0F", "char": "💇🏼‍♂️", "name": "man getting haircut: medium-light skin tone" }, { "no": 825, "code": "1F487 1F3FD 200D 2642 FE0F", "char": "💇🏽‍♂️", "name": "man getting haircut: medium skin tone" }, { "no": 826, "code": "1F487 1F3FE 200D 2642 FE0F", "char": "💇🏾‍♂️", "name": "man getting haircut: medium-dark skin tone" }, { "no": 827, "code": "1F487 1F3FF 200D 2642 FE0F", "char": "💇🏿‍♂️", "name": "man getting haircut: dark skin tone" }, { "no": 828, "code": "1F487 200D 2640 FE0F", "char": "💇‍♀️", "name": "woman getting haircut" }, { "no": 829, "code": "1F487 1F3FB 200D 2640 FE0F", "char": "💇🏻‍♀️", "name": "woman getting haircut: light skin tone" }, { "no": 830, "code": "1F487 1F3FC 200D 2640 FE0F", "char": "💇🏼‍♀️", "name": "woman getting haircut: medium-light skin tone" }, { "no": 831, "code": "1F487 1F3FD 200D 2640 FE0F", "char": "💇🏽‍♀️", "name": "woman getting haircut: medium skin tone" }, { "no": 832, "code": "1F487 1F3FE 200D 2640 FE0F", "char": "💇🏾‍♀️", "name": "woman getting haircut: medium-dark skin tone" }, { "no": 833, "code": "1F487 1F3FF 200D 2640 FE0F", "char": "💇🏿‍♀️", "name": "woman getting haircut: dark skin tone" }, { "no": 834, "code": "1F6B6", "char": "🚶", "name": "person walking" }, { "no": 835, "code": "1F6B6 1F3FB", "char": "🚶🏻", "name": "person walking: light skin tone" }, { "no": 836, "code": "1F6B6 1F3FC", "char": "🚶🏼", "name": "person walking: medium-light skin tone" }, { "no": 837, "code": "1F6B6 1F3FD", "char": "🚶🏽", "name": "person walking: medium skin tone" }, { "no": 838, "code": "1F6B6 1F3FE", "char": "🚶🏾", "name": "person walking: medium-dark skin tone" }, { "no": 839, "code": "1F6B6 1F3FF", "char": "🚶🏿", "name": "person walking: dark skin tone" }, { "no": 840, "code": "1F6B6 200D 2642 FE0F", "char": "🚶‍♂️", "name": "man walking" }, { "no": 841, "code": "1F6B6 1F3FB 200D 2642 FE0F", "char": "🚶🏻‍♂️", "name": "man walking: light skin tone" }, { "no": 842, "code": "1F6B6 1F3FC 200D 2642 FE0F", "char": "🚶🏼‍♂️", "name": "man walking: medium-light skin tone" }, { "no": 843, "code": "1F6B6 1F3FD 200D 2642 FE0F", "char": "🚶🏽‍♂️", "name": "man walking: medium skin tone" }, { "no": 844, "code": "1F6B6 1F3FE 200D 2642 FE0F", "char": "🚶🏾‍♂️", "name": "man walking: medium-dark skin tone" }, { "no": 845, "code": "1F6B6 1F3FF 200D 2642 FE0F", "char": "🚶🏿‍♂️", "name": "man walking: dark skin tone" }, { "no": 846, "code": "1F6B6 200D 2640 FE0F", "char": "🚶‍♀️", "name": "woman walking" }, { "no": 847, "code": "1F6B6 1F3FB 200D 2640 FE0F", "char": "🚶🏻‍♀️", "name": "woman walking: light skin tone" }, { "no": 848, "code": "1F6B6 1F3FC 200D 2640 FE0F", "char": "🚶🏼‍♀️", "name": "woman walking: medium-light skin tone" }, { "no": 849, "code": "1F6B6 1F3FD 200D 2640 FE0F", "char": "🚶🏽‍♀️", "name": "woman walking: medium skin tone" }, { "no": 850, "code": "1F6B6 1F3FE 200D 2640 FE0F", "char": "🚶🏾‍♀️", "name": "woman walking: medium-dark skin tone" }, { "no": 851, "code": "1F6B6 1F3FF 200D 2640 FE0F", "char": "🚶🏿‍♀️", "name": "woman walking: dark skin tone" }, { "no": 852, "code": "1F3C3", "char": "🏃", "name": "person running" }, { "no": 853, "code": "1F3C3 1F3FB", "char": "🏃🏻", "name": "person running: light skin tone" }, { "no": 854, "code": "1F3C3 1F3FC", "char": "🏃🏼", "name": "person running: medium-light skin tone" }, { "no": 855, "code": "1F3C3 1F3FD", "char": "🏃🏽", "name": "person running: medium skin tone" }, { "no": 856, "code": "1F3C3 1F3FE", "char": "🏃🏾", "name": "person running: medium-dark skin tone" }, { "no": 857, "code": "1F3C3 1F3FF", "char": "🏃🏿", "name": "person running: dark skin tone" }, { "no": 858, "code": "1F3C3 200D 2642 FE0F", "char": "🏃‍♂️", "name": "man running" }, { "no": 859, "code": "1F3C3 1F3FB 200D 2642 FE0F", "char": "🏃🏻‍♂️", "name": "man running: light skin tone" }, { "no": 860, "code": "1F3C3 1F3FC 200D 2642 FE0F", "char": "🏃🏼‍♂️", "name": "man running: medium-light skin tone" }, { "no": 861, "code": "1F3C3 1F3FD 200D 2642 FE0F", "char": "🏃🏽‍♂️", "name": "man running: medium skin tone" }, { "no": 862, "code": "1F3C3 1F3FE 200D 2642 FE0F", "char": "🏃🏾‍♂️", "name": "man running: medium-dark skin tone" }, { "no": 863, "code": "1F3C3 1F3FF 200D 2642 FE0F", "char": "🏃🏿‍♂️", "name": "man running: dark skin tone" }, { "no": 864, "code": "1F3C3 200D 2640 FE0F", "char": "🏃‍♀️", "name": "woman running" }, { "no": 865, "code": "1F3C3 1F3FB 200D 2640 FE0F", "char": "🏃🏻‍♀️", "name": "woman running: light skin tone" }, { "no": 866, "code": "1F3C3 1F3FC 200D 2640 FE0F", "char": "🏃🏼‍♀️", "name": "woman running: medium-light skin tone" }, { "no": 867, "code": "1F3C3 1F3FD 200D 2640 FE0F", "char": "🏃🏽‍♀️", "name": "woman running: medium skin tone" }, { "no": 868, "code": "1F3C3 1F3FE 200D 2640 FE0F", "char": "🏃🏾‍♀️", "name": "woman running: medium-dark skin tone" }, { "no": 869, "code": "1F3C3 1F3FF 200D 2640 FE0F", "char": "🏃🏿‍♀️", "name": "woman running: dark skin tone" }, { "no": 870, "code": "1F483", "char": "💃", "name": "woman dancing" }, { "no": 871, "code": "1F483 1F3FB", "char": "💃🏻", "name": "woman dancing: light skin tone" }, { "no": 872, "code": "1F483 1F3FC", "char": "💃🏼", "name": "woman dancing: medium-light skin tone" }, { "no": 873, "code": "1F483 1F3FD", "char": "💃🏽", "name": "woman dancing: medium skin tone" }, { "no": 874, "code": "1F483 1F3FE", "char": "💃🏾", "name": "woman dancing: medium-dark skin tone" }, { "no": 875, "code": "1F483 1F3FF", "char": "💃🏿", "name": "woman dancing: dark skin tone" }, { "no": 876, "code": "1F57A", "char": "🕺", "name": "man dancing" }, { "no": 877, "code": "1F57A 1F3FB", "char": "🕺🏻", "name": "man dancing: light skin tone" }, { "no": 878, "code": "1F57A 1F3FC", "char": "🕺🏼", "name": "man dancing: medium-light skin tone" }, { "no": 879, "code": "1F57A 1F3FD", "char": "🕺🏽", "name": "man dancing: medium skin tone" }, { "no": 880, "code": "1F57A 1F3FE", "char": "🕺🏾", "name": "man dancing: medium-dark skin tone" }, { "no": 881, "code": "1F57A 1F3FF", "char": "🕺🏿", "name": "man dancing: dark skin tone" }, { "no": 882, "code": "1F46F", "char": "👯", "name": "people with bunny ears" }, { "no": 883, "code": "1F46F 200D 2642 FE0F", "char": "👯‍♂️", "name": "men with bunny ears" }, { "no": 884, "code": "1F46F 200D 2640 FE0F", "char": "👯‍♀️", "name": "women with bunny ears" }, { "no": 885, "code": "1F9D6", "char": "🧖", "name": "⊛ person in steamy room" }, { "no": 886, "code": "1F9D6 1F3FB", "char": "🧖🏻", "name": "⊛ person in steamy room: light skin tone" }, { "no": 887, "code": "1F9D6 1F3FC", "char": "🧖🏼", "name": "⊛ person in steamy room: medium-light skin tone" }, { "no": 888, "code": "1F9D6 1F3FD", "char": "🧖🏽", "name": "⊛ person in steamy room: medium skin tone" }, { "no": 889, "code": "1F9D6 1F3FE", "char": "🧖🏾", "name": "⊛ person in steamy room: medium-dark skin tone" }, { "no": 890, "code": "1F9D6 1F3FF", "char": "🧖🏿", "name": "⊛ person in steamy room: dark skin tone" }, { "no": 891, "code": "1F9D6 200D 2640 FE0F", "char": "🧖‍♀️", "name": "⊛ woman in steamy room" }, { "no": 892, "code": "1F9D6 1F3FB 200D 2640 FE0F", "char": "🧖🏻‍♀️", "name": "⊛ woman in steamy room: light skin tone" }, { "no": 893, "code": "1F9D6 1F3FC 200D 2640 FE0F", "char": "🧖🏼‍♀️", "name": "⊛ woman in steamy room: medium-light skin tone" }, { "no": 894, "code": "1F9D6 1F3FD 200D 2640 FE0F", "char": "🧖🏽‍♀️", "name": "⊛ woman in steamy room: medium skin tone" }, { "no": 895, "code": "1F9D6 1F3FE 200D 2640 FE0F", "char": "🧖🏾‍♀️", "name": "⊛ woman in steamy room: medium-dark skin tone" }, { "no": 896, "code": "1F9D6 1F3FF 200D 2640 FE0F", "char": "🧖🏿‍♀️", "name": "⊛ woman in steamy room: dark skin tone" }, { "no": 897, "code": "1F9D6 200D 2642 FE0F", "char": "🧖‍♂️", "name": "⊛ man in steamy room" }, { "no": 898, "code": "1F9D6 1F3FB 200D 2642 FE0F", "char": "🧖🏻‍♂️", "name": "⊛ man in steamy room: light skin tone" }, { "no": 899, "code": "1F9D6 1F3FC 200D 2642 FE0F", "char": "🧖🏼‍♂️", "name": "⊛ man in steamy room: medium-light skin tone" }, { "no": 900, "code": "1F9D6 1F3FD 200D 2642 FE0F", "char": "🧖🏽‍♂️", "name": "⊛ man in steamy room: medium skin tone" }, { "no": 901, "code": "1F9D6 1F3FE 200D 2642 FE0F", "char": "🧖🏾‍♂️", "name": "⊛ man in steamy room: medium-dark skin tone" }, { "no": 902, "code": "1F9D6 1F3FF 200D 2642 FE0F", "char": "🧖🏿‍♂️", "name": "⊛ man in steamy room: dark skin tone" }, { "no": 903, "code": "1F9D7", "char": "🧗", "name": "⊛ person climbing" }, { "no": 904, "code": "1F9D7 1F3FB", "char": "🧗🏻", "name": "⊛ person climbing: light skin tone" }, { "no": 905, "code": "1F9D7 1F3FC", "char": "🧗🏼", "name": "⊛ person climbing: medium-light skin tone" }, { "no": 906, "code": "1F9D7 1F3FD", "char": "🧗🏽", "name": "⊛ person climbing: medium skin tone" }, { "no": 907, "code": "1F9D7 1F3FE", "char": "🧗🏾", "name": "⊛ person climbing: medium-dark skin tone" }, { "no": 908, "code": "1F9D7 1F3FF", "char": "🧗🏿", "name": "⊛ person climbing: dark skin tone" }, { "no": 909, "code": "1F9D7 200D 2640 FE0F", "char": "🧗‍♀️", "name": "⊛ woman climbing" }, { "no": 910, "code": "1F9D7 1F3FB 200D 2640 FE0F", "char": "🧗🏻‍♀️", "name": "⊛ woman climbing: light skin tone" }, { "no": 911, "code": "1F9D7 1F3FC 200D 2640 FE0F", "char": "🧗🏼‍♀️", "name": "⊛ woman climbing: medium-light skin tone" }, { "no": 912, "code": "1F9D7 1F3FD 200D 2640 FE0F", "char": "🧗🏽‍♀️", "name": "⊛ woman climbing: medium skin tone" }, { "no": 913, "code": "1F9D7 1F3FE 200D 2640 FE0F", "char": "🧗🏾‍♀️", "name": "⊛ woman climbing: medium-dark skin tone" }, { "no": 914, "code": "1F9D7 1F3FF 200D 2640 FE0F", "char": "🧗🏿‍♀️", "name": "⊛ woman climbing: dark skin tone" }, { "no": 915, "code": "1F9D7 200D 2642 FE0F", "char": "🧗‍♂️", "name": "⊛ man climbing" }, { "no": 916, "code": "1F9D7 1F3FB 200D 2642 FE0F", "char": "🧗🏻‍♂️", "name": "⊛ man climbing: light skin tone" }, { "no": 917, "code": "1F9D7 1F3FC 200D 2642 FE0F", "char": "🧗🏼‍♂️", "name": "⊛ man climbing: medium-light skin tone" }, { "no": 918, "code": "1F9D7 1F3FD 200D 2642 FE0F", "char": "🧗🏽‍♂️", "name": "⊛ man climbing: medium skin tone" }, { "no": 919, "code": "1F9D7 1F3FE 200D 2642 FE0F", "char": "🧗🏾‍♂️", "name": "⊛ man climbing: medium-dark skin tone" }, { "no": 920, "code": "1F9D7 1F3FF 200D 2642 FE0F", "char": "🧗🏿‍♂️", "name": "⊛ man climbing: dark skin tone" }, { "no": 921, "code": "1F9D8", "char": "🧘", "name": "⊛ person in lotus position" }, { "no": 922, "code": "1F9D8 1F3FB", "char": "🧘🏻", "name": "⊛ person in lotus position: light skin tone" }, { "no": 923, "code": "1F9D8 1F3FC", "char": "🧘🏼", "name": "⊛ person in lotus position: medium-light skin tone" }, { "no": 924, "code": "1F9D8 1F3FD", "char": "🧘🏽", "name": "⊛ person in lotus position: medium skin tone" }, { "no": 925, "code": "1F9D8 1F3FE", "char": "🧘🏾", "name": "⊛ person in lotus position: medium-dark skin tone" }, { "no": 926, "code": "1F9D8 1F3FF", "char": "🧘🏿", "name": "⊛ person in lotus position: dark skin tone" }, { "no": 927, "code": "1F9D8 200D 2640 FE0F", "char": "🧘‍♀️", "name": "⊛ woman in lotus position" }, { "no": 928, "code": "1F9D8 1F3FB 200D 2640 FE0F", "char": "🧘🏻‍♀️", "name": "⊛ woman in lotus position: light skin tone" }, { "no": 929, "code": "1F9D8 1F3FC 200D 2640 FE0F", "char": "🧘🏼‍♀️", "name": "⊛ woman in lotus position: medium-light skin tone" }, { "no": 930, "code": "1F9D8 1F3FD 200D 2640 FE0F", "char": "🧘🏽‍♀️", "name": "⊛ woman in lotus position: medium skin tone" }, { "no": 931, "code": "1F9D8 1F3FE 200D 2640 FE0F", "char": "🧘🏾‍♀️", "name": "⊛ woman in lotus position: medium-dark skin tone" }, { "no": 932, "code": "1F9D8 1F3FF 200D 2640 FE0F", "char": "🧘🏿‍♀️", "name": "⊛ woman in lotus position: dark skin tone" }, { "no": 933, "code": "1F9D8 200D 2642 FE0F", "char": "🧘‍♂️", "name": "⊛ man in lotus position" }, { "no": 934, "code": "1F9D8 1F3FB 200D 2642 FE0F", "char": "🧘🏻‍♂️", "name": "⊛ man in lotus position: light skin tone" }, { "no": 935, "code": "1F9D8 1F3FC 200D 2642 FE0F", "char": "🧘🏼‍♂️", "name": "⊛ man in lotus position: medium-light skin tone" }, { "no": 936, "code": "1F9D8 1F3FD 200D 2642 FE0F", "char": "🧘🏽‍♂️", "name": "⊛ man in lotus position: medium skin tone" }, { "no": 937, "code": "1F9D8 1F3FE 200D 2642 FE0F", "char": "🧘🏾‍♂️", "name": "⊛ man in lotus position: medium-dark skin tone" }, { "no": 938, "code": "1F9D8 1F3FF 200D 2642 FE0F", "char": "🧘🏿‍♂️", "name": "⊛ man in lotus position: dark skin tone" }, { "no": 939, "code": "1F6C0", "char": "🛀", "name": "person taking bath" }, { "no": 940, "code": "1F6C0 1F3FB", "char": "🛀🏻", "name": "person taking bath: light skin tone" }, { "no": 941, "code": "1F6C0 1F3FC", "char": "🛀🏼", "name": "person taking bath: medium-light skin tone" }, { "no": 942, "code": "1F6C0 1F3FD", "char": "🛀🏽", "name": "person taking bath: medium skin tone" }, { "no": 943, "code": "1F6C0 1F3FE", "char": "🛀🏾", "name": "person taking bath: medium-dark skin tone" }, { "no": 944, "code": "1F6C0 1F3FF", "char": "🛀🏿", "name": "person taking bath: dark skin tone" }, { "no": 945, "code": "1F6CC", "char": "🛌", "name": "person in bed" }, { "no": 946, "code": "1F6CC 1F3FB", "char": "🛌🏻", "name": "person in bed: light skin tone" }, { "no": 947, "code": "1F6CC 1F3FC", "char": "🛌🏼", "name": "person in bed: medium-light skin tone" }, { "no": 948, "code": "1F6CC 1F3FD", "char": "🛌🏽", "name": "person in bed: medium skin tone" }, { "no": 949, "code": "1F6CC 1F3FE", "char": "🛌🏾", "name": "person in bed: medium-dark skin tone" }, { "no": 950, "code": "1F6CC 1F3FF", "char": "🛌🏿", "name": "person in bed: dark skin tone" }, { "no": 951, "code": "1F574", "char": "🕴", "name": "man in suit levitating" }, { "no": 952, "code": "1F574 1F3FB", "char": "🕴🏻", "name": "man in suit levitating: light skin tone" }, { "no": 953, "code": "1F574 1F3FC", "char": "🕴🏼", "name": "man in suit levitating: medium-light skin tone" }, { "no": 954, "code": "1F574 1F3FD", "char": "🕴🏽", "name": "man in suit levitating: medium skin tone" }, { "no": 955, "code": "1F574 1F3FE", "char": "🕴🏾", "name": "man in suit levitating: medium-dark skin tone" }, { "no": 956, "code": "1F574 1F3FF", "char": "🕴🏿", "name": "man in suit levitating: dark skin tone" }, { "no": 957, "code": "1F5E3", "char": "🗣", "name": "speaking head" }, { "no": 958, "code": "1F464", "char": "👤", "name": "bust in silhouette" }, { "no": 959, "code": "1F465", "char": "👥", "name": "busts in silhouette" }, { "no": 960, "code": "1F93A", "char": "🤺", "name": "person fencing" }, { "no": 961, "code": "1F3C7", "char": "🏇", "name": "horse racing" }, { "no": 962, "code": "1F3C7 1F3FB", "char": "🏇🏻", "name": "horse racing: light skin tone" }, { "no": 963, "code": "1F3C7 1F3FC", "char": "🏇🏼", "name": "horse racing: medium-light skin tone" }, { "no": 964, "code": "1F3C7 1F3FD", "char": "🏇🏽", "name": "horse racing: medium skin tone" }, { "no": 965, "code": "1F3C7 1F3FE", "char": "🏇🏾", "name": "horse racing: medium-dark skin tone" }, { "no": 966, "code": "1F3C7 1F3FF", "char": "🏇🏿", "name": "horse racing: dark skin tone" }, { "no": 967, "code": "26F7", "char": "⛷", "name": "skier" }, { "no": 968, "code": "1F3C2", "char": "🏂", "name": "snowboarder" }, { "no": 969, "code": "1F3C2 1F3FB", "char": "🏂🏻", "name": "snowboarder: light skin tone" }, { "no": 970, "code": "1F3C2 1F3FC", "char": "🏂🏼", "name": "snowboarder: medium-light skin tone" }, { "no": 971, "code": "1F3C2 1F3FD", "char": "🏂🏽", "name": "snowboarder: medium skin tone" }, { "no": 972, "code": "1F3C2 1F3FE", "char": "🏂🏾", "name": "snowboarder: medium-dark skin tone" }, { "no": 973, "code": "1F3C2 1F3FF", "char": "🏂🏿", "name": "snowboarder: dark skin tone" }, { "no": 974, "code": "1F3CC", "char": "🏌", "name": "person golfing" }, { "no": 975, "code": "1F3CC 1F3FB", "char": "🏌🏻", "name": "person golfing: light skin tone" }, { "no": 976, "code": "1F3CC 1F3FC", "char": "🏌🏼", "name": "person golfing: medium-light skin tone" }, { "no": 977, "code": "1F3CC 1F3FD", "char": "🏌🏽", "name": "person golfing: medium skin tone" }, { "no": 978, "code": "1F3CC 1F3FE", "char": "🏌🏾", "name": "person golfing: medium-dark skin tone" }, { "no": 979, "code": "1F3CC 1F3FF", "char": "🏌🏿", "name": "person golfing: dark skin tone" }, { "no": 980, "code": "1F3CC FE0F 200D 2642 FE0F", "char": "🏌️‍♂️", "name": "man golfing" }, { "no": 981, "code": "1F3CC 1F3FB 200D 2642 FE0F", "char": "🏌🏻‍♂️", "name": "man golfing: light skin tone" }, { "no": 982, "code": "1F3CC 1F3FC 200D 2642 FE0F", "char": "🏌🏼‍♂️", "name": "man golfing: medium-light skin tone" }, { "no": 983, "code": "1F3CC 1F3FD 200D 2642 FE0F", "char": "🏌🏽‍♂️", "name": "man golfing: medium skin tone" }, { "no": 984, "code": "1F3CC 1F3FE 200D 2642 FE0F", "char": "🏌🏾‍♂️", "name": "man golfing: medium-dark skin tone" }, { "no": 985, "code": "1F3CC 1F3FF 200D 2642 FE0F", "char": "🏌🏿‍♂️", "name": "man golfing: dark skin tone" }, { "no": 986, "code": "1F3CC FE0F 200D 2640 FE0F", "char": "🏌️‍♀️", "name": "woman golfing" }, { "no": 987, "code": "1F3CC 1F3FB 200D 2640 FE0F", "char": "🏌🏻‍♀️", "name": "woman golfing: light skin tone" }, { "no": 988, "code": "1F3CC 1F3FC 200D 2640 FE0F", "char": "🏌🏼‍♀️", "name": "woman golfing: medium-light skin tone" }, { "no": 989, "code": "1F3CC 1F3FD 200D 2640 FE0F", "char": "🏌🏽‍♀️", "name": "woman golfing: medium skin tone" }, { "no": 990, "code": "1F3CC 1F3FE 200D 2640 FE0F", "char": "🏌🏾‍♀️", "name": "woman golfing: medium-dark skin tone" }, { "no": 991, "code": "1F3CC 1F3FF 200D 2640 FE0F", "char": "🏌🏿‍♀️", "name": "woman golfing: dark skin tone" }, { "no": 992, "code": "1F3C4", "char": "🏄", "name": "person surfing" }, { "no": 993, "code": "1F3C4 1F3FB", "char": "🏄🏻", "name": "person surfing: light skin tone" }, { "no": 994, "code": "1F3C4 1F3FC", "char": "🏄🏼", "name": "person surfing: medium-light skin tone" }, { "no": 995, "code": "1F3C4 1F3FD", "char": "🏄🏽", "name": "person surfing: medium skin tone" }, { "no": 996, "code": "1F3C4 1F3FE", "char": "🏄🏾", "name": "person surfing: medium-dark skin tone" }, { "no": 997, "code": "1F3C4 1F3FF", "char": "🏄🏿", "name": "person surfing: dark skin tone" }, { "no": 998, "code": "1F3C4 200D 2642 FE0F", "char": "🏄‍♂️", "name": "man surfing" }, { "no": 999, "code": "1F3C4 1F3FB 200D 2642 FE0F", "char": "🏄🏻‍♂️", "name": "man surfing: light skin tone" }, { "no": 1000, "code": "1F3C4 1F3FC 200D 2642 FE0F", "char": "🏄🏼‍♂️", "name": "man surfing: medium-light skin tone" }, { "no": 1001, "code": "1F3C4 1F3FD 200D 2642 FE0F", "char": "🏄🏽‍♂️", "name": "man surfing: medium skin tone" }, { "no": 1002, "code": "1F3C4 1F3FE 200D 2642 FE0F", "char": "🏄🏾‍♂️", "name": "man surfing: medium-dark skin tone" }, { "no": 1003, "code": "1F3C4 1F3FF 200D 2642 FE0F", "char": "🏄🏿‍♂️", "name": "man surfing: dark skin tone" }, { "no": 1004, "code": "1F3C4 200D 2640 FE0F", "char": "🏄‍♀️", "name": "woman surfing" }, { "no": 1005, "code": "1F3C4 1F3FB 200D 2640 FE0F", "char": "🏄🏻‍♀️", "name": "woman surfing: light skin tone" }, { "no": 1006, "code": "1F3C4 1F3FC 200D 2640 FE0F", "char": "🏄🏼‍♀️", "name": "woman surfing: medium-light skin tone" }, { "no": 1007, "code": "1F3C4 1F3FD 200D 2640 FE0F", "char": "🏄🏽‍♀️", "name": "woman surfing: medium skin tone" }, { "no": 1008, "code": "1F3C4 1F3FE 200D 2640 FE0F", "char": "🏄🏾‍♀️", "name": "woman surfing: medium-dark skin tone" }, { "no": 1009, "code": "1F3C4 1F3FF 200D 2640 FE0F", "char": "🏄🏿‍♀️", "name": "woman surfing: dark skin tone" }, { "no": 1010, "code": "1F6A3", "char": "🚣", "name": "person rowing boat" }, { "no": 1011, "code": "1F6A3 1F3FB", "char": "🚣🏻", "name": "person rowing boat: light skin tone" }, { "no": 1012, "code": "1F6A3 1F3FC", "char": "🚣🏼", "name": "person rowing boat: medium-light skin tone" }, { "no": 1013, "code": "1F6A3 1F3FD", "char": "🚣🏽", "name": "person rowing boat: medium skin tone" }, { "no": 1014, "code": "1F6A3 1F3FE", "char": "🚣🏾", "name": "person rowing boat: medium-dark skin tone" }, { "no": 1015, "code": "1F6A3 1F3FF", "char": "🚣🏿", "name": "person rowing boat: dark skin tone" }, { "no": 1016, "code": "1F6A3 200D 2642 FE0F", "char": "🚣‍♂️", "name": "man rowing boat" }, { "no": 1017, "code": "1F6A3 1F3FB 200D 2642 FE0F", "char": "🚣🏻‍♂️", "name": "man rowing boat: light skin tone" }, { "no": 1018, "code": "1F6A3 1F3FC 200D 2642 FE0F", "char": "🚣🏼‍♂️", "name": "man rowing boat: medium-light skin tone" }, { "no": 1019, "code": "1F6A3 1F3FD 200D 2642 FE0F", "char": "🚣🏽‍♂️", "name": "man rowing boat: medium skin tone" }, { "no": 1020, "code": "1F6A3 1F3FE 200D 2642 FE0F", "char": "🚣🏾‍♂️", "name": "man rowing boat: medium-dark skin tone" }, { "no": 1021, "code": "1F6A3 1F3FF 200D 2642 FE0F", "char": "🚣🏿‍♂️", "name": "man rowing boat: dark skin tone" }, { "no": 1022, "code": "1F6A3 200D 2640 FE0F", "char": "🚣‍♀️", "name": "woman rowing boat" }, { "no": 1023, "code": "1F6A3 1F3FB 200D 2640 FE0F", "char": "🚣🏻‍♀️", "name": "woman rowing boat: light skin tone" }, { "no": 1024, "code": "1F6A3 1F3FC 200D 2640 FE0F", "char": "🚣🏼‍♀️", "name": "woman rowing boat: medium-light skin tone" }, { "no": 1025, "code": "1F6A3 1F3FD 200D 2640 FE0F", "char": "🚣🏽‍♀️", "name": "woman rowing boat: medium skin tone" }, { "no": 1026, "code": "1F6A3 1F3FE 200D 2640 FE0F", "char": "🚣🏾‍♀️", "name": "woman rowing boat: medium-dark skin tone" }, { "no": 1027, "code": "1F6A3 1F3FF 200D 2640 FE0F", "char": "🚣🏿‍♀️", "name": "woman rowing boat: dark skin tone" }, { "no": 1028, "code": "1F3CA", "char": "🏊", "name": "person swimming" }, { "no": 1029, "code": "1F3CA 1F3FB", "char": "🏊🏻", "name": "person swimming: light skin tone" }, { "no": 1030, "code": "1F3CA 1F3FC", "char": "🏊🏼", "name": "person swimming: medium-light skin tone" }, { "no": 1031, "code": "1F3CA 1F3FD", "char": "🏊🏽", "name": "person swimming: medium skin tone" }, { "no": 1032, "code": "1F3CA 1F3FE", "char": "🏊🏾", "name": "person swimming: medium-dark skin tone" }, { "no": 1033, "code": "1F3CA 1F3FF", "char": "🏊🏿", "name": "person swimming: dark skin tone" }, { "no": 1034, "code": "1F3CA 200D 2642 FE0F", "char": "🏊‍♂️", "name": "man swimming" }, { "no": 1035, "code": "1F3CA 1F3FB 200D 2642 FE0F", "char": "🏊🏻‍♂️", "name": "man swimming: light skin tone" }, { "no": 1036, "code": "1F3CA 1F3FC 200D 2642 FE0F", "char": "🏊🏼‍♂️", "name": "man swimming: medium-light skin tone" }, { "no": 1037, "code": "1F3CA 1F3FD 200D 2642 FE0F", "char": "🏊🏽‍♂️", "name": "man swimming: medium skin tone" }, { "no": 1038, "code": "1F3CA 1F3FE 200D 2642 FE0F", "char": "🏊🏾‍♂️", "name": "man swimming: medium-dark skin tone" }, { "no": 1039, "code": "1F3CA 1F3FF 200D 2642 FE0F", "char": "🏊🏿‍♂️", "name": "man swimming: dark skin tone" }, { "no": 1040, "code": "1F3CA 200D 2640 FE0F", "char": "🏊‍♀️", "name": "woman swimming" }, { "no": 1041, "code": "1F3CA 1F3FB 200D 2640 FE0F", "char": "🏊🏻‍♀️", "name": "woman swimming: light skin tone" }, { "no": 1042, "code": "1F3CA 1F3FC 200D 2640 FE0F", "char": "🏊🏼‍♀️", "name": "woman swimming: medium-light skin tone" }, { "no": 1043, "code": "1F3CA 1F3FD 200D 2640 FE0F", "char": "🏊🏽‍♀️", "name": "woman swimming: medium skin tone" }, { "no": 1044, "code": "1F3CA 1F3FE 200D 2640 FE0F", "char": "🏊🏾‍♀️", "name": "woman swimming: medium-dark skin tone" }, { "no": 1045, "code": "1F3CA 1F3FF 200D 2640 FE0F", "char": "🏊🏿‍♀️", "name": "woman swimming: dark skin tone" }, { "no": 1046, "code": "26F9", "char": "⛹", "name": "person bouncing ball" }, { "no": 1047, "code": "26F9 1F3FB", "char": "⛹🏻", "name": "person bouncing ball: light skin tone" }, { "no": 1048, "code": "26F9 1F3FC", "char": "⛹🏼", "name": "person bouncing ball: medium-light skin tone" }, { "no": 1049, "code": "26F9 1F3FD", "char": "⛹🏽", "name": "person bouncing ball: medium skin tone" }, { "no": 1050, "code": "26F9 1F3FE", "char": "⛹🏾", "name": "person bouncing ball: medium-dark skin tone" }, { "no": 1051, "code": "26F9 1F3FF", "char": "⛹🏿", "name": "person bouncing ball: dark skin tone" }, { "no": 1052, "code": "26F9 FE0F 200D 2642 FE0F", "char": "⛹️‍♂️", "name": "man bouncing ball" }, { "no": 1053, "code": "26F9 1F3FB 200D 2642 FE0F", "char": "⛹🏻‍♂️", "name": "man bouncing ball: light skin tone" }, { "no": 1054, "code": "26F9 1F3FC 200D 2642 FE0F", "char": "⛹🏼‍♂️", "name": "man bouncing ball: medium-light skin tone" }, { "no": 1055, "code": "26F9 1F3FD 200D 2642 FE0F", "char": "⛹🏽‍♂️", "name": "man bouncing ball: medium skin tone" }, { "no": 1056, "code": "26F9 1F3FE 200D 2642 FE0F", "char": "⛹🏾‍♂️", "name": "man bouncing ball: medium-dark skin tone" }, { "no": 1057, "code": "26F9 1F3FF 200D 2642 FE0F", "char": "⛹🏿‍♂️", "name": "man bouncing ball: dark skin tone" }, { "no": 1058, "code": "26F9 FE0F 200D 2640 FE0F", "char": "⛹️‍♀️", "name": "woman bouncing ball" }, { "no": 1059, "code": "26F9 1F3FB 200D 2640 FE0F", "char": "⛹🏻‍♀️", "name": "woman bouncing ball: light skin tone" }, { "no": 1060, "code": "26F9 1F3FC 200D 2640 FE0F", "char": "⛹🏼‍♀️", "name": "woman bouncing ball: medium-light skin tone" }, { "no": 1061, "code": "26F9 1F3FD 200D 2640 FE0F", "char": "⛹🏽‍♀️", "name": "woman bouncing ball: medium skin tone" }, { "no": 1062, "code": "26F9 1F3FE 200D 2640 FE0F", "char": "⛹🏾‍♀️", "name": "woman bouncing ball: medium-dark skin tone" }, { "no": 1063, "code": "26F9 1F3FF 200D 2640 FE0F", "char": "⛹🏿‍♀️", "name": "woman bouncing ball: dark skin tone" }, { "no": 1064, "code": "1F3CB", "char": "🏋", "name": "person lifting weights" }, { "no": 1065, "code": "1F3CB 1F3FB", "char": "🏋🏻", "name": "person lifting weights: light skin tone" }, { "no": 1066, "code": "1F3CB 1F3FC", "char": "🏋🏼", "name": "person lifting weights: medium-light skin tone" }, { "no": 1067, "code": "1F3CB 1F3FD", "char": "🏋🏽", "name": "person lifting weights: medium skin tone" }, { "no": 1068, "code": "1F3CB 1F3FE", "char": "🏋🏾", "name": "person lifting weights: medium-dark skin tone" }, { "no": 1069, "code": "1F3CB 1F3FF", "char": "🏋🏿", "name": "person lifting weights: dark skin tone" }, { "no": 1070, "code": "1F3CB FE0F 200D 2642 FE0F", "char": "🏋️‍♂️", "name": "man lifting weights" }, { "no": 1071, "code": "1F3CB 1F3FB 200D 2642 FE0F", "char": "🏋🏻‍♂️", "name": "man lifting weights: light skin tone" }, { "no": 1072, "code": "1F3CB 1F3FC 200D 2642 FE0F", "char": "🏋🏼‍♂️", "name": "man lifting weights: medium-light skin tone" }, { "no": 1073, "code": "1F3CB 1F3FD 200D 2642 FE0F", "char": "🏋🏽‍♂️", "name": "man lifting weights: medium skin tone" }, { "no": 1074, "code": "1F3CB 1F3FE 200D 2642 FE0F", "char": "🏋🏾‍♂️", "name": "man lifting weights: medium-dark skin tone" }, { "no": 1075, "code": "1F3CB 1F3FF 200D 2642 FE0F", "char": "🏋🏿‍♂️", "name": "man lifting weights: dark skin tone" }, { "no": 1076, "code": "1F3CB FE0F 200D 2640 FE0F", "char": "🏋️‍♀️", "name": "woman lifting weights" }, { "no": 1077, "code": "1F3CB 1F3FB 200D 2640 FE0F", "char": "🏋🏻‍♀️", "name": "woman lifting weights: light skin tone" }, { "no": 1078, "code": "1F3CB 1F3FC 200D 2640 FE0F", "char": "🏋🏼‍♀️", "name": "woman lifting weights: medium-light skin tone" }, { "no": 1079, "code": "1F3CB 1F3FD 200D 2640 FE0F", "char": "🏋🏽‍♀️", "name": "woman lifting weights: medium skin tone" }, { "no": 1080, "code": "1F3CB 1F3FE 200D 2640 FE0F", "char": "🏋🏾‍♀️", "name": "woman lifting weights: medium-dark skin tone" }, { "no": 1081, "code": "1F3CB 1F3FF 200D 2640 FE0F", "char": "🏋🏿‍♀️", "name": "woman lifting weights: dark skin tone" }, { "no": 1082, "code": "1F6B4", "char": "🚴", "name": "person biking" }, { "no": 1083, "code": "1F6B4 1F3FB", "char": "🚴🏻", "name": "person biking: light skin tone" }, { "no": 1084, "code": "1F6B4 1F3FC", "char": "🚴🏼", "name": "person biking: medium-light skin tone" }, { "no": 1085, "code": "1F6B4 1F3FD", "char": "🚴🏽", "name": "person biking: medium skin tone" }, { "no": 1086, "code": "1F6B4 1F3FE", "char": "🚴🏾", "name": "person biking: medium-dark skin tone" }, { "no": 1087, "code": "1F6B4 1F3FF", "char": "🚴🏿", "name": "person biking: dark skin tone" }, { "no": 1088, "code": "1F6B4 200D 2642 FE0F", "char": "🚴‍♂️", "name": "man biking" }, { "no": 1089, "code": "1F6B4 1F3FB 200D 2642 FE0F", "char": "🚴🏻‍♂️", "name": "man biking: light skin tone" }, { "no": 1090, "code": "1F6B4 1F3FC 200D 2642 FE0F", "char": "🚴🏼‍♂️", "name": "man biking: medium-light skin tone" }, { "no": 1091, "code": "1F6B4 1F3FD 200D 2642 FE0F", "char": "🚴🏽‍♂️", "name": "man biking: medium skin tone" }, { "no": 1092, "code": "1F6B4 1F3FE 200D 2642 FE0F", "char": "🚴🏾‍♂️", "name": "man biking: medium-dark skin tone" }, { "no": 1093, "code": "1F6B4 1F3FF 200D 2642 FE0F", "char": "🚴🏿‍♂️", "name": "man biking: dark skin tone" }, { "no": 1094, "code": "1F6B4 200D 2640 FE0F", "char": "🚴‍♀️", "name": "woman biking" }, { "no": 1095, "code": "1F6B4 1F3FB 200D 2640 FE0F", "char": "🚴🏻‍♀️", "name": "woman biking: light skin tone" }, { "no": 1096, "code": "1F6B4 1F3FC 200D 2640 FE0F", "char": "🚴🏼‍♀️", "name": "woman biking: medium-light skin tone" }, { "no": 1097, "code": "1F6B4 1F3FD 200D 2640 FE0F", "char": "🚴🏽‍♀️", "name": "woman biking: medium skin tone" }, { "no": 1098, "code": "1F6B4 1F3FE 200D 2640 FE0F", "char": "🚴🏾‍♀️", "name": "woman biking: medium-dark skin tone" }, { "no": 1099, "code": "1F6B4 1F3FF 200D 2640 FE0F", "char": "🚴🏿‍♀️", "name": "woman biking: dark skin tone" }, { "no": 1100, "code": "1F6B5", "char": "🚵", "name": "person mountain biking" }, { "no": 1101, "code": "1F6B5 1F3FB", "char": "🚵🏻", "name": "person mountain biking: light skin tone" }, { "no": 1102, "code": "1F6B5 1F3FC", "char": "🚵🏼", "name": "person mountain biking: medium-light skin tone" }, { "no": 1103, "code": "1F6B5 1F3FD", "char": "🚵🏽", "name": "person mountain biking: medium skin tone" }, { "no": 1104, "code": "1F6B5 1F3FE", "char": "🚵🏾", "name": "person mountain biking: medium-dark skin tone" }, { "no": 1105, "code": "1F6B5 1F3FF", "char": "🚵🏿", "name": "person mountain biking: dark skin tone" }, { "no": 1106, "code": "1F6B5 200D 2642 FE0F", "char": "🚵‍♂️", "name": "man mountain biking" }, { "no": 1107, "code": "1F6B5 1F3FB 200D 2642 FE0F", "char": "🚵🏻‍♂️", "name": "man mountain biking: light skin tone" }, { "no": 1108, "code": "1F6B5 1F3FC 200D 2642 FE0F", "char": "🚵🏼‍♂️", "name": "man mountain biking: medium-light skin tone" }, { "no": 1109, "code": "1F6B5 1F3FD 200D 2642 FE0F", "char": "🚵🏽‍♂️", "name": "man mountain biking: medium skin tone" }, { "no": 1110, "code": "1F6B5 1F3FE 200D 2642 FE0F", "char": "🚵🏾‍♂️", "name": "man mountain biking: medium-dark skin tone" }, { "no": 1111, "code": "1F6B5 1F3FF 200D 2642 FE0F", "char": "🚵🏿‍♂️", "name": "man mountain biking: dark skin tone" }, { "no": 1112, "code": "1F6B5 200D 2640 FE0F", "char": "🚵‍♀️", "name": "woman mountain biking" }, { "no": 1113, "code": "1F6B5 1F3FB 200D 2640 FE0F", "char": "🚵🏻‍♀️", "name": "woman mountain biking: light skin tone" }, { "no": 1114, "code": "1F6B5 1F3FC 200D 2640 FE0F", "char": "🚵🏼‍♀️", "name": "woman mountain biking: medium-light skin tone" }, { "no": 1115, "code": "1F6B5 1F3FD 200D 2640 FE0F", "char": "🚵🏽‍♀️", "name": "woman mountain biking: medium skin tone" }, { "no": 1116, "code": "1F6B5 1F3FE 200D 2640 FE0F", "char": "🚵🏾‍♀️", "name": "woman mountain biking: medium-dark skin tone" }, { "no": 1117, "code": "1F6B5 1F3FF 200D 2640 FE0F", "char": "🚵🏿‍♀️", "name": "woman mountain biking: dark skin tone" }, { "no": 1118, "code": "1F3CE", "char": "🏎", "name": "racing car" }, { "no": 1119, "code": "1F3CD", "char": "🏍", "name": "motorcycle" }, { "no": 1120, "code": "1F938", "char": "🤸", "name": "person cartwheeling" }, { "no": 1121, "code": "1F938 1F3FB", "char": "🤸🏻", "name": "person cartwheeling: light skin tone" }, { "no": 1122, "code": "1F938 1F3FC", "char": "🤸🏼", "name": "person cartwheeling: medium-light skin tone" }, { "no": 1123, "code": "1F938 1F3FD", "char": "🤸🏽", "name": "person cartwheeling: medium skin tone" }, { "no": 1124, "code": "1F938 1F3FE", "char": "🤸🏾", "name": "person cartwheeling: medium-dark skin tone" }, { "no": 1125, "code": "1F938 1F3FF", "char": "🤸🏿", "name": "person cartwheeling: dark skin tone" }, { "no": 1126, "code": "1F938 200D 2642 FE0F", "char": "🤸‍♂️", "name": "man cartwheeling" }, { "no": 1127, "code": "1F938 1F3FB 200D 2642 FE0F", "char": "🤸🏻‍♂️", "name": "man cartwheeling: light skin tone" }, { "no": 1128, "code": "1F938 1F3FC 200D 2642 FE0F", "char": "🤸🏼‍♂️", "name": "man cartwheeling: medium-light skin tone" }, { "no": 1129, "code": "1F938 1F3FD 200D 2642 FE0F", "char": "🤸🏽‍♂️", "name": "man cartwheeling: medium skin tone" }, { "no": 1130, "code": "1F938 1F3FE 200D 2642 FE0F", "char": "🤸🏾‍♂️", "name": "man cartwheeling: medium-dark skin tone" }, { "no": 1131, "code": "1F938 1F3FF 200D 2642 FE0F", "char": "🤸🏿‍♂️", "name": "man cartwheeling: dark skin tone" }, { "no": 1132, "code": "1F938 200D 2640 FE0F", "char": "🤸‍♀️", "name": "woman cartwheeling" }, { "no": 1133, "code": "1F938 1F3FB 200D 2640 FE0F", "char": "🤸🏻‍♀️", "name": "woman cartwheeling: light skin tone" }, { "no": 1134, "code": "1F938 1F3FC 200D 2640 FE0F", "char": "🤸🏼‍♀️", "name": "woman cartwheeling: medium-light skin tone" }, { "no": 1135, "code": "1F938 1F3FD 200D 2640 FE0F", "char": "🤸🏽‍♀️", "name": "woman cartwheeling: medium skin tone" }, { "no": 1136, "code": "1F938 1F3FE 200D 2640 FE0F", "char": "🤸🏾‍♀️", "name": "woman cartwheeling: medium-dark skin tone" }, { "no": 1137, "code": "1F938 1F3FF 200D 2640 FE0F", "char": "🤸🏿‍♀️", "name": "woman cartwheeling: dark skin tone" }, { "no": 1138, "code": "1F93C", "char": "🤼", "name": "people wrestling" }, { "no": 1139, "code": "1F93C 200D 2642 FE0F", "char": "🤼‍♂️", "name": "men wrestling" }, { "no": 1140, "code": "1F93C 200D 2640 FE0F", "char": "🤼‍♀️", "name": "women wrestling" }, { "no": 1141, "code": "1F93D", "char": "🤽", "name": "person playing water polo" }, { "no": 1142, "code": "1F93D 1F3FB", "char": "🤽🏻", "name": "person playing water polo: light skin tone" }, { "no": 1143, "code": "1F93D 1F3FC", "char": "🤽🏼", "name": "person playing water polo: medium-light skin tone" }, { "no": 1144, "code": "1F93D 1F3FD", "char": "🤽🏽", "name": "person playing water polo: medium skin tone" }, { "no": 1145, "code": "1F93D 1F3FE", "char": "🤽🏾", "name": "person playing water polo: medium-dark skin tone" }, { "no": 1146, "code": "1F93D 1F3FF", "char": "🤽🏿", "name": "person playing water polo: dark skin tone" }, { "no": 1147, "code": "1F93D 200D 2642 FE0F", "char": "🤽‍♂️", "name": "man playing water polo" }, { "no": 1148, "code": "1F93D 1F3FB 200D 2642 FE0F", "char": "🤽🏻‍♂️", "name": "man playing water polo: light skin tone" }, { "no": 1149, "code": "1F93D 1F3FC 200D 2642 FE0F", "char": "🤽🏼‍♂️", "name": "man playing water polo: medium-light skin tone" }, { "no": 1150, "code": "1F93D 1F3FD 200D 2642 FE0F", "char": "🤽🏽‍♂️", "name": "man playing water polo: medium skin tone" }, { "no": 1151, "code": "1F93D 1F3FE 200D 2642 FE0F", "char": "🤽🏾‍♂️", "name": "man playing water polo: medium-dark skin tone" }, { "no": 1152, "code": "1F93D 1F3FF 200D 2642 FE0F", "char": "🤽🏿‍♂️", "name": "man playing water polo: dark skin tone" }, { "no": 1153, "code": "1F93D 200D 2640 FE0F", "char": "🤽‍♀️", "name": "woman playing water polo" }, { "no": 1154, "code": "1F93D 1F3FB 200D 2640 FE0F", "char": "🤽🏻‍♀️", "name": "woman playing water polo: light skin tone" }, { "no": 1155, "code": "1F93D 1F3FC 200D 2640 FE0F", "char": "🤽🏼‍♀️", "name": "woman playing water polo: medium-light skin tone" }, { "no": 1156, "code": "1F93D 1F3FD 200D 2640 FE0F", "char": "🤽🏽‍♀️", "name": "woman playing water polo: medium skin tone" }, { "no": 1157, "code": "1F93D 1F3FE 200D 2640 FE0F", "char": "🤽🏾‍♀️", "name": "woman playing water polo: medium-dark skin tone" }, { "no": 1158, "code": "1F93D 1F3FF 200D 2640 FE0F", "char": "🤽🏿‍♀️", "name": "woman playing water polo: dark skin tone" }, { "no": 1159, "code": "1F93E", "char": "🤾", "name": "person playing handball" }, { "no": 1160, "code": "1F93E 1F3FB", "char": "🤾🏻", "name": "person playing handball: light skin tone" }, { "no": 1161, "code": "1F93E 1F3FC", "char": "🤾🏼", "name": "person playing handball: medium-light skin tone" }, { "no": 1162, "code": "1F93E 1F3FD", "char": "🤾🏽", "name": "person playing handball: medium skin tone" }, { "no": 1163, "code": "1F93E 1F3FE", "char": "🤾🏾", "name": "person playing handball: medium-dark skin tone" }, { "no": 1164, "code": "1F93E 1F3FF", "char": "🤾🏿", "name": "person playing handball: dark skin tone" }, { "no": 1165, "code": "1F93E 200D 2642 FE0F", "char": "🤾‍♂️", "name": "man playing handball" }, { "no": 1166, "code": "1F93E 1F3FB 200D 2642 FE0F", "char": "🤾🏻‍♂️", "name": "man playing handball: light skin tone" }, { "no": 1167, "code": "1F93E 1F3FC 200D 2642 FE0F", "char": "🤾🏼‍♂️", "name": "man playing handball: medium-light skin tone" }, { "no": 1168, "code": "1F93E 1F3FD 200D 2642 FE0F", "char": "🤾🏽‍♂️", "name": "man playing handball: medium skin tone" }, { "no": 1169, "code": "1F93E 1F3FE 200D 2642 FE0F", "char": "🤾🏾‍♂️", "name": "man playing handball: medium-dark skin tone" }, { "no": 1170, "code": "1F93E 1F3FF 200D 2642 FE0F", "char": "🤾🏿‍♂️", "name": "man playing handball: dark skin tone" }, { "no": 1171, "code": "1F93E 200D 2640 FE0F", "char": "🤾‍♀️", "name": "woman playing handball" }, { "no": 1172, "code": "1F93E 1F3FB 200D 2640 FE0F", "char": "🤾🏻‍♀️", "name": "woman playing handball: light skin tone" }, { "no": 1173, "code": "1F93E 1F3FC 200D 2640 FE0F", "char": "🤾🏼‍♀️", "name": "woman playing handball: medium-light skin tone" }, { "no": 1174, "code": "1F93E 1F3FD 200D 2640 FE0F", "char": "🤾🏽‍♀️", "name": "woman playing handball: medium skin tone" }, { "no": 1175, "code": "1F93E 1F3FE 200D 2640 FE0F", "char": "🤾🏾‍♀️", "name": "woman playing handball: medium-dark skin tone" }, { "no": 1176, "code": "1F93E 1F3FF 200D 2640 FE0F", "char": "🤾🏿‍♀️", "name": "woman playing handball: dark skin tone" }, { "no": 1177, "code": "1F939", "char": "🤹", "name": "person juggling" }, { "no": 1178, "code": "1F939 1F3FB", "char": "🤹🏻", "name": "person juggling: light skin tone" }, { "no": 1179, "code": "1F939 1F3FC", "char": "🤹🏼", "name": "person juggling: medium-light skin tone" }, { "no": 1180, "code": "1F939 1F3FD", "char": "🤹🏽", "name": "person juggling: medium skin tone" }, { "no": 1181, "code": "1F939 1F3FE", "char": "🤹🏾", "name": "person juggling: medium-dark skin tone" }, { "no": 1182, "code": "1F939 1F3FF", "char": "🤹🏿", "name": "person juggling: dark skin tone" }, { "no": 1183, "code": "1F939 200D 2642 FE0F", "char": "🤹‍♂️", "name": "man juggling" }, { "no": 1184, "code": "1F939 1F3FB 200D 2642 FE0F", "char": "🤹🏻‍♂️", "name": "man juggling: light skin tone" }, { "no": 1185, "code": "1F939 1F3FC 200D 2642 FE0F", "char": "🤹🏼‍♂️", "name": "man juggling: medium-light skin tone" }, { "no": 1186, "code": "1F939 1F3FD 200D 2642 FE0F", "char": "🤹🏽‍♂️", "name": "man juggling: medium skin tone" }, { "no": 1187, "code": "1F939 1F3FE 200D 2642 FE0F", "char": "🤹🏾‍♂️", "name": "man juggling: medium-dark skin tone" }, { "no": 1188, "code": "1F939 1F3FF 200D 2642 FE0F", "char": "🤹🏿‍♂️", "name": "man juggling: dark skin tone" }, { "no": 1189, "code": "1F939 200D 2640 FE0F", "char": "🤹‍♀️", "name": "woman juggling" }, { "no": 1190, "code": "1F939 1F3FB 200D 2640 FE0F", "char": "🤹🏻‍♀️", "name": "woman juggling: light skin tone" }, { "no": 1191, "code": "1F939 1F3FC 200D 2640 FE0F", "char": "🤹🏼‍♀️", "name": "woman juggling: medium-light skin tone" }, { "no": 1192, "code": "1F939 1F3FD 200D 2640 FE0F", "char": "🤹🏽‍♀️", "name": "woman juggling: medium skin tone" }, { "no": 1193, "code": "1F939 1F3FE 200D 2640 FE0F", "char": "🤹🏾‍♀️", "name": "woman juggling: medium-dark skin tone" }, { "no": 1194, "code": "1F939 1F3FF 200D 2640 FE0F", "char": "🤹🏿‍♀️", "name": "woman juggling: dark skin tone" }, { "no": 1195, "code": "1F46B", "char": "👫", "name": "man and woman holding hands" }, { "no": 1196, "code": "1F46C", "char": "👬", "name": "two men holding hands" }, { "no": 1197, "code": "1F46D", "char": "👭", "name": "two women holding hands" }, { "no": 1198, "code": "1F48F", "char": "💏", "name": "kiss" }, { "no": 1199, "code": "1F469 200D 2764 FE0F 200D 1F48B 200D 1F468", "char": "👩‍❤️‍💋‍👨", "name": "kiss: woman, man" }, { "no": 1200, "code": "1F468 200D 2764 FE0F 200D 1F48B 200D 1F468", "char": "👨‍❤️‍💋‍👨", "name": "kiss: man, man" }, { "no": 1201, "code": "1F469 200D 2764 FE0F 200D 1F48B 200D 1F469", "char": "👩‍❤️‍💋‍👩", "name": "kiss: woman, woman" }, { "no": 1202, "code": "1F491", "char": "💑", "name": "couple with heart" }, { "no": 1203, "code": "1F469 200D 2764 FE0F 200D 1F468", "char": "👩‍❤️‍👨", "name": "couple with heart: woman, man" }, { "no": 1204, "code": "1F468 200D 2764 FE0F 200D 1F468", "char": "👨‍❤️‍👨", "name": "couple with heart: man, man" }, { "no": 1205, "code": "1F469 200D 2764 FE0F 200D 1F469", "char": "👩‍❤️‍👩", "name": "couple with heart: woman, woman" }, { "no": 1206, "code": "1F46A", "char": "👪", "name": "family" }, { "no": 1207, "code": "1F468 200D 1F469 200D 1F466", "char": "👨‍👩‍👦", "name": "family: man, woman, boy" }, { "no": 1208, "code": "1F468 200D 1F469 200D 1F467", "char": "👨‍👩‍👧", "name": "family: man, woman, girl" }, { "no": 1209, "code": "1F468 200D 1F469 200D 1F467 200D 1F466", "char": "👨‍👩‍👧‍👦", "name": "family: man, woman, girl, boy" }, { "no": 1210, "code": "1F468 200D 1F469 200D 1F466 200D 1F466", "char": "👨‍👩‍👦‍👦", "name": "family: man, woman, boy, boy" }, { "no": 1211, "code": "1F468 200D 1F469 200D 1F467 200D 1F467", "char": "👨‍👩‍👧‍👧", "name": "family: man, woman, girl, girl" }, { "no": 1212, "code": "1F468 200D 1F468 200D 1F466", "char": "👨‍👨‍👦", "name": "family: man, man, boy" }, { "no": 1213, "code": "1F468 200D 1F468 200D 1F467", "char": "👨‍👨‍👧", "name": "family: man, man, girl" }, { "no": 1214, "code": "1F468 200D 1F468 200D 1F467 200D 1F466", "char": "👨‍👨‍👧‍👦", "name": "family: man, man, girl, boy" }, { "no": 1215, "code": "1F468 200D 1F468 200D 1F466 200D 1F466", "char": "👨‍👨‍👦‍👦", "name": "family: man, man, boy, boy" }, { "no": 1216, "code": "1F468 200D 1F468 200D 1F467 200D 1F467", "char": "👨‍👨‍👧‍👧", "name": "family: man, man, girl, girl" }, { "no": 1217, "code": "1F469 200D 1F469 200D 1F466", "char": "👩‍👩‍👦", "name": "family: woman, woman, boy" }, { "no": 1218, "code": "1F469 200D 1F469 200D 1F467", "char": "👩‍👩‍👧", "name": "family: woman, woman, girl" }, { "no": 1219, "code": "1F469 200D 1F469 200D 1F467 200D 1F466", "char": "👩‍👩‍👧‍👦", "name": "family: woman, woman, girl, boy" }, { "no": 1220, "code": "1F469 200D 1F469 200D 1F466 200D 1F466", "char": "👩‍👩‍👦‍👦", "name": "family: woman, woman, boy, boy" }, { "no": 1221, "code": "1F469 200D 1F469 200D 1F467 200D 1F467", "char": "👩‍👩‍👧‍👧", "name": "family: woman, woman, girl, girl" }, { "no": 1222, "code": "1F468 200D 1F466", "char": "👨‍👦", "name": "family: man, boy" }, { "no": 1223, "code": "1F468 200D 1F466 200D 1F466", "char": "👨‍👦‍👦", "name": "family: man, boy, boy" }, { "no": 1224, "code": "1F468 200D 1F467", "char": "👨‍👧", "name": "family: man, girl" }, { "no": 1225, "code": "1F468 200D 1F467 200D 1F466", "char": "👨‍👧‍👦", "name": "family: man, girl, boy" }, { "no": 1226, "code": "1F468 200D 1F467 200D 1F467", "char": "👨‍👧‍👧", "name": "family: man, girl, girl" }, { "no": 1227, "code": "1F469 200D 1F466", "char": "👩‍👦", "name": "family: woman, boy" }, { "no": 1228, "code": "1F469 200D 1F466 200D 1F466", "char": "👩‍👦‍👦", "name": "family: woman, boy, boy" }, { "no": 1229, "code": "1F469 200D 1F467", "char": "👩‍👧", "name": "family: woman, girl" }, { "no": 1230, "code": "1F469 200D 1F467 200D 1F466", "char": "👩‍👧‍👦", "name": "family: woman, girl, boy" }, { "no": 1231, "code": "1F469 200D 1F467 200D 1F467", "char": "👩‍👧‍👧", "name": "family: woman, girl, girl" }, { "no": 1232, "code": "1F933", "char": "🤳", "name": "selfie" }, { "no": 1233, "code": "1F933 1F3FB", "char": "🤳🏻", "name": "selfie: light skin tone" }, { "no": 1234, "code": "1F933 1F3FC", "char": "🤳🏼", "name": "selfie: medium-light skin tone" }, { "no": 1235, "code": "1F933 1F3FD", "char": "🤳🏽", "name": "selfie: medium skin tone" }, { "no": 1236, "code": "1F933 1F3FE", "char": "🤳🏾", "name": "selfie: medium-dark skin tone" }, { "no": 1237, "code": "1F933 1F3FF", "char": "🤳🏿", "name": "selfie: dark skin tone" }, { "no": 1238, "code": "1F4AA", "char": "💪", "name": "flexed biceps" }, { "no": 1239, "code": "1F4AA 1F3FB", "char": "💪🏻", "name": "flexed biceps: light skin tone" }, { "no": 1240, "code": "1F4AA 1F3FC", "char": "💪🏼", "name": "flexed biceps: medium-light skin tone" }, { "no": 1241, "code": "1F4AA 1F3FD", "char": "💪🏽", "name": "flexed biceps: medium skin tone" }, { "no": 1242, "code": "1F4AA 1F3FE", "char": "💪🏾", "name": "flexed biceps: medium-dark skin tone" }, { "no": 1243, "code": "1F4AA 1F3FF", "char": "💪🏿", "name": "flexed biceps: dark skin tone" }, { "no": 1244, "code": "1F448", "char": "👈", "name": "backhand index pointing left" }, { "no": 1245, "code": "1F448 1F3FB", "char": "👈🏻", "name": "backhand index pointing left: light skin tone" }, { "no": 1246, "code": "1F448 1F3FC", "char": "👈🏼", "name": "backhand index pointing left: medium-light skin tone" }, { "no": 1247, "code": "1F448 1F3FD", "char": "👈🏽", "name": "backhand index pointing left: medium skin tone" }, { "no": 1248, "code": "1F448 1F3FE", "char": "👈🏾", "name": "backhand index pointing left: medium-dark skin tone" }, { "no": 1249, "code": "1F448 1F3FF", "char": "👈🏿", "name": "backhand index pointing left: dark skin tone" }, { "no": 1250, "code": "1F449", "char": "👉", "name": "backhand index pointing right" }, { "no": 1251, "code": "1F449 1F3FB", "char": "👉🏻", "name": "backhand index pointing right: light skin tone" }, { "no": 1252, "code": "1F449 1F3FC", "char": "👉🏼", "name": "backhand index pointing right: medium-light skin tone" }, { "no": 1253, "code": "1F449 1F3FD", "char": "👉🏽", "name": "backhand index pointing right: medium skin tone" }, { "no": 1254, "code": "1F449 1F3FE", "char": "👉🏾", "name": "backhand index pointing right: medium-dark skin tone" }, { "no": 1255, "code": "1F449 1F3FF", "char": "👉🏿", "name": "backhand index pointing right: dark skin tone" }, { "no": 1256, "code": "261D", "char": "☝", "name": "index pointing up" }, { "no": 1257, "code": "261D 1F3FB", "char": "☝🏻", "name": "index pointing up: light skin tone" }, { "no": 1258, "code": "261D 1F3FC", "char": "☝🏼", "name": "index pointing up: medium-light skin tone" }, { "no": 1259, "code": "261D 1F3FD", "char": "☝🏽", "name": "index pointing up: medium skin tone" }, { "no": 1260, "code": "261D 1F3FE", "char": "☝🏾", "name": "index pointing up: medium-dark skin tone" }, { "no": 1261, "code": "261D 1F3FF", "char": "☝🏿", "name": "index pointing up: dark skin tone" }, { "no": 1262, "code": "1F446", "char": "👆", "name": "backhand index pointing up" }, { "no": 1263, "code": "1F446 1F3FB", "char": "👆🏻", "name": "backhand index pointing up: light skin tone" }, { "no": 1264, "code": "1F446 1F3FC", "char": "👆🏼", "name": "backhand index pointing up: medium-light skin tone" }, { "no": 1265, "code": "1F446 1F3FD", "char": "👆🏽", "name": "backhand index pointing up: medium skin tone" }, { "no": 1266, "code": "1F446 1F3FE", "char": "👆🏾", "name": "backhand index pointing up: medium-dark skin tone" }, { "no": 1267, "code": "1F446 1F3FF", "char": "👆🏿", "name": "backhand index pointing up: dark skin tone" }, { "no": 1268, "code": "1F595", "char": "🖕", "name": "middle finger" }, { "no": 1269, "code": "1F595 1F3FB", "char": "🖕🏻", "name": "middle finger: light skin tone" }, { "no": 1270, "code": "1F595 1F3FC", "char": "🖕🏼", "name": "middle finger: medium-light skin tone" }, { "no": 1271, "code": "1F595 1F3FD", "char": "🖕🏽", "name": "middle finger: medium skin tone" }, { "no": 1272, "code": "1F595 1F3FE", "char": "🖕🏾", "name": "middle finger: medium-dark skin tone" }, { "no": 1273, "code": "1F595 1F3FF", "char": "🖕🏿", "name": "middle finger: dark skin tone" }, { "no": 1274, "code": "1F447", "char": "👇", "name": "backhand index pointing down" }, { "no": 1275, "code": "1F447 1F3FB", "char": "👇🏻", "name": "backhand index pointing down: light skin tone" }, { "no": 1276, "code": "1F447 1F3FC", "char": "👇🏼", "name": "backhand index pointing down: medium-light skin tone" }, { "no": 1277, "code": "1F447 1F3FD", "char": "👇🏽", "name": "backhand index pointing down: medium skin tone" }, { "no": 1278, "code": "1F447 1F3FE", "char": "👇🏾", "name": "backhand index pointing down: medium-dark skin tone" }, { "no": 1279, "code": "1F447 1F3FF", "char": "👇🏿", "name": "backhand index pointing down: dark skin tone" }, { "no": 1280, "code": "270C", "char": "✌", "name": "victory hand" }, { "no": 1281, "code": "270C 1F3FB", "char": "✌🏻", "name": "victory hand: light skin tone" }, { "no": 1282, "code": "270C 1F3FC", "char": "✌🏼", "name": "victory hand: medium-light skin tone" }, { "no": 1283, "code": "270C 1F3FD", "char": "✌🏽", "name": "victory hand: medium skin tone" }, { "no": 1284, "code": "270C 1F3FE", "char": "✌🏾", "name": "victory hand: medium-dark skin tone" }, { "no": 1285, "code": "270C 1F3FF", "char": "✌🏿", "name": "victory hand: dark skin tone" }, { "no": 1286, "code": "1F91E", "char": "🤞", "name": "crossed fingers" }, { "no": 1287, "code": "1F91E 1F3FB", "char": "🤞🏻", "name": "crossed fingers: light skin tone" }, { "no": 1288, "code": "1F91E 1F3FC", "char": "🤞🏼", "name": "crossed fingers: medium-light skin tone" }, { "no": 1289, "code": "1F91E 1F3FD", "char": "🤞🏽", "name": "crossed fingers: medium skin tone" }, { "no": 1290, "code": "1F91E 1F3FE", "char": "🤞🏾", "name": "crossed fingers: medium-dark skin tone" }, { "no": 1291, "code": "1F91E 1F3FF", "char": "🤞🏿", "name": "crossed fingers: dark skin tone" }, { "no": 1292, "code": "1F596", "char": "🖖", "name": "vulcan salute" }, { "no": 1293, "code": "1F596 1F3FB", "char": "🖖🏻", "name": "vulcan salute: light skin tone" }, { "no": 1294, "code": "1F596 1F3FC", "char": "🖖🏼", "name": "vulcan salute: medium-light skin tone" }, { "no": 1295, "code": "1F596 1F3FD", "char": "🖖🏽", "name": "vulcan salute: medium skin tone" }, { "no": 1296, "code": "1F596 1F3FE", "char": "🖖🏾", "name": "vulcan salute: medium-dark skin tone" }, { "no": 1297, "code": "1F596 1F3FF", "char": "🖖🏿", "name": "vulcan salute: dark skin tone" }, { "no": 1298, "code": "1F918", "char": "🤘", "name": "sign of the horns" }, { "no": 1299, "code": "1F918 1F3FB", "char": "🤘🏻", "name": "sign of the horns: light skin tone" }, { "no": 1300, "code": "1F918 1F3FC", "char": "🤘🏼", "name": "sign of the horns: medium-light skin tone" }, { "no": 1301, "code": "1F918 1F3FD", "char": "🤘🏽", "name": "sign of the horns: medium skin tone" }, { "no": 1302, "code": "1F918 1F3FE", "char": "🤘🏾", "name": "sign of the horns: medium-dark skin tone" }, { "no": 1303, "code": "1F918 1F3FF", "char": "🤘🏿", "name": "sign of the horns: dark skin tone" }, { "no": 1304, "code": "1F919", "char": "🤙", "name": "call me hand" }, { "no": 1305, "code": "1F919 1F3FB", "char": "🤙🏻", "name": "call me hand: light skin tone" }, { "no": 1306, "code": "1F919 1F3FC", "char": "🤙🏼", "name": "call me hand: medium-light skin tone" }, { "no": 1307, "code": "1F919 1F3FD", "char": "🤙🏽", "name": "call me hand: medium skin tone" }, { "no": 1308, "code": "1F919 1F3FE", "char": "🤙🏾", "name": "call me hand: medium-dark skin tone" }, { "no": 1309, "code": "1F919 1F3FF", "char": "🤙🏿", "name": "call me hand: dark skin tone" }, { "no": 1310, "code": "1F590", "char": "🖐", "name": "hand with fingers splayed" }, { "no": 1311, "code": "1F590 1F3FB", "char": "🖐🏻", "name": "hand with fingers splayed: light skin tone" }, { "no": 1312, "code": "1F590 1F3FC", "char": "🖐🏼", "name": "hand with fingers splayed: medium-light skin tone" }, { "no": 1313, "code": "1F590 1F3FD", "char": "🖐🏽", "name": "hand with fingers splayed: medium skin tone" }, { "no": 1314, "code": "1F590 1F3FE", "char": "🖐🏾", "name": "hand with fingers splayed: medium-dark skin tone" }, { "no": 1315, "code": "1F590 1F3FF", "char": "🖐🏿", "name": "hand with fingers splayed: dark skin tone" }, { "no": 1316, "code": "270B", "char": "✋", "name": "raised hand" }, { "no": 1317, "code": "270B 1F3FB", "char": "✋🏻", "name": "raised hand: light skin tone" }, { "no": 1318, "code": "270B 1F3FC", "char": "✋🏼", "name": "raised hand: medium-light skin tone" }, { "no": 1319, "code": "270B 1F3FD", "char": "✋🏽", "name": "raised hand: medium skin tone" }, { "no": 1320, "code": "270B 1F3FE", "char": "✋🏾", "name": "raised hand: medium-dark skin tone" }, { "no": 1321, "code": "270B 1F3FF", "char": "✋🏿", "name": "raised hand: dark skin tone" }, { "no": 1322, "code": "1F44C", "char": "👌", "name": "OK hand" }, { "no": 1323, "code": "1F44C 1F3FB", "char": "👌🏻", "name": "OK hand: light skin tone" }, { "no": 1324, "code": "1F44C 1F3FC", "char": "👌🏼", "name": "OK hand: medium-light skin tone" }, { "no": 1325, "code": "1F44C 1F3FD", "char": "👌🏽", "name": "OK hand: medium skin tone" }, { "no": 1326, "code": "1F44C 1F3FE", "char": "👌🏾", "name": "OK hand: medium-dark skin tone" }, { "no": 1327, "code": "1F44C 1F3FF", "char": "👌🏿", "name": "OK hand: dark skin tone" }, { "no": 1328, "code": "1F44D", "char": "👍", "name": "thumbs up" }, { "no": 1329, "code": "1F44D 1F3FB", "char": "👍🏻", "name": "thumbs up: light skin tone" }, { "no": 1330, "code": "1F44D 1F3FC", "char": "👍🏼", "name": "thumbs up: medium-light skin tone" }, { "no": 1331, "code": "1F44D 1F3FD", "char": "👍🏽", "name": "thumbs up: medium skin tone" }, { "no": 1332, "code": "1F44D 1F3FE", "char": "👍🏾", "name": "thumbs up: medium-dark skin tone" }, { "no": 1333, "code": "1F44D 1F3FF", "char": "👍🏿", "name": "thumbs up: dark skin tone" }, { "no": 1334, "code": "1F44E", "char": "👎", "name": "thumbs down" }, { "no": 1335, "code": "1F44E 1F3FB", "char": "👎🏻", "name": "thumbs down: light skin tone" }, { "no": 1336, "code": "1F44E 1F3FC", "char": "👎🏼", "name": "thumbs down: medium-light skin tone" }, { "no": 1337, "code": "1F44E 1F3FD", "char": "👎🏽", "name": "thumbs down: medium skin tone" }, { "no": 1338, "code": "1F44E 1F3FE", "char": "👎🏾", "name": "thumbs down: medium-dark skin tone" }, { "no": 1339, "code": "1F44E 1F3FF", "char": "👎🏿", "name": "thumbs down: dark skin tone" }, { "no": 1340, "code": "270A", "char": "✊", "name": "raised fist" }, { "no": 1341, "code": "270A 1F3FB", "char": "✊🏻", "name": "raised fist: light skin tone" }, { "no": 1342, "code": "270A 1F3FC", "char": "✊🏼", "name": "raised fist: medium-light skin tone" }, { "no": 1343, "code": "270A 1F3FD", "char": "✊🏽", "name": "raised fist: medium skin tone" }, { "no": 1344, "code": "270A 1F3FE", "char": "✊🏾", "name": "raised fist: medium-dark skin tone" }, { "no": 1345, "code": "270A 1F3FF", "char": "✊🏿", "name": "raised fist: dark skin tone" }, { "no": 1346, "code": "1F44A", "char": "👊", "name": "oncoming fist" }, { "no": 1347, "code": "1F44A 1F3FB", "char": "👊🏻", "name": "oncoming fist: light skin tone" }, { "no": 1348, "code": "1F44A 1F3FC", "char": "👊🏼", "name": "oncoming fist: medium-light skin tone" }, { "no": 1349, "code": "1F44A 1F3FD", "char": "👊🏽", "name": "oncoming fist: medium skin tone" }, { "no": 1350, "code": "1F44A 1F3FE", "char": "👊🏾", "name": "oncoming fist: medium-dark skin tone" }, { "no": 1351, "code": "1F44A 1F3FF", "char": "👊🏿", "name": "oncoming fist: dark skin tone" }, { "no": 1352, "code": "1F91B", "char": "🤛", "name": "left-facing fist" }, { "no": 1353, "code": "1F91B 1F3FB", "char": "🤛🏻", "name": "left-facing fist: light skin tone" }, { "no": 1354, "code": "1F91B 1F3FC", "char": "🤛🏼", "name": "left-facing fist: medium-light skin tone" }, { "no": 1355, "code": "1F91B 1F3FD", "char": "🤛🏽", "name": "left-facing fist: medium skin tone" }, { "no": 1356, "code": "1F91B 1F3FE", "char": "🤛🏾", "name": "left-facing fist: medium-dark skin tone" }, { "no": 1357, "code": "1F91B 1F3FF", "char": "🤛🏿", "name": "left-facing fist: dark skin tone" }, { "no": 1358, "code": "1F91C", "char": "🤜", "name": "right-facing fist" }, { "no": 1359, "code": "1F91C 1F3FB", "char": "🤜🏻", "name": "right-facing fist: light skin tone" }, { "no": 1360, "code": "1F91C 1F3FC", "char": "🤜🏼", "name": "right-facing fist: medium-light skin tone" }, { "no": 1361, "code": "1F91C 1F3FD", "char": "🤜🏽", "name": "right-facing fist: medium skin tone" }, { "no": 1362, "code": "1F91C 1F3FE", "char": "🤜🏾", "name": "right-facing fist: medium-dark skin tone" }, { "no": 1363, "code": "1F91C 1F3FF", "char": "🤜🏿", "name": "right-facing fist: dark skin tone" }, { "no": 1364, "code": "1F91A", "char": "🤚", "name": "raised back of hand" }, { "no": 1365, "code": "1F91A 1F3FB", "char": "🤚🏻", "name": "raised back of hand: light skin tone" }, { "no": 1366, "code": "1F91A 1F3FC", "char": "🤚🏼", "name": "raised back of hand: medium-light skin tone" }, { "no": 1367, "code": "1F91A 1F3FD", "char": "🤚🏽", "name": "raised back of hand: medium skin tone" }, { "no": 1368, "code": "1F91A 1F3FE", "char": "🤚🏾", "name": "raised back of hand: medium-dark skin tone" }, { "no": 1369, "code": "1F91A 1F3FF", "char": "🤚🏿", "name": "raised back of hand: dark skin tone" }, { "no": 1370, "code": "1F44B", "char": "👋", "name": "waving hand" }, { "no": 1371, "code": "1F44B 1F3FB", "char": "👋🏻", "name": "waving hand: light skin tone" }, { "no": 1372, "code": "1F44B 1F3FC", "char": "👋🏼", "name": "waving hand: medium-light skin tone" }, { "no": 1373, "code": "1F44B 1F3FD", "char": "👋🏽", "name": "waving hand: medium skin tone" }, { "no": 1374, "code": "1F44B 1F3FE", "char": "👋🏾", "name": "waving hand: medium-dark skin tone" }, { "no": 1375, "code": "1F44B 1F3FF", "char": "👋🏿", "name": "waving hand: dark skin tone" }, { "no": 1376, "code": "1F91F", "char": "🤟", "name": "⊛ love-you gesture" }, { "no": 1377, "code": "1F91F 1F3FB", "char": "🤟🏻", "name": "⊛ love-you gesture: light skin tone" }, { "no": 1378, "code": "1F91F 1F3FC", "char": "🤟🏼", "name": "⊛ love-you gesture: medium-light skin tone" }, { "no": 1379, "code": "1F91F 1F3FD", "char": "🤟🏽", "name": "⊛ love-you gesture: medium skin tone" }, { "no": 1380, "code": "1F91F 1F3FE", "char": "🤟🏾", "name": "⊛ love-you gesture: medium-dark skin tone" }, { "no": 1381, "code": "1F91F 1F3FF", "char": "🤟🏿", "name": "⊛ love-you gesture: dark skin tone" }, { "no": 1382, "code": "270D", "char": "✍", "name": "writing hand" }, { "no": 1383, "code": "270D 1F3FB", "char": "✍🏻", "name": "writing hand: light skin tone" }, { "no": 1384, "code": "270D 1F3FC", "char": "✍🏼", "name": "writing hand: medium-light skin tone" }, { "no": 1385, "code": "270D 1F3FD", "char": "✍🏽", "name": "writing hand: medium skin tone" }, { "no": 1386, "code": "270D 1F3FE", "char": "✍🏾", "name": "writing hand: medium-dark skin tone" }, { "no": 1387, "code": "270D 1F3FF", "char": "✍🏿", "name": "writing hand: dark skin tone" }, { "no": 1388, "code": "1F44F", "char": "👏", "name": "clapping hands" }, { "no": 1389, "code": "1F44F 1F3FB", "char": "👏🏻", "name": "clapping hands: light skin tone" }, { "no": 1390, "code": "1F44F 1F3FC", "char": "👏🏼", "name": "clapping hands: medium-light skin tone" }, { "no": 1391, "code": "1F44F 1F3FD", "char": "👏🏽", "name": "clapping hands: medium skin tone" }, { "no": 1392, "code": "1F44F 1F3FE", "char": "👏🏾", "name": "clapping hands: medium-dark skin tone" }, { "no": 1393, "code": "1F44F 1F3FF", "char": "👏🏿", "name": "clapping hands: dark skin tone" }, { "no": 1394, "code": "1F450", "char": "👐", "name": "open hands" }, { "no": 1395, "code": "1F450 1F3FB", "char": "👐🏻", "name": "open hands: light skin tone" }, { "no": 1396, "code": "1F450 1F3FC", "char": "👐🏼", "name": "open hands: medium-light skin tone" }, { "no": 1397, "code": "1F450 1F3FD", "char": "👐🏽", "name": "open hands: medium skin tone" }, { "no": 1398, "code": "1F450 1F3FE", "char": "👐🏾", "name": "open hands: medium-dark skin tone" }, { "no": 1399, "code": "1F450 1F3FF", "char": "👐🏿", "name": "open hands: dark skin tone" }, { "no": 1400, "code": "1F64C", "char": "🙌", "name": "raising hands" }, { "no": 1401, "code": "1F64C 1F3FB", "char": "🙌🏻", "name": "raising hands: light skin tone" }, { "no": 1402, "code": "1F64C 1F3FC", "char": "🙌🏼", "name": "raising hands: medium-light skin tone" }, { "no": 1403, "code": "1F64C 1F3FD", "char": "🙌🏽", "name": "raising hands: medium skin tone" }, { "no": 1404, "code": "1F64C 1F3FE", "char": "🙌🏾", "name": "raising hands: medium-dark skin tone" }, { "no": 1405, "code": "1F64C 1F3FF", "char": "🙌🏿", "name": "raising hands: dark skin tone" }, { "no": 1406, "code": "1F932", "char": "🤲", "name": "⊛ palms up together" }, { "no": 1407, "code": "1F932 1F3FB", "char": "🤲🏻", "name": "⊛ palms up together: light skin tone" }, { "no": 1408, "code": "1F932 1F3FC", "char": "🤲🏼", "name": "⊛ palms up together: medium-light skin tone" }, { "no": 1409, "code": "1F932 1F3FD", "char": "🤲🏽", "name": "⊛ palms up together: medium skin tone" }, { "no": 1410, "code": "1F932 1F3FE", "char": "🤲🏾", "name": "⊛ palms up together: medium-dark skin tone" }, { "no": 1411, "code": "1F932 1F3FF", "char": "🤲🏿", "name": "⊛ palms up together: dark skin tone" }, { "no": 1412, "code": "1F64F", "char": "🙏", "name": "folded hands" }, { "no": 1413, "code": "1F64F 1F3FB", "char": "🙏🏻", "name": "folded hands: light skin tone" }, { "no": 1414, "code": "1F64F 1F3FC", "char": "🙏🏼", "name": "folded hands: medium-light skin tone" }, { "no": 1415, "code": "1F64F 1F3FD", "char": "🙏🏽", "name": "folded hands: medium skin tone" }, { "no": 1416, "code": "1F64F 1F3FE", "char": "🙏🏾", "name": "folded hands: medium-dark skin tone" }, { "no": 1417, "code": "1F64F 1F3FF", "char": "🙏🏿", "name": "folded hands: dark skin tone" }, { "no": 1418, "code": "1F91D", "char": "🤝", "name": "handshake" }, { "no": 1419, "code": "1F485", "char": "💅", "name": "nail polish" }, { "no": 1420, "code": "1F485 1F3FB", "char": "💅🏻", "name": "nail polish: light skin tone" }, { "no": 1421, "code": "1F485 1F3FC", "char": "💅🏼", "name": "nail polish: medium-light skin tone" }, { "no": 1422, "code": "1F485 1F3FD", "char": "💅🏽", "name": "nail polish: medium skin tone" }, { "no": 1423, "code": "1F485 1F3FE", "char": "💅🏾", "name": "nail polish: medium-dark skin tone" }, { "no": 1424, "code": "1F485 1F3FF", "char": "💅🏿", "name": "nail polish: dark skin tone" }, { "no": 1425, "code": "1F442", "char": "👂", "name": "ear" }, { "no": 1426, "code": "1F442 1F3FB", "char": "👂🏻", "name": "ear: light skin tone" }, { "no": 1427, "code": "1F442 1F3FC", "char": "👂🏼", "name": "ear: medium-light skin tone" }, { "no": 1428, "code": "1F442 1F3FD", "char": "👂🏽", "name": "ear: medium skin tone" }, { "no": 1429, "code": "1F442 1F3FE", "char": "👂🏾", "name": "ear: medium-dark skin tone" }, { "no": 1430, "code": "1F442 1F3FF", "char": "👂🏿", "name": "ear: dark skin tone" }, { "no": 1431, "code": "1F443", "char": "👃", "name": "nose" }, { "no": 1432, "code": "1F443 1F3FB", "char": "👃🏻", "name": "nose: light skin tone" }, { "no": 1433, "code": "1F443 1F3FC", "char": "👃🏼", "name": "nose: medium-light skin tone" }, { "no": 1434, "code": "1F443 1F3FD", "char": "👃🏽", "name": "nose: medium skin tone" }, { "no": 1435, "code": "1F443 1F3FE", "char": "👃🏾", "name": "nose: medium-dark skin tone" }, { "no": 1436, "code": "1F443 1F3FF", "char": "👃🏿", "name": "nose: dark skin tone" }, { "no": 1437, "code": "1F463", "char": "👣", "name": "footprints" }, { "no": 1438, "code": "1F440", "char": "👀", "name": "eyes" }, { "no": 1439, "code": "1F441", "char": "👁", "name": "eye" }, { "no": 1440, "code": "1F441 FE0F 200D 1F5E8 FE0F", "char": "👁️‍🗨️", "name": "eye in speech bubble" }, { "no": 1441, "code": "1F9E0", "char": "🧠", "name": "⊛ brain" }, { "no": 1442, "code": "1F445", "char": "👅", "name": "tongue" }, { "no": 1443, "code": "1F444", "char": "👄", "name": "mouth" }, { "no": 1444, "code": "1F48B", "char": "💋", "name": "kiss mark" }, { "no": 1445, "code": "1F498", "char": "💘", "name": "heart with arrow" }, { "no": 1446, "code": "2764", "char": "❤", "name": "red heart" }, { "no": 1447, "code": "1F493", "char": "💓", "name": "beating heart" }, { "no": 1448, "code": "1F494", "char": "💔", "name": "broken heart" }, { "no": 1449, "code": "1F495", "char": "💕", "name": "two hearts" }, { "no": 1450, "code": "1F496", "char": "💖", "name": "sparkling heart" }, { "no": 1451, "code": "1F497", "char": "💗", "name": "growing heart" }, { "no": 1452, "code": "1F499", "char": "💙", "name": "blue heart" }, { "no": 1453, "code": "1F49A", "char": "💚", "name": "green heart" }, { "no": 1454, "code": "1F49B", "char": "💛", "name": "yellow heart" }, { "no": 1455, "code": "1F9E1", "char": "🧡", "name": "⊛ orange heart" }, { "no": 1456, "code": "1F49C", "char": "💜", "name": "purple heart" }, { "no": 1457, "code": "1F5A4", "char": "🖤", "name": "black heart" }, { "no": 1458, "code": "1F49D", "char": "💝", "name": "heart with ribbon" }, { "no": 1459, "code": "1F49E", "char": "💞", "name": "revolving hearts" }, { "no": 1460, "code": "1F49F", "char": "💟", "name": "heart decoration" }, { "no": 1461, "code": "2763", "char": "❣", "name": "heavy heart exclamation" }, { "no": 1462, "code": "1F48C", "char": "💌", "name": "love letter" }, { "no": 1463, "code": "1F4A4", "char": "💤", "name": "zzz" }, { "no": 1464, "code": "1F4A2", "char": "💢", "name": "anger symbol" }, { "no": 1465, "code": "1F4A3", "char": "💣", "name": "bomb" }, { "no": 1466, "code": "1F4A5", "char": "💥", "name": "collision" }, { "no": 1467, "code": "1F4A6", "char": "💦", "name": "sweat droplets" }, { "no": 1468, "code": "1F4A8", "char": "💨", "name": "dashing away" }, { "no": 1469, "code": "1F4AB", "char": "💫", "name": "dizzy" }, { "no": 1470, "code": "1F4AC", "char": "💬", "name": "speech balloon" }, { "no": 1471, "code": "1F5E8", "char": "🗨", "name": "left speech bubble" }, { "no": 1472, "code": "1F5EF", "char": "🗯", "name": "right anger bubble" }, { "no": 1473, "code": "1F4AD", "char": "💭", "name": "thought balloon" }, { "no": 1474, "code": "1F573", "char": "🕳", "name": "hole" }, { "no": 1475, "code": "1F453", "char": "👓", "name": "glasses" }, { "no": 1476, "code": "1F576", "char": "🕶", "name": "sunglasses" }, { "no": 1477, "code": "1F454", "char": "👔", "name": "necktie" }, { "no": 1478, "code": "1F455", "char": "👕", "name": "t-shirt" }, { "no": 1479, "code": "1F456", "char": "👖", "name": "jeans" }, { "no": 1480, "code": "1F9E3", "char": "🧣", "name": "⊛ scarf" }, { "no": 1481, "code": "1F9E4", "char": "🧤", "name": "⊛ gloves" }, { "no": 1482, "code": "1F9E5", "char": "🧥", "name": "⊛ coat" }, { "no": 1483, "code": "1F9E6", "char": "🧦", "name": "⊛ socks" }, { "no": 1484, "code": "1F457", "char": "👗", "name": "dress" }, { "no": 1485, "code": "1F458", "char": "👘", "name": "kimono" }, { "no": 1486, "code": "1F459", "char": "👙", "name": "bikini" }, { "no": 1487, "code": "1F45A", "char": "👚", "name": "woman’s clothes" }, { "no": 1488, "code": "1F45B", "char": "👛", "name": "purse" }, { "no": 1489, "code": "1F45C", "char": "👜", "name": "handbag" }, { "no": 1490, "code": "1F45D", "char": "👝", "name": "clutch bag" }, { "no": 1491, "code": "1F6CD", "char": "🛍", "name": "shopping bags" }, { "no": 1492, "code": "1F392", "char": "🎒", "name": "school backpack" }, { "no": 1493, "code": "1F45E", "char": "👞", "name": "man’s shoe" }, { "no": 1494, "code": "1F45F", "char": "👟", "name": "running shoe" }, { "no": 1495, "code": "1F460", "char": "👠", "name": "high-heeled shoe" }, { "no": 1496, "code": "1F461", "char": "👡", "name": "woman’s sandal" }, { "no": 1497, "code": "1F462", "char": "👢", "name": "woman’s boot" }, { "no": 1498, "code": "1F451", "char": "👑", "name": "crown" }, { "no": 1499, "code": "1F452", "char": "👒", "name": "woman’s hat" }, { "no": 1500, "code": "1F3A9", "char": "🎩", "name": "top hat" }, { "no": 1501, "code": "1F393", "char": "🎓", "name": "graduation cap" }, { "no": 1502, "code": "1F9E2", "char": "🧢", "name": "⊛ billed cap" }, { "no": 1503, "code": "26D1", "char": "⛑", "name": "rescue worker’s helmet" }, { "no": 1504, "code": "1F4FF", "char": "📿", "name": "prayer beads" }, { "no": 1505, "code": "1F484", "char": "💄", "name": "lipstick" }, { "no": 1506, "code": "1F48D", "char": "💍", "name": "ring" }, { "no": 1507, "code": "1F48E", "char": "💎", "name": "gem stone" }, { "no": 1508, "code": "1F435", "char": "🐵", "name": "monkey face" }, { "no": 1509, "code": "1F412", "char": "🐒", "name": "monkey" }, { "no": 1510, "code": "1F98D", "char": "🦍", "name": "gorilla" }, { "no": 1511, "code": "1F436", "char": "🐶", "name": "dog face" }, { "no": 1512, "code": "1F415", "char": "🐕", "name": "dog" }, { "no": 1513, "code": "1F429", "char": "🐩", "name": "poodle" }, { "no": 1514, "code": "1F43A", "char": "🐺", "name": "wolf face" }, { "no": 1515, "code": "1F98A", "char": "🦊", "name": "fox face" }, { "no": 1516, "code": "1F431", "char": "🐱", "name": "cat face" }, { "no": 1517, "code": "1F408", "char": "🐈", "name": "cat" }, { "no": 1518, "code": "1F981", "char": "🦁", "name": "lion face" }, { "no": 1519, "code": "1F42F", "char": "🐯", "name": "tiger face" }, { "no": 1520, "code": "1F405", "char": "🐅", "name": "tiger" }, { "no": 1521, "code": "1F406", "char": "🐆", "name": "leopard" }, { "no": 1522, "code": "1F434", "char": "🐴", "name": "horse face" }, { "no": 1523, "code": "1F40E", "char": "🐎", "name": "horse" }, { "no": 1524, "code": "1F984", "char": "🦄", "name": "unicorn face" }, { "no": 1525, "code": "1F993", "char": "🦓", "name": "⊛ zebra" }, { "no": 1526, "code": "1F98C", "char": "🦌", "name": "deer" }, { "no": 1527, "code": "1F42E", "char": "🐮", "name": "cow face" }, { "no": 1528, "code": "1F402", "char": "🐂", "name": "ox" }, { "no": 1529, "code": "1F403", "char": "🐃", "name": "water buffalo" }, { "no": 1530, "code": "1F404", "char": "🐄", "name": "cow" }, { "no": 1531, "code": "1F437", "char": "🐷", "name": "pig face" }, { "no": 1532, "code": "1F416", "char": "🐖", "name": "pig" }, { "no": 1533, "code": "1F417", "char": "🐗", "name": "boar" }, { "no": 1534, "code": "1F43D", "char": "🐽", "name": "pig nose" }, { "no": 1535, "code": "1F40F", "char": "🐏", "name": "ram" }, { "no": 1536, "code": "1F411", "char": "🐑", "name": "ewe" }, { "no": 1537, "code": "1F410", "char": "🐐", "name": "goat" }, { "no": 1538, "code": "1F42A", "char": "🐪", "name": "camel" }, { "no": 1539, "code": "1F42B", "char": "🐫", "name": "two-hump camel" }, { "no": 1540, "code": "1F992", "char": "🦒", "name": "⊛ giraffe" }, { "no": 1541, "code": "1F418", "char": "🐘", "name": "elephant" }, { "no": 1542, "code": "1F98F", "char": "🦏", "name": "rhinoceros" }, { "no": 1543, "code": "1F42D", "char": "🐭", "name": "mouse face" }, { "no": 1544, "code": "1F401", "char": "🐁", "name": "mouse" }, { "no": 1545, "code": "1F400", "char": "🐀", "name": "rat" }, { "no": 1546, "code": "1F439", "char": "🐹", "name": "hamster face" }, { "no": 1547, "code": "1F430", "char": "🐰", "name": "rabbit face" }, { "no": 1548, "code": "1F407", "char": "🐇", "name": "rabbit" }, { "no": 1549, "code": "1F43F", "char": "🐿", "name": "chipmunk" }, { "no": 1550, "code": "1F994", "char": "🦔", "name": "⊛ hedgehog" }, { "no": 1551, "code": "1F987", "char": "🦇", "name": "bat" }, { "no": 1552, "code": "1F43B", "char": "🐻", "name": "bear face" }, { "no": 1553, "code": "1F428", "char": "🐨", "name": "koala" }, { "no": 1554, "code": "1F43C", "char": "🐼", "name": "panda face" }, { "no": 1555, "code": "1F43E", "char": "🐾", "name": "paw prints" }, { "no": 1556, "code": "1F983", "char": "🦃", "name": "turkey" }, { "no": 1557, "code": "1F414", "char": "🐔", "name": "chicken" }, { "no": 1558, "code": "1F413", "char": "🐓", "name": "rooster" }, { "no": 1559, "code": "1F423", "char": "🐣", "name": "hatching chick" }, { "no": 1560, "code": "1F424", "char": "🐤", "name": "baby chick" }, { "no": 1561, "code": "1F425", "char": "🐥", "name": "front-facing baby chick" }, { "no": 1562, "code": "1F426", "char": "🐦", "name": "bird" }, { "no": 1563, "code": "1F427", "char": "🐧", "name": "penguin" }, { "no": 1564, "code": "1F54A", "char": "🕊", "name": "dove" }, { "no": 1565, "code": "1F985", "char": "🦅", "name": "eagle" }, { "no": 1566, "code": "1F986", "char": "🦆", "name": "duck" }, { "no": 1567, "code": "1F989", "char": "🦉", "name": "owl" }, { "no": 1568, "code": "1F438", "char": "🐸", "name": "frog face" }, { "no": 1569, "code": "1F40A", "char": "🐊", "name": "crocodile" }, { "no": 1570, "code": "1F422", "char": "🐢", "name": "turtle" }, { "no": 1571, "code": "1F98E", "char": "🦎", "name": "lizard" }, { "no": 1572, "code": "1F40D", "char": "🐍", "name": "snake" }, { "no": 1573, "code": "1F432", "char": "🐲", "name": "dragon face" }, { "no": 1574, "code": "1F409", "char": "🐉", "name": "dragon" }, { "no": 1575, "code": "1F995", "char": "🦕", "name": "⊛ sauropod" }, { "no": 1576, "code": "1F996", "char": "🦖", "name": "⊛ T-Rex" }, { "no": 1577, "code": "1F433", "char": "🐳", "name": "spouting whale" }, { "no": 1578, "code": "1F40B", "char": "🐋", "name": "whale" }, { "no": 1579, "code": "1F42C", "char": "🐬", "name": "dolphin" }, { "no": 1580, "code": "1F41F", "char": "🐟", "name": "fish" }, { "no": 1581, "code": "1F420", "char": "🐠", "name": "tropical fish" }, { "no": 1582, "code": "1F421", "char": "🐡", "name": "blowfish" }, { "no": 1583, "code": "1F988", "char": "🦈", "name": "shark" }, { "no": 1584, "code": "1F419", "char": "🐙", "name": "octopus" }, { "no": 1585, "code": "1F41A", "char": "🐚", "name": "spiral shell" }, { "no": 1586, "code": "1F980", "char": "🦀", "name": "crab" }, { "no": 1587, "code": "1F990", "char": "🦐", "name": "shrimp" }, { "no": 1588, "code": "1F991", "char": "🦑", "name": "squid" }, { "no": 1589, "code": "1F40C", "char": "🐌", "name": "snail" }, { "no": 1590, "code": "1F98B", "char": "🦋", "name": "butterfly" }, { "no": 1591, "code": "1F41B", "char": "🐛", "name": "bug" }, { "no": 1592, "code": "1F41C", "char": "🐜", "name": "ant" }, { "no": 1593, "code": "1F41D", "char": "🐝", "name": "honeybee" }, { "no": 1594, "code": "1F41E", "char": "🐞", "name": "lady beetle" }, { "no": 1595, "code": "1F997", "char": "🦗", "name": "⊛ cricket" }, { "no": 1596, "code": "1F577", "char": "🕷", "name": "spider" }, { "no": 1597, "code": "1F578", "char": "🕸", "name": "spider web" }, { "no": 1598, "code": "1F982", "char": "🦂", "name": "scorpion" }, { "no": 1599, "code": "1F490", "char": "💐", "name": "bouquet" }, { "no": 1600, "code": "1F338", "char": "🌸", "name": "cherry blossom" }, { "no": 1601, "code": "1F4AE", "char": "💮", "name": "white flower" }, { "no": 1602, "code": "1F3F5", "char": "🏵", "name": "rosette" }, { "no": 1603, "code": "1F339", "char": "🌹", "name": "rose" }, { "no": 1604, "code": "1F940", "char": "🥀", "name": "wilted flower" }, { "no": 1605, "code": "1F33A", "char": "🌺", "name": "hibiscus" }, { "no": 1606, "code": "1F33B", "char": "🌻", "name": "sunflower" }, { "no": 1607, "code": "1F33C", "char": "🌼", "name": "blossom" }, { "no": 1608, "code": "1F337", "char": "🌷", "name": "tulip" }, { "no": 1609, "code": "1F331", "char": "🌱", "name": "seedling" }, { "no": 1610, "code": "1F332", "char": "🌲", "name": "evergreen tree" }, { "no": 1611, "code": "1F333", "char": "🌳", "name": "deciduous tree" }, { "no": 1612, "code": "1F334", "char": "🌴", "name": "palm tree" }, { "no": 1613, "code": "1F335", "char": "🌵", "name": "cactus" }, { "no": 1614, "code": "1F33E", "char": "🌾", "name": "sheaf of rice" }, { "no": 1615, "code": "1F33F", "char": "🌿", "name": "herb" }, { "no": 1616, "code": "2618", "char": "☘", "name": "shamrock" }, { "no": 1617, "code": "1F340", "char": "🍀", "name": "four leaf clover" }, { "no": 1618, "code": "1F341", "char": "🍁", "name": "maple leaf" }, { "no": 1619, "code": "1F342", "char": "🍂", "name": "fallen leaf" }, { "no": 1620, "code": "1F343", "char": "🍃", "name": "leaf fluttering in wind" }, { "no": 1621, "code": "1F347", "char": "🍇", "name": "grapes" }, { "no": 1622, "code": "1F348", "char": "🍈", "name": "melon" }, { "no": 1623, "code": "1F349", "char": "🍉", "name": "watermelon" }, { "no": 1624, "code": "1F34A", "char": "🍊", "name": "tangerine" }, { "no": 1625, "code": "1F34B", "char": "🍋", "name": "lemon" }, { "no": 1626, "code": "1F34C", "char": "🍌", "name": "banana" }, { "no": 1627, "code": "1F34D", "char": "🍍", "name": "pineapple" }, { "no": 1628, "code": "1F34E", "char": "🍎", "name": "red apple" }, { "no": 1629, "code": "1F34F", "char": "🍏", "name": "green apple" }, { "no": 1630, "code": "1F350", "char": "🍐", "name": "pear" }, { "no": 1631, "code": "1F351", "char": "🍑", "name": "peach" }, { "no": 1632, "code": "1F352", "char": "🍒", "name": "cherries" }, { "no": 1633, "code": "1F353", "char": "🍓", "name": "strawberry" }, { "no": 1634, "code": "1F95D", "char": "🥝", "name": "kiwi fruit" }, { "no": 1635, "code": "1F345", "char": "🍅", "name": "tomato" }, { "no": 1636, "code": "1F965", "char": "🥥", "name": "⊛ coconut" }, { "no": 1637, "code": "1F951", "char": "🥑", "name": "avocado" }, { "no": 1638, "code": "1F346", "char": "🍆", "name": "eggplant" }, { "no": 1639, "code": "1F954", "char": "🥔", "name": "potato" }, { "no": 1640, "code": "1F955", "char": "🥕", "name": "carrot" }, { "no": 1641, "code": "1F33D", "char": "🌽", "name": "ear of corn" }, { "no": 1642, "code": "1F336", "char": "🌶", "name": "hot pepper" }, { "no": 1643, "code": "1F952", "char": "🥒", "name": "cucumber" }, { "no": 1644, "code": "1F966", "char": "🥦", "name": "⊛ broccoli" }, { "no": 1645, "code": "1F344", "char": "🍄", "name": "mushroom" }, { "no": 1646, "code": "1F95C", "char": "🥜", "name": "peanuts" }, { "no": 1647, "code": "1F330", "char": "🌰", "name": "chestnut" }, { "no": 1648, "code": "1F35E", "char": "🍞", "name": "bread" }, { "no": 1649, "code": "1F950", "char": "🥐", "name": "croissant" }, { "no": 1650, "code": "1F956", "char": "🥖", "name": "baguette bread" }, { "no": 1651, "code": "1F968", "char": "🥨", "name": "⊛ pretzel" }, { "no": 1652, "code": "1F95E", "char": "🥞", "name": "pancakes" }, { "no": 1653, "code": "1F9C0", "char": "🧀", "name": "cheese wedge" }, { "no": 1654, "code": "1F356", "char": "🍖", "name": "meat on bone" }, { "no": 1655, "code": "1F357", "char": "🍗", "name": "poultry leg" }, { "no": 1656, "code": "1F969", "char": "🥩", "name": "⊛ cut of meat" }, { "no": 1657, "code": "1F953", "char": "🥓", "name": "bacon" }, { "no": 1658, "code": "1F354", "char": "🍔", "name": "hamburger" }, { "no": 1659, "code": "1F35F", "char": "🍟", "name": "french fries" }, { "no": 1660, "code": "1F355", "char": "🍕", "name": "pizza" }, { "no": 1661, "code": "1F32D", "char": "🌭", "name": "hot dog" }, { "no": 1662, "code": "1F96A", "char": "🥪", "name": "⊛ sandwich" }, { "no": 1663, "code": "1F32E", "char": "🌮", "name": "taco" }, { "no": 1664, "code": "1F32F", "char": "🌯", "name": "burrito" }, { "no": 1665, "code": "1F959", "char": "🥙", "name": "stuffed flatbread" }, { "no": 1666, "code": "1F95A", "char": "🥚", "name": "egg" }, { "no": 1667, "code": "1F373", "char": "🍳", "name": "cooking" }, { "no": 1668, "code": "1F958", "char": "🥘", "name": "shallow pan of food" }, { "no": 1669, "code": "1F372", "char": "🍲", "name": "pot of food" }, { "no": 1670, "code": "1F963", "char": "🥣", "name": "⊛ bowl with spoon" }, { "no": 1671, "code": "1F957", "char": "🥗", "name": "green salad" }, { "no": 1672, "code": "1F37F", "char": "🍿", "name": "popcorn" }, { "no": 1673, "code": "1F96B", "char": "🥫", "name": "⊛ canned food" }, { "no": 1674, "code": "1F371", "char": "🍱", "name": "bento box" }, { "no": 1675, "code": "1F358", "char": "🍘", "name": "rice cracker" }, { "no": 1676, "code": "1F359", "char": "🍙", "name": "rice ball" }, { "no": 1677, "code": "1F35A", "char": "🍚", "name": "cooked rice" }, { "no": 1678, "code": "1F35B", "char": "🍛", "name": "curry rice" }, { "no": 1679, "code": "1F35C", "char": "🍜", "name": "steaming bowl" }, { "no": 1680, "code": "1F35D", "char": "🍝", "name": "spaghetti" }, { "no": 1681, "code": "1F360", "char": "🍠", "name": "roasted sweet potato" }, { "no": 1682, "code": "1F362", "char": "🍢", "name": "oden" }, { "no": 1683, "code": "1F363", "char": "🍣", "name": "sushi" }, { "no": 1684, "code": "1F364", "char": "🍤", "name": "fried shrimp" }, { "no": 1685, "code": "1F365", "char": "🍥", "name": "fish cake with swirl" }, { "no": 1686, "code": "1F361", "char": "🍡", "name": "dango" }, { "no": 1687, "code": "1F95F", "char": "🥟", "name": "⊛ dumpling" }, { "no": 1688, "code": "1F960", "char": "🥠", "name": "⊛ fortune cookie" }, { "no": 1689, "code": "1F961", "char": "🥡", "name": "⊛ takeout box" }, { "no": 1690, "code": "1F366", "char": "🍦", "name": "soft ice cream" }, { "no": 1691, "code": "1F367", "char": "🍧", "name": "shaved ice" }, { "no": 1692, "code": "1F368", "char": "🍨", "name": "ice cream" }, { "no": 1693, "code": "1F369", "char": "🍩", "name": "doughnut" }, { "no": 1694, "code": "1F36A", "char": "🍪", "name": "cookie" }, { "no": 1695, "code": "1F382", "char": "🎂", "name": "birthday cake" }, { "no": 1696, "code": "1F370", "char": "🍰", "name": "shortcake" }, { "no": 1697, "code": "1F967", "char": "🥧", "name": "⊛ pie" }, { "no": 1698, "code": "1F36B", "char": "🍫", "name": "chocolate bar" }, { "no": 1699, "code": "1F36C", "char": "🍬", "name": "candy" }, { "no": 1700, "code": "1F36D", "char": "🍭", "name": "lollipop" }, { "no": 1701, "code": "1F36E", "char": "🍮", "name": "custard" }, { "no": 1702, "code": "1F36F", "char": "🍯", "name": "honey pot" }, { "no": 1703, "code": "1F37C", "char": "🍼", "name": "baby bottle" }, { "no": 1704, "code": "1F95B", "char": "🥛", "name": "glass of milk" }, { "no": 1705, "code": "2615", "char": "☕", "name": "hot beverage" }, { "no": 1706, "code": "1F375", "char": "🍵", "name": "teacup without handle" }, { "no": 1707, "code": "1F376", "char": "🍶", "name": "sake" }, { "no": 1708, "code": "1F37E", "char": "🍾", "name": "bottle with popping cork" }, { "no": 1709, "code": "1F377", "char": "🍷", "name": "wine glass" }, { "no": 1710, "code": "1F378", "char": "🍸", "name": "cocktail glass" }, { "no": 1711, "code": "1F379", "char": "🍹", "name": "tropical drink" }, { "no": 1712, "code": "1F37A", "char": "🍺", "name": "beer mug" }, { "no": 1713, "code": "1F37B", "char": "🍻", "name": "clinking beer mugs" }, { "no": 1714, "code": "1F942", "char": "🥂", "name": "clinking glasses" }, { "no": 1715, "code": "1F943", "char": "🥃", "name": "tumbler glass" }, { "no": 1716, "code": "1F964", "char": "🥤", "name": "⊛ cup with straw" }, { "no": 1717, "code": "1F962", "char": "🥢", "name": "⊛ chopsticks" }, { "no": 1718, "code": "1F37D", "char": "🍽", "name": "fork and knife with plate" }, { "no": 1719, "code": "1F374", "char": "🍴", "name": "fork and knife" }, { "no": 1720, "code": "1F944", "char": "🥄", "name": "spoon" }, { "no": 1721, "code": "1F52A", "char": "🔪", "name": "kitchen knife" }, { "no": 1722, "code": "1F3FA", "char": "🏺", "name": "amphora" }, { "no": 1723, "code": "1F30D", "char": "🌍", "name": "globe showing Europe-Africa" }, { "no": 1724, "code": "1F30E", "char": "🌎", "name": "globe showing Americas" }, { "no": 1725, "code": "1F30F", "char": "🌏", "name": "globe showing Asia-Australia" }, { "no": 1726, "code": "1F310", "char": "🌐", "name": "globe with meridians" }, { "no": 1727, "code": "1F5FA", "char": "🗺", "name": "world map" }, { "no": 1728, "code": "1F5FE", "char": "🗾", "name": "map of Japan" }, { "no": 1729, "code": "1F3D4", "char": "🏔", "name": "snow-capped mountain" }, { "no": 1730, "code": "26F0", "char": "⛰", "name": "mountain" }, { "no": 1731, "code": "1F30B", "char": "🌋", "name": "volcano" }, { "no": 1732, "code": "1F5FB", "char": "🗻", "name": "mount fuji" }, { "no": 1733, "code": "1F3D5", "char": "🏕", "name": "camping" }, { "no": 1734, "code": "1F3D6", "char": "🏖", "name": "beach with umbrella" }, { "no": 1735, "code": "1F3DC", "char": "🏜", "name": "desert" }, { "no": 1736, "code": "1F3DD", "char": "🏝", "name": "desert island" }, { "no": 1737, "code": "1F3DE", "char": "🏞", "name": "national park" }, { "no": 1738, "code": "1F3DF", "char": "🏟", "name": "stadium" }, { "no": 1739, "code": "1F3DB", "char": "🏛", "name": "classical building" }, { "no": 1740, "code": "1F3D7", "char": "🏗", "name": "building construction" }, { "no": 1741, "code": "1F3D8", "char": "🏘", "name": "houses" }, { "no": 1742, "code": "1F3D9", "char": "🏙", "name": "cityscape" }, { "no": 1743, "code": "1F3DA", "char": "🏚", "name": "derelict house" }, { "no": 1744, "code": "1F3E0", "char": "🏠", "name": "house" }, { "no": 1745, "code": "1F3E1", "char": "🏡", "name": "house with garden" }, { "no": 1746, "code": "1F3E2", "char": "🏢", "name": "office building" }, { "no": 1747, "code": "1F3E3", "char": "🏣", "name": "Japanese post office" }, { "no": 1748, "code": "1F3E4", "char": "🏤", "name": "post office" }, { "no": 1749, "code": "1F3E5", "char": "🏥", "name": "hospital" }, { "no": 1750, "code": "1F3E6", "char": "🏦", "name": "bank" }, { "no": 1751, "code": "1F3E8", "char": "🏨", "name": "hotel" }, { "no": 1752, "code": "1F3E9", "char": "🏩", "name": "love hotel" }, { "no": 1753, "code": "1F3EA", "char": "🏪", "name": "convenience store" }, { "no": 1754, "code": "1F3EB", "char": "🏫", "name": "school" }, { "no": 1755, "code": "1F3EC", "char": "🏬", "name": "department store" }, { "no": 1756, "code": "1F3ED", "char": "🏭", "name": "factory" }, { "no": 1757, "code": "1F3EF", "char": "🏯", "name": "Japanese castle" }, { "no": 1758, "code": "1F3F0", "char": "🏰", "name": "castle" }, { "no": 1759, "code": "1F492", "char": "💒", "name": "wedding" }, { "no": 1760, "code": "1F5FC", "char": "🗼", "name": "Tokyo tower" }, { "no": 1761, "code": "1F5FD", "char": "🗽", "name": "Statue of Liberty" }, { "no": 1762, "code": "26EA", "char": "⛪", "name": "church" }, { "no": 1763, "code": "1F54C", "char": "🕌", "name": "mosque" }, { "no": 1764, "code": "1F54D", "char": "🕍", "name": "synagogue" }, { "no": 1765, "code": "26E9", "char": "⛩", "name": "shinto shrine" }, { "no": 1766, "code": "1F54B", "char": "🕋", "name": "kaaba" }, { "no": 1767, "code": "26F2", "char": "⛲", "name": "fountain" }, { "no": 1768, "code": "26FA", "char": "⛺", "name": "tent" }, { "no": 1769, "code": "1F301", "char": "🌁", "name": "foggy" }, { "no": 1770, "code": "1F303", "char": "🌃", "name": "night with stars" }, { "no": 1771, "code": "1F304", "char": "🌄", "name": "sunrise over mountains" }, { "no": 1772, "code": "1F305", "char": "🌅", "name": "sunrise" }, { "no": 1773, "code": "1F306", "char": "🌆", "name": "cityscape at dusk" }, { "no": 1774, "code": "1F307", "char": "🌇", "name": "sunset" }, { "no": 1775, "code": "1F309", "char": "🌉", "name": "bridge at night" }, { "no": 1776, "code": "2668", "char": "♨", "name": "hot springs" }, { "no": 1777, "code": "1F30C", "char": "🌌", "name": "milky way" }, { "no": 1778, "code": "1F3A0", "char": "🎠", "name": "carousel horse" }, { "no": 1779, "code": "1F3A1", "char": "🎡", "name": "ferris wheel" }, { "no": 1780, "code": "1F3A2", "char": "🎢", "name": "roller coaster" }, { "no": 1781, "code": "1F488", "char": "💈", "name": "barber pole" }, { "no": 1782, "code": "1F3AA", "char": "🎪", "name": "circus tent" }, { "no": 1783, "code": "1F3AD", "char": "🎭", "name": "performing arts" }, { "no": 1784, "code": "1F5BC", "char": "🖼", "name": "framed picture" }, { "no": 1785, "code": "1F3A8", "char": "🎨", "name": "artist palette" }, { "no": 1786, "code": "1F3B0", "char": "🎰", "name": "slot machine" }, { "no": 1787, "code": "1F682", "char": "🚂", "name": "locomotive" }, { "no": 1788, "code": "1F683", "char": "🚃", "name": "railway car" }, { "no": 1789, "code": "1F684", "char": "🚄", "name": "high-speed train" }, { "no": 1790, "code": "1F685", "char": "🚅", "name": "bullet train" }, { "no": 1791, "code": "1F686", "char": "🚆", "name": "train" }, { "no": 1792, "code": "1F687", "char": "🚇", "name": "metro" }, { "no": 1793, "code": "1F688", "char": "🚈", "name": "light rail" }, { "no": 1794, "code": "1F689", "char": "🚉", "name": "station" }, { "no": 1795, "code": "1F68A", "char": "🚊", "name": "tram" }, { "no": 1796, "code": "1F69D", "char": "🚝", "name": "monorail" }, { "no": 1797, "code": "1F69E", "char": "🚞", "name": "mountain railway" }, { "no": 1798, "code": "1F68B", "char": "🚋", "name": "tram car" }, { "no": 1799, "code": "1F68C", "char": "🚌", "name": "bus" }, { "no": 1800, "code": "1F68D", "char": "🚍", "name": "oncoming bus" }, { "no": 1801, "code": "1F68E", "char": "🚎", "name": "trolleybus" }, { "no": 1802, "code": "1F690", "char": "🚐", "name": "minibus" }, { "no": 1803, "code": "1F691", "char": "🚑", "name": "ambulance" }, { "no": 1804, "code": "1F692", "char": "🚒", "name": "fire engine" }, { "no": 1805, "code": "1F693", "char": "🚓", "name": "police car" }, { "no": 1806, "code": "1F694", "char": "🚔", "name": "oncoming police car" }, { "no": 1807, "code": "1F695", "char": "🚕", "name": "taxi" }, { "no": 1808, "code": "1F696", "char": "🚖", "name": "oncoming taxi" }, { "no": 1809, "code": "1F697", "char": "🚗", "name": "automobile" }, { "no": 1810, "code": "1F698", "char": "🚘", "name": "oncoming automobile" }, { "no": 1811, "code": "1F699", "char": "🚙", "name": "sport utility vehicle" }, { "no": 1812, "code": "1F69A", "char": "🚚", "name": "delivery truck" }, { "no": 1813, "code": "1F69B", "char": "🚛", "name": "articulated lorry" }, { "no": 1814, "code": "1F69C", "char": "🚜", "name": "tractor" }, { "no": 1815, "code": "1F6B2", "char": "🚲", "name": "bicycle" }, { "no": 1816, "code": "1F6F4", "char": "🛴", "name": "kick scooter" }, { "no": 1817, "code": "1F6F5", "char": "🛵", "name": "motor scooter" }, { "no": 1818, "code": "1F68F", "char": "🚏", "name": "bus stop" }, { "no": 1819, "code": "1F6E3", "char": "🛣", "name": "motorway" }, { "no": 1820, "code": "1F6E4", "char": "🛤", "name": "railway track" }, { "no": 1821, "code": "26FD", "char": "⛽", "name": "fuel pump" }, { "no": 1822, "code": "1F6A8", "char": "🚨", "name": "police car light" }, { "no": 1823, "code": "1F6A5", "char": "🚥", "name": "horizontal traffic light" }, { "no": 1824, "code": "1F6A6", "char": "🚦", "name": "vertical traffic light" }, { "no": 1825, "code": "1F6A7", "char": "🚧", "name": "construction" }, { "no": 1826, "code": "1F6D1", "char": "🛑", "name": "stop sign" }, { "no": 1827, "code": "2693", "char": "⚓", "name": "anchor" }, { "no": 1828, "code": "26F5", "char": "⛵", "name": "sailboat" }, { "no": 1829, "code": "1F6F6", "char": "🛶", "name": "canoe" }, { "no": 1830, "code": "1F6A4", "char": "🚤", "name": "speedboat" }, { "no": 1831, "code": "1F6F3", "char": "🛳", "name": "passenger ship" }, { "no": 1832, "code": "26F4", "char": "⛴", "name": "ferry" }, { "no": 1833, "code": "1F6E5", "char": "🛥", "name": "motor boat" }, { "no": 1834, "code": "1F6A2", "char": "🚢", "name": "ship" }, { "no": 1835, "code": "2708", "char": "✈", "name": "airplane" }, { "no": 1836, "code": "1F6E9", "char": "🛩", "name": "small airplane" }, { "no": 1837, "code": "1F6EB", "char": "🛫", "name": "airplane departure" }, { "no": 1838, "code": "1F6EC", "char": "🛬", "name": "airplane arrival" }, { "no": 1839, "code": "1F4BA", "char": "💺", "name": "seat" }, { "no": 1840, "code": "1F681", "char": "🚁", "name": "helicopter" }, { "no": 1841, "code": "1F69F", "char": "🚟", "name": "suspension railway" }, { "no": 1842, "code": "1F6A0", "char": "🚠", "name": "mountain cableway" }, { "no": 1843, "code": "1F6A1", "char": "🚡", "name": "aerial tramway" }, { "no": 1844, "code": "1F6F0", "char": "🛰", "name": "satellite" }, { "no": 1845, "code": "1F680", "char": "🚀", "name": "rocket" }, { "no": 1846, "code": "1F6F8", "char": "🛸", "name": "⊛ flying saucer" }, { "no": 1847, "code": "1F6CE", "char": "🛎", "name": "bellhop bell" }, { "no": 1848, "code": "1F6AA", "char": "🚪", "name": "door" }, { "no": 1849, "code": "1F6CF", "char": "🛏", "name": "bed" }, { "no": 1850, "code": "1F6CB", "char": "🛋", "name": "couch and lamp" }, { "no": 1851, "code": "1F6BD", "char": "🚽", "name": "toilet" }, { "no": 1852, "code": "1F6BF", "char": "🚿", "name": "shower" }, { "no": 1853, "code": "1F6C1", "char": "🛁", "name": "bathtub" }, { "no": 1854, "code": "231B", "char": "⌛", "name": "hourglass done" }, { "no": 1855, "code": "23F3", "char": "⏳", "name": "hourglass not done" }, { "no": 1856, "code": "231A", "char": "⌚", "name": "watch" }, { "no": 1857, "code": "23F0", "char": "⏰", "name": "alarm clock" }, { "no": 1858, "code": "23F1", "char": "⏱", "name": "stopwatch" }, { "no": 1859, "code": "23F2", "char": "⏲", "name": "timer clock" }, { "no": 1860, "code": "1F570", "char": "🕰", "name": "mantelpiece clock" }, { "no": 1861, "code": "1F55B", "char": "🕛", "name": "twelve o’clock" }, { "no": 1862, "code": "1F567", "char": "🕧", "name": "twelve-thirty" }, { "no": 1863, "code": "1F550", "char": "🕐", "name": "one o’clock" }, { "no": 1864, "code": "1F55C", "char": "🕜", "name": "one-thirty" }, { "no": 1865, "code": "1F551", "char": "🕑", "name": "two o’clock" }, { "no": 1866, "code": "1F55D", "char": "🕝", "name": "two-thirty" }, { "no": 1867, "code": "1F552", "char": "🕒", "name": "three o’clock" }, { "no": 1868, "code": "1F55E", "char": "🕞", "name": "three-thirty" }, { "no": 1869, "code": "1F553", "char": "🕓", "name": "four o’clock" }, { "no": 1870, "code": "1F55F", "char": "🕟", "name": "four-thirty" }, { "no": 1871, "code": "1F554", "char": "🕔", "name": "five o’clock" }, { "no": 1872, "code": "1F560", "char": "🕠", "name": "five-thirty" }, { "no": 1873, "code": "1F555", "char": "🕕", "name": "six o’clock" }, { "no": 1874, "code": "1F561", "char": "🕡", "name": "six-thirty" }, { "no": 1875, "code": "1F556", "char": "🕖", "name": "seven o’clock" }, { "no": 1876, "code": "1F562", "char": "🕢", "name": "seven-thirty" }, { "no": 1877, "code": "1F557", "char": "🕗", "name": "eight o’clock" }, { "no": 1878, "code": "1F563", "char": "🕣", "name": "eight-thirty" }, { "no": 1879, "code": "1F558", "char": "🕘", "name": "nine o’clock" }, { "no": 1880, "code": "1F564", "char": "🕤", "name": "nine-thirty" }, { "no": 1881, "code": "1F559", "char": "🕙", "name": "ten o’clock" }, { "no": 1882, "code": "1F565", "char": "🕥", "name": "ten-thirty" }, { "no": 1883, "code": "1F55A", "char": "🕚", "name": "eleven o’clock" }, { "no": 1884, "code": "1F566", "char": "🕦", "name": "eleven-thirty" }, { "no": 1885, "code": "1F311", "char": "🌑", "name": "new moon" }, { "no": 1886, "code": "1F312", "char": "🌒", "name": "waxing crescent moon" }, { "no": 1887, "code": "1F313", "char": "🌓", "name": "first quarter moon" }, { "no": 1888, "code": "1F314", "char": "🌔", "name": "waxing gibbous moon" }, { "no": 1889, "code": "1F315", "char": "🌕", "name": "full moon" }, { "no": 1890, "code": "1F316", "char": "🌖", "name": "waning gibbous moon" }, { "no": 1891, "code": "1F317", "char": "🌗", "name": "last quarter moon" }, { "no": 1892, "code": "1F318", "char": "🌘", "name": "waning crescent moon" }, { "no": 1893, "code": "1F319", "char": "🌙", "name": "crescent moon" }, { "no": 1894, "code": "1F31A", "char": "🌚", "name": "new moon face" }, { "no": 1895, "code": "1F31B", "char": "🌛", "name": "first quarter moon face" }, { "no": 1896, "code": "1F31C", "char": "🌜", "name": "last quarter moon face" }, { "no": 1897, "code": "1F321", "char": "🌡", "name": "thermometer" }, { "no": 1898, "code": "2600", "char": "☀", "name": "sun" }, { "no": 1899, "code": "1F31D", "char": "🌝", "name": "full moon face" }, { "no": 1900, "code": "1F31E", "char": "🌞", "name": "sun with face" }, { "no": 1901, "code": "2B50", "char": "⭐", "name": "white medium star" }, { "no": 1902, "code": "1F31F", "char": "🌟", "name": "glowing star" }, { "no": 1903, "code": "1F320", "char": "🌠", "name": "shooting star" }, { "no": 1904, "code": "2601", "char": "☁", "name": "cloud" }, { "no": 1905, "code": "26C5", "char": "⛅", "name": "sun behind cloud" }, { "no": 1906, "code": "26C8", "char": "⛈", "name": "cloud with lightning and rain" }, { "no": 1907, "code": "1F324", "char": "🌤", "name": "sun behind small cloud" }, { "no": 1908, "code": "1F325", "char": "🌥", "name": "sun behind large cloud" }, { "no": 1909, "code": "1F326", "char": "🌦", "name": "sun behind rain cloud" }, { "no": 1910, "code": "1F327", "char": "🌧", "name": "cloud with rain" }, { "no": 1911, "code": "1F328", "char": "🌨", "name": "cloud with snow" }, { "no": 1912, "code": "1F329", "char": "🌩", "name": "cloud with lightning" }, { "no": 1913, "code": "1F32A", "char": "🌪", "name": "tornado" }, { "no": 1914, "code": "1F32B", "char": "🌫", "name": "fog" }, { "no": 1915, "code": "1F32C", "char": "🌬", "name": "wind face" }, { "no": 1916, "code": "1F300", "char": "🌀", "name": "cyclone" }, { "no": 1917, "code": "1F308", "char": "🌈", "name": "rainbow" }, { "no": 1918, "code": "1F302", "char": "🌂", "name": "closed umbrella" }, { "no": 1919, "code": "2602", "char": "☂", "name": "umbrella" }, { "no": 1920, "code": "2614", "char": "☔", "name": "umbrella with rain drops" }, { "no": 1921, "code": "26F1", "char": "⛱", "name": "umbrella on ground" }, { "no": 1922, "code": "26A1", "char": "⚡", "name": "high voltage" }, { "no": 1923, "code": "2744", "char": "❄", "name": "snowflake" }, { "no": 1924, "code": "2603", "char": "☃", "name": "snowman" }, { "no": 1925, "code": "26C4", "char": "⛄", "name": "snowman without snow" }, { "no": 1926, "code": "2604", "char": "☄", "name": "comet" }, { "no": 1927, "code": "1F525", "char": "🔥", "name": "fire" }, { "no": 1928, "code": "1F4A7", "char": "💧", "name": "droplet" }, { "no": 1929, "code": "1F30A", "char": "🌊", "name": "water wave" }, { "no": 1930, "code": "1F383", "char": "🎃", "name": "jack-o-lantern" }, { "no": 1931, "code": "1F384", "char": "🎄", "name": "Christmas tree" }, { "no": 1932, "code": "1F386", "char": "🎆", "name": "fireworks" }, { "no": 1933, "code": "1F387", "char": "🎇", "name": "sparkler" }, { "no": 1934, "code": "2728", "char": "✨", "name": "sparkles" }, { "no": 1935, "code": "1F388", "char": "🎈", "name": "balloon" }, { "no": 1936, "code": "1F389", "char": "🎉", "name": "party popper" }, { "no": 1937, "code": "1F38A", "char": "🎊", "name": "confetti ball" }, { "no": 1938, "code": "1F38B", "char": "🎋", "name": "tanabata tree" }, { "no": 1939, "code": "1F38D", "char": "🎍", "name": "pine decoration" }, { "no": 1940, "code": "1F38E", "char": "🎎", "name": "Japanese dolls" }, { "no": 1941, "code": "1F38F", "char": "🎏", "name": "carp streamer" }, { "no": 1942, "code": "1F390", "char": "🎐", "name": "wind chime" }, { "no": 1943, "code": "1F391", "char": "🎑", "name": "moon viewing ceremony" }, { "no": 1944, "code": "1F380", "char": "🎀", "name": "ribbon" }, { "no": 1945, "code": "1F381", "char": "🎁", "name": "wrapped gift" }, { "no": 1946, "code": "1F397", "char": "🎗", "name": "reminder ribbon" }, { "no": 1947, "code": "1F39F", "char": "🎟", "name": "admission tickets" }, { "no": 1948, "code": "1F3AB", "char": "🎫", "name": "ticket" }, { "no": 1949, "code": "1F396", "char": "🎖", "name": "military medal" }, { "no": 1950, "code": "1F3C6", "char": "🏆", "name": "trophy" }, { "no": 1951, "code": "1F3C5", "char": "🏅", "name": "sports medal" }, { "no": 1952, "code": "1F947", "char": "🥇", "name": "1st place medal" }, { "no": 1953, "code": "1F948", "char": "🥈", "name": "2nd place medal" }, { "no": 1954, "code": "1F949", "char": "🥉", "name": "3rd place medal" }, { "no": 1955, "code": "26BD", "char": "⚽", "name": "soccer ball" }, { "no": 1956, "code": "26BE", "char": "⚾", "name": "baseball" }, { "no": 1957, "code": "1F3C0", "char": "🏀", "name": "basketball" }, { "no": 1958, "code": "1F3D0", "char": "🏐", "name": "volleyball" }, { "no": 1959, "code": "1F3C8", "char": "🏈", "name": "american football" }, { "no": 1960, "code": "1F3C9", "char": "🏉", "name": "rugby football" }, { "no": 1961, "code": "1F3BE", "char": "🎾", "name": "tennis" }, { "no": 1962, "code": "1F3B1", "char": "🎱", "name": "pool 8 ball" }, { "no": 1963, "code": "1F3B3", "char": "🎳", "name": "bowling" }, { "no": 1964, "code": "1F3CF", "char": "🏏", "name": "cricket game" }, { "no": 1965, "code": "1F3D1", "char": "🏑", "name": "field hockey" }, { "no": 1966, "code": "1F3D2", "char": "🏒", "name": "ice hockey" }, { "no": 1967, "code": "1F3D3", "char": "🏓", "name": "ping pong" }, { "no": 1968, "code": "1F3F8", "char": "🏸", "name": "badminton" }, { "no": 1969, "code": "1F94A", "char": "🥊", "name": "boxing glove" }, { "no": 1970, "code": "1F94B", "char": "🥋", "name": "martial arts uniform" }, { "no": 1971, "code": "1F945", "char": "🥅", "name": "goal net" }, { "no": 1972, "code": "1F3AF", "char": "🎯", "name": "direct hit" }, { "no": 1973, "code": "26F3", "char": "⛳", "name": "flag in hole" }, { "no": 1974, "code": "26F8", "char": "⛸", "name": "ice skate" }, { "no": 1975, "code": "1F3A3", "char": "🎣", "name": "fishing pole" }, { "no": 1976, "code": "1F3BD", "char": "🎽", "name": "running shirt" }, { "no": 1977, "code": "1F3BF", "char": "🎿", "name": "skis" }, { "no": 1978, "code": "1F6F7", "char": "🛷", "name": "⊛ sled" }, { "no": 1979, "code": "1F94C", "char": "🥌", "name": "⊛ curling stone" }, { "no": 1980, "code": "1F3AE", "char": "🎮", "name": "video game" }, { "no": 1981, "code": "1F579", "char": "🕹", "name": "joystick" }, { "no": 1982, "code": "1F3B2", "char": "🎲", "name": "game die" }, { "no": 1983, "code": "2660", "char": "♠", "name": "spade suit" }, { "no": 1984, "code": "2665", "char": "♥", "name": "heart suit" }, { "no": 1985, "code": "2666", "char": "♦", "name": "diamond suit" }, { "no": 1986, "code": "2663", "char": "♣", "name": "club suit" }, { "no": 1987, "code": "1F0CF", "char": "🃏", "name": "joker" }, { "no": 1988, "code": "1F004", "char": "🀄", "name": "mahjong red dragon" }, { "no": 1989, "code": "1F3B4", "char": "🎴", "name": "flower playing cards" }, { "no": 1990, "code": "1F507", "char": "🔇", "name": "muted speaker" }, { "no": 1991, "code": "1F508", "char": "🔈", "name": "speaker low volume" }, { "no": 1992, "code": "1F509", "char": "🔉", "name": "speaker medium volume" }, { "no": 1993, "code": "1F50A", "char": "🔊", "name": "speaker high volume" }, { "no": 1994, "code": "1F4E2", "char": "📢", "name": "loudspeaker" }, { "no": 1995, "code": "1F4E3", "char": "📣", "name": "megaphone" }, { "no": 1996, "code": "1F4EF", "char": "📯", "name": "postal horn" }, { "no": 1997, "code": "1F514", "char": "🔔", "name": "bell" }, { "no": 1998, "code": "1F515", "char": "🔕", "name": "bell with slash" }, { "no": 1999, "code": "1F3BC", "char": "🎼", "name": "musical score" }, { "no": 2000, "code": "1F3B5", "char": "🎵", "name": "musical note" }, { "no": 2001, "code": "1F3B6", "char": "🎶", "name": "musical notes" }, { "no": 2002, "code": "1F399", "char": "🎙", "name": "studio microphone" }, { "no": 2003, "code": "1F39A", "char": "🎚", "name": "level slider" }, { "no": 2004, "code": "1F39B", "char": "🎛", "name": "control knobs" }, { "no": 2005, "code": "1F3A4", "char": "🎤", "name": "microphone" }, { "no": 2006, "code": "1F3A7", "char": "🎧", "name": "headphone" }, { "no": 2007, "code": "1F4FB", "char": "📻", "name": "radio" }, { "no": 2008, "code": "1F3B7", "char": "🎷", "name": "saxophone" }, { "no": 2009, "code": "1F3B8", "char": "🎸", "name": "guitar" }, { "no": 2010, "code": "1F3B9", "char": "🎹", "name": "musical keyboard" }, { "no": 2011, "code": "1F3BA", "char": "🎺", "name": "trumpet" }, { "no": 2012, "code": "1F3BB", "char": "🎻", "name": "violin" }, { "no": 2013, "code": "1F941", "char": "🥁", "name": "drum" }, { "no": 2014, "code": "1F4F1", "char": "📱", "name": "mobile phone" }, { "no": 2015, "code": "1F4F2", "char": "📲", "name": "mobile phone with arrow" }, { "no": 2016, "code": "260E", "char": "☎", "name": "telephone" }, { "no": 2017, "code": "1F4DE", "char": "📞", "name": "telephone receiver" }, { "no": 2018, "code": "1F4DF", "char": "📟", "name": "pager" }, { "no": 2019, "code": "1F4E0", "char": "📠", "name": "fax machine" }, { "no": 2020, "code": "1F50B", "char": "🔋", "name": "battery" }, { "no": 2021, "code": "1F50C", "char": "🔌", "name": "electric plug" }, { "no": 2022, "code": "1F4BB", "char": "💻", "name": "laptop computer" }, { "no": 2023, "code": "1F5A5", "char": "🖥", "name": "desktop computer" }, { "no": 2024, "code": "1F5A8", "char": "🖨", "name": "printer" }, { "no": 2025, "code": "2328", "char": "⌨", "name": "keyboard" }, { "no": 2026, "code": "1F5B1", "char": "🖱", "name": "computer mouse" }, { "no": 2027, "code": "1F5B2", "char": "🖲", "name": "trackball" }, { "no": 2028, "code": "1F4BD", "char": "💽", "name": "computer disk" }, { "no": 2029, "code": "1F4BE", "char": "💾", "name": "floppy disk" }, { "no": 2030, "code": "1F4BF", "char": "💿", "name": "optical disk" }, { "no": 2031, "code": "1F4C0", "char": "📀", "name": "dvd" }, { "no": 2032, "code": "1F3A5", "char": "🎥", "name": "movie camera" }, { "no": 2033, "code": "1F39E", "char": "🎞", "name": "film frames" }, { "no": 2034, "code": "1F4FD", "char": "📽", "name": "film projector" }, { "no": 2035, "code": "1F3AC", "char": "🎬", "name": "clapper board" }, { "no": 2036, "code": "1F4FA", "char": "📺", "name": "television" }, { "no": 2037, "code": "1F4F7", "char": "📷", "name": "camera" }, { "no": 2038, "code": "1F4F8", "char": "📸", "name": "camera with flash" }, { "no": 2039, "code": "1F4F9", "char": "📹", "name": "video camera" }, { "no": 2040, "code": "1F4FC", "char": "📼", "name": "videocassette" }, { "no": 2041, "code": "1F50D", "char": "🔍", "name": "magnifying glass tilted left" }, { "no": 2042, "code": "1F50E", "char": "🔎", "name": "magnifying glass tilted right" }, { "no": 2043, "code": "1F52C", "char": "🔬", "name": "microscope" }, { "no": 2044, "code": "1F52D", "char": "🔭", "name": "telescope" }, { "no": 2045, "code": "1F4E1", "char": "📡", "name": "satellite antenna" }, { "no": 2046, "code": "1F56F", "char": "🕯", "name": "candle" }, { "no": 2047, "code": "1F4A1", "char": "💡", "name": "light bulb" }, { "no": 2048, "code": "1F526", "char": "🔦", "name": "flashlight" }, { "no": 2049, "code": "1F3EE", "char": "🏮", "name": "red paper lantern" }, { "no": 2050, "code": "1F4D4", "char": "📔", "name": "notebook with decorative cover" }, { "no": 2051, "code": "1F4D5", "char": "📕", "name": "closed book" }, { "no": 2052, "code": "1F4D6", "char": "📖", "name": "open book" }, { "no": 2053, "code": "1F4D7", "char": "📗", "name": "green book" }, { "no": 2054, "code": "1F4D8", "char": "📘", "name": "blue book" }, { "no": 2055, "code": "1F4D9", "char": "📙", "name": "orange book" }, { "no": 2056, "code": "1F4DA", "char": "📚", "name": "books" }, { "no": 2057, "code": "1F4D3", "char": "📓", "name": "notebook" }, { "no": 2058, "code": "1F4D2", "char": "📒", "name": "ledger" }, { "no": 2059, "code": "1F4C3", "char": "📃", "name": "page with curl" }, { "no": 2060, "code": "1F4DC", "char": "📜", "name": "scroll" }, { "no": 2061, "code": "1F4C4", "char": "📄", "name": "page facing up" }, { "no": 2062, "code": "1F4F0", "char": "📰", "name": "newspaper" }, { "no": 2063, "code": "1F5DE", "char": "🗞", "name": "rolled-up newspaper" }, { "no": 2064, "code": "1F4D1", "char": "📑", "name": "bookmark tabs" }, { "no": 2065, "code": "1F516", "char": "🔖", "name": "bookmark" }, { "no": 2066, "code": "1F3F7", "char": "🏷", "name": "label" }, { "no": 2067, "code": "1F4B0", "char": "💰", "name": "money bag" }, { "no": 2068, "code": "1F4B4", "char": "💴", "name": "yen banknote" }, { "no": 2069, "code": "1F4B5", "char": "💵", "name": "dollar banknote" }, { "no": 2070, "code": "1F4B6", "char": "💶", "name": "euro banknote" }, { "no": 2071, "code": "1F4B7", "char": "💷", "name": "pound banknote" }, { "no": 2072, "code": "1F4B8", "char": "💸", "name": "money with wings" }, { "no": 2073, "code": "1F4B3", "char": "💳", "name": "credit card" }, { "no": 2074, "code": "1F4B9", "char": "💹", "name": "chart increasing with yen" }, { "no": 2075, "code": "1F4B1", "char": "💱", "name": "currency exchange" }, { "no": 2076, "code": "1F4B2", "char": "💲", "name": "heavy dollar sign" }, { "no": 2077, "code": "2709", "char": "✉", "name": "envelope" }, { "no": 2078, "code": "1F4E7", "char": "📧", "name": "e-mail" }, { "no": 2079, "code": "1F4E8", "char": "📨", "name": "incoming envelope" }, { "no": 2080, "code": "1F4E9", "char": "📩", "name": "envelope with arrow" }, { "no": 2081, "code": "1F4E4", "char": "📤", "name": "outbox tray" }, { "no": 2082, "code": "1F4E5", "char": "📥", "name": "inbox tray" }, { "no": 2083, "code": "1F4E6", "char": "📦", "name": "package" }, { "no": 2084, "code": "1F4EB", "char": "📫", "name": "closed mailbox with raised flag" }, { "no": 2085, "code": "1F4EA", "char": "📪", "name": "closed mailbox with lowered flag" }, { "no": 2086, "code": "1F4EC", "char": "📬", "name": "open mailbox with raised flag" }, { "no": 2087, "code": "1F4ED", "char": "📭", "name": "open mailbox with lowered flag" }, { "no": 2088, "code": "1F4EE", "char": "📮", "name": "postbox" }, { "no": 2089, "code": "1F5F3", "char": "🗳", "name": "ballot box with ballot" }, { "no": 2090, "code": "270F", "char": "✏", "name": "pencil" }, { "no": 2091, "code": "2712", "char": "✒", "name": "black nib" }, { "no": 2092, "code": "1F58B", "char": "🖋", "name": "fountain pen" }, { "no": 2093, "code": "1F58A", "char": "🖊", "name": "pen" }, { "no": 2094, "code": "1F58C", "char": "🖌", "name": "paintbrush" }, { "no": 2095, "code": "1F58D", "char": "🖍", "name": "crayon" }, { "no": 2096, "code": "1F4DD", "char": "📝", "name": "memo" }, { "no": 2097, "code": "1F4BC", "char": "💼", "name": "briefcase" }, { "no": 2098, "code": "1F4C1", "char": "📁", "name": "file folder" }, { "no": 2099, "code": "1F4C2", "char": "📂", "name": "open file folder" }, { "no": 2100, "code": "1F5C2", "char": "🗂", "name": "card index dividers" }, { "no": 2101, "code": "1F4C5", "char": "📅", "name": "calendar" }, { "no": 2102, "code": "1F4C6", "char": "📆", "name": "tear-off calendar" }, { "no": 2103, "code": "1F5D2", "char": "🗒", "name": "spiral notepad" }, { "no": 2104, "code": "1F5D3", "char": "🗓", "name": "spiral calendar" }, { "no": 2105, "code": "1F4C7", "char": "📇", "name": "card index" }, { "no": 2106, "code": "1F4C8", "char": "📈", "name": "chart increasing" }, { "no": 2107, "code": "1F4C9", "char": "📉", "name": "chart decreasing" }, { "no": 2108, "code": "1F4CA", "char": "📊", "name": "bar chart" }, { "no": 2109, "code": "1F4CB", "char": "📋", "name": "clipboard" }, { "no": 2110, "code": "1F4CC", "char": "📌", "name": "pushpin" }, { "no": 2111, "code": "1F4CD", "char": "📍", "name": "round pushpin" }, { "no": 2112, "code": "1F4CE", "char": "📎", "name": "paperclip" }, { "no": 2113, "code": "1F587", "char": "🖇", "name": "linked paperclips" }, { "no": 2114, "code": "1F4CF", "char": "📏", "name": "straight ruler" }, { "no": 2115, "code": "1F4D0", "char": "📐", "name": "triangular ruler" }, { "no": 2116, "code": "2702", "char": "✂", "name": "scissors" }, { "no": 2117, "code": "1F5C3", "char": "🗃", "name": "card file box" }, { "no": 2118, "code": "1F5C4", "char": "🗄", "name": "file cabinet" }, { "no": 2119, "code": "1F5D1", "char": "🗑", "name": "wastebasket" }, { "no": 2120, "code": "1F512", "char": "🔒", "name": "locked" }, { "no": 2121, "code": "1F513", "char": "🔓", "name": "unlocked" }, { "no": 2122, "code": "1F50F", "char": "🔏", "name": "locked with pen" }, { "no": 2123, "code": "1F510", "char": "🔐", "name": "locked with key" }, { "no": 2124, "code": "1F511", "char": "🔑", "name": "key" }, { "no": 2125, "code": "1F5DD", "char": "🗝", "name": "old key" }, { "no": 2126, "code": "1F528", "char": "🔨", "name": "hammer" }, { "no": 2127, "code": "26CF", "char": "⛏", "name": "pick" }, { "no": 2128, "code": "2692", "char": "⚒", "name": "hammer and pick" }, { "no": 2129, "code": "1F6E0", "char": "🛠", "name": "hammer and wrench" }, { "no": 2130, "code": "1F5E1", "char": "🗡", "name": "dagger" }, { "no": 2131, "code": "2694", "char": "⚔", "name": "crossed swords" }, { "no": 2132, "code": "1F52B", "char": "🔫", "name": "pistol" }, { "no": 2133, "code": "1F3F9", "char": "🏹", "name": "bow and arrow" }, { "no": 2134, "code": "1F6E1", "char": "🛡", "name": "shield" }, { "no": 2135, "code": "1F527", "char": "🔧", "name": "wrench" }, { "no": 2136, "code": "1F529", "char": "🔩", "name": "nut and bolt" }, { "no": 2137, "code": "2699", "char": "⚙", "name": "gear" }, { "no": 2138, "code": "1F5DC", "char": "🗜", "name": "clamp" }, { "no": 2139, "code": "2697", "char": "⚗", "name": "alembic" }, { "no": 2140, "code": "2696", "char": "⚖", "name": "balance scale" }, { "no": 2141, "code": "1F517", "char": "🔗", "name": "link" }, { "no": 2142, "code": "26D3", "char": "⛓", "name": "chains" }, { "no": 2143, "code": "1F489", "char": "💉", "name": "syringe" }, { "no": 2144, "code": "1F48A", "char": "💊", "name": "pill" }, { "no": 2145, "code": "1F6AC", "char": "🚬", "name": "cigarette" }, { "no": 2146, "code": "26B0", "char": "⚰", "name": "coffin" }, { "no": 2147, "code": "26B1", "char": "⚱", "name": "funeral urn" }, { "no": 2148, "code": "1F5FF", "char": "🗿", "name": "moai" }, { "no": 2149, "code": "1F6E2", "char": "🛢", "name": "oil drum" }, { "no": 2150, "code": "1F52E", "char": "🔮", "name": "crystal ball" }, { "no": 2151, "code": "1F6D2", "char": "🛒", "name": "shopping cart" }, { "no": 2152, "code": "1F3E7", "char": "🏧", "name": "ATM sign" }, { "no": 2153, "code": "1F6AE", "char": "🚮", "name": "litter in bin sign" }, { "no": 2154, "code": "1F6B0", "char": "🚰", "name": "potable water" }, { "no": 2155, "code": "267F", "char": "♿", "name": "wheelchair symbol" }, { "no": 2156, "code": "1F6B9", "char": "🚹", "name": "men’s room" }, { "no": 2157, "code": "1F6BA", "char": "🚺", "name": "women’s room" }, { "no": 2158, "code": "1F6BB", "char": "🚻", "name": "restroom" }, { "no": 2159, "code": "1F6BC", "char": "🚼", "name": "baby symbol" }, { "no": 2160, "code": "1F6BE", "char": "🚾", "name": "water closet" }, { "no": 2161, "code": "1F6C2", "char": "🛂", "name": "passport control" }, { "no": 2162, "code": "1F6C3", "char": "🛃", "name": "customs" }, { "no": 2163, "code": "1F6C4", "char": "🛄", "name": "baggage claim" }, { "no": 2164, "code": "1F6C5", "char": "🛅", "name": "left luggage" }, { "no": 2165, "code": "26A0", "char": "⚠", "name": "warning" }, { "no": 2166, "code": "1F6B8", "char": "🚸", "name": "children crossing" }, { "no": 2167, "code": "26D4", "char": "⛔", "name": "no entry" }, { "no": 2168, "code": "1F6AB", "char": "🚫", "name": "prohibited" }, { "no": 2169, "code": "1F6B3", "char": "🚳", "name": "no bicycles" }, { "no": 2170, "code": "1F6AD", "char": "🚭", "name": "no smoking" }, { "no": 2171, "code": "1F6AF", "char": "🚯", "name": "no littering" }, { "no": 2172, "code": "1F6B1", "char": "🚱", "name": "non-potable water" }, { "no": 2173, "code": "1F6B7", "char": "🚷", "name": "no pedestrians" }, { "no": 2174, "code": "1F4F5", "char": "📵", "name": "no mobile phones" }, { "no": 2175, "code": "1F51E", "char": "🔞", "name": "no one under eighteen" }, { "no": 2176, "code": "2622", "char": "☢", "name": "radioactive" }, { "no": 2177, "code": "2623", "char": "☣", "name": "biohazard" }, { "no": 2178, "code": "2B06", "char": "⬆", "name": "up arrow" }, { "no": 2179, "code": "2197", "char": "↗", "name": "up-right arrow" }, { "no": 2180, "code": "27A1", "char": "➡", "name": "right arrow" }, { "no": 2181, "code": "2198", "char": "↘", "name": "down-right arrow" }, { "no": 2182, "code": "2B07", "char": "⬇", "name": "down arrow" }, { "no": 2183, "code": "2199", "char": "↙", "name": "down-left arrow" }, { "no": 2184, "code": "2B05", "char": "⬅", "name": "left arrow" }, { "no": 2185, "code": "2196", "char": "↖", "name": "up-left arrow" }, { "no": 2186, "code": "2195", "char": "↕", "name": "up-down arrow" }, { "no": 2187, "code": "2194", "char": "↔", "name": "left-right arrow" }, { "no": 2188, "code": "21A9", "char": "↩", "name": "right arrow curving left" }, { "no": 2189, "code": "21AA", "char": "↪", "name": "left arrow curving right" }, { "no": 2190, "code": "2934", "char": "⤴", "name": "right arrow curving up" }, { "no": 2191, "code": "2935", "char": "⤵", "name": "right arrow curving down" }, { "no": 2192, "code": "1F503", "char": "🔃", "name": "clockwise vertical arrows" }, { "no": 2193, "code": "1F504", "char": "🔄", "name": "counterclockwise arrows button" }, { "no": 2194, "code": "1F519", "char": "🔙", "name": "BACK arrow" }, { "no": 2195, "code": "1F51A", "char": "🔚", "name": "END arrow" }, { "no": 2196, "code": "1F51B", "char": "🔛", "name": "ON! arrow" }, { "no": 2197, "code": "1F51C", "char": "🔜", "name": "SOON arrow" }, { "no": 2198, "code": "1F51D", "char": "🔝", "name": "TOP arrow" }, { "no": 2199, "code": "1F6D0", "char": "🛐", "name": "place of worship" }, { "no": 2200, "code": "269B", "char": "⚛", "name": "atom symbol" }, { "no": 2201, "code": "1F549", "char": "🕉", "name": "om" }, { "no": 2202, "code": "2721", "char": "✡", "name": "star of David" }, { "no": 2203, "code": "2638", "char": "☸", "name": "wheel of dharma" }, { "no": 2204, "code": "262F", "char": "☯", "name": "yin yang" }, { "no": 2205, "code": "271D", "char": "✝", "name": "latin cross" }, { "no": 2206, "code": "2626", "char": "☦", "name": "orthodox cross" }, { "no": 2207, "code": "262A", "char": "☪", "name": "star and crescent" }, { "no": 2208, "code": "262E", "char": "☮", "name": "peace symbol" }, { "no": 2209, "code": "1F54E", "char": "🕎", "name": "menorah" }, { "no": 2210, "code": "1F52F", "char": "🔯", "name": "dotted six-pointed star" }, { "no": 2211, "code": "2648", "char": "♈", "name": "Aries" }, { "no": 2212, "code": "2649", "char": "♉", "name": "Taurus" }, { "no": 2213, "code": "264A", "char": "♊", "name": "Gemini" }, { "no": 2214, "code": "264B", "char": "♋", "name": "Cancer" }, { "no": 2215, "code": "264C", "char": "♌", "name": "Leo" }, { "no": 2216, "code": "264D", "char": "♍", "name": "Virgo" }, { "no": 2217, "code": "264E", "char": "♎", "name": "Libra" }, { "no": 2218, "code": "264F", "char": "♏", "name": "Scorpius" }, { "no": 2219, "code": "2650", "char": "♐", "name": "Sagittarius" }, { "no": 2220, "code": "2651", "char": "♑", "name": "Capricorn" }, { "no": 2221, "code": "2652", "char": "♒", "name": "Aquarius" }, { "no": 2222, "code": "2653", "char": "♓", "name": "Pisces" }, { "no": 2223, "code": "26CE", "char": "⛎", "name": "Ophiuchus" }, { "no": 2224, "code": "1F500", "char": "🔀", "name": "shuffle tracks button" }, { "no": 2225, "code": "1F501", "char": "🔁", "name": "repeat button" }, { "no": 2226, "code": "1F502", "char": "🔂", "name": "repeat single button" }, { "no": 2227, "code": "25B6", "char": "▶", "name": "play button" }, { "no": 2228, "code": "23E9", "char": "⏩", "name": "fast-forward button" }, { "no": 2229, "code": "23ED", "char": "⏭", "name": "next track button" }, { "no": 2230, "code": "23EF", "char": "⏯", "name": "play or pause button" }, { "no": 2231, "code": "25C0", "char": "◀", "name": "reverse button" }, { "no": 2232, "code": "23EA", "char": "⏪", "name": "fast reverse button" }, { "no": 2233, "code": "23EE", "char": "⏮", "name": "last track button" }, { "no": 2234, "code": "1F53C", "char": "🔼", "name": "up button" }, { "no": 2235, "code": "23EB", "char": "⏫", "name": "fast up button" }, { "no": 2236, "code": "1F53D", "char": "🔽", "name": "down button" }, { "no": 2237, "code": "23EC", "char": "⏬", "name": "fast down button" }, { "no": 2238, "code": "23F8", "char": "⏸", "name": "pause button" }, { "no": 2239, "code": "23F9", "char": "⏹", "name": "stop button" }, { "no": 2240, "code": "23FA", "char": "⏺", "name": "record button" }, { "no": 2241, "code": "23CF", "char": "⏏", "name": "eject button" }, { "no": 2242, "code": "1F3A6", "char": "🎦", "name": "cinema" }, { "no": 2243, "code": "1F505", "char": "🔅", "name": "dim button" }, { "no": 2244, "code": "1F506", "char": "🔆", "name": "bright button" }, { "no": 2245, "code": "1F4F6", "char": "📶", "name": "antenna bars" }, { "no": 2246, "code": "1F4F3", "char": "📳", "name": "vibration mode" }, { "no": 2247, "code": "1F4F4", "char": "📴", "name": "mobile phone off" }, { "no": 2248, "code": "2640", "char": "♀", "name": "female sign" }, { "no": 2249, "code": "2642", "char": "♂", "name": "male sign" }, { "no": 2250, "code": "2695", "char": "⚕", "name": "medical symbol" }, { "no": 2251, "code": "267B", "char": "♻", "name": "recycling symbol" }, { "no": 2252, "code": "269C", "char": "⚜", "name": "fleur-de-lis" }, { "no": 2253, "code": "1F531", "char": "🔱", "name": "trident emblem" }, { "no": 2254, "code": "1F4DB", "char": "📛", "name": "name badge" }, { "no": 2255, "code": "1F530", "char": "🔰", "name": "Japanese symbol for beginner" }, { "no": 2256, "code": "2B55", "char": "⭕", "name": "heavy large circle" }, { "no": 2257, "code": "2705", "char": "✅", "name": "white heavy check mark" }, { "no": 2258, "code": "2611", "char": "☑", "name": "ballot box with check" }, { "no": 2259, "code": "2714", "char": "✔", "name": "heavy check mark" }, { "no": 2260, "code": "2716", "char": "✖", "name": "heavy multiplication x" }, { "no": 2261, "code": "274C", "char": "❌", "name": "cross mark" }, { "no": 2262, "code": "274E", "char": "❎", "name": "cross mark button" }, { "no": 2263, "code": "2795", "char": "➕", "name": "heavy plus sign" }, { "no": 2264, "code": "2796", "char": "➖", "name": "heavy minus sign" }, { "no": 2265, "code": "2797", "char": "➗", "name": "heavy division sign" }, { "no": 2266, "code": "27B0", "char": "➰", "name": "curly loop" }, { "no": 2267, "code": "27BF", "char": "➿", "name": "double curly loop" }, { "no": 2268, "code": "303D", "char": "〽", "name": "part alternation mark" }, { "no": 2269, "code": "2733", "char": "✳", "name": "eight-spoked asterisk" }, { "no": 2270, "code": "2734", "char": "✴", "name": "eight-pointed star" }, { "no": 2271, "code": "2747", "char": "❇", "name": "sparkle" }, { "no": 2272, "code": "203C", "char": "‼", "name": "double exclamation mark" }, { "no": 2273, "code": "2049", "char": "⁉", "name": "exclamation question mark" }, { "no": 2274, "code": "2753", "char": "❓", "name": "question mark" }, { "no": 2275, "code": "2754", "char": "❔", "name": "white question mark" }, { "no": 2276, "code": "2755", "char": "❕", "name": "white exclamation mark" }, { "no": 2277, "code": "2757", "char": "❗", "name": "exclamation mark" }, { "no": 2278, "code": "3030", "char": "〰", "name": "wavy dash" }, { "no": 2279, "code": "00A9", "char": "©", "name": "copyright" }, { "no": 2280, "code": "00AE", "char": "®", "name": "registered" }, { "no": 2281, "code": "2122", "char": "™", "name": "trade mark" }, { "no": 2282, "code": "0023 FE0F 20E3", "char": "#️⃣", "name": "keycap: #" }, { "no": 2283, "code": "002A FE0F 20E3", "char": "*️⃣", "name": "keycap: *" }, { "no": 2284, "code": "0030 FE0F 20E3", "char": "0️⃣", "name": "keycap: 0" }, { "no": 2285, "code": "0031 FE0F 20E3", "char": "1️⃣", "name": "keycap: 1" }, { "no": 2286, "code": "0032 FE0F 20E3", "char": "2️⃣", "name": "keycap: 2" }, { "no": 2287, "code": "0033 FE0F 20E3", "char": "3️⃣", "name": "keycap: 3" }, { "no": 2288, "code": "0034 FE0F 20E3", "char": "4️⃣", "name": "keycap: 4" }, { "no": 2289, "code": "0035 FE0F 20E3", "char": "5️⃣", "name": "keycap: 5" }, { "no": 2290, "code": "0036 FE0F 20E3", "char": "6️⃣", "name": "keycap: 6" }, { "no": 2291, "code": "0037 FE0F 20E3", "char": "7️⃣", "name": "keycap: 7" }, { "no": 2292, "code": "0038 FE0F 20E3", "char": "8️⃣", "name": "keycap: 8" }, { "no": 2293, "code": "0039 FE0F 20E3", "char": "9️⃣", "name": "keycap: 9" }, { "no": 2294, "code": "1F51F", "char": "🔟", "name": "keycap 10" }, { "no": 2295, "code": "1F4AF", "char": "💯", "name": "hundred points" }, { "no": 2296, "code": "1F520", "char": "🔠", "name": "input latin uppercase" }, { "no": 2297, "code": "1F521", "char": "🔡", "name": "input latin lowercase" }, { "no": 2298, "code": "1F522", "char": "🔢", "name": "input numbers" }, { "no": 2299, "code": "1F523", "char": "🔣", "name": "input symbols" }, { "no": 2300, "code": "1F524", "char": "🔤", "name": "input latin letters" }, { "no": 2301, "code": "1F170", "char": "🅰", "name": "A button (blood type)" }, { "no": 2302, "code": "1F18E", "char": "🆎", "name": "AB button (blood type)" }, { "no": 2303, "code": "1F171", "char": "🅱", "name": "B button (blood type)" }, { "no": 2304, "code": "1F191", "char": "🆑", "name": "CL button" }, { "no": 2305, "code": "1F192", "char": "🆒", "name": "COOL button" }, { "no": 2306, "code": "1F193", "char": "🆓", "name": "FREE button" }, { "no": 2307, "code": "2139", "char": "ℹ", "name": "information" }, { "no": 2308, "code": "1F194", "char": "🆔", "name": "ID button" }, { "no": 2309, "code": "24C2", "char": "Ⓜ", "name": "circled M" }, { "no": 2310, "code": "1F195", "char": "🆕", "name": "NEW button" }, { "no": 2311, "code": "1F196", "char": "🆖", "name": "NG button" }, { "no": 2312, "code": "1F17E", "char": "🅾", "name": "O button (blood type)" }, { "no": 2313, "code": "1F197", "char": "🆗", "name": "OK button" }, { "no": 2314, "code": "1F17F", "char": "🅿", "name": "P button" }, { "no": 2315, "code": "1F198", "char": "🆘", "name": "SOS button" }, { "no": 2316, "code": "1F199", "char": "🆙", "name": "UP! button" }, { "no": 2317, "code": "1F19A", "char": "🆚", "name": "VS button" }, { "no": 2318, "code": "1F201", "char": "🈁", "name": "Japanese “here” button" }, { "no": 2319, "code": "1F202", "char": "🈂", "name": "Japanese “service charge” button" }, { "no": 2320, "code": "1F237", "char": "🈷", "name": "Japanese “monthly amount” button" }, { "no": 2321, "code": "1F236", "char": "🈶", "name": "Japanese “not free of charge” button" }, { "no": 2322, "code": "1F22F", "char": "🈯", "name": "Japanese “reserved” button" }, { "no": 2323, "code": "1F250", "char": "🉐", "name": "Japanese “bargain” button" }, { "no": 2324, "code": "1F239", "char": "🈹", "name": "Japanese “discount” button" }, { "no": 2325, "code": "1F21A", "char": "🈚", "name": "Japanese “free of charge” button" }, { "no": 2326, "code": "1F232", "char": "🈲", "name": "Japanese “prohibited” button" }, { "no": 2327, "code": "1F251", "char": "🉑", "name": "Japanese “acceptable” button" }, { "no": 2328, "code": "1F238", "char": "🈸", "name": "Japanese “application” button" }, { "no": 2329, "code": "1F234", "char": "🈴", "name": "Japanese “passing grade” button" }, { "no": 2330, "code": "1F233", "char": "🈳", "name": "Japanese “vacancy” button" }, { "no": 2331, "code": "3297", "char": "㊗", "name": "Japanese “congratulations” button" }, { "no": 2332, "code": "3299", "char": "㊙", "name": "Japanese “secret” button" }, { "no": 2333, "code": "1F23A", "char": "🈺", "name": "Japanese “open for business” button" }, { "no": 2334, "code": "1F235", "char": "🈵", "name": "Japanese “no vacancy” button" }, { "no": 2335, "code": "25AA", "char": "▪", "name": "black small square" }, { "no": 2336, "code": "25AB", "char": "▫", "name": "white small square" }, { "no": 2337, "code": "25FB", "char": "◻", "name": "white medium square" }, { "no": 2338, "code": "25FC", "char": "◼", "name": "black medium square" }, { "no": 2339, "code": "25FD", "char": "◽", "name": "white medium-small square" }, { "no": 2340, "code": "25FE", "char": "◾", "name": "black medium-small square" }, { "no": 2341, "code": "2B1B", "char": "⬛", "name": "black large square" }, { "no": 2342, "code": "2B1C", "char": "⬜", "name": "white large square" }, { "no": 2343, "code": "1F536", "char": "🔶", "name": "large orange diamond" }, { "no": 2344, "code": "1F537", "char": "🔷", "name": "large blue diamond" }, { "no": 2345, "code": "1F538", "char": "🔸", "name": "small orange diamond" }, { "no": 2346, "code": "1F539", "char": "🔹", "name": "small blue diamond" }, { "no": 2347, "code": "1F53A", "char": "🔺", "name": "red triangle pointed up" }, { "no": 2348, "code": "1F53B", "char": "🔻", "name": "red triangle pointed down" }, { "no": 2349, "code": "1F4A0", "char": "💠", "name": "diamond with a dot" }, { "no": 2350, "code": "1F518", "char": "🔘", "name": "radio button" }, { "no": 2351, "code": "1F532", "char": "🔲", "name": "black square button" }, { "no": 2352, "code": "1F533", "char": "🔳", "name": "white square button" }, { "no": 2353, "code": "26AA", "char": "⚪", "name": "white circle" }, { "no": 2354, "code": "26AB", "char": "⚫", "name": "black circle" }, { "no": 2355, "code": "1F534", "char": "🔴", "name": "red circle" }, { "no": 2356, "code": "1F535", "char": "🔵", "name": "blue circle" }, { "no": 2357, "code": "1F3C1", "char": "🏁", "name": "chequered flag" }, { "no": 2358, "code": "1F6A9", "char": "🚩", "name": "triangular flag" }, { "no": 2359, "code": "1F38C", "char": "🎌", "name": "crossed flags" }, { "no": 2360, "code": "1F3F4", "char": "🏴", "name": "black flag" }, { "no": 2361, "code": "1F3F3", "char": "🏳", "name": "white flag" }, { "no": 2362, "code": "1F3F3 FE0F 200D 1F308", "char": "🏳️‍🌈", "name": "rainbow flag" }, { "no": 2363, "code": "1F1E6 1F1E8", "char": "🇦🇨", "name": "Ascension Island" }, { "no": 2364, "code": "1F1E6 1F1E9", "char": "🇦🇩", "name": "Andorra" }, { "no": 2365, "code": "1F1E6 1F1EA", "char": "🇦🇪", "name": "United Arab Emirates" }, { "no": 2366, "code": "1F1E6 1F1EB", "char": "🇦🇫", "name": "Afghanistan" }, { "no": 2367, "code": "1F1E6 1F1EC", "char": "🇦🇬", "name": "Antigua & Barbuda" }, { "no": 2368, "code": "1F1E6 1F1EE", "char": "🇦🇮", "name": "Anguilla" }, { "no": 2369, "code": "1F1E6 1F1F1", "char": "🇦🇱", "name": "Albania" }, { "no": 2370, "code": "1F1E6 1F1F2", "char": "🇦🇲", "name": "Armenia" }, { "no": 2371, "code": "1F1E6 1F1F4", "char": "🇦🇴", "name": "Angola" }, { "no": 2372, "code": "1F1E6 1F1F6", "char": "🇦🇶", "name": "Antarctica" }, { "no": 2373, "code": "1F1E6 1F1F7", "char": "🇦🇷", "name": "Argentina" }, { "no": 2374, "code": "1F1E6 1F1F8", "char": "🇦🇸", "name": "American Samoa" }, { "no": 2375, "code": "1F1E6 1F1F9", "char": "🇦🇹", "name": "Austria" }, { "no": 2376, "code": "1F1E6 1F1FA", "char": "🇦🇺", "name": "Australia" }, { "no": 2377, "code": "1F1E6 1F1FC", "char": "🇦🇼", "name": "Aruba" }, { "no": 2378, "code": "1F1E6 1F1FD", "char": "🇦🇽", "name": "Åland Islands" }, { "no": 2379, "code": "1F1E6 1F1FF", "char": "🇦🇿", "name": "Azerbaijan" }, { "no": 2380, "code": "1F1E7 1F1E6", "char": "🇧🇦", "name": "Bosnia & Herzegovina" }, { "no": 2381, "code": "1F1E7 1F1E7", "char": "🇧🇧", "name": "Barbados" }, { "no": 2382, "code": "1F1E7 1F1E9", "char": "🇧🇩", "name": "Bangladesh" }, { "no": 2383, "code": "1F1E7 1F1EA", "char": "🇧🇪", "name": "Belgium" }, { "no": 2384, "code": "1F1E7 1F1EB", "char": "🇧🇫", "name": "Burkina Faso" }, { "no": 2385, "code": "1F1E7 1F1EC", "char": "🇧🇬", "name": "Bulgaria" }, { "no": 2386, "code": "1F1E7 1F1ED", "char": "🇧🇭", "name": "Bahrain" }, { "no": 2387, "code": "1F1E7 1F1EE", "char": "🇧🇮", "name": "Burundi" }, { "no": 2388, "code": "1F1E7 1F1EF", "char": "🇧🇯", "name": "Benin" }, { "no": 2389, "code": "1F1E7 1F1F1", "char": "🇧🇱", "name": "St. Barthélemy" }, { "no": 2390, "code": "1F1E7 1F1F2", "char": "🇧🇲", "name": "Bermuda" }, { "no": 2391, "code": "1F1E7 1F1F3", "char": "🇧🇳", "name": "Brunei" }, { "no": 2392, "code": "1F1E7 1F1F4", "char": "🇧🇴", "name": "Bolivia" }, { "no": 2393, "code": "1F1E7 1F1F6", "char": "🇧🇶", "name": "Caribbean Netherlands" }, { "no": 2394, "code": "1F1E7 1F1F7", "char": "🇧🇷", "name": "Brazil" }, { "no": 2395, "code": "1F1E7 1F1F8", "char": "🇧🇸", "name": "Bahamas" }, { "no": 2396, "code": "1F1E7 1F1F9", "char": "🇧🇹", "name": "Bhutan" }, { "no": 2397, "code": "1F1E7 1F1FB", "char": "🇧🇻", "name": "Bouvet Island" }, { "no": 2398, "code": "1F1E7 1F1FC", "char": "🇧🇼", "name": "Botswana" }, { "no": 2399, "code": "1F1E7 1F1FE", "char": "🇧🇾", "name": "Belarus" }, { "no": 2400, "code": "1F1E7 1F1FF", "char": "🇧🇿", "name": "Belize" }, { "no": 2401, "code": "1F1E8 1F1E6", "char": "🇨🇦", "name": "Canada" }, { "no": 2402, "code": "1F1E8 1F1E8", "char": "🇨🇨", "name": "Cocos (Keeling) Islands" }, { "no": 2403, "code": "1F1E8 1F1E9", "char": "🇨🇩", "name": "Congo - Kinshasa" }, { "no": 2404, "code": "1F1E8 1F1EB", "char": "🇨🇫", "name": "Central African Republic" }, { "no": 2405, "code": "1F1E8 1F1EC", "char": "🇨🇬", "name": "Congo - Brazzaville" }, { "no": 2406, "code": "1F1E8 1F1ED", "char": "🇨🇭", "name": "Switzerland" }, { "no": 2407, "code": "1F1E8 1F1EE", "char": "🇨🇮", "name": "Côte d’Ivoire" }, { "no": 2408, "code": "1F1E8 1F1F0", "char": "🇨🇰", "name": "Cook Islands" }, { "no": 2409, "code": "1F1E8 1F1F1", "char": "🇨🇱", "name": "Chile" }, { "no": 2410, "code": "1F1E8 1F1F2", "char": "🇨🇲", "name": "Cameroon" }, { "no": 2411, "code": "1F1E8 1F1F3", "char": "🇨🇳", "name": "China" }, { "no": 2412, "code": "1F1E8 1F1F4", "char": "🇨🇴", "name": "Colombia" }, { "no": 2413, "code": "1F1E8 1F1F5", "char": "🇨🇵", "name": "Clipperton Island" }, { "no": 2414, "code": "1F1E8 1F1F7", "char": "🇨🇷", "name": "Costa Rica" }, { "no": 2415, "code": "1F1E8 1F1FA", "char": "🇨🇺", "name": "Cuba" }, { "no": 2416, "code": "1F1E8 1F1FB", "char": "🇨🇻", "name": "Cape Verde" }, { "no": 2417, "code": "1F1E8 1F1FC", "char": "🇨🇼", "name": "Curaçao" }, { "no": 2418, "code": "1F1E8 1F1FD", "char": "🇨🇽", "name": "Christmas Island" }, { "no": 2419, "code": "1F1E8 1F1FE", "char": "🇨🇾", "name": "Cyprus" }, { "no": 2420, "code": "1F1E8 1F1FF", "char": "🇨🇿", "name": "Czechia" }, { "no": 2421, "code": "1F1E9 1F1EA", "char": "🇩🇪", "name": "Germany" }, { "no": 2422, "code": "1F1E9 1F1EC", "char": "🇩🇬", "name": "Diego Garcia" }, { "no": 2423, "code": "1F1E9 1F1EF", "char": "🇩🇯", "name": "Djibouti" }, { "no": 2424, "code": "1F1E9 1F1F0", "char": "🇩🇰", "name": "Denmark" }, { "no": 2425, "code": "1F1E9 1F1F2", "char": "🇩🇲", "name": "Dominica" }, { "no": 2426, "code": "1F1E9 1F1F4", "char": "🇩🇴", "name": "Dominican Republic" }, { "no": 2427, "code": "1F1E9 1F1FF", "char": "🇩🇿", "name": "Algeria" }, { "no": 2428, "code": "1F1EA 1F1E6", "char": "🇪🇦", "name": "Ceuta & Melilla" }, { "no": 2429, "code": "1F1EA 1F1E8", "char": "🇪🇨", "name": "Ecuador" }, { "no": 2430, "code": "1F1EA 1F1EA", "char": "🇪🇪", "name": "Estonia" }, { "no": 2431, "code": "1F1EA 1F1EC", "char": "🇪🇬", "name": "Egypt" }, { "no": 2432, "code": "1F1EA 1F1ED", "char": "🇪🇭", "name": "Western Sahara" }, { "no": 2433, "code": "1F1EA 1F1F7", "char": "🇪🇷", "name": "Eritrea" }, { "no": 2434, "code": "1F1EA 1F1F8", "char": "🇪🇸", "name": "Spain" }, { "no": 2435, "code": "1F1EA 1F1F9", "char": "🇪🇹", "name": "Ethiopia" }, { "no": 2436, "code": "1F1EA 1F1FA", "char": "🇪🇺", "name": "European Union" }, { "no": 2437, "code": "1F1EB 1F1EE", "char": "🇫🇮", "name": "Finland" }, { "no": 2438, "code": "1F1EB 1F1EF", "char": "🇫🇯", "name": "Fiji" }, { "no": 2439, "code": "1F1EB 1F1F0", "char": "🇫🇰", "name": "Falkland Islands" }, { "no": 2440, "code": "1F1EB 1F1F2", "char": "🇫🇲", "name": "Micronesia" }, { "no": 2441, "code": "1F1EB 1F1F4", "char": "🇫🇴", "name": "Faroe Islands" }, { "no": 2442, "code": "1F1EB 1F1F7", "char": "🇫🇷", "name": "France" }, { "no": 2443, "code": "1F1EC 1F1E6", "char": "🇬🇦", "name": "Gabon" }, { "no": 2444, "code": "1F1EC 1F1E7", "char": "🇬🇧", "name": "United Kingdom" }, { "no": 2445, "code": "1F1EC 1F1E9", "char": "🇬🇩", "name": "Grenada" }, { "no": 2446, "code": "1F1EC 1F1EA", "char": "🇬🇪", "name": "Georgia" }, { "no": 2447, "code": "1F1EC 1F1EB", "char": "🇬🇫", "name": "French Guiana" }, { "no": 2448, "code": "1F1EC 1F1EC", "char": "🇬🇬", "name": "Guernsey" }, { "no": 2449, "code": "1F1EC 1F1ED", "char": "🇬🇭", "name": "Ghana" }, { "no": 2450, "code": "1F1EC 1F1EE", "char": "🇬🇮", "name": "Gibraltar" }, { "no": 2451, "code": "1F1EC 1F1F1", "char": "🇬🇱", "name": "Greenland" }, { "no": 2452, "code": "1F1EC 1F1F2", "char": "🇬🇲", "name": "Gambia" }, { "no": 2453, "code": "1F1EC 1F1F3", "char": "🇬🇳", "name": "Guinea" }, { "no": 2454, "code": "1F1EC 1F1F5", "char": "🇬🇵", "name": "Guadeloupe" }, { "no": 2455, "code": "1F1EC 1F1F6", "char": "🇬🇶", "name": "Equatorial Guinea" }, { "no": 2456, "code": "1F1EC 1F1F7", "char": "🇬🇷", "name": "Greece" }, { "no": 2457, "code": "1F1EC 1F1F8", "char": "🇬🇸", "name": "South Georgia & South Sandwich Islands" }, { "no": 2458, "code": "1F1EC 1F1F9", "char": "🇬🇹", "name": "Guatemala" }, { "no": 2459, "code": "1F1EC 1F1FA", "char": "🇬🇺", "name": "Guam" }, { "no": 2460, "code": "1F1EC 1F1FC", "char": "🇬🇼", "name": "Guinea-Bissau" }, { "no": 2461, "code": "1F1EC 1F1FE", "char": "🇬🇾", "name": "Guyana" }, { "no": 2462, "code": "1F1ED 1F1F0", "char": "🇭🇰", "name": "Hong Kong SAR China" }, { "no": 2463, "code": "1F1ED 1F1F2", "char": "🇭🇲", "name": "Heard & McDonald Islands" }, { "no": 2464, "code": "1F1ED 1F1F3", "char": "🇭🇳", "name": "Honduras" }, { "no": 2465, "code": "1F1ED 1F1F7", "char": "🇭🇷", "name": "Croatia" }, { "no": 2466, "code": "1F1ED 1F1F9", "char": "🇭🇹", "name": "Haiti" }, { "no": 2467, "code": "1F1ED 1F1FA", "char": "🇭🇺", "name": "Hungary" }, { "no": 2468, "code": "1F1EE 1F1E8", "char": "🇮🇨", "name": "Canary Islands" }, { "no": 2469, "code": "1F1EE 1F1E9", "char": "🇮🇩", "name": "Indonesia" }, { "no": 2470, "code": "1F1EE 1F1EA", "char": "🇮🇪", "name": "Ireland" }, { "no": 2471, "code": "1F1EE 1F1F1", "char": "🇮🇱", "name": "Israel" }, { "no": 2472, "code": "1F1EE 1F1F2", "char": "🇮🇲", "name": "Isle of Man" }, { "no": 2473, "code": "1F1EE 1F1F3", "char": "🇮🇳", "name": "India" }, { "no": 2474, "code": "1F1EE 1F1F4", "char": "🇮🇴", "name": "British Indian Ocean Territory" }, { "no": 2475, "code": "1F1EE 1F1F6", "char": "🇮🇶", "name": "Iraq" }, { "no": 2476, "code": "1F1EE 1F1F7", "char": "🇮🇷", "name": "Iran" }, { "no": 2477, "code": "1F1EE 1F1F8", "char": "🇮🇸", "name": "Iceland" }, { "no": 2478, "code": "1F1EE 1F1F9", "char": "🇮🇹", "name": "Italy" }, { "no": 2479, "code": "1F1EF 1F1EA", "char": "🇯🇪", "name": "Jersey" }, { "no": 2480, "code": "1F1EF 1F1F2", "char": "🇯🇲", "name": "Jamaica" }, { "no": 2481, "code": "1F1EF 1F1F4", "char": "🇯🇴", "name": "Jordan" }, { "no": 2482, "code": "1F1EF 1F1F5", "char": "🇯🇵", "name": "Japan" }, { "no": 2483, "code": "1F1F0 1F1EA", "char": "🇰🇪", "name": "Kenya" }, { "no": 2484, "code": "1F1F0 1F1EC", "char": "🇰🇬", "name": "Kyrgyzstan" }, { "no": 2485, "code": "1F1F0 1F1ED", "char": "🇰🇭", "name": "Cambodia" }, { "no": 2486, "code": "1F1F0 1F1EE", "char": "🇰🇮", "name": "Kiribati" }, { "no": 2487, "code": "1F1F0 1F1F2", "char": "🇰🇲", "name": "Comoros" }, { "no": 2488, "code": "1F1F0 1F1F3", "char": "🇰🇳", "name": "St. Kitts & Nevis" }, { "no": 2489, "code": "1F1F0 1F1F5", "char": "🇰🇵", "name": "North Korea" }, { "no": 2490, "code": "1F1F0 1F1F7", "char": "🇰🇷", "name": "South Korea" }, { "no": 2491, "code": "1F1F0 1F1FC", "char": "🇰🇼", "name": "Kuwait" }, { "no": 2492, "code": "1F1F0 1F1FE", "char": "🇰🇾", "name": "Cayman Islands" }, { "no": 2493, "code": "1F1F0 1F1FF", "char": "🇰🇿", "name": "Kazakhstan" }, { "no": 2494, "code": "1F1F1 1F1E6", "char": "🇱🇦", "name": "Laos" }, { "no": 2495, "code": "1F1F1 1F1E7", "char": "🇱🇧", "name": "Lebanon" }, { "no": 2496, "code": "1F1F1 1F1E8", "char": "🇱🇨", "name": "St. Lucia" }, { "no": 2497, "code": "1F1F1 1F1EE", "char": "🇱🇮", "name": "Liechtenstein" }, { "no": 2498, "code": "1F1F1 1F1F0", "char": "🇱🇰", "name": "Sri Lanka" }, { "no": 2499, "code": "1F1F1 1F1F7", "char": "🇱🇷", "name": "Liberia" }, { "no": 2500, "code": "1F1F1 1F1F8", "char": "🇱🇸", "name": "Lesotho" }, { "no": 2501, "code": "1F1F1 1F1F9", "char": "🇱🇹", "name": "Lithuania" }, { "no": 2502, "code": "1F1F1 1F1FA", "char": "🇱🇺", "name": "Luxembourg" }, { "no": 2503, "code": "1F1F1 1F1FB", "char": "🇱🇻", "name": "Latvia" }, { "no": 2504, "code": "1F1F1 1F1FE", "char": "🇱🇾", "name": "Libya" }, { "no": 2505, "code": "1F1F2 1F1E6", "char": "🇲🇦", "name": "Morocco" }, { "no": 2506, "code": "1F1F2 1F1E8", "char": "🇲🇨", "name": "Monaco" }, { "no": 2507, "code": "1F1F2 1F1E9", "char": "🇲🇩", "name": "Moldova" }, { "no": 2508, "code": "1F1F2 1F1EA", "char": "🇲🇪", "name": "Montenegro" }, { "no": 2509, "code": "1F1F2 1F1EB", "char": "🇲🇫", "name": "St. Martin" }, { "no": 2510, "code": "1F1F2 1F1EC", "char": "🇲🇬", "name": "Madagascar" }, { "no": 2511, "code": "1F1F2 1F1ED", "char": "🇲🇭", "name": "Marshall Islands" }, { "no": 2512, "code": "1F1F2 1F1F0", "char": "🇲🇰", "name": "Macedonia" }, { "no": 2513, "code": "1F1F2 1F1F1", "char": "🇲🇱", "name": "Mali" }, { "no": 2514, "code": "1F1F2 1F1F2", "char": "🇲🇲", "name": "Myanmar (Burma)" }, { "no": 2515, "code": "1F1F2 1F1F3", "char": "🇲🇳", "name": "Mongolia" }, { "no": 2516, "code": "1F1F2 1F1F4", "char": "🇲🇴", "name": "Macau SAR China" }, { "no": 2517, "code": "1F1F2 1F1F5", "char": "🇲🇵", "name": "Northern Mariana Islands" }, { "no": 2518, "code": "1F1F2 1F1F6", "char": "🇲🇶", "name": "Martinique" }, { "no": 2519, "code": "1F1F2 1F1F7", "char": "🇲🇷", "name": "Mauritania" }, { "no": 2520, "code": "1F1F2 1F1F8", "char": "🇲🇸", "name": "Montserrat" }, { "no": 2521, "code": "1F1F2 1F1F9", "char": "🇲🇹", "name": "Malta" }, { "no": 2522, "code": "1F1F2 1F1FA", "char": "🇲🇺", "name": "Mauritius" }, { "no": 2523, "code": "1F1F2 1F1FB", "char": "🇲🇻", "name": "Maldives" }, { "no": 2524, "code": "1F1F2 1F1FC", "char": "🇲🇼", "name": "Malawi" }, { "no": 2525, "code": "1F1F2 1F1FD", "char": "🇲🇽", "name": "Mexico" }, { "no": 2526, "code": "1F1F2 1F1FE", "char": "🇲🇾", "name": "Malaysia" }, { "no": 2527, "code": "1F1F2 1F1FF", "char": "🇲🇿", "name": "Mozambique" }, { "no": 2528, "code": "1F1F3 1F1E6", "char": "🇳🇦", "name": "Namibia" }, { "no": 2529, "code": "1F1F3 1F1E8", "char": "🇳🇨", "name": "New Caledonia" }, { "no": 2530, "code": "1F1F3 1F1EA", "char": "🇳🇪", "name": "Niger" }, { "no": 2531, "code": "1F1F3 1F1EB", "char": "🇳🇫", "name": "Norfolk Island" }, { "no": 2532, "code": "1F1F3 1F1EC", "char": "🇳🇬", "name": "Nigeria" }, { "no": 2533, "code": "1F1F3 1F1EE", "char": "🇳🇮", "name": "Nicaragua" }, { "no": 2534, "code": "1F1F3 1F1F1", "char": "🇳🇱", "name": "Netherlands" }, { "no": 2535, "code": "1F1F3 1F1F4", "char": "🇳🇴", "name": "Norway" }, { "no": 2536, "code": "1F1F3 1F1F5", "char": "🇳🇵", "name": "Nepal" }, { "no": 2537, "code": "1F1F3 1F1F7", "char": "🇳🇷", "name": "Nauru" }, { "no": 2538, "code": "1F1F3 1F1FA", "char": "🇳🇺", "name": "Niue" }, { "no": 2539, "code": "1F1F3 1F1FF", "char": "🇳🇿", "name": "New Zealand" }, { "no": 2540, "code": "1F1F4 1F1F2", "char": "🇴🇲", "name": "Oman" }, { "no": 2541, "code": "1F1F5 1F1E6", "char": "🇵🇦", "name": "Panama" }, { "no": 2542, "code": "1F1F5 1F1EA", "char": "🇵🇪", "name": "Peru" }, { "no": 2543, "code": "1F1F5 1F1EB", "char": "🇵🇫", "name": "French Polynesia" }, { "no": 2544, "code": "1F1F5 1F1EC", "char": "🇵🇬", "name": "Papua New Guinea" }, { "no": 2545, "code": "1F1F5 1F1ED", "char": "🇵🇭", "name": "Philippines" }, { "no": 2546, "code": "1F1F5 1F1F0", "char": "🇵🇰", "name": "Pakistan" }, { "no": 2547, "code": "1F1F5 1F1F1", "char": "🇵🇱", "name": "Poland" }, { "no": 2548, "code": "1F1F5 1F1F2", "char": "🇵🇲", "name": "St. Pierre & Miquelon" }, { "no": 2549, "code": "1F1F5 1F1F3", "char": "🇵🇳", "name": "Pitcairn Islands" }, { "no": 2550, "code": "1F1F5 1F1F7", "char": "🇵🇷", "name": "Puerto Rico" }, { "no": 2551, "code": "1F1F5 1F1F8", "char": "🇵🇸", "name": "Palestinian Territories" }, { "no": 2552, "code": "1F1F5 1F1F9", "char": "🇵🇹", "name": "Portugal" }, { "no": 2553, "code": "1F1F5 1F1FC", "char": "🇵🇼", "name": "Palau" }, { "no": 2554, "code": "1F1F5 1F1FE", "char": "🇵🇾", "name": "Paraguay" }, { "no": 2555, "code": "1F1F6 1F1E6", "char": "🇶🇦", "name": "Qatar" }, { "no": 2556, "code": "1F1F7 1F1EA", "char": "🇷🇪", "name": "Réunion" }, { "no": 2557, "code": "1F1F7 1F1F4", "char": "🇷🇴", "name": "Romania" }, { "no": 2558, "code": "1F1F7 1F1F8", "char": "🇷🇸", "name": "Serbia" }, { "no": 2559, "code": "1F1F7 1F1FA", "char": "🇷🇺", "name": "Russia" }, { "no": 2560, "code": "1F1F7 1F1FC", "char": "🇷🇼", "name": "Rwanda" }, { "no": 2561, "code": "1F1F8 1F1E6", "char": "🇸🇦", "name": "Saudi Arabia" }, { "no": 2562, "code": "1F1F8 1F1E7", "char": "🇸🇧", "name": "Solomon Islands" }, { "no": 2563, "code": "1F1F8 1F1E8", "char": "🇸🇨", "name": "Seychelles" }, { "no": 2564, "code": "1F1F8 1F1E9", "char": "🇸🇩", "name": "Sudan" }, { "no": 2565, "code": "1F1F8 1F1EA", "char": "🇸🇪", "name": "Sweden" }, { "no": 2566, "code": "1F1F8 1F1EC", "char": "🇸🇬", "name": "Singapore" }, { "no": 2567, "code": "1F1F8 1F1ED", "char": "🇸🇭", "name": "St. Helena" }, { "no": 2568, "code": "1F1F8 1F1EE", "char": "🇸🇮", "name": "Slovenia" }, { "no": 2569, "code": "1F1F8 1F1EF", "char": "🇸🇯", "name": "Svalbard & Jan Mayen" }, { "no": 2570, "code": "1F1F8 1F1F0", "char": "🇸🇰", "name": "Slovakia" }, { "no": 2571, "code": "1F1F8 1F1F1", "char": "🇸🇱", "name": "Sierra Leone" }, { "no": 2572, "code": "1F1F8 1F1F2", "char": "🇸🇲", "name": "San Marino" }, { "no": 2573, "code": "1F1F8 1F1F3", "char": "🇸🇳", "name": "Senegal" }, { "no": 2574, "code": "1F1F8 1F1F4", "char": "🇸🇴", "name": "Somalia" }, { "no": 2575, "code": "1F1F8 1F1F7", "char": "🇸🇷", "name": "Suriname" }, { "no": 2576, "code": "1F1F8 1F1F8", "char": "🇸🇸", "name": "South Sudan" }, { "no": 2577, "code": "1F1F8 1F1F9", "char": "🇸🇹", "name": "São Tomé & Príncipe" }, { "no": 2578, "code": "1F1F8 1F1FB", "char": "🇸🇻", "name": "El Salvador" }, { "no": 2579, "code": "1F1F8 1F1FD", "char": "🇸🇽", "name": "Sint Maarten" }, { "no": 2580, "code": "1F1F8 1F1FE", "char": "🇸🇾", "name": "Syria" }, { "no": 2581, "code": "1F1F8 1F1FF", "char": "🇸🇿", "name": "Swaziland" }, { "no": 2582, "code": "1F1F9 1F1E6", "char": "🇹🇦", "name": "Tristan da Cunha" }, { "no": 2583, "code": "1F1F9 1F1E8", "char": "🇹🇨", "name": "Turks & Caicos Islands" }, { "no": 2584, "code": "1F1F9 1F1E9", "char": "🇹🇩", "name": "Chad" }, { "no": 2585, "code": "1F1F9 1F1EB", "char": "🇹🇫", "name": "French Southern Territories" }, { "no": 2586, "code": "1F1F9 1F1EC", "char": "🇹🇬", "name": "Togo" }, { "no": 2587, "code": "1F1F9 1F1ED", "char": "🇹🇭", "name": "Thailand" }, { "no": 2588, "code": "1F1F9 1F1EF", "char": "🇹🇯", "name": "Tajikistan" }, { "no": 2589, "code": "1F1F9 1F1F0", "char": "🇹🇰", "name": "Tokelau" }, { "no": 2590, "code": "1F1F9 1F1F1", "char": "🇹🇱", "name": "Timor-Leste" }, { "no": 2591, "code": "1F1F9 1F1F2", "char": "🇹🇲", "name": "Turkmenistan" }, { "no": 2592, "code": "1F1F9 1F1F3", "char": "🇹🇳", "name": "Tunisia" }, { "no": 2593, "code": "1F1F9 1F1F4", "char": "🇹🇴", "name": "Tonga" }, { "no": 2594, "code": "1F1F9 1F1F7", "char": "🇹🇷", "name": "Turkey" }, { "no": 2595, "code": "1F1F9 1F1F9", "char": "🇹🇹", "name": "Trinidad & Tobago" }, { "no": 2596, "code": "1F1F9 1F1FB", "char": "🇹🇻", "name": "Tuvalu" }, { "no": 2597, "code": "1F1F9 1F1FC", "char": "🇹🇼", "name": "Taiwan" }, { "no": 2598, "code": "1F1F9 1F1FF", "char": "🇹🇿", "name": "Tanzania" }, { "no": 2599, "code": "1F1FA 1F1E6", "char": "🇺🇦", "name": "Ukraine" }, { "no": 2600, "code": "1F1FA 1F1EC", "char": "🇺🇬", "name": "Uganda" }, { "no": 2601, "code": "1F1FA 1F1F2", "char": "🇺🇲", "name": "U.S. Outlying Islands" }, { "no": 2602, "code": "1F1FA 1F1F3", "char": "🇺🇳", "name": "United Nations" }, { "no": 2603, "code": "1F1FA 1F1F8", "char": "🇺🇸", "name": "United States" }, { "no": 2604, "code": "1F1FA 1F1FE", "char": "🇺🇾", "name": "Uruguay" }, { "no": 2605, "code": "1F1FA 1F1FF", "char": "🇺🇿", "name": "Uzbekistan" }, { "no": 2606, "code": "1F1FB 1F1E6", "char": "🇻🇦", "name": "Vatican City" }, { "no": 2607, "code": "1F1FB 1F1E8", "char": "🇻🇨", "name": "St. Vincent & Grenadines" }, { "no": 2608, "code": "1F1FB 1F1EA", "char": "🇻🇪", "name": "Venezuela" }, { "no": 2609, "code": "1F1FB 1F1EC", "char": "🇻🇬", "name": "British Virgin Islands" }, { "no": 2610, "code": "1F1FB 1F1EE", "char": "🇻🇮", "name": "U.S. Virgin Islands" }, { "no": 2611, "code": "1F1FB 1F1F3", "char": "🇻🇳", "name": "Vietnam" }, { "no": 2612, "code": "1F1FB 1F1FA", "char": "🇻🇺", "name": "Vanuatu" }, { "no": 2613, "code": "1F1FC 1F1EB", "char": "🇼🇫", "name": "Wallis & Futuna" }, { "no": 2614, "code": "1F1FC 1F1F8", "char": "🇼🇸", "name": "Samoa" }, { "no": 2615, "code": "1F1FD 1F1F0", "char": "🇽🇰", "name": "Kosovo" }, { "no": 2616, "code": "1F1FE 1F1EA", "char": "🇾🇪", "name": "Yemen" }, { "no": 2617, "code": "1F1FE 1F1F9", "char": "🇾🇹", "name": "Mayotte" }, { "no": 2618, "code": "1F1FF 1F1E6", "char": "🇿🇦", "name": "South Africa" }, { "no": 2619, "code": "1F1FF 1F1F2", "char": "🇿🇲", "name": "Zambia" }, { "no": 2620, "code": "1F1FF 1F1FC", "char": "🇿🇼", "name": "Zimbabwe" }, { "no": 2621, "code": "1F3F4 E0067 E0062 E0065 E006E E0067 E007F", "char": "🏴󠁧󠁢󠁥󠁮󠁧󠁿", "name": "⊛ England" }, { "no": 2622, "code": "1F3F4 E0067 E0062 E0073 E0063 E0074 E007F", "char": "🏴󠁧󠁢󠁳󠁣󠁴󠁿", "name": "⊛ Scotland" }, { "no": 2623, "code": "1F3F4 E0067 E0062 E0077 E006C E0073 E007F", "char": "🏴󠁧󠁢󠁷󠁬󠁳󠁿", "name": "⊛ Wales" } ] cinnamon-6.6.8/data/icons/0000775000175000017500000000000015167446463014325 5ustar fabiofabiocinnamon-6.6.8/data/icons/find_icons.sh0000775000175000017500000000010315167446463016771 0ustar fabiofabio#!/bin/sh ls -1 | grep hicolor.*\.svg ls -1 | grep hicolor.*\.png cinnamon-6.6.8/data/icons/hicolor_actions_24x24_cinnamon-hc-double-click.png0000664000175000017500000000112315167446463025657 0ustar fabiofabioPNG  IHDRw=bKGD pHYs  IDATHݕ1Q+ēC`!F] NcXDl郕iX)|@p"YD/Fıy<6{aʁ){{3 ϖP5c|Dyȶm`;B&Xlw"}F@Y.2)$\m۩@V mH$ MZ@ZX@q(H61}Fp8|.vs@fyEwvNXE^X,R(0MbARu])(7]U {icP@U%0{|>Np218si4T69~DC|K# ^$@IENDB`cinnamon-6.6.8/data/icons/hicolor_actions_24x24_cinnamon-hc-drag-click.png0000664000175000017500000000073515167446463025332 0ustar fabiofabioPNG  IHDRw=bKGDtIME .X IDATH핱JPĢPF E:w5PE*}W#n4:TM7i&A=99?ǟQ"?6(*ݕ)2s-N511VK%bHHHm^)%<wLfmN}麊NNḀ͢U}?8*:0dh4Zɵ|F l$ZMq!DO,7P-1 -ɰ4T P8. ܸƥeY*ߋ`8( -g>ڠw`3~<7eZ%D$0YHLX tIKlIENDB`cinnamon-6.6.8/data/icons/hicolor_actions_24x24_cinnamon-hc-right-click.png0000664000175000017500000000073415167446463025531 0ustar fabiofabioPNG  IHDRw=bKGDtIME .X ~IDATHսQ_v]MXHAa!&{ރU&w`Jۀ]4B*h"a9Ynd,􁧘93?QaكW3Hd0OpnBluau\`/VpԺl WeFU{x7|E3z h\.T*F?qXՔJ%XVV3A 0 !$V+g<,jg6NBIOzW8cS鰻X?NM&n}|ǏJ}3zςq5V NN)2k܍. k e|'I/v}0jG\IENDB`cinnamon-6.6.8/data/icons/hicolor_actions_24x24_cinnamon-hc-single-click.png0000664000175000017500000000074015167446463025672 0ustar fabiofabioPNG  IHDRw=bKGDtIME .X IDATHձQO\QP<9@!uUob ҚtVA87ܳݸ={a|g?Zk_2M͂縁N@ a>q.@iN pQ3R PRiZE$.{⤸AV`2Xǹs+e`XFhpgxF~"ru[տC *٬8>Ði7i>^U8£,_VqfwoN!I{Zfo v.8&-O y|sN;&#|4*5 v4 Y&IENDB`cinnamon-6.6.8/data/icons/hicolor_actions_scalable_cinnamon-caps-lock-off-symbolic.svg0000664000175000017500000000527315167446463030205 0ustar fabiofabio image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-6.6.8/data/icons/hicolor_actions_scalable_cinnamon-caps-lock-symbolic.svg0000664000175000017500000000520715167446463027432 0ustar fabiofabio image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-6.6.8/data/icons/hicolor_actions_scalable_cinnamon-num-lock-off-symbolic.svg0000664000175000017500000000525015167446463030051 0ustar fabiofabio image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-6.6.8/data/icons/hicolor_actions_scalable_cinnamon-num-lock-symbolic.svg0000664000175000017500000000516015167446463027301 0ustar fabiofabio image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-6.6.8/data/icons/hicolor_apps_scalable_cinnamon-panel-launcher.svg0000664000175000017500000011463415167446463026145 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_apps_scalable_cinnamon-virtual-keyboard.svg0000664000175000017500000011030515167446463026522 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_apps_scalable_removable-drives.svg0000664000175000017500000005116715167446463024716 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cinnamon-all-applications-symbolic.svg0000664000175000017500000001307415167446463031500 0ustar fabiofabio image/svg+xml Cinnamon All Applications Cinnamon All Applications cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-actions.svg0000664000175000017500000012713415167446463024673 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-applets.svg0000664000175000017500000017202415167446463024701 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-backgrounds-symbolic.svg0000664000175000017500000000554515167446463027355 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-backgrounds.svg0000664000175000017500000012055015167446463025530 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-bluetooth.svg0000664000175000017500000002376315167446463025243 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-cat-admin.svg0000664000175000017500000004667515167446463025102 0ustar fabiofabio image/svg+xml $ cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-cat-appearance.svg0000664000175000017500000002415615167446463026077 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-cat-hardware.svg0000664000175000017500000007730315167446463025577 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-cat-prefs.svg0000664000175000017500000003471715167446463025123 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-color.svg0000664000175000017500000004664115167446463024354 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-date-time.svg0000664000175000017500000012776015167446463025111 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-default-applications.svg0000664000175000017500000011440515167446463027340 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-desklets-symbolic.svg0000664000175000017500000000415215167446463026662 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-desklets.svg0000664000175000017500000004470315167446463025051 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-desktop-effects.svg0000664000175000017500000007220015167446463026312 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-desktop.svg0000664000175000017500000001023415167446463024674 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-details.svg0000664000175000017500000013245115167446463024656 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-display.svg0000664000175000017500000002436015167446463024675 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-drivers.svg0000664000175000017500000011466415167446463024715 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-extensions.svg0000664000175000017500000004073415167446463025432 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-firewall.svg0000664000175000017500000015467015167446463025045 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-fonts.svg0000664000175000017500000002036015167446463024355 0ustar fabiofabio A cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-general.svg0000664000175000017500000004330015167446463024640 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-gestures.svg0000664000175000017500000001063215167446463025066 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-input-method.svg0000664000175000017500000022327315167446463025651 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-keyboard.svg0000664000175000017500000011030515167446463025023 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-language.svg0000664000175000017500000016267015167446463025022 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-login.svg0000664000175000017500000005513415167446463024343 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-mouse.svg0000664000175000017500000002777015167446463024370 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-network.svg0000664000175000017500000002721115167446463024717 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-nightlight.svg0000664000175000017500000005670215167446463025376 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-notifications.svg0000664000175000017500000021537515167446463026111 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-online-accounts.svg0000664000175000017500000007041715167446463026335 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-overview.svg0000664000175000017500000004155515167446463025103 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-panel.svg0000664000175000017500000001107415167446463024325 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-power.svg0000664000175000017500000003045115167446463024362 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-printer.svg0000664000175000017500000065744715167446463024735 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-privacy.svg0000664000175000017500000023512515167446463024710 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-region.svg0000664000175000017500000021146015167446463024512 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-screen.svg0000664000175000017500000000575115167446463024512 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-screensaver.svg0000664000175000017500000006605315167446463025555 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-sound.svg0000664000175000017500000003535515167446463024366 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-sources.svg0000664000175000017500000005413015167446463024711 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-startup-programs.svg0000664000175000017500000050773515167446463026576 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-tablet.svg0000664000175000017500000022137515167446463024510 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-themes.svg0000664000175000017500000012543015167446463024515 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-thunderbolt.svg0000664000175000017500000021375515167446463025572 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-universal-access.svg0000664000175000017500000002475115167446463026503 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-user-accounts.svg0000664000175000017500000010341015167446463026015 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-user.svg0000664000175000017500000006672415167446463024220 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-windows.svg0000664000175000017500000011457015167446463024725 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_categories_scalable_cs-workspaces.svg0000664000175000017500000003315415167446463025412 0ustar fabiofabio cinnamon-6.6.8/data/icons/hicolor_devices_scalable_audio-speaker-center-back.svg0000664000175000017500000004514015167446463027026 0ustar fabiofabio image/svg+xml audio device speaker output center audio-speaker-center Evangeline McGlynn cinnamon-6.6.8/data/icons/hicolor_devices_scalable_audio-speaker-center.svg0000664000175000017500000004651115167446463026133 0ustar fabiofabio image/svg+xml audio device speaker output center audio-speaker-center Evangeline McGlynn cinnamon-6.6.8/data/icons/hicolor_devices_scalable_audio-speaker-left-back.svg0000664000175000017500000004656515167446463026514 0ustar fabiofabio image/svg+xml audio device speaker output left-back audio-speaker-left-back Evangeline McGlynn cinnamon-6.6.8/data/icons/hicolor_devices_scalable_audio-speaker-left-side.svg0000664000175000017500000004653315167446463026533 0ustar fabiofabio image/svg+xml audio device speaker output left-side audio-speaker-left-side Evangeline McGlynn cinnamon-6.6.8/data/icons/hicolor_devices_scalable_audio-speaker-left.svg0000664000175000017500000004654615167446463025615 0ustar fabiofabio image/svg+xml audio device speaker output left audio-speaker-left Evangeline McGlynn cinnamon-6.6.8/data/icons/hicolor_devices_scalable_audio-speaker-right-back.svg0000664000175000017500000004657515167446463026700 0ustar fabiofabio image/svg+xml audio device speaker output right-back audio-speaker-right-back Evangeline McGlynn cinnamon-6.6.8/data/icons/hicolor_devices_scalable_audio-speaker-right-side.svg0000664000175000017500000004653515167446463026720 0ustar fabiofabio image/svg+xml audio device speaker output right-side audio-speaker-right-side Evangeline McGlynn cinnamon-6.6.8/data/icons/hicolor_devices_scalable_audio-speaker-right.svg0000664000175000017500000004654315167446463025775 0ustar fabiofabio image/svg+xml audio device speaker output right audio-speaker-right Evangeline McGlynn cinnamon-6.6.8/data/icons/hicolor_devices_scalable_audio-subwoofer.svg0000664000175000017500000003353115167446463025234 0ustar fabiofabio image/svg+xml audio device subwoofer output audio-subwoofer Evangeline McGlynn cinnamon-6.6.8/data/icons/hicolor_devices_scalable_bluetooth.svg0000664000175000017500000003453115167446463024130 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_emblems_scalable_cs-xlet-danger.svg0000664000175000017500000004346515167446463024750 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_emblems_scalable_cs-xlet-error.svg0000664000175000017500000003160015167446463024625 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_emblems_scalable_cs-xlet-installed.svg0000664000175000017500000003766115167446463025470 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_emblems_scalable_cs-xlet-running.svg0000664000175000017500000003153015167446463025156 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_emblems_scalable_cs-xlet-system.svg0000664000175000017500000004566315167446463025036 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/hicolor_emblems_scalable_cs-xlet-update.svg0000664000175000017500000003615415167446463024767 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/icons/meson.build0000664000175000017500000000076415167446463016476 0ustar fabiofabioicons = run_command('find_icons.sh', check: true).stdout().strip().split() # double-click, drag-click, right-click, single-click icons imported from mousetweaks # (git@github.com:GNOME/mousetweaks.git) foreach icon : icons parts = icon.split('_') theme = parts[0] category = parts[1] icontype = parts[2] filename = parts[3] install_data( icon, rename: filename, install_dir: join_paths(datadir, 'icons', theme, icontype, category), ) endforeach cinnamon-6.6.8/data/meson.build0000664000175000017500000000266715167446463015367 0ustar fabiofabiosubdir('icons') install_subdir( 'search_providers', install_dir: pkgdatadir, ) subdir('theme') install_subdir( 'theme', exclude_files: [ 'theme-changelog.txt', 'meson.build' ], exclude_directories: ['cinnamon-sass'], install_dir: pkgdatadir, ) desktop_conf = configuration_data() desktop_conf.set('bindir', join_paths(prefix, bindir)) desktop_conf.set('libexecdir', join_paths(prefix, libexecdir)) desktop_conf.set('VERSION', meson.project_version()) desktop_files = ['cinnamon.desktop', 'cinnamon2d.desktop'] if get_option('wayland') desktop_files += ['cinnamon-wayland.desktop'] endif foreach desktop_file : desktop_files i18n.merge_file( type: 'desktop', input: configure_file( input: desktop_file + '.in.in', output: desktop_file + '.in', configuration: desktop_conf, ), output: desktop_file, po_dir: po_dir, install: true, install_dir: desktopdir, ) endforeach subdir('xdg-portal') if get_option('wayland') subdir('wayland_sessions') endif subdir('xsessions') subdir('services') install_data( ['org.cinnamon.gschema.xml', 'org.cinnamon.gestures.gschema.xml'], install_dir: schemadir, ) gnome.compile_resources( 'cinnamon-osk-layouts', 'cinnamon-osk-layouts.gresource.xml', source_dir: 'osk-layouts', gresource_bundle: true, install: true, install_dir: pkgdatadir ) cinnamon-6.6.8/data/org.cinnamon.gestures.gschema.xml0000664000175000017500000000717515167446463021604 0ustar fabiofabio false Enables gesture support using Touchegg. 60 An approximate distance, measured in percent of the size of the touch device or area. This setting is for swipe gestures only. 40 An approximate distance, measured in percent of the size of the touch device or area. This setting is for pinch gestures only. 'PUSH_TILE_LEFT' Touchscreen only 'PUSH_TILE_RIGHT' Touchscreen only 'PUSH_TILE_UP' Touchscreen only 'PUSH_TILE_DOWN' Touchscreen only 'WORKSPACE_NEXT' 'WORKSPACE_PREVIOUS' 'TOGGLE_EXPO' 'TOGGLE_OVERVIEW' 'WINDOW_WORKSPACE_PREVIOUS' 'WINDOW_WORKSPACE_NEXT' 'VOLUME_UP' 'VOLUME_DOWN' '' Touchscreen only '' Touchscreen only '' Touchscreen only '' Touchscreen only '' '' '' '' '' '' '' Touchscreen only '' Touchscreen only '' Touchscreen only 'MEDIA_PLAY_PAUSE' Touchscreen only '' Touchscreen only '' Touchscreen only cinnamon-6.6.8/data/org.cinnamon.gschema.xml0000664000175000017500000010705615167446463017743 0ustar fabiofabio true Enable internal tools useful for developers and testers from Alt-F2 Allows access to internal debugging and monitoring tools using the Alt-F2 dialog. [] Uuids of extensions to enable Cinnamon extensions have a uuid property; this key lists extensions which should be loaded. disabled-extensions overrides this setting for extensions that appear in both lists. Append ! in front of uuid to override version check 0 [not used - obsolete] true Whether to enable the NetworkManager agent true Whether to enable the Polkit agent true Whether to enable the SSH agent ['panel1:left:0:menu@cinnamon.org', 'panel1:left:1:separator@cinnamon.org', 'panel1:left:2:grouped-window-list@cinnamon.org', 'panel1:right:0:systray@cinnamon.org', 'panel1:right:1:xapp-status@cinnamon.org', 'panel1:right:2:notifications@cinnamon.org', 'panel1:right:3:printers@cinnamon.org', 'panel1:right:4:removable-drives@cinnamon.org', 'panel1:right:5:keyboard@cinnamon.org', 'panel1:right:6:favorites@cinnamon.org', 'panel1:right:7:network@cinnamon.org', 'panel1:right:8:sound@cinnamon.org', 'panel1:right:9:power@cinnamon.org', 'panel1:right:10:calendar@cinnamon.org', 'panel1:right:11:cornerbar@cinnamon.org'] Uuids of applets to enable Cinnamon applets have a uuid property; this key lists applets which should be loaded. Append ! in front of uuid to override version check. 0 [not used - obsolete] 0 The next applet id to give the next added applet Do not change manually. 0 The next desklet id to give the next added desklet Do not change manually. [] Uuids of desklets to enable Cinnamon desklets have a uuid property; this key lists desklets which should be loaded. uuids should be put in the form uuid:id:x:y, where id is used to distinguish between multiple instances of the same desklet. Append ! in front of uuid to override version check. 0 [not used - obsolete] [] Uuids of search providers to enable Cinnamon search providers have a uuid property; this key lists search providers which should be loaded. true Whether desklets "snap" to a grid position Enabling this allows desklets' position to be snapped into a regular grid 25 The interval between each possible grid position when desklets "snap" If desklet-snap is enabled, the possible positions of desklets will be all integer multiples of the value of "desklet-snap-size" false Locks the current position of all desklets and prevents dragging ['1:0:bottom'] List of panels used Panels are listed in the following format: panelID:monitor:position, where monitor is the monitor number (0 for primary), and position is either top or bottom ['1:false'] Auto-hide panel Whether the panel autohides or not. ['1:0'] Duration of the delay before a hidden panel is shown Duration of the delay (in milliseconds) ['1:0'] Duration of the delay before a shown panel is hidden Duration of the delay (in milliseconds) ['1:40'] Panel size User-defined panel-height for panels. Note, this value may or may not be the true value in use at runtime, depending on any scaling that may be occurring (on hidpi screens, for instance). '[{"panelId": 1, "left": 0, "center": 0, "right": 24}]' Per-zone fullcolor icon-size configuration Panel zone configuration objects for fullcolor icon size. '[{"panelId": 1, "left": 28, "center": 28, "right": 16}]' Per-zone symbolic icon-size configuration Panel zone configuration objects for symbolic icon size. This is calculates size as a fraction of current color icon sizes '[{"panelId": 1, "left":0.0, "center":0.0, "right":0.0}]' Per-zone text-size configuration, values in point Panel zone configuration objects for text, values are expressed as points. Setting to 0.0 will give control to the theme. false (Deprecated) Scale panel applet text and icons (Deprecated) Retained to avoid applets who read the property from crashing Cinnamon true Enable desktop effects on dialog boxes Whether to enable desktop effects on dialog boxes. true Enable desktop effects on Gtk menus Whether to enable desktop effects on Gtk menus. true Enable desktop effects in the Cinnamon ui This affects switching workspaces, expo and scale. true Enable desktop effects Whether to enable desktop effects and window animations. "traditional" Effect used when closing windows An effect: traditional, fly, none "traditional" Effect used when mapping windows An effect: traditional, fly, fade, none "traditional" Effect used when minimizing windows An effect: traditional, fly, fade, none true Whether to show an animation when unmaximizing/tiling/snapping windows 1 Speed multiplier for window-effects true Whether the startup animation is enabled Whether the startup animation is enabled [] Aliases given to battery powered fardware devices "" (Deprecated) Layout style (Deprecated) Layout styles - pre-2.6 "YYYY-MM-DD" Date format Format used for dates. 0 (Deprecated) Number of workspaces (Deprecated) Number of Workspaces - pre-2.6, even though you shouldn't use it even on <2.6 releases. Use org.cinnamon.desktop.wm.preferences num-workspaces instead. ["DEPRECATED"] Obsolete - unused Obsolete - unused ['expo:false:0', 'scale:false:0', 'scale:false:0', 'desktop:false:0'] Properties of hotcorners Properties of hotcorners, in the form functionality:hover-enabled:hover-delay. The order in which properties are displayed is top left, top right, bottom left, bottom right. false Enable hotcorners in fullscreen Enable hotcorners in fullscreen ["DEPRECATED"] Obsolete - unused Obsolete - unused true Whether to collect stats about applications usage Cinnamon normally monitors active applications in order to present the most used ones (e.g. in launchers). While this data will be kept private, you may want to disable this for privacy reasons. Please note that doing so won't remove already saved data. [ 'org.gnome.Calculator.desktop', 'org.gnome.Calendar.desktop', 'org.x.editor.desktop', 'mintinstall.desktop', 'cinnamon-settings.desktop' ] List of desktop file IDs for favorite applications The applications corresponding to these identifiers will be displayed in the favorites area. ['DEPRECATED'] (Deprecated) List of non-default workspace names (Deprecated) The user-set names of the workspaces. Deprecated since 2.6. Use org.cinnamon.desktop.wm.preferences workspace-names instead. true Enable or disable the workspace OSD Whether the name of the workspace shows up on the screen when activated or not. false Display the Expo view as a grid When enabled the Expo view will be displayed as a grid. true Show the Expo view on the primary monitor When enabled the Expo view will be displayed on the primary monitor rather than the current monitor. [] disabled OpenSearch providers [] History for command (Alt-F2) dialog [] History for the looking glass dialog 1 0 false Whether to omit pointer barriers between adjacent panels. false Panel edit mode A mode for the user to drag and drop applets and modify the look of the desktop true Obsolete "icons+thumbnails" ALT-tab switcher style Controls the style of the ALT-tab window switcher. Can be any combination of "icons", "preview" and "thumbnails", separated by "+". false Enforce displaying the alt-tab switcher on the primary monitor instead of the active one false Show windows from current monitor only true Move minimized windows to the end of the appSwitcher 100 Duration of the effect (in milliseconds) Duration of the effect (in milliseconds) false Show all windows from all workspaces false Warp mouse pointer to the new focused window false not used - lives in org.cinnamon.muffin now false [unused] Prevents windows that request user attention from stealing focus This setting is no longer used. 1 The decoration level of the desklets The amount of decoration desklets must have. 0 = None; 1 = Borders; 2 = Borders and header; false Whether edge flip is enabled 1000 Duration of the delay before switching the workspace Duration of the delay (in milliseconds) false Whether advanced mode is enabled in cinnamon-settings true Whether or not to show possible completions in the run dialog (Alt-F2) [] Aliases for the Alt-F2 dialog Aliases for use in the Alt-F2 dialog. This is a list of strings of the form a:b, where an instance of "a" is to be replaced with "b". Replacement is only performed on the first word. true Whether or not to show the media keys osd "" The logo to use in the startup animation An icon name or absolute path to an icon, which will be used in the startup animation. If this is left empty, only a black screen will display. false If true, Cinnamon will no longer attempt to be the session notification handler. "" The logo to use in the system info settings An icon name or absolute path to an icon, which will be used for the system icon in the "System Info" settings app. Disabled if no value is set. true Center the pointer on the new monitor If true, the pointer will be set to the center of the new monitor when using pointer next/previous shortcuts. true Enable the fade effect in Cinnamon scrollviews Whether the vfade effect is enabled or not true Show the tile/snap OSD Hide the snap OSD. true Show the tile HUD Hide the tile HUD. false not used [] unused ['gnome-screenshot', 'lxterminal', 'xfce4-terminal', 'firefox', 'libreoffice', 'soffice'] WM class names to always give focus to in windowAttentionHandler.js "cinnamon-symbolic" The default icon name of the application menu Controls the default icon name used by the application menu. "" The default label of the application menu Controls the default label used by the application menu. "single" The type of mouse action to be performed using hoverkey (single, double, drag, secondary) "vertical::both" This defines the layout for the hoverkey window - format is vertical | horizontal :: icons | text | both "" Stores the position of the hoverclick window so it can be restored there later - format is x::y "" Theme name The name of the theme 0 [not used - obsolete] 0.67 Relative size of symbolic icons to the zone's icon size 1.5 Relative size of the scrollbars between gtk3 and gtk2 - the set value is multiplied by this for the gtk2 value 'tablet' Which keyboard to use The type of keyboard to use. 'on-demand' How the keyboard becomes activated Can be: on-demand: display the keyboard only at user demand, either when the applet is clicked, or a keyboard shortcut is used. accessible: display the keyboard any time an input field becomes the desktop keyboard focus. 3 The size of the keyboard. Set this value to X for the keyboard to take 1/x of the screen. The size of the keyboard. Set this value to X for the keyboard to take 1/x of the screen. 'top' Keyboard position Keyboard position. 15 Framerate used for recording screencasts. The framerate of the resulting screencast recordered by Cinnamon's screencast recorder in frames-per-second. '' The gstreamer pipeline used to encode the screencast Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch. The pipeline should have an unconnected sink pad where the recorded video is recorded. It will normally have a unconnected source pad; output from that pad will be written into the output file. However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar. When unset or set to an empty value, the default pipeline will be used. This is currently 'videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is used as a placeholder for a guess at the optimal thread count on the system. 'webm' File extension used for storing the screencast The filename for recorded screencasts will be a unique filename based on the current date, and use this extension. It should be changed when recording to a different container format. "wallpaper" Background mode This key defines the whether the desktop background shows one single wallpaper, a slideshow or an online slideshow (Flickr). "" Folder to use for the slideshow This key defines the folder to use for the slideshow. false Whether to list files recursively for the slideshow This key defines whether to list files recursively for the slideshow. 15 Delay for the slideshow This key defines the delay for the slideshow. false Whether to play a sound when switching workspaces Whether to play a sound when switching workspaces. "" Which sound to play when switching workspaces Which sound to play when switching workspaces. false Whether to play a sound when closing windows Whether to play a sound when closing windows. "" Which sound to play when closing windows Which sound to play when closing windows. false Whether to play a sound when mapping windows Whether to play a sound when mapping windows. "" Which sound to play when mapping windows Which sound to play when mapping windows. false Whether to play a sound when minimizing windows Whether to play a sound when minimizing windows. "" Which sound to play when minimizing windows Which sound to play when minimizing windows. false Whether to play a sound when maximizing windows Whether to play a sound when maximizing windows. "" Which sound to play when maximizing windows Which sound to play when maximizing windows. false Whether to play a sound when unmaximizing windows Whether to play a sound when unmaximizing windows. "" Which sound to play when unmaximizing windows Which sound to play when unmaximizing windows. false Whether to play a sound when tiling windows Whether to play a sound when tiling windows. "" Which sound to play when tiling windows Which sound to play when tiling windows. false Whether to play a sound during login Whether to play a sound during login. "" Which sound to play when logging in Which sound to play during login. false Whether to play a sound during logout Whether to play a sound during logout. "" Which sound to play when logging out Which sound to play during logout. false Whether to play a sound when a device is plugged Whether to play a sound when a device is plugged. "" Which sound to play when a device is plugged Which sound to play when a device is plugged. false Whether to play a sound when a device is unplugged Whether to play a sound when a device is unplugged. "" Which sound to play when a device is plugged Which sound to play when a device is unplugged. false Whether to play a sound when showing notifications Whether to play a sound when showing notifications. "" Which sound to play when showing notifications Which sound to play when showing notifications. [] Desktop files of the applications to be shown on desktop The "launchers" desklet provides a method to show a launcher on the desktop This list maps the desklet id to the desktop file of application. false [] Keybinding array for runtime keybinding. 0 Action id for keybinding '' deprecated - moved to org.cinnamon.desktop.keybindings '' deprecated - moved to org.cinnamon.desktop.keybindings '' deprecated - moved to org.cinnamon.desktop.keybindings true Whether to restart Cinnamon when it reachs the memory limit 2048 Memory limit (in MB) 300 Time between each checks (in seconds) cinnamon-6.6.8/data/osk-layouts/0000775000175000017500000000000015167446463015504 5ustar fabiofabiocinnamon-6.6.8/data/osk-layouts/am.json0000664000175000017500000002063515167446463017002 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "է" ], [ "թ" ], [ "փ" ], [ "ձ" ], [ "ջ" ], [ "ր" ], [ "չ" ], [ "ճ" ], [ "ժ" ], [ "ծ" ] ], [ [ "ք" ], [ "ո" ], [ "ե", "և" ], [ "ռ" ], [ "տ" ], [ "ը" ], [ "ւ" ], [ "ի" ], [ "օ" ], [ "պ" ] ], [ [ "ա" ], [ "ս" ], [ "դ" ], [ "ֆ" ], [ "գ" ], [ "հ" ], [ "յ" ], [ "կ" ], [ "լ" ], [ "խ" ] ], [ [ "զ" ], [ "ղ" ], [ "ց" ], [ "վ" ], [ "բ" ], [ "ն" ], [ "մ" ], [ "շ" ] ], [ [ "," ], [ " " ], [ "։" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Է" ], [ "Թ" ], [ "Փ" ], [ "Ձ" ], [ "Ջ" ], [ "Ր" ], [ "Չ" ], [ "Ճ" ], [ "Ժ" ], [ "Ծ" ] ], [ [ "Ք" ], [ "Ո" ], [ "Ե", "ԵՒ" ], [ "Ռ" ], [ "Տ" ], [ "Ը" ], [ "Ւ" ], [ "Ի" ], [ "Օ" ], [ "Պ" ] ], [ [ "Ա" ], [ "Ս" ], [ "Դ" ], [ "Ֆ" ], [ "Գ" ], [ "Հ" ], [ "Յ" ], [ "Կ" ], [ "Լ" ], [ "Խ" ] ], [ [ "Զ" ], [ "Ղ" ], [ "Ց" ], [ "Վ" ], [ "Բ" ], [ "Ն" ], [ "Մ" ], [ "Շ" ] ], [ [ "," ], [ " " ], [ "։" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "՜", "¡" ], [ "?", "՞", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "՝" ], [ "։", "!", "?", ",", ".", "֊", "՜", "՝", "՞", ":", ";", "@", "ՙ", "՚", "՛", "՟" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "՝" ], [ "։", "!", "?", ",", ".", "֊", "՜", "՝", "՞", ":", ";", "@", "ՙ", "՚", "՛", "՟" ] ] ] } ], "locale": "hy", "name": "Armenian" }cinnamon-6.6.8/data/osk-layouts/ara.json0000664000175000017500000001617715167446463017156 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "ض" ], [ "ص" ], [ "ث" ], [ "ق", "ڨ" ], [ "ف", "ڤ", "ڢ", "ڥ" ], [ "غ" ], [ "ع" ], [ "ه", "ه‍" ], [ "خ" ], [ "ح" ], [ "ج", "چ" ] ], [ [ "ش", "ڜ" ], [ "س" ], [ "ي", "ئ", "ى" ], [ "ب", "پ" ], [ "ل", "لا", "لأ", "لإ", "لآ" ], [ "ا", "آ", "ء", "أ", "إ", "ٱ" ], [ "ت" ], [ "ن" ], [ "م" ], [ "ك", "گ", "ک" ], [ "ط" ] ], [ [ "ذ" ], [ "ء" ], [ "ؤ" ], [ "ر" ], [ "ى", "ئ" ], [ "ة" ], [ "و" ], [ "ز", "ژ" ], [ "ظ" ], [ "د" ] ], [ [ "،" ], [ " " ], [ ".", "\"", "'", "#", "-", ":", "!", "،", "؟", "@", "&", "%", "+", "؛", "/", ")", "(" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "١", "¹", "½", "⅓", "¼", "⅛" ], [ "٢", "²", "⅔" ], [ "٣", "³", "¾", "⅜" ], [ "٤", "⁴" ], [ "٥", "⅝" ], [ "٦" ], [ "٧", "⅞" ], [ "٨" ], [ "٩" ], [ "٠", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "٪", "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "﴿", ">", "}", "]" ], [ ")", "﴾", "<", "{", "[" ] ], [ [ "*", "★", "٭" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ "؛", ";" ], [ "!", "¡" ], [ "؟", "?" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "،", "؟", "؛", "!", ":", "-", "/", "'", "\"" ], [ ".", "ٕ", "ٔ", "ْ", "ٍ", "ٌ", "ً", "ّ", "ٖ", "ٰ", "ٓ", "ِ", "ُ", "َ", "ـ" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "›", "≥", "»" ], [ ">", "‹", "≤", "«" ], [ " " ], [ "،", "؟", "؛", "!", ":", "-", "/", "'", "\"" ], [ ".", "ٕ", "ٔ", "ْ", "ٍ", "ٌ", "ً", "ّ", "ٖ", "ٰ", "ٓ", "ِ", "ُ", "َ", "ـ" ] ] ] } ], "locale": "ar", "name": "Arabic" }cinnamon-6.6.8/data/osk-layouts/be.json0000664000175000017500000002063315167446463016771 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "é", "ë", "ê", "è", "ę", "ė", "ē" ], [ "r" ], [ "t" ], [ "y", "ij" ], [ "u", "ú", "ü", "û", "ù", "ū" ], [ "i", "í", "ï", "ì", "î", "į", "ī", "ij" ], [ "o", "ó", "ö", "ô", "ò", "õ", "œ", "ø", "ō" ], [ "p" ] ], [ [ "a", "á", "ä", "â", "à", "æ", "ã", "å", "ā" ], [ "s" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "z" ], [ "x" ], [ "c" ], [ "v" ], [ "b" ], [ "n", "ñ", "ń" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "É", "Ë", "Ê", "È", "Ę", "Ė", "Ē" ], [ "R" ], [ "T" ], [ "Y", "IJ" ], [ "U", "Ú", "Ü", "Û", "Ù", "Ū" ], [ "I", "Í", "Ï", "Ì", "Î", "Į", "Ī", "IJ" ], [ "O", "Ó", "Ö", "Ô", "Ò", "Õ", "Œ", "Ø", "Ō" ], [ "P" ] ], [ [ "A", "Á", "Ä", "Â", "À", "Æ", "Ã", "Å", "Ā" ], [ "S" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Z" ], [ "X" ], [ "C" ], [ "V" ], [ "B" ], [ "N", "Ñ", "Ń" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "€", "¢", "£", "$", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¥" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "nl-BE", "name": "Dutch (Belgium)" }cinnamon-6.6.8/data/osk-layouts/bg.json0000664000175000017500000001672215167446463016777 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "я" ], [ "в" ], [ "е" ], [ "р" ], [ "т" ], [ "ъ" ], [ "у" ], [ "и", "ѝ" ], [ "о" ], [ "п" ], [ "ч" ] ], [ [ "а" ], [ "с" ], [ "д" ], [ "ф" ], [ "г" ], [ "х" ], [ "й" ], [ "к" ], [ "л" ], [ "ш" ], [ "щ" ] ], [ [ "з" ], [ "ь" ], [ "ц" ], [ "ж" ], [ "б" ], [ "н" ], [ "м" ], [ "ю" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Я" ], [ "В" ], [ "Е" ], [ "Р" ], [ "Т" ], [ "Ъ" ], [ "У" ], [ "И", "Ѝ" ], [ "О" ], [ "П" ], [ "Ч" ] ], [ [ "А" ], [ "С" ], [ "Д" ], [ "Ф" ], [ "Г" ], [ "Х" ], [ "Й" ], [ "К" ], [ "Л" ], [ "Ш" ], [ "Щ" ] ], [ [ "З" ], [ "Ь" ], [ "Ц" ], [ "Ж" ], [ "Б" ], [ "Н" ], [ "М" ], [ "Ю" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "bg", "name": "Bulgarian" }cinnamon-6.6.8/data/osk-layouts/by.json0000664000175000017500000001711315167446463017014 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "й" ], [ "ц" ], [ "у" ], [ "к" ], [ "е", "ё" ], [ "н" ], [ "г" ], [ "ш" ], [ "ў" ], [ "з" ], [ "х" ] ], [ [ "ф" ], [ "ы" ], [ "в" ], [ "а" ], [ "п" ], [ "р" ], [ "о" ], [ "л" ], [ "д" ], [ "ж" ], [ "э" ] ], [ [ "я" ], [ "ч" ], [ "с" ], [ "м" ], [ "і" ], [ "т" ], [ "ь", "ъ" ], [ "б" ], [ "ю" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Й" ], [ "Ц" ], [ "У" ], [ "К" ], [ "Е", "Ё" ], [ "Н" ], [ "Г" ], [ "Ш" ], [ "Ў" ], [ "З" ], [ "Х" ] ], [ [ "Ф" ], [ "Ы" ], [ "В" ], [ "А" ], [ "П" ], [ "Р" ], [ "О" ], [ "Л" ], [ "Д" ], [ "Ж" ], [ "Э" ] ], [ [ "Я" ], [ "Ч" ], [ "С" ], [ "М" ], [ "І" ], [ "Т" ], [ "Ь", "Ъ" ], [ "Б" ], [ "Ю" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "be", "name": "Belarusian" }cinnamon-6.6.8/data/osk-layouts/ca.json0000664000175000017500000002123515167446463016765 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "é", "è", "ê", "ë", "%", "ę", "ė", "ē" ], [ "r" ], [ "t" ], [ "y", "%", "ÿ" ], [ "u", "ù", "û", "%", "ü", "ú", "ū" ], [ "i", "î", "%", "ï", "ì", "í", "į", "ī" ], [ "o", "ô", "œ", "%", "ö", "ò", "ó", "õ", "ø", "ō", "º" ], [ "p" ] ], [ [ "a", "à", "â", "%", "æ", "á", "ä", "ã", "å", "ā", "ª" ], [ "s" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "z" ], [ "x" ], [ "c", "ç", "ć", "č" ], [ "v" ], [ "b" ], [ "n" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "É", "È", "Ê", "Ë", "%", "Ę", "Ė", "Ē" ], [ "R" ], [ "T" ], [ "Y", "%", "Ÿ" ], [ "U", "Ù", "Û", "%", "Ü", "Ú", "Ū" ], [ "I", "Î", "%", "Ï", "Ì", "Í", "Į", "Ī" ], [ "O", "Ô", "Œ", "%", "Ö", "Ò", "Ó", "Õ", "Ø", "Ō", "º" ], [ "P" ] ], [ [ "A", "À", "Â", "%", "Æ", "Á", "Ä", "Ã", "Å", "Ā", "ª" ], [ "S" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Z" ], [ "X" ], [ "C", "Ç", "Ć", "Č" ], [ "V" ], [ "B" ], [ "N" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "fr-CA", "name": "French Canada" }cinnamon-6.6.8/data/osk-layouts/cz.json0000664000175000017500000002163215167446463017017 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "é", "ě", "è", "ê", "ë", "ę", "ė", "ē" ], [ "r", "ř" ], [ "t", "ť" ], [ "z", "ž", "ź", "ż" ], [ "u", "ú", "ů", "û", "ü", "ù", "ū" ], [ "i", "í", "î", "ï", "ì", "į", "ī" ], [ "o", "ó", "ö", "ô", "ò", "õ", "œ", "ø", "ō" ], [ "p" ] ], [ [ "a", "á", "à", "â", "ä", "æ", "ã", "å", "ā" ], [ "s", "š", "ß", "ś" ], [ "d", "ď" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "y", "ý", "ÿ" ], [ "x" ], [ "c", "č", "ç", "ć" ], [ "v" ], [ "b" ], [ "n", "ň", "ñ", "ń" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "É", "Ě", "È", "Ê", "Ë", "Ę", "Ė", "Ē" ], [ "R", "Ř" ], [ "T", "Ť" ], [ "Z", "Ž", "Ź", "Ż" ], [ "U", "Ú", "Ů", "Û", "Ü", "Ù", "Ū" ], [ "I", "Í", "Î", "Ï", "Ì", "Į", "Ī" ], [ "O", "Ó", "Ö", "Ô", "Ò", "Õ", "Œ", "Ø", "Ō" ], [ "P" ] ], [ [ "A", "Á", "À", "Â", "Ä", "Æ", "Ã", "Å", "Ā" ], [ "S", "Š", "SS", "Ś" ], [ "D", "Ď" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Y", "Ý", "Ÿ" ], [ "X" ], [ "C", "Č", "Ç", "Ć" ], [ "V" ], [ "B" ], [ "N", "Ň", "Ñ", "Ń" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "cs", "name": "Czech" }cinnamon-6.6.8/data/osk-layouts/de.json0000664000175000017500000002022315167446463016766 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "é", "è", "ê", "ë", "ė" ], [ "r" ], [ "t" ], [ "z" ], [ "u", "ü", "û", "ù", "ú", "ū" ], [ "i" ], [ "o", "ö", "ô", "ò", "ó", "õ", "œ", "ø", "ō" ], [ "p" ] ], [ [ "a", "ä", "â", "à", "á", "æ", "ã", "å", "ā" ], [ "s", "ß", "ś", "š" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "y" ], [ "x" ], [ "c" ], [ "v" ], [ "b" ], [ "n", "ñ", "ń" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "É", "È", "Ê", "Ë", "Ė" ], [ "R" ], [ "T" ], [ "Z" ], [ "U", "Ü", "Û", "Ù", "Ú", "Ū" ], [ "I" ], [ "O", "Ö", "Ô", "Ò", "Ó", "Õ", "Œ", "Ø", "Ō" ], [ "P" ] ], [ [ "A", "Ä", "Â", "À", "Á", "Æ", "Ã", "Å", "Ā" ], [ "S", "SS", "Ś", "Š" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Y" ], [ "X" ], [ "C" ], [ "V" ], [ "B" ], [ "N", "Ñ", "Ń" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "€", "¢", "£", "$", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¥" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "de", "name": "German" }cinnamon-6.6.8/data/osk-layouts/dk.json0000664000175000017500000002066315167446463017004 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "é", "ë" ], [ "r" ], [ "t" ], [ "y", "ý", "ÿ" ], [ "u", "ú", "ü", "û", "ù", "ū" ], [ "i", "í", "ï" ], [ "o", "ó", "ô", "ò", "õ", "œ", "ō" ], [ "p" ], [ "å" ] ], [ [ "a", "á", "ä", "à", "â", "ã", "ā" ], [ "s", "ß", "ś", "š" ], [ "d", "ð" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l", "ł" ], [ "æ", "ä" ], [ "ø", "ö" ] ], [ [ "z" ], [ "x" ], [ "c" ], [ "v" ], [ "b" ], [ "n", "ñ", "ń" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "É", "Ë" ], [ "R" ], [ "T" ], [ "Y", "Ý", "Ÿ" ], [ "U", "Ú", "Ü", "Û", "Ù", "Ū" ], [ "I", "Í", "Ï" ], [ "O", "Ó", "Ô", "Ò", "Õ", "Œ", "Ō" ], [ "P" ], [ "Å" ] ], [ [ "A", "Á", "Ä", "À", "Â", "Ã", "Ā" ], [ "S", "SS", "Ś", "Š" ], [ "D", "Ð" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L", "Ł" ], [ "Æ", "Ä" ], [ "Ø", "Ö" ] ], [ [ "Z" ], [ "X" ], [ "C" ], [ "V" ], [ "B" ], [ "N", "Ñ", "Ń" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "€", "¢", "£", "$", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¥" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "da", "name": "Danish" }cinnamon-6.6.8/data/osk-layouts/ee.json0000664000175000017500000002341415167446463016774 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "ē", "è", "ė", "é", "ê", "ë", "ę", "ě" ], [ "r", "ŗ", "ř", "ŕ" ], [ "t", "ţ", "ť" ], [ "y", "ý", "ÿ" ], [ "u", "ü", "ū", "ų", "ù", "ú", "û", "ů", "ű" ], [ "i", "ī", "ì", "į", "í", "î", "ï", "ı" ], [ "o", "ö", "õ", "ò", "ó", "ô", "œ", "ő", "ø" ], [ "p" ], [ "ü" ] ], [ [ "a", "ä", "ā", "à", "á", "â", "ã", "å", "æ", "ą" ], [ "s", "š", "ß", "ś", "ş" ], [ "d", "ď" ], [ "f" ], [ "g", "ģ", "ğ" ], [ "h" ], [ "j" ], [ "k", "ķ" ], [ "l", "ļ", "ł", "ĺ", "ľ" ], [ "ö", "õ" ], [ "ä" ] ], [ [ "z", "ž", "ż", "ź" ], [ "x" ], [ "c", "č", "ç", "ć" ], [ "v" ], [ "b" ], [ "n", "ņ", "ñ", "ń", "ń" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "Ē", "È", "Ė", "É", "Ê", "Ë", "Ę", "Ě" ], [ "R", "Ŗ", "Ř", "Ŕ" ], [ "T", "Ţ", "Ť" ], [ "Y", "Ý", "Ÿ" ], [ "U", "Ü", "Ū", "Ų", "Ù", "Ú", "Û", "Ů", "Ű" ], [ "I", "Ī", "Ì", "Į", "Í", "Î", "Ï", "I" ], [ "O", "Ö", "Õ", "Ò", "Ó", "Ô", "Œ", "Ő", "Ø" ], [ "P" ], [ "Ü" ] ], [ [ "A", "Ä", "Ā", "À", "Á", "Â", "Ã", "Å", "Æ", "Ą" ], [ "S", "Š", "SS", "Ś", "Ş" ], [ "D", "Ď" ], [ "F" ], [ "G", "Ģ", "Ğ" ], [ "H" ], [ "J" ], [ "K", "Ķ" ], [ "L", "Ļ", "Ł", "Ĺ", "Ľ" ], [ "Ö", "Õ" ], [ "Ä" ] ], [ [ "Z", "Ž", "Ż", "Ź" ], [ "X" ], [ "C", "Č", "Ç", "Ć" ], [ "V" ], [ "B" ], [ "N", "Ņ", "Ñ", "Ń", "Ń" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "€", "¢", "£", "$", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¥" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "et", "name": "Estonian" }cinnamon-6.6.8/data/osk-layouts/epo.json0000664000175000017500000002515015167446463017165 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "ŝ", "q" ], [ "ĝ", "w", "ŵ" ], [ "e", "é", "ě", "è", "ê", "ë", "ę", "ė", "ē" ], [ "r", "ř", "ŕ", "ŗ" ], [ "t", "ť", "ț", "ţ", "ŧ" ], [ "ŭ", "y", "ý", "ŷ", "ÿ", "þ" ], [ "u", "ú", "ů", "û", "ü", "ù", "ū", "ũ", "ű", "ų", "µ" ], [ "i", "í", "î", "ï", "ĩ", "ì", "į", "ī", "ı", "ij" ], [ "o", "ó", "ö", "ô", "ò", "õ", "œ", "ø", "ō", "ő", "º" ], [ "p" ] ], [ [ "a", "á", "à", "â", "ä", "æ", "ã", "å", "ā", "ă", "ą", "ª" ], [ "s", "ß", "š", "ś", "ș", "ş" ], [ "d", "ð", "ď", "đ" ], [ "f" ], [ "g", "ğ", "ġ", "ģ" ], [ "h", "ĥ", "ħ" ], [ "j" ], [ "k", "ķ", "ĸ" ], [ "l", "ĺ", "ļ", "ľ", "ŀ", "ł" ], [ "ĵ" ] ], [ [ "z", "ź", "ż", "ž" ], [ "ĉ", "x" ], [ "c", "ć", "č", "ç", "ċ" ], [ "v", "w", "ŵ" ], [ "b" ], [ "n", "ñ", "ń", "ņ", "ň", "ʼn", "ŋ" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Ŝ", "Q" ], [ "Ĝ", "W", "Ŵ" ], [ "E", "É", "Ě", "È", "Ê", "Ë", "Ę", "Ė", "Ē" ], [ "R", "Ř", "Ŕ", "Ŗ" ], [ "T", "Ť", "Ț", "Ţ", "Ŧ" ], [ "Ŭ", "Y", "Ý", "Ŷ", "Ÿ", "Þ" ], [ "U", "Ú", "Ů", "Û", "Ü", "Ù", "Ū", "Ũ", "Ű", "Ų", "Μ" ], [ "I", "Í", "Î", "Ï", "Ĩ", "Ì", "Į", "Ī", "I", "IJ" ], [ "O", "Ó", "Ö", "Ô", "Ò", "Õ", "Œ", "Ø", "Ō", "Ő", "º" ], [ "P" ] ], [ [ "A", "Á", "À", "Â", "Ä", "Æ", "Ã", "Å", "Ā", "Ă", "Ą", "ª" ], [ "S", "SS", "Š", "Ś", "Ș", "Ş" ], [ "D", "Ð", "Ď", "Đ" ], [ "F" ], [ "G", "Ğ", "Ġ", "Ģ" ], [ "H", "Ĥ", "Ħ" ], [ "J" ], [ "K", "Ķ", "ĸ" ], [ "L", "Ĺ", "Ļ", "Ľ", "Ŀ", "Ł" ], [ "Ĵ" ] ], [ [ "Z", "Ź", "Ż", "Ž" ], [ "Ĉ", "X" ], [ "C", "Ć", "Č", "Ç", "Ċ" ], [ "V", "W", "Ŵ" ], [ "B" ], [ "N", "Ñ", "Ń", "Ņ", "Ň", "ʼN", "Ŋ" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "eo", "name": "Esperanto" }cinnamon-6.6.8/data/osk-layouts/es+cat.json0000664000175000017500000002130015167446463017545 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "è", "é", "ë", "ê", "ę", "ė", "ē" ], [ "r" ], [ "t" ], [ "y" ], [ "u", "ú", "ü", "ù", "û", "ū" ], [ "i", "í", "ï", "ì", "î", "į", "ī" ], [ "o", "ò", "ó", "ö", "ô", "õ", "ø", "œ", "ō", "º" ], [ "p" ] ], [ [ "a", "à", "á", "ä", "â", "ã", "å", "ą", "æ", "ā", "ª" ], [ "s" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l", "l·l", "ł" ], [ "ç" ] ], [ [ "z" ], [ "x" ], [ "c", "ç", "ć", "č" ], [ "v" ], [ "b" ], [ "n", "ñ", "ń" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "·", "!", ",", "?", ":", ";", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "È", "É", "Ë", "Ê", "Ę", "Ė", "Ē" ], [ "R" ], [ "T" ], [ "Y" ], [ "U", "Ú", "Ü", "Ù", "Û", "Ū" ], [ "I", "Í", "Ï", "Ì", "Î", "Į", "Ī" ], [ "O", "Ò", "Ó", "Ö", "Ô", "Õ", "Ø", "Œ", "Ō", "º" ], [ "P" ] ], [ [ "A", "À", "Á", "Ä", "Â", "Ã", "Å", "Ą", "Æ", "Ā", "ª" ], [ "S" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L", "L·L", "Ł" ], [ "Ç" ] ], [ [ "Z" ], [ "X" ], [ "C", "Ç", "Ć", "Č" ], [ "V" ], [ "B" ], [ "N", "Ñ", "Ń" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "·", "!", ",", "?", ":", ";", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "€", "¢", "£", "$", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "?", "·" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¥" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "?", "·" ] ] ] } ], "locale": "ca", "name": "Catalan" }cinnamon-6.6.8/data/osk-layouts/es.json0000664000175000017500000002133615167446463017013 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "é", "è", "ë", "ê", "ę", "ė", "ē" ], [ "r" ], [ "t" ], [ "y" ], [ "u", "ú", "ü", "ù", "û", "ū" ], [ "i", "í", "ï", "ì", "î", "į", "ī" ], [ "o", "ó", "ò", "ö", "ô", "õ", "ø", "œ", "ō", "º" ], [ "p" ] ], [ [ "a", "á", "à", "ä", "â", "ã", "å", "ą", "æ", "ā", "ª" ], [ "s" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ], [ "ñ" ] ], [ [ "z" ], [ "x" ], [ "c", "ç", "ć", "č" ], [ "v" ], [ "b" ], [ "n", "ñ", "ń" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", ";", "!", ",", "?", ":", "¡", "@", "¿" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "É", "È", "Ë", "Ê", "Ę", "Ė", "Ē" ], [ "R" ], [ "T" ], [ "Y" ], [ "U", "Ú", "Ü", "Ù", "Û", "Ū" ], [ "I", "Í", "Ï", "Ì", "Î", "Į", "Ī" ], [ "O", "Ó", "Ò", "Ö", "Ô", "Õ", "Ø", "Œ", "Ō", "º" ], [ "P" ] ], [ [ "A", "Á", "À", "Ä", "Â", "Ã", "Å", "Ą", "Æ", "Ā", "ª" ], [ "S" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ], [ "Ñ" ] ], [ [ "Z" ], [ "X" ], [ "C", "Ç", "Ć", "Č" ], [ "V" ], [ "B" ], [ "N", "Ñ", "Ń" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", ";", "!", ",", "?", ":", "¡", "@", "¿" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "€", "¢", "£", "$", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ ",", "!", "¡" ], [ ".", "?", "¿" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¥" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ ",", "!", "¡" ], [ ".", "?", "¿" ] ] ] } ], "locale": "es", "name": "Spanish" }cinnamon-6.6.8/data/osk-layouts/fi.json0000664000175000017500000002011415167446463016773 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e" ], [ "r" ], [ "t" ], [ "y" ], [ "u", "ü" ], [ "i" ], [ "o", "ø", "ô", "ò", "ó", "õ", "œ", "ō" ], [ "p" ], [ "å" ] ], [ [ "a", "æ", "à", "á", "â", "ã", "ā" ], [ "s", "š", "ß", "ś" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ], [ "ö", "ø" ], [ "ä", "æ" ] ], [ [ "z", "ž", "ź", "ż" ], [ "x" ], [ "c" ], [ "v" ], [ "b" ], [ "n" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E" ], [ "R" ], [ "T" ], [ "Y" ], [ "U", "Ü" ], [ "I" ], [ "O", "Ø", "Ô", "Ò", "Ó", "Õ", "Œ", "Ō" ], [ "P" ], [ "Å" ] ], [ [ "A", "Æ", "À", "Á", "Â", "Ã", "Ā" ], [ "S", "Š", "SS", "Ś" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ], [ "Ö", "Ø" ], [ "Ä", "Æ" ] ], [ [ "Z", "Ž", "Ź", "Ż" ], [ "X" ], [ "C" ], [ "V" ], [ "B" ], [ "N" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "€", "¢", "£", "$", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¥" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "fi", "name": "Finnish" }cinnamon-6.6.8/data/osk-layouts/fr.json0000664000175000017500000002161515167446463017013 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "a", "à", "â", "%", "æ", "á", "ä", "ã", "å", "ā", "ª" ], [ "z" ], [ "e", "é", "è", "ê", "ë", "%", "ę", "ė", "ē" ], [ "r" ], [ "t" ], [ "y", "%", "ÿ" ], [ "u", "ù", "û", "%", "ü", "ú", "ū" ], [ "i", "î", "%", "ï", "ì", "í", "į", "ī" ], [ "o", "ô", "œ", "%", "ö", "ò", "ó", "õ", "ø", "ō", "º" ], [ "p" ] ], [ [ "q" ], [ "s" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ], [ "m" ] ], [ [ "w" ], [ "x" ], [ "c", "ç", "ć", "č" ], [ "v" ], [ "b" ], [ "n" ], [ "'", "‘", "’", "‹", "›" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "A", "À", "Â", "%", "Æ", "Á", "Ä", "Ã", "Å", "Ā", "ª" ], [ "Z" ], [ "E", "É", "È", "Ê", "Ë", "%", "Ę", "Ė", "Ē" ], [ "R" ], [ "T" ], [ "Y", "%", "Ÿ" ], [ "U", "Ù", "Û", "%", "Ü", "Ú", "Ū" ], [ "I", "Î", "%", "Ï", "Ì", "Í", "Į", "Ī" ], [ "O", "Ô", "Œ", "%", "Ö", "Ò", "Ó", "Õ", "Ø", "Ō", "º" ], [ "P" ] ], [ [ "Q" ], [ "S" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ], [ "M" ] ], [ [ "W" ], [ "X" ], [ "C", "Ç", "Ć", "Č" ], [ "V" ], [ "B" ], [ "N" ], [ "'", "‘", "’", "‹", "›" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "€", "¢", "£", "$", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¥" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "fr", "name": "French" }cinnamon-6.6.8/data/osk-layouts/ge.json0000664000175000017500000001353415167446463017000 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "ქ" ], [ "წ" ], [ "ე", "ჱ" ], [ "რ" ], [ "ტ" ], [ "ყ", "ჸ" ], [ "უ" ], [ "ი", "ჲ" ], [ "ო" ], [ "პ" ] ], [ [ "ა", "ჺ" ], [ "ს" ], [ "დ" ], [ "ფ", "ჶ" ], [ "გ", "ჹ" ], [ "ჰ", "ჵ" ], [ "ჯ", "ჷ" ], [ "კ" ], [ "ლ" ] ], [ [ "ზ" ], [ "ხ", "ჴ" ], [ "ც" ], [ "ვ", "ჳ" ], [ "ბ" ], [ "ნ", "ჼ" ], [ "მ" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "ka", "name": "Georgian" }cinnamon-6.6.8/data/osk-layouts/gr.json0000664000175000017500000001703615167446463017016 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ ";", ":" ], [ "ς" ], [ "ε", "έ" ], [ "ρ" ], [ "τ" ], [ "υ", "ύ", "ϋ", "ΰ" ], [ "θ" ], [ "ι", "ί", "ϊ", "ΐ" ], [ "ο", "ό" ], [ "π" ] ], [ [ "α", "ά" ], [ "σ" ], [ "δ" ], [ "φ" ], [ "γ" ], [ "η", "ή" ], [ "ξ" ], [ "κ" ], [ "λ" ] ], [ [ "ζ" ], [ "χ" ], [ "ψ" ], [ "ω", "ώ" ], [ "β" ], [ "ν" ], [ "μ" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ ";", ":" ], [ "Σ" ], [ "Ε", "Έ" ], [ "Ρ" ], [ "Τ" ], [ "Υ", "Ύ", "Ϋ", "Ϋ́" ], [ "Θ" ], [ "Ι", "Ί", "Ϊ", "Ϊ́" ], [ "Ο", "Ό" ], [ "Π" ] ], [ [ "Α", "Ά" ], [ "Σ" ], [ "Δ" ], [ "Φ" ], [ "Γ" ], [ "Η", "Ή" ], [ "Ξ" ], [ "Κ" ], [ "Λ" ] ], [ [ "Ζ" ], [ "Χ" ], [ "Ψ" ], [ "Ω", "Ώ" ], [ "Β" ], [ "Ν" ], [ "Μ" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "€", "¢", "£", "$", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¥" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "el", "name": "Greek" }cinnamon-6.6.8/data/osk-layouts/hr.json0000664000175000017500000001673115167446463017020 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e" ], [ "r" ], [ "t" ], [ "z", "ž", "ź", "ż" ], [ "u" ], [ "i" ], [ "o" ], [ "p" ] ], [ [ "a" ], [ "s", "š", "ś", "ß" ], [ "d", "đ" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "y" ], [ "x" ], [ "c", "č", "ć", "ç" ], [ "v" ], [ "b" ], [ "n", "ñ", "ń" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E" ], [ "R" ], [ "T" ], [ "Z", "Ž", "Ź", "Ż" ], [ "U" ], [ "I" ], [ "O" ], [ "P" ] ], [ [ "A" ], [ "S", "Š", "Ś", "SS" ], [ "D", "Đ" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Y" ], [ "X" ], [ "C", "Č", "Ć", "Ç" ], [ "V" ], [ "B" ], [ "N", "Ñ", "Ń" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "hr", "name": "Croatian" }cinnamon-6.6.8/data/osk-layouts/hu.json0000664000175000017500000002047215167446463017020 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "é", "è", "ê", "ë", "ę", "ė", "ē" ], [ "r" ], [ "t" ], [ "z" ], [ "u", "ú", "ü", "ű", "û", "ù", "ū" ], [ "i", "í", "î", "ï", "ì", "į", "ī" ], [ "o", "ó", "ö", "ő", "ô", "ò", "õ", "œ", "ø", "ō" ], [ "p" ] ], [ [ "a", "á", "à", "â", "ä", "æ", "ã", "å", "ā" ], [ "s" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "y" ], [ "x" ], [ "c" ], [ "v" ], [ "b" ], [ "n" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "É", "È", "Ê", "Ë", "Ę", "Ė", "Ē" ], [ "R" ], [ "T" ], [ "Z" ], [ "U", "Ú", "Ü", "Ű", "Û", "Ù", "Ū" ], [ "I", "Í", "Î", "Ï", "Ì", "Į", "Ī" ], [ "O", "Ó", "Ö", "Ő", "Ô", "Ò", "Õ", "Œ", "Ø", "Ō" ], [ "P" ] ], [ [ "A", "Á", "À", "Â", "Ä", "Æ", "Ã", "Å", "Ā" ], [ "S" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Y" ], [ "X" ], [ "C" ], [ "V" ], [ "B" ], [ "N" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "hu", "name": "Hungarian" }cinnamon-6.6.8/data/osk-layouts/id.json0000664000175000017500000001605315167446463017000 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e" ], [ "r" ], [ "t" ], [ "y" ], [ "u" ], [ "i" ], [ "o" ], [ "p" ] ], [ [ "a" ], [ "s" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "z" ], [ "x" ], [ "c" ], [ "v" ], [ "b" ], [ "n" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E" ], [ "R" ], [ "T" ], [ "Y" ], [ "U" ], [ "I" ], [ "O" ], [ "P" ] ], [ [ "A" ], [ "S" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Z" ], [ "X" ], [ "C" ], [ "V" ], [ "B" ], [ "N" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "id", "name": "Indonesian" }cinnamon-6.6.8/data/osk-layouts/il.json0000664000175000017500000001371115167446463017006 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "'", "\"" ], [ "-", "_" ], [ "ק" ], [ "ר" ], [ "א" ], [ "ט" ], [ "ו" ], [ "ן" ], [ "ם" ], [ "פ" ] ], [ [ "ש" ], [ "ד" ], [ "ג", "ג׳" ], [ "כ" ], [ "ע" ], [ "י", "ײַ" ], [ "ח", "ח׳" ], [ "ל" ], [ "ך" ], [ "ף" ] ], [ [ "ז", "ז׳" ], [ "ס" ], [ "ב" ], [ "ה" ], [ "נ" ], [ "מ" ], [ "צ", "צ׳" ], [ "ת", "ת׳" ], [ "ץ", "ץ׳" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "₪", "$", "¢", "€", "£", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±", "﬩" ], [ "(", ">", "}", "]" ], [ ")", "<", "{", "[" ] ], [ [ "*", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ ",", "!" ], [ ".", "?" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "€" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "›", "≥", "»" ], [ ">", "‹", "≤", "«" ], [ " " ], [ ",", "!" ], [ ".", "?" ] ] ] } ], "locale": "he", "name": "Hebrew" }cinnamon-6.6.8/data/osk-layouts/in+bolnagri.json0000664000175000017500000001466015167446463020605 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "◌ौ" ], [ "◌ै" ], [ "◌ा" ], [ "◌ी" ], [ "◌ू" ], [ "ब", "ब॒", "%" ], [ "ह" ], [ "ग", "ज्ञ", "ग़", "ग॒", "%" ], [ "द" ], [ "ज", "ज॒", "ज्ञ", "ज़", "%" ], [ "ड", "ड॒", "ड़" ] ], [ [ "◌ो" ], [ "◌े" ], [ "◌्" ], [ "◌ि" ], [ "◌ु" ], [ "प" ], [ "र", "ऋ", "ऱ", "ॠ" ], [ "क", "क़" ], [ "त", "त्र" ], [ "च" ], [ "ट" ] ], [ [ "◌ॉ" ], [ "◌ं" ], [ "म", "ॐ" ], [ "न", "ञ", "ङ", "ऩ" ], [ "व" ], [ "ल", "ऌ", "ॡ" ], [ "स" ], [ "य", "य़" ], [ "◌़" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "१", "¹", "½", "⅓", "¼", "⅛" ], [ "२", "²", "⅔" ], [ "३", "³", "¾", "⅜" ], [ "४", "⁴" ], [ "५", "⅝" ], [ "६" ], [ "७", "⅞" ], [ "८" ], [ "९" ], [ "०", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "₹", "$", "¢", "€", "£", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "€" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "hi", "name": "Hindi" }cinnamon-6.6.8/data/osk-layouts/in+mal.json0000664000175000017500000001766715167446463017573 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "െ" ], [ "ൌ" ], [ "ൈ" ], [ "ാ" ], [ "ീ" ], [ "ൂ" ], [ "ബ" ], [ "ഹ" ], [ "ഗ" ], [ "ദ" ], [ "ജ" ], [ "ഡ" ], [ "‍" ] ], [ [ "ോ" ], [ "േ" ], [ "്" ], [ "ി" ], [ "ു" ], [ "പ" ], [ "ര" ], [ "ക" ], [ "ത" ], [ "ച" ], [ "ട" ] ], [ [ "െ" ], [ "ം" ], [ "മ", "ç" ], [ "ന" ], [ "വ" ], [ "ല", "ñ" ], [ "സ" ], [ "ഷ" ], [ "യ" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "ഔ" ], [ "ഐ" ], [ "ആ" ], [ "ഈ" ], [ "ഊ" ], [ "ഭ" ], [ "ങ" ], [ "ഘ" ], [ "ധ" ], [ "ഝ" ], [ "ഢ" ], [ "ഞ" ] ], [ [ "ഓ" ], [ "ഏ" ], [ "അ" ], [ "ഇ" ], [ "ഉ" ], [ "ഫ" ], [ "റ" ], [ "ഖ" ], [ "ഥ" ], [ "ഛ" ], [ "ഠ" ] ], [ [ "എ" ], [ "​" ], [ "ണ" ], [ "ന" ], [ "ഴ" ], [ "ള" ], [ "ശ" ], [ "ഷ" ], [ "യ" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "൧", "1", "¹", "½", "⅓", "¼", "⅛" ], [ "൨", "2", "²", "⅔" ], [ "൩", "3", "³", "¾", "⅜" ], [ "൪", "4", "⁴" ], [ "൫", "5", "⅝" ], [ "൬", "6" ], [ "൭", "7", "⅞" ], [ "൮", "8" ], [ "൯", "9" ], [ "൦", "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "₹", "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "ml", "name": "Malayalam" } cinnamon-6.6.8/data/osk-layouts/ir.json0000664000175000017500000001636415167446463017023 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "ض" ], [ "ص" ], [ "ث" ], [ "ق", "ڨ" ], [ "ف", "ڤ", "ڢ", "ڥ" ], [ "غ" ], [ "ع" ], [ "ه", "ه‍" ], [ "خ" ], [ "ح" ], [ "ج", "چ" ] ], [ [ "ش", "ڜ" ], [ "س" ], [ "ي", "ئ", "ى" ], [ "ب", "پ" ], [ "ل", "لا", "لأ", "لإ", "لآ" ], [ "ا", "آ", "ء", "أ", "إ", "ٱ" ], [ "ت" ], [ "ن" ], [ "م" ], [ "ك", "گ", "ک" ], [ "ط" ] ], [ [ "ذ" ], [ "ء" ], [ "ؤ" ], [ "ر" ], [ "ى", "ئ" ], [ "ة" ], [ "و" ], [ "ز", "ژ" ], [ "ظ" ], [ "د" ] ], [ [ "،" ], [ " " ], [ " " ], [ ".", "\"", "'", "#", "-", ":", "!", "،", "؟", "@", "&", "%", "+", "؛", "/", ")", "(" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "۱", "¹", "½", "⅓", "¼", "⅛" ], [ "۲", "²", "⅔" ], [ "۳", "³", "¾", "⅜" ], [ "۴", "⁴" ], [ "۵", "⅝" ], [ "۶" ], [ "۷", "⅞" ], [ "۸" ], [ "۹" ], [ "۰", "ⁿ", "∅" ] ], [ [ "٬", "@" ], [ "٫", "#" ], [ "﷼", "$", "¢", "€", "£", "¥", "₱" ], [ "٪", "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "﴿", ">", "}", "]" ], [ ")", "﴾", "<", "{", "[" ] ], [ [ "*", "★", "٭" ], [ "«", "“", "”", "«", "»" ], [ "»", "‘", "’", "‹", "›" ], [ ":" ], [ "؛", ";" ], [ "!", "¡" ], [ "؟", "?" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "،", ":", "!", "؟", "؛", "-", "/", "»", "«" ], [ ".", "ٕ", "ٔ", "ْ", "ٍ", "ٌ", "ً", "ّ", "ٖ", "ٰ", "ٓ", "ِ", "ُ", "َ", "ـ" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "€" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "«", "›", "≥", ">" ], [ "»", "‹", "≤", "<" ], [ " " ], [ "،", ":", "!", "؟", "؛", "-", "/", "»", "«" ], [ ".", "ٕ", "ٔ", "ْ", "ٍ", "ٌ", "ً", "ّ", "ٖ", "ٰ", "ٓ", "ِ", "ُ", "َ", "ـ" ] ] ] } ], "locale": "fa", "name": "Persian" }cinnamon-6.6.8/data/osk-layouts/is.json0000664000175000017500000002060215167446463017012 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "é", "ë", "è", "ê", "ę", "ė", "ē" ], [ "r" ], [ "t", "þ" ], [ "y", "ý", "ÿ" ], [ "u", "ú", "ü", "û", "ù", "ū" ], [ "i", "í", "ï", "î", "ì", "į", "ī" ], [ "o", "ó", "ö", "ô", "ò", "õ", "œ", "ø", "ō" ], [ "p" ] ], [ [ "a", "á", "ä", "æ", "å", "à", "â", "ã", "ā" ], [ "s" ], [ "d", "ð" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "z" ], [ "x" ], [ "c" ], [ "v" ], [ "b" ], [ "n" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "É", "Ë", "È", "Ê", "Ę", "Ė", "Ē" ], [ "R" ], [ "T", "Þ" ], [ "Y", "Ý", "Ÿ" ], [ "U", "Ú", "Ü", "Û", "Ù", "Ū" ], [ "I", "Í", "Ï", "Î", "Ì", "Į", "Ī" ], [ "O", "Ó", "Ö", "Ô", "Ò", "Õ", "Œ", "Ø", "Ō" ], [ "P" ] ], [ [ "A", "Á", "Ä", "Æ", "Å", "À", "Â", "Ã", "Ā" ], [ "S" ], [ "D", "Ð" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Z" ], [ "X" ], [ "C" ], [ "V" ], [ "B" ], [ "N" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "is", "name": "Icelandic" }cinnamon-6.6.8/data/osk-layouts/it.json0000664000175000017500000002051015167446463017011 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "è", "é", "ê", "ë", "ę", "ė", "ē" ], [ "r" ], [ "t" ], [ "y" ], [ "u", "ù", "ú", "û", "ü", "ū" ], [ "i", "ì", "í", "î", "ï", "į", "ī" ], [ "o", "ò", "ó", "ô", "ö", "õ", "œ", "ø", "ō", "º" ], [ "p" ] ], [ [ "a", "à", "á", "â", "ä", "æ", "ã", "å", "ā", "ª" ], [ "s" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "z" ], [ "x" ], [ "c" ], [ "v" ], [ "b" ], [ "n" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "È", "É", "Ê", "Ë", "Ę", "Ė", "Ē" ], [ "R" ], [ "T" ], [ "Y" ], [ "U", "Ù", "Ú", "Û", "Ü", "Ū" ], [ "I", "Ì", "Í", "Î", "Ï", "Į", "Ī" ], [ "O", "Ò", "Ó", "Ô", "Ö", "Õ", "Œ", "Ø", "Ō", "º" ], [ "P" ] ], [ [ "A", "À", "Á", "Â", "Ä", "Æ", "Ã", "Å", "Ā", "ª" ], [ "S" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Z" ], [ "X" ], [ "C" ], [ "V" ], [ "B" ], [ "N" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "€", "¢", "£", "$", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¥" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "it", "name": "Italian" }cinnamon-6.6.8/data/osk-layouts/ke.json0000664000175000017500000002042415167446463017000 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "è", "é", "ê", "ë", "ē" ], [ "r" ], [ "t" ], [ "y" ], [ "u", "û", "ü", "ù", "ú", "ū" ], [ "i", "î", "ï", "í", "ī", "ì" ], [ "o", "ô", "ö", "ò", "ó", "œ", "ø", "ō", "õ" ], [ "p" ] ], [ [ "a", "à", "á", "â", "ä", "æ", "ã", "å", "ā" ], [ "s", "ß" ], [ "d" ], [ "f" ], [ "g", "g'" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "z" ], [ "x" ], [ "c", "ç" ], [ "v" ], [ "b" ], [ "n", "ñ" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "È", "É", "Ê", "Ë", "Ē" ], [ "R" ], [ "T" ], [ "Y" ], [ "U", "Û", "Ü", "Ù", "Ú", "Ū" ], [ "I", "Î", "Ï", "Í", "Ī", "Ì" ], [ "O", "Ô", "Ö", "Ò", "Ó", "Œ", "Ø", "Ō", "Õ" ], [ "P" ] ], [ [ "A", "À", "Á", "Â", "Ä", "Æ", "Ã", "Å", "Ā" ], [ "S", "SS" ], [ "D" ], [ "F" ], [ "G", "G'" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Z" ], [ "X" ], [ "C", "Ç" ], [ "V" ], [ "B" ], [ "N", "Ñ" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "sw", "name": "Swahili" }cinnamon-6.6.8/data/osk-layouts/keyboard-caps-lock-filled-symbolic.svg0000664000175000017500000000041415167446463024752 0ustar fabiofabio cinnamon-6.6.8/data/osk-layouts/keyboard-enter-symbolic.svg0000664000175000017500000000227215167446463022762 0ustar fabiofabio cinnamon-6.6.8/data/osk-layouts/keyboard-shift-filled-symbolic.svg0000664000175000017500000000030315167446463024210 0ustar fabiofabio cinnamon-6.6.8/data/osk-layouts/kg.json0000664000175000017500000001726415167446463017012 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "й" ], [ "ц" ], [ "у", "ү" ], [ "к" ], [ "е", "ё" ], [ "н", "ң" ], [ "г" ], [ "ш" ], [ "щ" ], [ "з" ], [ "х" ] ], [ [ "ф" ], [ "ы" ], [ "в" ], [ "а" ], [ "п" ], [ "р" ], [ "о", "ө" ], [ "л" ], [ "д" ], [ "ж" ], [ "э" ] ], [ [ "я" ], [ "ч" ], [ "с" ], [ "м" ], [ "и" ], [ "т" ], [ "ь", "ъ" ], [ "б" ], [ "ю" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Й" ], [ "Ц" ], [ "У", "Ү" ], [ "К" ], [ "Е", "Ё" ], [ "Н", "Ң" ], [ "Г" ], [ "Ш" ], [ "Щ" ], [ "З" ], [ "Х" ] ], [ [ "Ф" ], [ "Ы" ], [ "В" ], [ "А" ], [ "П" ], [ "Р" ], [ "О", "Ө" ], [ "Л" ], [ "Д" ], [ "Ж" ], [ "Э" ] ], [ [ "Я" ], [ "Ч" ], [ "С" ], [ "М" ], [ "И" ], [ "Т" ], [ "Ь", "Ъ" ], [ "Б" ], [ "Ю" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "ky", "name": "Kirghiz" }cinnamon-6.6.8/data/osk-layouts/kh.json0000664000175000017500000001560715167446463017012 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "១", "៱" ], [ "២", "៲" ], [ "៣", "៳" ], [ "៤", "៴" ], [ "៥", "៵" ], [ "៦", "៶" ], [ "៧", "៷" ], [ "៨", "៸" ], [ "៩", "៹" ], [ "០", "៰" ], [ "ឥ", "", "ឦ" ], [ "ឲ", "ឱ" ] ], [ [ "ឆ" ], [ "ឹ" ], [ "េ" ], [ "រ" ], [ "ត" ], [ "យ" ], [ "ុ" ], [ "ិ" ], [ "ោ" ], [ "ផ" ], [ "ៀ" ], [ "ឪ", "ឧ", "ឱ", "ឳ", "ឩ", "ឨ" ] ], [ [ "ា" ], [ "ស" ], [ "ដ" ], [ "ថ" ], [ "ង" ], [ "ហ" ], [ "្" ], [ "ក" ], [ "ល" ], [ "ើ" ], [ "់" ], [ "ឮ", "ឭ", "ឰ" ] ], [ [ "ឋ" ], [ "ខ" ], [ "ច" ], [ "វ" ], [ "ប" ], [ "ន" ], [ "ម" ], [ "ុំ" ], [ "។" ], [ "៊" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "៛", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "km", "name": "Khmer" }cinnamon-6.6.8/data/osk-layouts/la.json0000664000175000017500000001533015167446463016775 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "ຢ", "໑" ], [ "ຟ", "໒" ], [ "ໂ", "໓" ], [ "ຖ", "໔" ], [ "ຸ" ], [ "ູ" ], [ "ຄ", "໕" ], [ "ຕ", "໖" ], [ "ຈ", "໗" ], [ "ຂ", "໘" ], [ "ຊ", "໙" ], [ "ໍ" ] ], [ [ "ົ" ], [ "ໄ", "໐" ], [ "ຳ" ], [ "ພ" ], [ "ະ" ], [ "ິ" ], [ "ີ" ], [ "ຮ" ], [ "ນ" ], [ "ຍ" ], [ "ບ" ], [ "ລ" ] ], [ [ "ັ" ], [ "ຫ" ], [ "ກ" ], [ "ດ" ], [ "ເ" ], [ "້" ], [ "່" ], [ "າ" ], [ "ສ" ], [ "ວ" ], [ "ງ" ], [ "“" ] ], [ [ "ຜ" ], [ "ປ" ], [ "ແ" ], [ "ອ" ], [ "ຶ" ], [ "ື" ], [ "ທ" ], [ "ມ" ], [ "ໃ" ], [ "ຝ" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "₭", "$", "¢", "€", "£", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "€" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "lo", "name": "Lao" }cinnamon-6.6.8/data/osk-layouts/latam.json0000664000175000017500000002133715167446463017503 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "é", "è", "ë", "ê", "ę", "ė", "ē" ], [ "r" ], [ "t" ], [ "y" ], [ "u", "ú", "ü", "ù", "û", "ū" ], [ "i", "í", "ï", "ì", "î", "į", "ī" ], [ "o", "ó", "ò", "ö", "ô", "õ", "ø", "œ", "ō", "º" ], [ "p" ] ], [ [ "a", "á", "à", "ä", "â", "ã", "å", "ą", "æ", "ā", "ª" ], [ "s" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ], [ "ñ" ] ], [ [ "z" ], [ "x" ], [ "c", "ç", "ć", "č" ], [ "v" ], [ "b" ], [ "n", "ñ", "ń" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", ";", "!", ",", "?", ":", "¡", "@", "¿" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "É", "È", "Ë", "Ê", "Ę", "Ė", "Ē" ], [ "R" ], [ "T" ], [ "Y" ], [ "U", "Ú", "Ü", "Ù", "Û", "Ū" ], [ "I", "Í", "Ï", "Ì", "Î", "Į", "Ī" ], [ "O", "Ó", "Ò", "Ö", "Ô", "Õ", "Ø", "Œ", "Ō", "º" ], [ "P" ] ], [ [ "A", "Á", "À", "Ä", "Â", "Ã", "Å", "Ą", "Æ", "Ā", "ª" ], [ "S" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ], [ "Ñ" ] ], [ [ "Z" ], [ "X" ], [ "C", "Ç", "Ć", "Č" ], [ "V" ], [ "B" ], [ "N", "Ñ", "Ń" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", ";", "!", ",", "?", ":", "¡", "@", "¿" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ ",", "!", "¡" ], [ ".", "?", "¿" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ ",", "!", "¡" ], [ ".", "?", "¿" ] ] ] } ], "locale": "es-US", "name": "Spanish United States" }cinnamon-6.6.8/data/osk-layouts/lt.json0000664000175000017500000002300215167446463017013 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "ė", "ę", "ē", "è", "é", "ê", "ë", "ě" ], [ "r", "ŗ", "ř", "ŕ" ], [ "t", "ţ", "ť" ], [ "y", "ý", "ÿ" ], [ "u", "ū", "ų", "ü", "ū", "ù", "ú", "û", "ů", "ű" ], [ "i", "į", "ī", "ì", "í", "î", "ï", "ı" ], [ "o", "ö", "õ", "ò", "ó", "ô", "œ", "ő", "ø" ], [ "p" ] ], [ [ "a", "ą", "ä", "ā", "à", "á", "â", "ã", "å", "æ" ], [ "s", "š", "ß", "ś", "ş" ], [ "d", "ď" ], [ "f" ], [ "g", "ģ", "ğ" ], [ "h" ], [ "j" ], [ "k", "ķ" ], [ "l", "ļ", "ł", "ĺ", "ľ" ] ], [ [ "z", "ž", "ż", "ź" ], [ "x" ], [ "c", "č", "ç", "ć" ], [ "v" ], [ "b" ], [ "n", "ņ", "ñ", "ń", "ń" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "Ė", "Ę", "Ē", "È", "É", "Ê", "Ë", "Ě" ], [ "R", "Ŗ", "Ř", "Ŕ" ], [ "T", "Ţ", "Ť" ], [ "Y", "Ý", "Ÿ" ], [ "U", "Ū", "Ų", "Ü", "Ū", "Ù", "Ú", "Û", "Ů", "Ű" ], [ "I", "Į", "Ī", "Ì", "Í", "Î", "Ï", "I" ], [ "O", "Ö", "Õ", "Ò", "Ó", "Ô", "Œ", "Ő", "Ø" ], [ "P" ] ], [ [ "A", "Ą", "Ä", "Ā", "À", "Á", "Â", "Ã", "Å", "Æ" ], [ "S", "Š", "SS", "Ś", "Ş" ], [ "D", "Ď" ], [ "F" ], [ "G", "Ģ", "Ğ" ], [ "H" ], [ "J" ], [ "K", "Ķ" ], [ "L", "Ļ", "Ł", "Ĺ", "Ľ" ] ], [ [ "Z", "Ž", "Ż", "Ź" ], [ "X" ], [ "C", "Č", "Ç", "Ć" ], [ "V" ], [ "B" ], [ "N", "Ņ", "Ñ", "Ń", "Ń" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "lt", "name": "Lithuanian" }cinnamon-6.6.8/data/osk-layouts/lv.json0000664000175000017500000002273315167446463017027 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "ē", "ė", "è", "é", "ê", "ë", "ę", "ě" ], [ "r", "ŗ", "ř", "ŕ" ], [ "t", "ţ", "ť" ], [ "y", "ý", "ÿ" ], [ "u", "ū", "ų", "ù", "ú", "û", "ü", "ů", "ű" ], [ "i", "ī", "į", "ì", "í", "î", "ï", "ı" ], [ "o", "ò", "ó", "ô", "õ", "ö", "œ", "ő", "ø" ], [ "p" ] ], [ [ "a", "ā", "à", "á", "â", "ã", "ä", "å", "æ", "ą" ], [ "s", "š", "ß", "ś", "ş" ], [ "d", "ď" ], [ "f" ], [ "g", "ģ", "ğ" ], [ "h" ], [ "j" ], [ "k", "ķ" ], [ "l", "ļ", "ł", "ĺ", "ľ" ] ], [ [ "z", "ž", "ż", "ź" ], [ "x" ], [ "c", "č", "ç", "ć" ], [ "v" ], [ "b" ], [ "n", "ņ", "ñ", "ń", "ń" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "Ē", "Ė", "È", "É", "Ê", "Ë", "Ę", "Ě" ], [ "R", "Ŗ", "Ř", "Ŕ" ], [ "T", "Ţ", "Ť" ], [ "Y", "Ý", "Ÿ" ], [ "U", "Ū", "Ų", "Ù", "Ú", "Û", "Ü", "Ů", "Ű" ], [ "I", "Ī", "Į", "Ì", "Í", "Î", "Ï", "I" ], [ "O", "Ò", "Ó", "Ô", "Õ", "Ö", "Œ", "Ő", "Ø" ], [ "P" ] ], [ [ "A", "Ā", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ą" ], [ "S", "Š", "SS", "Ś", "Ş" ], [ "D", "Ď" ], [ "F" ], [ "G", "Ģ", "Ğ" ], [ "H" ], [ "J" ], [ "K", "Ķ" ], [ "L", "Ļ", "Ł", "Ĺ", "Ľ" ] ], [ [ "Z", "Ž", "Ż", "Ź" ], [ "X" ], [ "C", "Č", "Ç", "Ć" ], [ "V" ], [ "B" ], [ "N", "Ņ", "Ñ", "Ń", "Ń" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "lv", "name": "Latvian" }cinnamon-6.6.8/data/osk-layouts/mk.json0000664000175000017500000001711315167446463017011 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "љ" ], [ "њ" ], [ "е", "ѐ" ], [ "р" ], [ "т" ], [ "ѕ" ], [ "у" ], [ "и", "ѝ" ], [ "о" ], [ "п" ], [ "ш" ] ], [ [ "а" ], [ "с" ], [ "д" ], [ "ф" ], [ "г" ], [ "х" ], [ "ј" ], [ "к" ], [ "л" ], [ "ч" ], [ "ќ" ] ], [ [ "з" ], [ "џ" ], [ "ц" ], [ "в" ], [ "б" ], [ "н" ], [ "м" ], [ "ѓ" ], [ "ж" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Љ" ], [ "Њ" ], [ "Е", "Ѐ" ], [ "Р" ], [ "Т" ], [ "Ѕ" ], [ "У" ], [ "И", "Ѝ" ], [ "О" ], [ "П" ], [ "Ш" ] ], [ [ "А" ], [ "С" ], [ "Д" ], [ "Ф" ], [ "Г" ], [ "Х" ], [ "Ј" ], [ "К" ], [ "Л" ], [ "Ч" ], [ "Ќ" ] ], [ [ "З" ], [ "Џ" ], [ "Ц" ], [ "В" ], [ "Б" ], [ "Н" ], [ "М" ], [ "Ѓ" ], [ "Ж" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "mk", "name": "Macedonian" }cinnamon-6.6.8/data/osk-layouts/mn.json0000664000175000017500000001726615167446463017025 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "ф" ], [ "ц" ], [ "у" ], [ "ж" ], [ "э" ], [ "н" ], [ "г" ], [ "ш", "щ" ], [ "ү" ], [ "з" ], [ "к" ] ], [ [ "й" ], [ "ы" ], [ "б" ], [ "ө" ], [ "а" ], [ "х" ], [ "р" ], [ "о" ], [ "л" ], [ "д" ], [ "п" ] ], [ [ "я" ], [ "ч" ], [ "ё", "е" ], [ "с" ], [ "м" ], [ "и" ], [ "т" ], [ "ь", "ъ" ], [ "в", "ю" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Ф" ], [ "Ц" ], [ "У" ], [ "Ж" ], [ "Э" ], [ "Н" ], [ "Г" ], [ "Ш", "Щ" ], [ "Ү" ], [ "З" ], [ "К" ] ], [ [ "Й" ], [ "Ы" ], [ "Б" ], [ "Ө" ], [ "А" ], [ "Х" ], [ "Р" ], [ "О" ], [ "Л" ], [ "Д" ], [ "П" ] ], [ [ "Я" ], [ "Ч" ], [ "Ё", "Е" ], [ "С" ], [ "М" ], [ "И" ], [ "Т" ], [ "Ь", "Ъ" ], [ "В", "Ю" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "₮", "$", "¢", "€", "£", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "€" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "mn", "name": "Mongolian" }cinnamon-6.6.8/data/osk-layouts/my.json0000664000175000017500000001604615167446463017033 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e" ], [ "r" ], [ "t" ], [ "y" ], [ "u" ], [ "i" ], [ "o" ], [ "p" ] ], [ [ "a" ], [ "s" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "z" ], [ "x" ], [ "c" ], [ "v" ], [ "b" ], [ "n" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E" ], [ "R" ], [ "T" ], [ "Y" ], [ "U" ], [ "I" ], [ "O" ], [ "P" ] ], [ [ "A" ], [ "S" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Z" ], [ "X" ], [ "C" ], [ "V" ], [ "B" ], [ "N" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "ms", "name": "Malay" }cinnamon-6.6.8/data/osk-layouts/nl.json0000664000175000017500000002061615167446463017015 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "é", "ë", "ê", "è", "ę", "ė", "ē" ], [ "r" ], [ "t" ], [ "y", "ij" ], [ "u", "ú", "ü", "û", "ù", "ū" ], [ "i", "í", "ï", "ì", "î", "į", "ī", "ij" ], [ "o", "ó", "ö", "ô", "ò", "õ", "œ", "ø", "ō" ], [ "p" ] ], [ [ "a", "á", "ä", "â", "à", "æ", "ã", "å", "ā" ], [ "s" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "z" ], [ "x" ], [ "c" ], [ "v" ], [ "b" ], [ "n", "ñ", "ń" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "É", "Ë", "Ê", "È", "Ę", "Ė", "Ē" ], [ "R" ], [ "T" ], [ "Y", "IJ" ], [ "U", "Ú", "Ü", "Û", "Ù", "Ū" ], [ "I", "Í", "Ï", "Ì", "Î", "Į", "Ī", "IJ" ], [ "O", "Ó", "Ö", "Ô", "Ò", "Õ", "Œ", "Ø", "Ō" ], [ "P" ] ], [ [ "A", "Á", "Ä", "Â", "À", "Æ", "Ã", "Å", "Ā" ], [ "S" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Z" ], [ "X" ], [ "C" ], [ "V" ], [ "B" ], [ "N", "Ñ", "Ń" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "€", "¢", "£", "$", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¥" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "nl", "name": "Dutch" }cinnamon-6.6.8/data/osk-layouts/no.json0000664000175000017500000002067715167446463017027 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "é", "ë" ], [ "r" ], [ "t" ], [ "y", "ý", "ÿ" ], [ "u", "ú", "ü", "û", "ù", "ū" ], [ "i", "í", "ï" ], [ "o", "ó", "ô", "ò", "õ", "œ", "ō" ], [ "p" ], [ "å" ] ], [ [ "a", "á", "ä", "à", "â", "ã", "ā" ], [ "s", "ß", "ś", "š" ], [ "d", "ð" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l", "ł" ], [ "ø", "ö" ], [ "æ", "ä" ] ], [ [ "z" ], [ "x" ], [ "c" ], [ "v" ], [ "b" ], [ "n", "ñ", "ń" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "É", "Ë" ], [ "R" ], [ "T" ], [ "Y", "Ý", "Ÿ" ], [ "U", "Ú", "Ü", "Û", "Ù", "Ū" ], [ "I", "Í", "Ï" ], [ "O", "Ó", "Ô", "Ò", "Õ", "Œ", "Ō" ], [ "P" ], [ "Å" ] ], [ [ "A", "Á", "Ä", "À", "Â", "Ã", "Ā" ], [ "S", "SS", "Ś", "Š" ], [ "D", "Ð" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L", "Ł" ], [ "Ø", "Ö" ], [ "Æ", "Ä" ] ], [ [ "Z" ], [ "X" ], [ "C" ], [ "V" ], [ "B" ], [ "N", "Ñ", "Ń" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "€", "¢", "£", "$", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¥" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "nb", "name": "Norwegian Bokmål" } cinnamon-6.6.8/data/osk-layouts/ph.json0000664000175000017500000001605215167446463017012 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e" ], [ "r" ], [ "t" ], [ "y" ], [ "u" ], [ "i" ], [ "o" ], [ "p" ] ], [ [ "a" ], [ "s" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "z" ], [ "x" ], [ "c" ], [ "v" ], [ "b" ], [ "n" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E" ], [ "R" ], [ "T" ], [ "Y" ], [ "U" ], [ "I" ], [ "O" ], [ "P" ] ], [ [ "A" ], [ "S" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Z" ], [ "X" ], [ "C" ], [ "V" ], [ "B" ], [ "N" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "fil", "name": "Filipino" }cinnamon-6.6.8/data/osk-layouts/pl.json0000664000175000017500000002046715167446463017023 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "ę", "è", "é", "ê", "ë", "ė", "ē" ], [ "r" ], [ "t" ], [ "y" ], [ "u" ], [ "i" ], [ "o", "ó", "ö", "ô", "ò", "õ", "œ", "ø", "ō" ], [ "p" ] ], [ [ "a", "ą", "á", "à", "â", "ä", "æ", "ã", "å", "ā" ], [ "s", "ś", "ß", "š" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l", "ł" ] ], [ [ "z", "ż", "ź", "ž" ], [ "x" ], [ "c", "ć", "ç", "č" ], [ "v" ], [ "b" ], [ "n", "ń", "ñ" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "Ę", "È", "É", "Ê", "Ë", "Ė", "Ē" ], [ "R" ], [ "T" ], [ "Y" ], [ "U" ], [ "I" ], [ "O", "Ó", "Ö", "Ô", "Ò", "Õ", "Œ", "Ø", "Ō" ], [ "P" ] ], [ [ "A", "Ą", "Á", "À", "Â", "Ä", "Æ", "Ã", "Å", "Ā" ], [ "S", "Ś", "SS", "Š" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L", "Ł" ] ], [ [ "Z", "Ż", "Ź", "Ž" ], [ "X" ], [ "C", "Ć", "Ç", "Č" ], [ "V" ], [ "B" ], [ "N", "Ń", "Ñ" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "pl", "name": "Polish" }cinnamon-6.6.8/data/osk-layouts/pt.json0000664000175000017500000002063715167446463017032 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "é", "ê", "è", "ę", "ė", "ē", "ë" ], [ "r" ], [ "t" ], [ "y" ], [ "u", "ú", "ü", "ù", "û", "ū" ], [ "i", "í", "î", "ì", "ï", "į", "ī" ], [ "o", "ó", "õ", "ô", "ò", "ö", "œ", "ø", "ō", "º" ], [ "p" ] ], [ [ "a", "á", "ã", "à", "â", "ä", "å", "æ", "ª" ], [ "s" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "z" ], [ "x" ], [ "c", "ç", "č", "ć" ], [ "v" ], [ "b" ], [ "n" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "É", "Ê", "È", "Ę", "Ė", "Ē", "Ë" ], [ "R" ], [ "T" ], [ "Y" ], [ "U", "Ú", "Ü", "Ù", "Û", "Ū" ], [ "I", "Í", "Î", "Ì", "Ï", "Į", "Ī" ], [ "O", "Ó", "Õ", "Ô", "Ò", "Ö", "Œ", "Ø", "Ō", "º" ], [ "P" ] ], [ [ "A", "Á", "Ã", "À", "Â", "Ä", "Å", "Æ", "ª" ], [ "S" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Z" ], [ "X" ], [ "C", "Ç", "Č", "Ć" ], [ "V" ], [ "B" ], [ "N" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "€", "¢", "£", "$", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¥" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "pt-PT", "name": "Portuguese Portugal" }cinnamon-6.6.8/data/osk-layouts/ro.json0000664000175000017500000001737115167446463017030 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e" ], [ "r" ], [ "t", "ț" ], [ "y" ], [ "u" ], [ "i", "î", "ï", "ì", "í", "į", "ī" ], [ "o" ], [ "p" ] ], [ [ "a", "â", "ã", "ă", "à", "á", "ä", "æ", "å", "ā" ], [ "s", "ș", "ß", "ś", "š" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "z" ], [ "x" ], [ "c" ], [ "v" ], [ "b" ], [ "n" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E" ], [ "R" ], [ "T", "Ț" ], [ "Y" ], [ "U" ], [ "I", "Î", "Ï", "Ì", "Í", "Į", "Ī" ], [ "O" ], [ "P" ] ], [ [ "A", "Â", "Ã", "Ă", "À", "Á", "Ä", "Æ", "Å", "Ā" ], [ "S", "Ș", "SS", "Ś", "Š" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Z" ], [ "X" ], [ "C" ], [ "V" ], [ "B" ], [ "N" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "ro", "name": "Romanian" }cinnamon-6.6.8/data/osk-layouts/rs.json0000664000175000017500000001711015167446463017023 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "љ" ], [ "њ" ], [ "е", "ѐ" ], [ "р" ], [ "т" ], [ "з" ], [ "у" ], [ "и", "ѝ" ], [ "о" ], [ "п" ], [ "ш" ] ], [ [ "а" ], [ "с" ], [ "д" ], [ "ф" ], [ "г" ], [ "х" ], [ "ј" ], [ "к" ], [ "л" ], [ "ч" ], [ "ћ" ] ], [ [ "ѕ" ], [ "џ" ], [ "ц" ], [ "в" ], [ "б" ], [ "н" ], [ "м" ], [ "ђ" ], [ "ж" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Љ" ], [ "Њ" ], [ "Е", "Ѐ" ], [ "Р" ], [ "Т" ], [ "З" ], [ "У" ], [ "И", "Ѝ" ], [ "О" ], [ "П" ], [ "Ш" ] ], [ [ "А" ], [ "С" ], [ "Д" ], [ "Ф" ], [ "Г" ], [ "Х" ], [ "Ј" ], [ "К" ], [ "Л" ], [ "Ч" ], [ "Ћ" ] ], [ [ "Ѕ" ], [ "Џ" ], [ "Ц" ], [ "В" ], [ "Б" ], [ "Н" ], [ "М" ], [ "Ђ" ], [ "Ж" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "sr", "name": "Serbian" }cinnamon-6.6.8/data/osk-layouts/ru.json0000664000175000017500000001711015167446463017025 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "й" ], [ "ц" ], [ "у" ], [ "к" ], [ "е", "ё" ], [ "н" ], [ "г" ], [ "ш" ], [ "щ" ], [ "з" ], [ "х" ] ], [ [ "ф" ], [ "ы" ], [ "в" ], [ "а" ], [ "п" ], [ "р" ], [ "о" ], [ "л" ], [ "д" ], [ "ж" ], [ "э" ] ], [ [ "я" ], [ "ч" ], [ "с" ], [ "м" ], [ "и" ], [ "т" ], [ "ь", "ъ" ], [ "б" ], [ "ю" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Й" ], [ "Ц" ], [ "У" ], [ "К" ], [ "Е", "Ё" ], [ "Н" ], [ "Г" ], [ "Ш" ], [ "Щ" ], [ "З" ], [ "Х" ] ], [ [ "Ф" ], [ "Ы" ], [ "В" ], [ "А" ], [ "П" ], [ "Р" ], [ "О" ], [ "Л" ], [ "Д" ], [ "Ж" ], [ "Э" ] ], [ [ "Я" ], [ "Ч" ], [ "С" ], [ "М" ], [ "И" ], [ "Т" ], [ "Ь", "Ъ" ], [ "Б" ], [ "Ю" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "ru", "name": "Russian" }cinnamon-6.6.8/data/osk-layouts/se.json0000664000175000017500000002203015167446463017003 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "é", "è", "ê", "ë", "ę" ], [ "r", "ř" ], [ "t", "ť", "þ" ], [ "y", "ý", "ÿ", "ü" ], [ "u", "ü", "ú", "ù", "û", "ū" ], [ "i", "í", "ì", "î", "ï" ], [ "o", "ó", "ò", "ô", "õ", "ō" ], [ "p" ], [ "å" ] ], [ [ "a", "á", "à", "â", "ą", "ã" ], [ "s", "ś", "š", "ş", "ß" ], [ "d", "ð", "ď" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l", "ł" ], [ "ö", "ø", "œ" ], [ "ä", "æ" ] ], [ [ "z", "ź", "ž", "ż" ], [ "x" ], [ "c", "ç", "ć", "č" ], [ "v" ], [ "b" ], [ "n", "ń", "ñ", "ň" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "É", "È", "Ê", "Ë", "Ę" ], [ "R", "Ř" ], [ "T", "Ť", "Þ" ], [ "Y", "Ý", "Ÿ", "Ü" ], [ "U", "Ü", "Ú", "Ù", "Û", "Ū" ], [ "I", "Í", "Ì", "Î", "Ï" ], [ "O", "Ó", "Ò", "Ô", "Õ", "Ō" ], [ "P" ], [ "Å" ] ], [ [ "A", "Á", "À", "Â", "Ą", "Ã" ], [ "S", "Ś", "Š", "Ş", "SS" ], [ "D", "Ð", "Ď" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L", "Ł" ], [ "Ö", "Ø", "Œ" ], [ "Ä", "Æ" ] ], [ [ "Z", "Ź", "Ž", "Ż" ], [ "X" ], [ "C", "Ç", "Ć", "Č" ], [ "V" ], [ "B" ], [ "N", "Ń", "Ñ", "Ň" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "€", "¢", "£", "$", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¥" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "sv", "name": "Swedish" }cinnamon-6.6.8/data/osk-layouts/si.json0000664000175000017500000001635615167446463017025 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e" ], [ "r" ], [ "t" ], [ "y" ], [ "u" ], [ "i" ], [ "o" ], [ "p" ] ], [ [ "a" ], [ "s", "š" ], [ "d", "đ" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "z", "ž" ], [ "x" ], [ "c", "č", "ć" ], [ "v" ], [ "b" ], [ "n" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E" ], [ "R" ], [ "T" ], [ "Y" ], [ "U" ], [ "I" ], [ "O" ], [ "P" ] ], [ [ "A" ], [ "S", "Š" ], [ "D", "Đ" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Z", "Ž" ], [ "X" ], [ "C", "Č", "Ć" ], [ "V" ], [ "B" ], [ "N" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "€", "¢", "£", "$", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¥" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "sl", "name": "Slovenian" }cinnamon-6.6.8/data/osk-layouts/sk.json0000664000175000017500000002301615167446463017016 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "é", "ě", "ē", "ė", "è", "ê", "ë", "ę" ], [ "r", "ŕ", "ř", "ŗ" ], [ "t", "ť", "ţ" ], [ "y", "ý", "ÿ" ], [ "u", "ú", "ů", "ü", "ū", "ų", "ù", "û", "ű" ], [ "i", "í", "ī", "į", "ì", "î", "ï", "ı" ], [ "o", "ô", "ó", "ö", "ò", "õ", "œ", "ő", "ø" ], [ "p" ] ], [ [ "a", "á", "ä", "ā", "à", "â", "ã", "å", "æ", "ą" ], [ "s", "š", "ß", "ś", "ş" ], [ "d", "ď" ], [ "f" ], [ "g", "ģ", "ğ" ], [ "h" ], [ "j" ], [ "k", "ķ" ], [ "l", "ľ", "ĺ", "ļ", "ł" ] ], [ [ "z", "ž", "ż", "ź" ], [ "x" ], [ "c", "č", "ç", "ć" ], [ "v" ], [ "b" ], [ "n", "ň", "ņ", "ñ", "ń", "ń" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "É", "Ě", "Ē", "Ė", "È", "Ê", "Ë", "Ę" ], [ "R", "Ŕ", "Ř", "Ŗ" ], [ "T", "Ť", "Ţ" ], [ "Y", "Ý", "Ÿ" ], [ "U", "Ú", "Ů", "Ü", "Ū", "Ų", "Ù", "Û", "Ű" ], [ "I", "Í", "Ī", "Į", "Ì", "Î", "Ï", "I" ], [ "O", "Ô", "Ó", "Ö", "Ò", "Õ", "Œ", "Ő", "Ø" ], [ "P" ] ], [ [ "A", "Á", "Ä", "Ā", "À", "Â", "Ã", "Å", "Æ", "Ą" ], [ "S", "Š", "SS", "Ś", "Ş" ], [ "D", "Ď" ], [ "F" ], [ "G", "Ģ", "Ğ" ], [ "H" ], [ "J" ], [ "K", "Ķ" ], [ "L", "Ľ", "Ĺ", "Ļ", "Ł" ] ], [ [ "Z", "Ž", "Ż", "Ź" ], [ "X" ], [ "C", "Č", "Ç", "Ć" ], [ "V" ], [ "B" ], [ "N", "Ň", "Ņ", "Ñ", "Ń", "Ń" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "€", "¢", "£", "$", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¥" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "sk", "name": "Slovak" }cinnamon-6.6.8/data/osk-layouts/test-osk-layouts.py0000775000175000017500000000750315167446463021335 0ustar fabiofabio#!/usr/bin/python3 import gi gi.require_version('Gtk', '3.0') gi.require_version('XApp', '1.0') from gi.repository import Gio, GLib, GObject, Gtk import sys import subprocess import signal import json from pathlib import Path signal.signal(signal.SIGINT, signal.SIG_DFL) DBUS_NAME = "org.x.StatusIcon" DBUS_PATH = "/org/x/StatusIcon" class LayoutRow(GObject.Object): def __init__(self, shortname, json_info): super(LayoutRow, self).__init__() self.shortname = shortname self.name = json_info["name"] self.locale = json_info["locale"] class OskLayoutTester(): def __init__(self): self.window = None self.window = Gtk.Window() self.window.set_default_size(300, 400) self.window.connect("destroy", self.on_window_destroy) self.main_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, margin=6, spacing=0) # list stuff sw_frame = Gtk.Frame() sw = Gtk.ScrolledWindow(hadjustment=None, vadjustment=None) sw_frame.add(sw) self.store = Gio.ListStore(item_type=LayoutRow) self.list_box = Gtk.ListBox(activate_on_single_click=True) self.list_box.connect("row-activated", self.on_row_activated) self.list_box.bind_model(self.store, self.new_row_widget) sw.add(self.list_box) self.main_box.pack_start(sw_frame, True, True, 3) self.toggle_button = Gtk.Button(label="Toggle Keyboard") self.toggle_button.connect("clicked", self.toggle_keyboard) self.main_box.pack_start(self.toggle_button, False, False, 3) self.window.add(self.main_box) self.window.show_all() self.input_source_settings = Gio.Settings.new("org.cinnamon.desktop.input-sources") print("Saving original sources") self.orig_sources = self.input_source_settings.get_value("sources") self.shortname_size_group = Gtk.SizeGroup(mode=Gtk.SizeGroupMode.HORIZONTAL) self.load_layouts() def toggle_keyboard(self, button, data=None): subprocess.run(["cinnamon-dbus-command", "ToggleKeyboard"]) def load_layouts(self): for file in Path.cwd().iterdir(): if file.suffix != ".json": continue with open(file, "r") as f: json_info = json.load(f) self.store.append(LayoutRow(file.stem, json_info)) self.store.sort(self.sort_rows) def sort_rows(self, a, b, data=None): if a.shortname < b.shortname: return -1 elif a.shortname > b.shortname: return 1 else: return 0 def new_row_widget(self, item, data=None): box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=2) label = Gtk.Label(label=f"{item.shortname}", visible=True, xalign=0, use_markup=True) self.shortname_size_group.add_widget(label) box.pack_start(label, False, False, 6) label = Gtk.Label(label=item.name, visible=True, xalign=0) box.pack_start(label, True, True, 0) label = Gtk.Label(label=f"{item.locale}", visible=True, xalign=0, use_markup=True) box.pack_end(label, False, False, 6) row = Gtk.ListBoxRow() row.add(box) row.name = item.shortname row.show_all() return row def on_row_activated(self, box, row, data=None): self.input_source_settings.set_value("sources", GLib.Variant("a(ss)", [("xkb", row.name)])) def on_window_destroy(self, widget, data=None): self.quit() def quit(self): if self.orig_sources is not None: print("Restoring original sources") self.input_source_settings.set_value("sources", self.orig_sources) Gtk.main_quit() if __name__ == '__main__': test = OskLayoutTester() Gtk.main() cinnamon-6.6.8/data/osk-layouts/th.json0000664000175000017500000001532515167446463017020 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "ๅ" ], [ "/", "๑" ], [ "_", "๒" ], [ "ภ", "๓" ], [ "ถ", "๔" ], [ "ุ" ], [ "ึ" ], [ "ค", "๕" ], [ "ต", "๖" ], [ "จ", "๗" ], [ "ข", "๘" ], [ "ช", "๙" ] ], [ [ "ๆ", "๐" ], [ "ไ" ], [ "ำ" ], [ "พ" ], [ "ะ" ], [ "ั" ], [ "ี" ], [ "ร" ], [ "น" ], [ "ย" ], [ "บ" ], [ "ล" ] ], [ [ "ฟ" ], [ "ห" ], [ "ก" ], [ "ด" ], [ "เ" ], [ "้" ], [ "่" ], [ "า" ], [ "ส" ], [ "ว" ], [ "ง" ], [ "ฃ" ] ], [ [ "ผ" ], [ "ป" ], [ "แ" ], [ "อ" ], [ "ิ" ], [ "ื" ], [ "ท" ], [ "ม" ], [ "ใ" ], [ "ฝ" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "฿", "$", "¢", "€", "£", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "€" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "th", "name": "Thai" }cinnamon-6.6.8/data/osk-layouts/tr.json0000664000175000017500000002011415167446463017022 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e" ], [ "r" ], [ "t" ], [ "y" ], [ "u", "ü", "û", "ù", "ú", "ū" ], [ "i", "ı", "î", "ï", "ì", "í", "į", "ī" ], [ "o", "ö", "ô", "œ", "ò", "ó", "õ", "ø", "ō" ], [ "p" ] ], [ [ "a", "â" ], [ "s", "ş", "ß", "ś", "š" ], [ "d" ], [ "f" ], [ "g", "ğ" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "z" ], [ "x" ], [ "c", "ç", "ć", "č" ], [ "v" ], [ "b" ], [ "n" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E" ], [ "R" ], [ "T" ], [ "Y" ], [ "U", "Ü", "Û", "Ù", "Ú", "Ū" ], [ "İ", "I", "Î", "Ï", "Ì", "Í", "Į", "Ī" ], [ "O", "Ö", "Ô", "Œ", "Ò", "Ó", "Õ", "Ø", "Ō" ], [ "P" ] ], [ [ "A", "Â" ], [ "S", "Ş", "SS", "Ś", "Š" ], [ "D" ], [ "F" ], [ "G", "Ğ" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Z" ], [ "X" ], [ "C", "Ç", "Ć", "Č" ], [ "V" ], [ "B" ], [ "N" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "€", "¢", "£", "$", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¥" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "tr", "name": "Turkish" }cinnamon-6.6.8/data/osk-layouts/ua.json0000664000175000017500000001722215167446463017010 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "й" ], [ "ц" ], [ "у" ], [ "к" ], [ "е" ], [ "н" ], [ "г", "ґ" ], [ "ш" ], [ "щ" ], [ "з" ], [ "х" ] ], [ [ "ф" ], [ "і", "ї" ], [ "в" ], [ "а" ], [ "п" ], [ "р" ], [ "о" ], [ "л" ], [ "д" ], [ "ж" ], [ "є" ] ], [ [ "я" ], [ "ч" ], [ "с" ], [ "м" ], [ "и" ], [ "т" ], [ "ь", "ъ" ], [ "б" ], [ "ю" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Й" ], [ "Ц" ], [ "У" ], [ "К" ], [ "Е" ], [ "Н" ], [ "Г", "Ґ" ], [ "Ш" ], [ "Щ" ], [ "З" ], [ "Х" ] ], [ [ "Ф" ], [ "І", "Ї" ], [ "В" ], [ "А" ], [ "П" ], [ "Р" ], [ "О" ], [ "Л" ], [ "Д" ], [ "Ж" ], [ "Є" ] ], [ [ "Я" ], [ "Ч" ], [ "С" ], [ "М" ], [ "И" ], [ "Т" ], [ "Ь", "Ъ" ], [ "Б" ], [ "Ю" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "₴", "$", "¢", "€", "£", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "€" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "uk", "name": "Ukrainian" }cinnamon-6.6.8/data/osk-layouts/uk.json0000664000175000017500000002042215167446463017016 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "è", "é", "ê", "ë", "ē" ], [ "r" ], [ "t" ], [ "y" ], [ "u", "û", "ü", "ù", "ú", "ū" ], [ "i", "î", "ï", "í", "ī", "ì" ], [ "o", "ô", "ö", "ò", "ó", "œ", "ø", "ō", "õ" ], [ "p" ] ], [ [ "a", "à", "á", "â", "ä", "æ", "ã", "å", "ā" ], [ "s", "ß" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "z" ], [ "x" ], [ "c", "ç" ], [ "v" ], [ "b" ], [ "n", "ñ" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "È", "É", "Ê", "Ë", "Ē" ], [ "R" ], [ "T" ], [ "Y" ], [ "U", "Û", "Ü", "Ù", "Ú", "Ū" ], [ "I", "Î", "Ï", "Í", "Ī", "Ì" ], [ "O", "Ô", "Ö", "Ò", "Ó", "Œ", "Ø", "Ō", "Õ" ], [ "P" ] ], [ [ "A", "À", "Á", "Â", "Ä", "Æ", "Ã", "Å", "Ā" ], [ "S", "SS" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Z" ], [ "X" ], [ "C", "Ç" ], [ "V" ], [ "B" ], [ "N", "Ñ" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "£", "¢", "$", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "€" ], [ "¥" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "en-GB", "name": "English Great Britain" }cinnamon-6.6.8/data/osk-layouts/us.json0000664000175000017500000002037615167446463017036 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "è", "é", "ê", "ë", "ē" ], [ "r" ], [ "t" ], [ "y" ], [ "u", "û", "ü", "ù", "ú", "ū" ], [ "i", "î", "ï", "í", "ī", "ì" ], [ "o", "ô", "ö", "ò", "ó", "œ", "ø", "ō", "õ" ], [ "p" ] ], [ [ "a", "à", "á", "â", "ä", "æ", "ã", "å", "ā" ], [ "s", "ß" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "z" ], [ "x" ], [ "c", "ç" ], [ "v" ], [ "b" ], [ "n", "ñ" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "È", "É", "Ê", "Ë", "Ē" ], [ "R" ], [ "T" ], [ "Y" ], [ "U", "Û", "Ü", "Ù", "Ú", "Ū" ], [ "I", "Î", "Ï", "Í", "Ī", "Ì" ], [ "O", "Ô", "Ö", "Ò", "Ó", "Œ", "Ø", "Ō", "Õ" ], [ "P" ] ], [ [ "A", "À", "Á", "Â", "Ä", "Æ", "Ã", "Å", "Ā" ], [ "S", "SS" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Z" ], [ "X" ], [ "C", "Ç" ], [ "V" ], [ "B" ], [ "N", "Ñ" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "en", "name": "English United States" }cinnamon-6.6.8/data/osk-layouts/vn.json0000664000175000017500000002302515167446463017024 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "è", "é", "ẻ", "ẽ", "ẹ", "ê", "ề", "ế", "ể", "ễ", "ệ" ], [ "r" ], [ "t" ], [ "y", "ỳ", "ý", "ỷ", "ỹ", "ỵ" ], [ "u", "ù", "ú", "ủ", "ũ", "ụ", "ư", "ừ", "ứ", "ử", "ữ", "ự" ], [ "i", "ì", "í", "ỉ", "ĩ", "ị" ], [ "o", "ò", "ó", "ỏ", "õ", "ọ", "ô", "ồ", "ố", "ổ", "ỗ", "ộ", "ơ", "ờ", "ớ", "ở", "ỡ", "ợ" ], [ "p" ] ], [ [ "a", "à", "á", "ả", "ã", "ạ", "ă", "ằ", "ắ", "ẳ", "ẵ", "ặ", "â", "ầ", "ấ", "ẩ", "ẫ", "ậ" ], [ "s" ], [ "d", "đ" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "z" ], [ "x" ], [ "c" ], [ "v" ], [ "b" ], [ "n" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "È", "É", "Ẻ", "Ẽ", "Ẹ", "Ê", "Ề", "Ế", "Ể", "Ễ", "Ệ" ], [ "R" ], [ "T" ], [ "Y", "Ỳ", "Ý", "Ỷ", "Ỹ", "Ỵ" ], [ "U", "Ù", "Ú", "Ủ", "Ũ", "Ụ", "Ư", "Ừ", "Ứ", "Ử", "Ữ", "Ự" ], [ "I", "Ì", "Í", "Ỉ", "Ĩ", "Ị" ], [ "O", "Ò", "Ó", "Ỏ", "Õ", "Ọ", "Ô", "Ồ", "Ố", "Ổ", "Ỗ", "Ộ", "Ơ", "Ờ", "Ớ", "Ở", "Ỡ", "Ợ" ], [ "P" ] ], [ [ "A", "À", "Á", "Ả", "Ã", "Ạ", "Ă", "Ằ", "Ắ", "Ẳ", "Ẵ", "Ặ", "Â", "Ầ", "Ấ", "Ẩ", "Ẫ", "Ậ" ], [ "S" ], [ "D", "Đ" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Z" ], [ "X" ], [ "C" ], [ "V" ], [ "B" ], [ "N" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "₫", "$", "¢", "€", "£", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "€" ], [ "$", "¢" ], [ "¢" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "vi", "name": "Vietnamese" }cinnamon-6.6.8/data/osk-layouts/za.json0000664000175000017500000002075615167446463017023 0ustar fabiofabio{ "levels": [ { "level": "", "mode": "default", "rows": [ [ [ "q" ], [ "w" ], [ "e", "é", "è", "ê", "ë", "ę", "ė", "ē" ], [ "r" ], [ "t" ], [ "y", "ý", "ŷ", "ÿ", "ij" ], [ "u", "ú", "û", "ü", "ù", "ū" ], [ "i", "í", "ì", "ï", "î", "į", "ī", "ij" ], [ "o", "ó", "ô", "ö", "ò", "õ", "œ", "ø", "ō" ], [ "p" ] ], [ [ "a", "á", "â", "ä", "à", "æ", "ã", "å", "ā" ], [ "s" ], [ "d" ], [ "f" ], [ "g" ], [ "h" ], [ "j" ], [ "k" ], [ "l" ] ], [ [ "z" ], [ "x" ], [ "c" ], [ "v" ], [ "b" ], [ "n", "ñ", "ń" ], [ "m" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "shift", "mode": "latched", "rows": [ [ [ "Q" ], [ "W" ], [ "E", "É", "È", "Ê", "Ë", "Ę", "Ė", "Ē" ], [ "R" ], [ "T" ], [ "Y", "Ý", "Ŷ", "Ÿ", "IJ" ], [ "U", "Ú", "Û", "Ü", "Ù", "Ū" ], [ "I", "Í", "Ì", "Ï", "Î", "Į", "Ī", "IJ" ], [ "O", "Ó", "Ô", "Ö", "Ò", "Õ", "Œ", "Ø", "Ō" ], [ "P" ] ], [ [ "A", "Á", "Â", "Ä", "À", "Æ", "Ã", "Å", "Ā" ], [ "S" ], [ "D" ], [ "F" ], [ "G" ], [ "H" ], [ "J" ], [ "K" ], [ "L" ] ], [ [ "Z" ], [ "X" ], [ "C" ], [ "V" ], [ "B" ], [ "N", "Ñ", "Ń" ], [ "M" ] ], [ [ "," ], [ " " ], [ ".", "#", "!", ",", "?", "-", ":", "'", "@" ] ] ] }, { "level": "opt", "mode": "locked", "rows": [ [ [ "1", "¹", "½", "⅓", "¼", "⅛" ], [ "2", "²", "⅔" ], [ "3", "³", "¾", "⅜" ], [ "4", "⁴" ], [ "5", "⅝" ], [ "6" ], [ "7", "⅞" ], [ "8" ], [ "9" ], [ "0", "ⁿ", "∅" ] ], [ [ "@" ], [ "#" ], [ "$", "¢", "£", "€", "¥", "₱" ], [ "%", "‰" ], [ "&" ], [ "-", "_", "–", "—", "·" ], [ "+", "±" ], [ "(", "<", "{", "[" ], [ ")", ">", "}", "]" ] ], [ [ "*", "†", "‡", "★" ], [ "\"", "“", "”", "«", "»" ], [ "'", "‘", "’", "‹", "›" ], [ ":" ], [ ";" ], [ "!", "¡" ], [ "?", "¿" ] ], [ [ "_" ], [ "/" ], [ " " ], [ "," ], [ ".", "…" ] ] ] }, { "level": "opt+shift", "mode": "locked", "rows": [ [ [ "~" ], [ "`" ], [ "|" ], [ "•", "♪", "♥", "♠", "♦", "♣" ], [ "√" ], [ "Π", "π" ], [ "÷" ], [ "×" ], [ "¶", "§" ], [ "∆" ] ], [ [ "£" ], [ "¢" ], [ "€" ], [ "¥" ], [ "^", "↑", "↓", "←", "→" ], [ "°", "′", "″" ], [ "=", "≠", "≈", "∞" ], [ "{" ], [ "}" ] ], [ [ "\\" ], [ "©" ], [ "®" ], [ "™" ], [ "℅" ], [ "[" ], [ "]" ] ], [ [ "<", "‹", "≤", "«" ], [ ">", "›", "≥", "»" ], [ " " ], [ "," ], [ ".", "…" ] ] ] } ], "locale": "af", "name": "Afrikaans" }cinnamon-6.6.8/data/search_providers/0000775000175000017500000000000015167446463016554 5ustar fabiofabiocinnamon-6.6.8/data/search_providers/google.xml0000664000175000017500000000251515167446463020555 0ustar fabiofabio Google Google Search UTF-8 data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAA81BMVEUAAADsRjPqQTTrQzb/MzPqQzTqQzXqQzXpQjb/gADwPDzqQzXrQzbpQzXqQzXqQjXqQzXqQzXtSTfrTjLqQzXqRDXbSSTqQCvrQzb7uAbuYCrqQjb5uQb0iBo7kbQ+lLH7vAT7vAZBiOtBh+2isygktkk+kcE+j8hBit/0vQdhrEAzp1Q9kb4+jsZEqk40qFM0qVJAn2AzmWY7mJk8k65Av0A1qVQ1qFM0qVQ0qFM0qFQ9jsctpVo5nYc3pKQzqFM0qFM0qFM1qVMA/wA2qFE0qFQ0qVM3pVPqQzX7vAVChfQ0qFNChfJChfM0qFU7lqX///9WHbjfAAAASHRSTlMAKEomBWvf3WgCEb+K7bbA8MYOZv18Bwxy2cF7KLqOfEi3/v67B8fZ+djCfcDVZv1/CAWPYQS97re86NkRxQ5p3dxlASZJSiWnh/GUAAAAAWJLR0RQ425MvAAAAAd0SU1FB+EICgI4IGF0gX8AAACkSURBVBjTXY5VEgIxEAUHd3f3xZ3FXSMs3P82JBMKKPon8/plUgFATGazBT5YbXYicDhdKrs95I1X9TL7/IEgCYVRRAiJxuIAiaTKkEqTDPyQpTQnesgjBYAipSVZMKT8Lyq4Uq0JoWlanbGGmJot3lbPdRjriqPHeX8wBBiN78yYCKFPOeez+WL5eBorvLmWBtls1a6+28t4OJ6+3ztfrjc1vQAAFh8zhcOYsgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNy0wOC0xMFQwMjo1NjozMiswMDowMJSiyM0AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTctMDgtMTBUMDI6NTY6MzIrMDA6MDDl/3BxAAAAAElFTkSuQmCC cinnamon-6.6.8/data/search_providers/wikipedia.xml0000664000175000017500000000441115167446463021244 0ustar fabiofabio Wikipedia Wikipedia, the free encyclopedia UTF-8 data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAA2FBMVEUAAAAkHh4jHx8jICAkHyEkHx8iHiAjHx8iHSIjHx8kHx8lISEiHx8jHx8iHCIhISEkHyAiHyEzMzMjHyAiHx8kHyAjHiAhISEkHx8jHyAkICAjHyAjIyMkHyAnJyckJCQjHx8oGxsjHyAiICAAAAAjHx8jHx8iICAiICAlICAiHyAiHx8jHyAfHx8AAAAkHh4kICAjHyAjHyEkHiEiHiIkICAjHyAjHiEjHyAeHh4iHyEjHyAkJCQjHyAjHiAiICAkHyAjHiAkICAuFxckHiEkGyQkHx////+J8/smAAAAR3RSTlMAKpKqpDmGmjWLcj6jmy0X7ZQF1EuWsC565U/1Fp4NDpMT9lkB07tpcDDIWv4ZAis474VNTLqnZvERlfoH5Kho159xC1UcY91qqm8AAAABYktHREdgvcl7AAAAB3RJTUUH4QkWFQIodMCjVgAAAIVJREFUGNOdjlcbgWAAhV9CVuSTvZURCdl7hP//kzxGXPNenucs+B2fXwoEQ5IcjkjRWFxJQFJNIdIKWgayuYcnXxAUS+VKlVr9GWo0dYxWuwNd81Uj96BvDbCVd+/QGqGPHSZTb2k2F/JiuVrbnqBtHHO72x8+X4zjCc6q+313uYJ740/um0oLayWpHuMAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTctMDktMjJUMjE6MDI6NDArMDA6MDAuOIoZAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE3LTA5LTIyVDIxOjAyOjQwKzAwOjAwX2UypQAAAABJRU5ErkJggg== ar bg ca cs da de en eo es fa fi fr he hu id it ja ko lt nl no pl pt ro ru sk sl sr sv tr uk vi vo war zh cinnamon-6.6.8/data/services/0000775000175000017500000000000015167446463015035 5ustar fabiofabiocinnamon-6.6.8/data/services/meson.build0000664000175000017500000000057715167446463017210 0ustar fabiofabioservice_files = [ 'org.cinnamon.CalendarServer.service', 'org.Cinnamon.HotplugSniffer.service', 'org.Cinnamon.Melange.service', 'org.Cinnamon.Slideshow.service', ] foreach service_file : service_files configure_file( input: service_file + '.in', output: service_file, configuration: desktop_conf, install_dir: servicedir ) endforeach cinnamon-6.6.8/data/services/org.Cinnamon.HotplugSniffer.service.in0000664000175000017500000000013415167446463024310 0ustar fabiofabio[D-BUS Service] Name=org.Cinnamon.HotplugSniffer Exec=@libexecdir@/cinnamon-hotplug-sniffer cinnamon-6.6.8/data/services/org.Cinnamon.Melange.service.in0000664000175000017500000000012615167446463022722 0ustar fabiofabio[D-BUS Service] Name=org.Cinnamon.Melange Exec=@bindir@/cinnamon-looking-glass daemon cinnamon-6.6.8/data/services/org.Cinnamon.Slideshow.service.in0000664000175000017500000000011515167446463023311 0ustar fabiofabio[D-BUS Service] Name=org.Cinnamon.Slideshow Exec=@bindir@/cinnamon-slideshow cinnamon-6.6.8/data/services/org.cinnamon.CalendarServer.service.in0000664000175000017500000000013015167446463024305 0ustar fabiofabio[D-BUS Service] Name=org.cinnamon.CalendarServer Exec=@bindir@/cinnamon-calendar-server cinnamon-6.6.8/data/theme/0000775000175000017500000000000015167446463014314 5ustar fabiofabiocinnamon-6.6.8/data/theme/add-workspace-hover.svg0000664000175000017500000000707015167446463020706 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/theme/add-workspace.svg0000664000175000017500000000707715167446463017574 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/theme/calendar-arrow-left-hover.svg0000664000175000017500000001257215167446463022016 0ustar fabiofabio image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-6.6.8/data/theme/calendar-arrow-left.svg0000664000175000017500000001241315167446463020667 0ustar fabiofabio image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-6.6.8/data/theme/calendar-arrow-right-hover.svg0000664000175000017500000001257415167446463022203 0ustar fabiofabio image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-6.6.8/data/theme/calendar-arrow-right.svg0000664000175000017500000001241515167446463021054 0ustar fabiofabio image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-6.6.8/data/theme/checkbox-off.svg0000664000175000017500000000265715167446463017405 0ustar fabiofabio cinnamon-6.6.8/data/theme/checkbox.svg0000664000175000017500000000310215167446463016617 0ustar fabiofabio cinnamon-6.6.8/data/theme/cinnamon-sass/0000775000175000017500000000000015167446463017065 5ustar fabiofabiocinnamon-6.6.8/data/theme/cinnamon-sass/_colors.scss0000664000175000017500000000157615167446463021433 0ustar fabiofabio// global colors $bg_color: #242424; $base_color: #303030; $fg_color: white; $panel_bg: #1a1a1a; // colored elements $error_color: #e4705b; $error_bg_color: #c01c28; $success_color: #8ff0a4; $success_bg_color: #26a269; $destructive_bg_color: #c01c28; $destructive_color: #ff7b63; $warning_color: #f8e45c; $warning_bg_color: #cd9309; $notification_badge_bg_color: #e74b37; $accent_color: #78aeed; $accent_bg_color: #3584e4; $large_icon_color: transparentize($fg_color, 0.6); $light_text_color: mix($fg_color, $bg_color, 65%); // used for button, entries and highlighted items $light_bg_color: #393939; $light_base_color: #444444; $lighter_bg_color: #454545; $lightest_bg_color: #656565; // link colors $link_color: #1c71d8; // borders $borders_color: #333333; // shadows $shadow_color: rgba(0, 0, 0, 0.5); // insensitive state $insensitive_fg_color: mix($fg_color, $bg_color, 40%); cinnamon-6.6.8/data/theme/cinnamon-sass/_common.scss0000664000175000017500000001010315167446463021404 0ustar fabiofabio$base_padding: 6px; $base_margin: 4px; $base_border_radius: 8px; $larger_border_radius: $base_border_radius * 2; $modal_dialog_radius: 18px; $scalable_icon_size: to_em(16px); // stage stage { color: $fg_color; } %entry_common { min-height: 22px; border-radius: $base_border_radius; padding: $base_padding $base_padding * 1.5; border: 1px solid $borders_color; caret-color: $fg_color; selected-color: black; selection-background-color: $accent_bg_color; caret-size: 1px; } %button_common { border-radius: $base_border_radius; padding: $base_padding $base_padding * 6; font-weight: bold; } %button { @extend %button_common; @include button(normal); &:focus { @include button(focus); } &:hover { @include button(hover); } &:active { @include button(active); } &:insensitive { @include button(insensitive); } } %flat_button { @include button(normal, $style: flat); &:focus { @include button(focus, $style: flat); } &:hover { @include button(hover, $style: flat); } &:insensitive { @include button(insensitive, $style: flat); } &:selected, &:active { @include button(active, $style: flat); } &:checked { @include button(checked, $style: flat); } } %entry { @extend %entry_common; @include entry(normal); &:focus { @include entry(focus); } &:insensitive { @include entry(insensitive); } StLabel.hint-text { color: transparentize($fg_color, 0.7); } .capslock-warning { icon-size: $scalable_icon_size; } StIcon.peek-password { icon-size: 16px; color: $fg_color; } } // buttons in dialogs %dialog_button { font-weight: bold; padding: $base_padding * 2; border-radius: $base_border_radius * 1.5; @include button(normal); &:focus { @include button(focus); } &:hover { @include button(hover); } &:active { @include button(active); } &:checked { @include button(checked); } &:insensitive { @include button(insensitive); } } %dialog_button_default { @extend %dialog_button; @include button(normal, $c: $accent_bg_color, $style: default); &:hover { @include button(hover, $c: $accent_bg_color, $style: default); } &:active { @include button(active, $c: $accent_bg_color, $style: default); } &:checked { @include button(checked, $c: $accent_bg_color, $style: default); } &:insensitive { border-color: $borders_color; @include button(insensitive); } } %dialog_button_destructive { @extend %dialog_button; @include button(normal, $c: $error_bg_color, $style: default); &:hover { @include button(hover, $c: $error_bg_color, $style: default); } &:active { @include button(active, $c: $error_bg_color, $style: default); } &:checked { @include button(checked, $c: $error_bg_color, $style: default); } &:insensitive { border-color: $borders_color; @include button(insensitive); } } // items in menus %menuitem { font-weight: normal; spacing: $base_padding; transition-duration: 100ms; padding: $base_padding + 2 $base_padding * 2; margin: 0 $base_margin; border-radius: $base_border_radius; } /* General Typography */ %large_title { font-weight: 300; @include fontsize(24pt); } %title_1 { font-weight: 800; @include fontsize(20pt); } %title_2 { font-weight: 800; @include fontsize(15pt); } %title_3 { font-weight: 700; @include fontsize(15pt); } %title_4 { font-weight: 700; @include fontsize(13pt); } %heading { font-weight: 700; @include fontsize(11pt); } %caption_heading { font-weight: 700; @include fontsize(9pt); } %caption { font-weight: 400; @include fontsize(9pt); } %smaller { font-weight: 400; @include fontsize(8pt); } %slider { height: 1em; min-width: 15em; -slider-height: 0.3em; -slider-background-color: $light_bg_color; -slider-active-background-color: $fg_color; -slider-border-color: transparent; -slider-active-border-color: transparent; -slider-border-width: 1px; -slider-handle-radius: 0.5em; } %osd_base { color: $fg_color; background-color: transparentize($bg_color, 0.01); border: 1px solid transparentize($borders_color, 0.01); border-radius: $base_border_radius; text-align: center; padding: $base_padding * 4; } cinnamon-6.6.8/data/theme/cinnamon-sass/_drawing.scss0000664000175000017500000000765015167446463021564 0ustar fabiofabio// function to convert px to em @function to_em($input, $base: 16px) { // multiplied and divided by 1000 to make up for round() shortcoming $em_value: ($input / $base) * 1.091 * 1000; @return round($em_value) / 1000 * 1em; } // Mixin to convert provided font size in pt to em units @mixin fontsize($size, $base: 16px, $unit: pt) { // if pt, convert into unitless value with the assumption: 1pt = 1.091px $adjusted_size: if($unit == pt, $size * 1.091, $size) * 1000; $rounded_size: round($adjusted_size / $base) / 1000; font-size: $rounded_size * 1em; // font-size: round($size) + pt; } @mixin entry($type) { // // $type: entry type, possible values: normal, focus, hover, insensitive // $c: text color // $bc: background color // $entry_fg_color: $fg_color; $entry_bg_color: $light_bg_color; $insensitive_factor: 3%; $insensitive_entry_bg_color: darken($entry_bg_color, $insensitive_factor); // normal @if $type == 'normal' { background-color: $entry_bg_color; color: $entry_fg_color; } @if $type == 'focus' { background-color: $entry_bg_color; color: $entry_fg_color; border-color: $accent_bg_color; } @if $type == 'insensitive' { background-color: $insensitive_entry_bg_color; color: transparentize($entry_fg_color, 0.5); } } // Button drawing function @mixin button($type, $tc:$fg_color, $c:$bg_color, $style: null) { // // $type: button type, possible values: // - normal, focus, hover, active, checked, insensitive, default, undecorated // $c: button bg color, derived from bg_color // $tc: button text color, derived from fg_color // $style: button style, possible values: flat, default // // mix input colors to get button background color $button_bg_color: $light_bg_color; // background color mix override for flat style; the button bg color is the background color input @if $style == 'flat' { $button_bg_color: $c;} // background color mix override for default button style @if $style == 'default' { $button_bg_color: $c;} // background color adjustment factors // the % a color is lightened or darkened for button states $insensitive_factor: 3%; // button base state background colors $hover_button_bg_color: $lighter_bg_color; $active_button_bg_color: $lightest_bg_color; $checked_button_bg_color: $lightest_bg_color; $insensitive_button_bg_color: darken($button_bg_color, $insensitive_factor); $focus_shadow_color: transparentize($fg_color, 0.6); // background color mix override for default button style @if $style == 'default' { $hover_button_bg_color: lighten($button_bg_color, 10%); $active_button_bg_color: darken($button_bg_color, 5%); $checked_button_bg_color: darken($button_bg_color, 5%); } // flat style overrides @if $style == 'flat' { $insensitive_button_bg_color: $button_bg_color; } // normal style @if $type == 'normal' { color: $tc; background-color: $button_bg_color; } @if $type == 'focus' { color: $tc; background-color: $button_bg_color; box-shadow: inset 0 0 1px 1px $focus_shadow_color; } // hover button @else if $type == 'hover' { color: $tc; background-color: $hover_button_bg_color; } // active button @else if $type == 'active' { color: $tc; background-color: $active_button_bg_color; } // checked button @else if $type == 'checked' { color: $tc; background-color: $checked_button_bg_color; } // insensitive button @else if $type == 'insensitive' { $insensitive_button_fg_color: transparentize($tc, .5); color: $insensitive_button_fg_color; background-color: $insensitive_button_bg_color; } // reset (unstyled button) @else if $type == 'undecorated' { background-color: transparent; border-color: transparent; box-shadow: none; &:insensitive { background-color: transparent !important; } } } cinnamon-6.6.8/data/theme/cinnamon-sass/_widgets.scss0000664000175000017500000000074715167446463021577 0ustar fabiofabio// Primary widgets @import 'widgets/alttab'; @import 'widgets/applets'; @import 'widgets/base'; @import 'widgets/calendar'; @import 'widgets/desklet'; @import 'widgets/dialogs'; @import 'widgets/expo'; @import 'widgets/ibus-popup'; @import 'widgets/keyboard'; @import 'widgets/menus'; @import 'widgets/notifications'; @import 'widgets/osd'; @import 'widgets/panel'; @import 'widgets/startmenu'; @import 'widgets/switch-check'; @import 'widgets/windowlist'; @import 'widgets/deprecated'; cinnamon-6.6.8/data/theme/cinnamon-sass/cinnamon.scss0000664000175000017500000000011615167446463021562 0ustar fabiofabio@import "_colors"; @import "_drawing"; @import "_common"; @import "_widgets"; cinnamon-6.6.8/data/theme/cinnamon-sass/meson.build0000664000175000017500000000041015167446463021222 0ustar fabiofabiosassc = find_program('pysassc', 'sassc') custom_target( 'cinnamon_css', input: 'cinnamon.scss', output: 'cinnamon.css', command: [sassc, '@INPUT@', '@OUTPUT@'], build_always_stale: true, install: true, install_dir: join_paths(pkgdatadir, 'theme') ) cinnamon-6.6.8/data/theme/cinnamon-sass/widgets/0000775000175000017500000000000015167446463020533 5ustar fabiofabiocinnamon-6.6.8/data/theme/cinnamon-sass/widgets/_alttab.scss0000664000175000017500000000315015167446463023035 0ustar fabiofabio#altTabPopup { padding: $base_margin * 2; spacing: $base_margin * 4; } .switcher-list { background-color: $panel_bg; border: 1px solid $borders_color; border-radius: $larger_border_radius; box-shadow: 0 0 6px 0 $shadow_color; padding: $base_padding * 3; &-item-container { spacing: $base_margin * 3; } .item-box { padding: $base_margin * 2; border: 1px solid transparent; border-radius: $base_border_radius; background-color: transparent; // this doesn't ever seem to get used &:outlined { border-color: red; } &:selected { border-color: $borders_color; background-color: $light_bg_color } } .thumbnail-box { padding: 0; spacing: $base_margin; } .thumbnail { width: 256px; } .separator {} } .switcher-preview-backdrop { background-color: transparentize(black, 0.5); } .switcher-arrow { background-color: transparent; border-color: transparent; color: $fg_color; &:highlighted {} } .thumbnail-scroll-gradient { &-left { background-gradient-direction: horizontal; background-gradient-start: transparentize($panel_bg, 0.0); background-gradient-end: transparentize($panel_bg, 1.0); border-radius: $larger_border_radius; border-radius-topright: 0px; border-radius-bottomright: 0px; width: 60px; } &-right { background-gradient-direction: horizontal; background-gradient-start: transparentize($panel_bg, 1.0); background-gradient-end: transparentize($panel_bg, 0.0); border-radius: $larger_border_radius; border-radius-topleft: 0px; border-radius-bottomleft: 0px; width: 60px; } } cinnamon-6.6.8/data/theme/cinnamon-sass/widgets/_applets.scss0000664000175000017500000001050315167446463023236 0ustar fabiofabio$applet_separator: transparentize($fg_color, 0.8); //padding and spacing for applets $applet_padding: 6px; .applet { &-box { padding: 0 $applet_padding; spacing: $applet_padding; text-align: center; &.vertical { padding: $applet_padding 0; } &:hover { background-color: $lighter_bg_color; } &:highlight { background-color: transparentize($error_bg_color, 0.5); } } &-label { font-weight: bold; } &-separator { padding: 1px 4px; &.vertical { padding: 4px 1px; } } &-separator-line { width: 1px; background: $applet_separator; &-vertical { height: 1px; background: $applet_separator; } } } // cornerbar applet .applet-cornerbar { width: $base_margin * 2; background-color: $lighter_bg_color; border: 1px solid $borders_color; &.vertical { height: $base_margin * 2; } &-box { background: none; } } .applet-cornerbar-box:hover > .applet-cornerbar { background-color: $lightest_bg_color; } // notification applet .notification-applet-padding { padding: $base_margin 0 $base_margin $base_margin; } // panel launchers .panel-launchers { // padding-left: $base_padding; spacing: 2px; .launcher { padding: 0 2px; &:hover { background-color: $lighter_bg_color; } } &.vertical { padding: 2px 0; .launcher { padding: 2px 0; } } } // power applet .device-box { .device-icon { icon-size: to_em(24px); color: $fg_color; } .device-labels { margin-left: $base_margin * 2; spacing: $base_margin; .primary-label { @extend %heading; color: $fg_color; } .status-label { color: $light_text_color; } } } // sound applet .sound-player { > StBoxLayout:first-child { spacing: $base_margin; padding: 0 $base_padding; } StButton { @extend %button; width: 18px; height: 18px; padding: $base_padding; StIcon { icon-size: 1em; } &:small { @extend %flat_button; width: 16px; height: 16px; StIcon { icon-size: 1.2 em;} } } &-generic-coverart { background-color: transparentize(black, 0.8); } &-overlay { width: 290px; padding: $base_padding * 2; spacing: $base_margin; background-color: transparentize($bg_color, 0.1); StBoxLayout { padding-top: 2px; } > StBoxLayout { spacing: $base_padding; } StBin > StBoxLayout { spacing: $base_padding; } } .slider { height: $base_padding; -slider-height: $base_padding; -slider-background-color: darken($base_color, 5%); -slider-active-background-color: $fg_color; -slider-border-color: transparent; -slider-active-border-color: transparent; -slider-border-width: 0; -slider-handle-radius: 0; } } // spacer applet .spacer-box { border: 1px solid transparent; &:highlight { background-color: $error_color; } &.edit-mode { border: 1px symbolic; } } // systray .systray { padding: 0; } // workspace switcher applet .panel-top, .panel-bottom { .workspace-switcher { padding: 0 $base_margin;} } .workspace-button { border: 1px solid $borders_color; width: 2em; color: $insensitive_fg_color; background-color: transparentize($fg_color, 0.95); &.vertical { height: 2em; } &:outlined { background-color: $light_bg_color; color: $fg_color; &:hover { background-color: $lighter_bg_color; } } &:hover { background-color: $light_bg_color; } &:shaded { // this is a workspace with no open windows background-color: darken($bg_color, 5%); } } .workspace-graph { padding: $base_margin; spacing: $base_margin; .workspace { border: 1px solid transparentize($fg_color, 0.8); background-color: darken($panel_bg, 5%); &:active { border-color: transparentize($fg_color, 0.5); .windows { -active-window-background: transparentize(white, 0.7); -active-window-border: transparentize(white, 0.65); -inactive-window-background: transparentize(white, 0.9); -inactive-window-border: transparentize(white, 0.85); } } .windows { -active-window-background: transparentize(white, 0.7); -active-window-border: transparentize(white, 0.65); -inactive-window-background: transparentize(white, 0.9); -inactive-window-border: transparentize(white, 0.85); } } } .system-status-icon { icon-size: $scalable_icon-size; } cinnamon-6.6.8/data/theme/cinnamon-sass/widgets/_base.scss0000664000175000017500000000520615167446463022504 0ustar fabiofabio.flashspot { background-color: white; } // Caps-lock warning .caps-lock-warning-label { text-align: center; padding-bottom: 8px; @extend %caption; color: $warning_color; } // links .cinnamon-link { color: $link_color; &:hover { color: lighten($link_color, 10%); } } // lightbox .lightbox { background-color: rgba(0, 0, 0, 0.4); } // looking glass dialog #LookingGlassDialog { @extend %osd_base; spacing: $base_margin; } // magnifier .magnifier-zoom { &-region { border: 2px solid $error_color; &.full-screen { border-width: 0; } } } // pie timer .pie-timer { width: 30px; height: 30px; -pie-border-width: 1px; -pie-border-color: rgba(200, 200, 200, 0.8); -pie-background-color: rgba(140, 140, 140, 0.6); } // ripples .ripple-pointer-location { width: 50px; height: 50px; border-radius: 25px; background-color: $accent_color; box-shadow: 0 0 2px 2px rgba(160,160,160,1.0); } .ripple-box { width: 104px; height: 104px; background-image: url("corner-ripple.png"); &:rtl { background-image: url("corner-ripple.png"); } } // scrollbars StScrollView.vfade { -st-vfade-offset: 68px; } StScrollBar { StScrollView & { min-height: 8px; min-width: 8px; } StBin#trough { background-color: transparentize($base_color, 0.9); border_radius: $base_border_radius; } StButton#vhandle, StButton#hhandle { background-color: mix($fg_color, $bg_color, 30%); border-radius: $base_border_radius; &:hover { background-color: mix($fg_color, $bg_color, 40%); } &:active {} } } // separator .separator { -gradient-height: 1px; -gradient-start: $borders_color; -gradient-end: $borders_color; -margin-horizontal: 0; height: 1px; } // slider .slider { @extend %slider; } // tile previews .tile-preview { background-color: transparentize($accent_color, 0.8); border: 1px solid transparentize($accent_color, 0.3); } #Tooltip { @extend %osd_base; padding: $base_padding * 2; margin: $base_margin; } // user avatar .user-icon { background-size: contain; border-radius: 99px; color: $fg_color; border-color: transparent; & StIcon { padding: $base_padding * 2; border: 1px solid transparent; border-radius: 99px; } &.user-avatar { border: transparent; border-radius: 99px; } StIcon.highlighted { border: 1px solid $fg_color; border-radius: 99px; } } .user-widget-label {} .user-widget.horizontal { spacing: $base_padding; } .user-widget.vertical { spacing: $base_padding; } .user-widget.vertical .user-widget-label { font-weight: 700; @include fontsize(13pt); color: $fg_color; text-align: center; } cinnamon-6.6.8/data/theme/cinnamon-sass/widgets/_calendar.scss0000664000175000017500000000750215167446463023344 0ustar fabiofabio.calendar { margin-top: $base_margin * 5; spacing-rows: 2px; spacing-columns: 2px; // can be used to set the entire bg color &-background {} &-main-box { margin: $base_margin * 2; } &-events-main-box { height: 300px; margin-right: $base_margin * 4; min-width: 350px; border-right-width: 1px; border-color: $borders_color; } &-today-home-button, &-today-home-button-enabled { margin-left: $base_padding * 2; padding: $base_padding + 2 $base_padding * 2; border-radius: $base_border_radius; &:hover { background-color: $lighter_bg_color; } } // the large date labels at the top &-today-day-label { @extend %title_4; text-align: center; } &-today-date-label { @extend %title_3; } &-month-label { @extend %heading; } &-change-month-back, &-change-month-forward:rtl { width: 16px; height: 16px; color: $fg_color; background-image: url("calendar-arrow-left.svg"); &:hover { background-image: url("calendar-arrow-left-hover.svg"); } } &-change-month-forward, &-change-month-back:rtl { width: 16px; height: 16px; color: $fg_color; background-image: url("calendar-arrow-right.svg"); &:hover { background-image: url("calendar-arrow-right-hover.svg"); } } &-day-event-dot-box { margin-top: 1.7em; max-rows: 1; } &-day-event-dot { margin: 1px; border-radius: 2px; width: 4px; height: 4px; } &-day-base { text-align: center; width: 2.4em; height: 2.4em; border-radius: 9999px; color: $insensitive_fg_color; &:hover { background-color: $lighter_bg_color; } } &-day-heading { color: $fg_color; margin-top: $base_margin * 3; // using this to move the weekday row closer to the dates height: 1.6em; } &-work-day {} &-week-number {} &-work-day { color: $fg_color; } &-nonwork-day { color: $fg_color; } &-today { box-shadow: inset 0 0 3px $accent_bg_color; background-color: $lightest_bg_color; &:hover { background-color: $lighter_bg_color; } &:selected {} } &-other-month-day { color: $insensitive_fg_color; } &-not-today { &:selected { background-color: $light_bg_color; } } // the calendar events area &-events-date-label { @extend %title_4; text-align: center; } &-events-no-events-box {} &-events-no-events-button { margin: 6px 0; padding: 6px; border-radius: $base_border_radius; color: $light_text_color; &:hover { color: $fg_color; } } &-events-no-events-icon { color: $large_icon_color; icon-size: 128px; } &-events-no-events-label { @extend %title_3; text-align: center; margin-top: 16px; } &-events-event-container {} &-events-scrollbox { margin-top: $base_margin * 2;} &-events-main-box { .separator { -margin-horizontal: 1em; -gradient-height: 1px; -gradient-start: transparent; -gradient-end: transparent; } } &-event-button { margin: 3px 0; border-radius: $base_border_radius; border: 1px solid transparent; &:hover { background-color: lighten($bg_color, 15%); border-color: $borders_color; } } &-event-color-strip { width: 1px; } &-event-row-content { margin: 7px; } &-event-time-past { @extend %heading; color: $insensitive_fg_color; } &-event-time-present { @extend %heading; color: $fg_color; } &-event-time-present:all-day { @extend %heading; color: $accent_color; } &-event-countdown { @extend %caption; color: $light_text_color; &:soon { color: $warning_color; } &:imminent { color: $error_color; } &:current { color: $success_color; } } &-event-time-future { @extend %heading; color: $fg_color; } &-event-summary { color: $light_text_color; } } cinnamon-6.6.8/data/theme/cinnamon-sass/widgets/_deprecated.scss0000664000175000017500000000372715167446463023700 0ustar fabiofabio// OLD MENU - Used by some of the menu spices $menu_outer_padding: 9px; %start_menu_button { padding: $base_padding; spacing: $base_margin; border-radius: $base_border_radius; } .menu { // this can be used to color the entire menu background but we aren't using it here &-background {} &-favorites-box { padding: $base_padding * 1.5; background-color: $light_bg_color; border: 1px solid transparentize(black, 0.9); border-radius: $base_border_radius; } &-favorites-button { padding: $base_padding * 1.5; border-radius: $base_border_radius; &:hover { background-color: $lightest_bg_color; } } &-categories-box { padding: $menu_outer_padding $base_padding * 4; } &-applications-box { padding: $menu_outer_padding; } &-applications-inner-box { &:ltr { padding-left: $base_padding * 4; } &:rtl { padding-right: $base_padding * 4; } } &-application-button { @extend %start_menu_button; &-label { padding: 0; } &:highlighted { font-weight: bold; } &-selected { @extend %start_menu_button; background-color: $light_bg_color; &:highlighted { font-weight: bold; } } } &-category-button { @extend %start_menu_button; &-label { padding: 0; } &:hover { background-color: $lighter_bg_color; } &-selected { @extend %start_menu_button; background-color: $light_bg_color; } &-greyed { @extend %start_menu_button; color: $insensitive_fg_color; font-style: italic; StIcon { opacity: 0.5; } } } &-context-menu {} &-selected-app-box { padding-right: $base_padding * 4; padding-left: $base_padding * 4; text-align: right; } &-selected-app-title { @extend %heading; } &-selected-app-description { color: $insensitive_fg_color; } &-search-box { padding: 0 0 $base_padding $menu_outer_padding; } } #menu-search-entry { @extend %entry; } .menu-search-entry-icon { icon-size: $scalable_icon_size; } cinnamon-6.6.8/data/theme/cinnamon-sass/widgets/_desklet.scss0000664000175000017500000000176715167446463023235 0ustar fabiofabio// desklet .desklet { &:highlight { border: 2px solid $accent_color; border-radius: $base_border_radius; } &-with-borders { border: 1px solid $borders_color; border-radius: $base_border_radius; background-color: transparentize($bg_color, 0.2); } &-with-borders-and-header { border: 1px solid $borders_color; border-radius: 0 0 $base_border_radius $base_border_radius; border-top-width: 0; background-color: transparentize($bg_color, 0.2); padding: $base_padding * 2; } &-header { border: 1px solid $borders_color; border-radius: $base_border_radius $base_border_radius 0 0; background-color: transparentize($bg_color, 0.2); padding: $base_padding; } &-drag-placeholder { border: 1px solid red; } } // digital photo frame .photoframe-box { border: 1px solid $borders_color; border-radius: $base_border_radius; background-color: transparentize($bg_color, 0.2); padding: $base_padding; } // clock .clock-desklet-label {} cinnamon-6.6.8/data/theme/cinnamon-sass/widgets/_dialogs.scss0000664000175000017500000000654215167446463023220 0ustar fabiofabio// Modal dialogs .dialog { background-color: $bg_color; color: $fg_color; border-radius: $modal_dialog_radius; border: 1px solid $borders_color; padding: $base_padding * 3; .dialog-content-box { margin-top: $base_margin * 2; margin-bottom: $base_margin * 4; spacing: $base_margin * 8; max-width: 28em; } .dialog-button { @extend %dialog_button; &:default { @extend %dialog_button_default; } &:destructive-action { @extend %dialog_button_destructive; } } .confirm-dialog-title { @extend %title_2; text-align: center; } } // Lists in dialogs .dialog-list { spacing: $base_padding * 3; .dialog-list-title { @extend %heading; text-align: center; } .dialog-list-scrollview { max-height: 200px; } .dialog-list-box { spacing: 1em; .dialog-list-item { spacing: 1em; .dialog-list-item-title { font-weight: bold; } .dialog-list-item-description { @extend %caption; color: darken($fg_color, 5%); } } } } // End session dialog .end-session-dialog { min-width: 40em; .dialog-content-box { spacing: 0; } .dialog-list { spacing: 0; .dialog-list-title { color: $warning_color; background-color: tranparentize($warning_color, 0.9); padding: $base_padding * 1.5; border-radius: $base_border_radius; margin: $base_margin 0; } } } // message dialog .message-dialog-content { spacing: $base_padding * 3; .message-dialog-title { text-align: center; @extend %title_2; &.lightweight { @extend %title_4; } } .message-dialog-description { text-align: center; } .message-dialog-caption { @extend %caption; text-align: center; } } // run dialog .run-dialog { .dialog-content-box { margin: $base_margin; } &-description { @extend %caption; text-align: center; color: darken($fg_color, 20%); &.error { color: $error_color; } } &-completion-box { padding-top: $base_padding; padding-left: $base_padding * 2; } &-entry { @extend %entry; width: 20em; height: 1.2em; } } // password or authentication dialog .prompt-dialog { width: 26em; .dialog-content-box { spacing: $base_margin * 4; margin-bottom: $base_margin * 3; } &-password-entry { @extend %entry; width: 20em; } &-password-layout { spacing: $base_margin * 2;} &-error-label, &-info-label, &-null-label { text-align: center; @extend %caption; } &-error-label { color: $error_color; } } // polkit dialog .polkit-dialog { &-user-layout { text-align: center; spacing: 2px; } &-user-combo { @extend %flat_button; @extend %heading; border-radius: $base_border_radius; padding: $base_padding $base_padding * 6; // special case the :insensitive button sinc we want // the label to be the normal color when there are // not multiple users &:insensitive { color: $fg_color; } } } // Audio selection dialog .audio-device-selection-dialog { min-width: 24em; .audio-selection-box { spacing: $base_padding *2; .audio-selection-device { @extend %flat_button; border-radius: $base_border_radius; .audio-selection-device-box { padding: $base_padding * 2; spacing: $base_padding * 2; } .audio-selection-device-icon { icon-size: 64px;} } } } cinnamon-6.6.8/data/theme/cinnamon-sass/widgets/_expo.scss0000664000175000017500000000334315167446463022545 0ustar fabiofabio .workspace { &-thumbnails { spacing: 26px; } &-thumbnails-background { padding: 8px; } // this controls both the darkness of thumbnails in expo and // the darkness of the overiew backgroound &-overview-background-shade { background-color: transparentize(black, 0.8); } &-add-button { background-image: url("add-workspace.svg"); height: 200px; width: 35px; transition-duration: 150; &:hover { background-image: url("add-workspace-hover.svg"); transition-duration: 150; } } &-close-button { background-image: url("close.svg"); height: 26px; width: 26px; -cinnamon-close-overlap: 13px; } } .expo { &-background { background-color: $bg_color; } &-workspace-thumbnail-frame { border: 1px solid $borders_color; &#active { border-color: $accent_color; border-width: 2px; } } &-workspaces-name-entry { @extend %entry; height: 1.5em; &#selected{} &:focus {} } } .window { &-close-area { background-image: url("trash-icon.svg"); height: 120px; width: 400px; } &-close { background-image: url("close.svg"); height: 26px; width: 26px; -cinnamon-close-overlap: 13px; &:hover {} } &-border { border: 3px solid $accent_bg_color; border-radius: $base_border_radius; } &-caption { min-height: 22px; border-radius: $base_border_radius; padding: $base_padding $base_padding * 1.5; spacing: $base_margin; border: 1px solid $borders_color; background-color: $light_bg_color; -cinnamon-caption-spacing: $base_padding; &:focus { background-color: $lightest_bg_color; } } } #overview { spacing: 12px; } .overview-empty-placeholder { @extend %large_title; } cinnamon-6.6.8/data/theme/cinnamon-sass/widgets/_ibus-popup.scss0000664000175000017500000000220215167446463023666 0ustar fabiofabio// IBus Candidate Popup $popover_arrow_height: 12px; .candidate-popup-boxpointer { -arrow-border-radius: $base_border_radius+4; -arrow-background-color: $bg_color; -arrow-border-width: 1px; -arrow-border-color: $borders_color; -arrow-base: $popover_arrow_height * 2; -arrow-rise: $popover_arrow_height; -arrow-box-shadow: 0 1px 3px rgba(0,0,0,0.5); // dreaming bugzilla #689995 } .candidate-popup-content { padding: 0.5em; spacing: 0.3em; } .candidate-index { padding: 0 0.5em 0 0; color: darken($fg_color,10%); } .candidate-box { padding: 0.3em 0.5em 0.3em 0.5em; border-radius: $base_border_radius; color: $fg_color; &:selected,&:hover { background-color: $lighter_bg_color; } } .candidate-page-button-box { height: 2em; .vertical & { padding-top: 0.5em; } .horizontal & { padding-left: 0.5em; } } .candidate-page-button { padding: 4px; } .candidate-page-button-previous { border-radius: $base_border_radius 0px 0px $base_border_radius; border-right-width: 0; } .candidate-page-button-next { border-radius: 0px $base_border_radius $base_border_radius 0px; } .candidate-page-button-icon { icon-size: 1em; }cinnamon-6.6.8/data/theme/cinnamon-sass/widgets/_keyboard.scss0000664000175000017500000000323515167446463023372 0ustar fabiofabio/* On-screen Keyboard */ $key_border_radius: $base_border_radius + 3px; $default_key_bg_color: $bg_color; $non_alpha_key_color: $light_bg_color; $shifted_key_color: $lightest_bg_color; #virtual-keyboard { background-color: $panel_bg; } // the container for individual keys .vkeyboard-key-container { padding: $base_margin; spacing: $base_margin; } // the keys .vkeyboard-key { @include button(normal); &:focus { @include button(focus);} &:hover, &:checked { @include button(hover);} &:active { @include button(active); } @include fontsize(20px); border-width: 1px; border-style: solid; border-radius: $key_border_radius; background-color: $lighter_bg_color; &.shift-key-lowercase, &.escape-key, &.hide-key, &.non-alpha-key { background-color: $non_alpha_key_color; &:focus { @include button(focus);} &:hover, &:checked { @include button(hover);} &:active { @include button(active); } } &.shift-key-uppercase { background-color: $shifted_key_color } &.enter-key { background-color: $accent_bg_color } &.modifier-key { background-color: $non_alpha_key_color; &:hover, &:checked { @include button(hover); } &:latched { background-color: $shifted_key_color; } } StIcon { icon-size: 1.125em; } } // long press on a key popup .vkeyboard-subkeys { color: $fg_color; -arrow-border-radius: $base_border_radius; -arrow-background-color: $bg_color; -arrow-border-width: 1px; -arrow-border-color: lighten($bg_color, 9%); -arrow-base: 20px; -arrow-rise: 10px; -boxpointer-gap: $base_padding; } // suggestions .word-suggestions { @include fontsize(18px); spacing: 20px; min-height: 20pt; } cinnamon-6.6.8/data/theme/cinnamon-sass/widgets/_menus.scss0000664000175000017500000000562115167446463022722 0ustar fabiofabio$menuitem_border_radius: $base_border_radius * 1; //container of the popup menu .menu { min-width: 15em; color: $fg_color; padding: 6px; } // popup content .popup-menu-content { padding: $base_padding; background-color: $bg_color; border-radius: $larger_border_radius; border: 1px solid $borders_color; box-shadow: 0 0 6px $shadow_color; } // menu items .popup-menu-item { @extend %menuitem; &:active { background-color: $light_bg_color; } &:insensitive { color: $insensitive_fg_color; background: none; } } // Used in the battery applet for the status // .popup-inactive-menu-item { // color: $fg_color; // &:insensitive { color: $insensitive_fg_color; } // } .popup-slider-menu-item { @extend %slider; } // icons in menus .popup-menu-arrow, .popup-menu-icon { icon-size: $scalable_icon_size; } // popup submenus .popup-sub-menu { border-radius: $base_border_radius + 1; margin: 0 $base_margin; margin-bottom: $base_padding; border: 1px solid transparentize(black, 0.9); .popup-menu-item { border-radius: 0; @extend %menuitem; background-color: $base_color; margin: 0; padding: $base_padding + 2 0 $base_padding + 2 $base_padding * 2; &:active { background-color: $light_base_color; } &:first-child { border-radius: $base_border_radius $base_border_radius 0 0; } &:last-child { border-radius: 0 0 $base_border_radius $base_border_radius; } &:only-child, &:first-child:last-child { border-radius: $base_border_radius; } } StScrollBar { padding: 4px; StBin#trough, StBin#vhandle { border-width: 0; } } } // This is the first submenu item that contains the arrow .popup-submenu-menu-item { &:open {} &:active {} } // separator .popup-separator-menu-item { -gradient-height: 1px; -gradient-start: $borders_color; -gradient-end: $borders_color; -margin-horizontal: 0; height: 1px; } // scale view context menu - just duplicating regular popupmenu here .popup-combo-menu { padding: $base_padding; background-color: $bg_color; border-radius: $larger_border_radius; border: 1px solid $borders_color; box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.2); } // Used by the recents applet .popup-combobox-item { @extend %menuitem; padding: 0 $base_padding * 2; } // this is not currently being used anywhere .popup-alternating-menu-item:alternate { font-weight: normal; } // Used in the power applet for display of battery items .popup-device-menu-item { spacing: .5em; @extend %heading; color: $fg_color; &:insensitive { color: $fg_color; } .popup-inactive-menu-item { font-weight: normal; color: $fg_color; } } // Used in window quick list and power applet .popup-subtitle-menu-item { font-weight: normal; } // Used to set the color of the signal strength icons in network applet .nm-menu-item-icons { spacing: .5em; } .wireless-active:insensitive { color: red; } cinnamon-6.6.8/data/theme/cinnamon-sass/widgets/_notifications.scss0000664000175000017500000000221615167446463024441 0ustar fabiofabio$notification_width: 34em; #notification { width: $notification_width; border-radius: $base_border_radius; border: 1px solid $borders_color; box-shadow: 0 2px 4px 2px $shadow_color; background-color: $bg_color; padding: $base_padding * 2; margin-from-right-edge-of-screen: 20px; spacing-rows: 10px; spacing-columns: 10px; &.multi-line-notification { padding-bottom: $base_padding * 2; color: $fg_color; } &-body { spacing: $base_padding; } &-actions { spacing: $base_padding * 2; } &-scrollview {} StEntry {} } .notification { /* We use row-span = 2 for the image cell, which prevents its height preferences to be taken into account during allocation, so its height ends up being limited by the height of the content in the other rows. To avoid showing a stretched image, we set the minimum height of the table to be ICON_SIZE + IMAGE_SIZE + spacing-rows = 24 + 125 + 10 = 159 */ &-with-image { min-height: 159px; } &-button { @extend %button; padding: $base_padding $base_padding * 2; } &-icon-button { @extend %button; padding: $base_padding; } &-icon-button > StIcon {} }cinnamon-6.6.8/data/theme/cinnamon-sass/widgets/_osd.scss0000664000175000017500000000350715167446463022361 0ustar fabiofabio// various on screen popups $barlevel_height: 6px; $ws_indicator_height: 32px; $ws_dot_active: $ws_indicator_height / 3; $ws_dot_inactive: $ws_indicator_height / 6; // media keys osd .media-keys-osd { @extend %osd_base; @extend %title_4; margin-bottom: 1em; border-radius: 9999px; font-weight: bold; spacing: $base_padding * 2; padding: $base_padding * 2 $base_padding * 4; & > * { spacing: $base_padding * 2; } StIcon { icon-size: 32px; } StLabel { &:ltr { margin-right: $base_padding; } &:rtl { margin-left: $base_padding; } } .level { min-width: 160px; -barlevel-height: $barlevel_height; -barlevel-background-color: $base_color; -barlevel-active-background-color: $fg_color; -barlevel-amplify-color: $warning_color; -barlevel-amplify-separator-width: $base_padding * 0.5; &:ltr { margin-right: $base_padding; } &:rtl { margin-left: $base_padding; } } .level-bar { border-radius: $base_border_radius; background-color: $fg_color; } } .info-osd { @extend %osd_base; font-size: 1.2em; font-weight: 700; text-align: center; } .workspace-switch-osd { @extend %osd_base; @extend %title_4; min-width: 140px; margin-bottom: 1em; border-radius: 9999px; font-weight: bold; padding: $base_padding * 2 $base_padding * 6 0 $base_padding * 6; &-indicator-box { spacing: $base_padding * 2; } &-indicator { background-color: transparentize($fg_color, 0.5); padding: $ws_dot_inactive / 2; margin: ($ws_indicator_height - $ws_dot_inactive) / 2; border-radius: $ws_indicator_height; &:active { background-color: $accent_bg_color; padding: $ws_dot_active / 2; margin: ($ws_indicator_height - $ws_dot_active) / 2; } } } // resize popup .resize-popup { @extend %osd_base; padding: $base_padding * 2; } cinnamon-6.6.8/data/theme/cinnamon-sass/widgets/_panel.scss0000664000175000017500000000336615167446463022676 0ustar fabiofabio .panel { &-top, &-bottom, &-left, &-right{ font-weight: bold; color: $fg_color; background-color: $panel_bg; } &Left { spacing: 4px; &:dnd { background-color: rgba(255,0,0,0.2); } // For panel edit mode &:ltr { padding-right: 4px; } &:rtl { padding-left: 4px; } &.vertical { padding: 0; &:ltr { padding-right: 0px; } &:rtl { padding-left: 0px; } } } &Right { &:dnd { background-color: rgba(0,0,255,0.2); } &:ltr { padding-left: 4px; spacing: 0; } &:rtl { padding-right: 4px; spacing: 0; } &.vertical { padding: 0; &:ltr { padding-left: 0; spacing: 0; } &:rtl { padding-right: 0; spacing: 0; } } } &Center { spacing: 4px; &:dnd { background-color: rgba(0,255,0,0.2); } &.vertical { padding-left: 0; padding-right: 0; } } // create a border on the side we want for each location &-top { box-shadow: inset 0 -1px $borders_color; } &-bottom { box-shadow: inset 0 1px $borders_color; } &-left { box-shadow: inset -1px 0 $borders_color; } &-right { box-shadow: inset 1px 0 $borders_color; } // used when adding a new panel &-dummy { background-color: transparentize($error_color, 0.5); &:entered { background-color: transparentize($error_color, 0.4); } } &-status-button {} // used by the keyboard applet but see no reason for it } // these are available but we aren't using them here .panel-corner {} .panel-corner:overview {} .panel-corner:active {} .panel-corner:focus {} // this is needed to highlight a specific panel when using the panel settings #panel:highlight { background-color: mix($panel_bg, $error_bg_color, 75%); } cinnamon-6.6.8/data/theme/cinnamon-sass/widgets/_startmenu.scss0000664000175000017500000001002115167446463023603 0ustar fabiofabio // New menu (since Cinnamon 6.6) // // Class diagram: // appmenu-main-box // ├─ appmenu-right-box // | ├─ appmenu-search-box // | | └─ appmenu-system-box // | └─ appmenu-categories-applications-box // | ├─ appmenu-categories-scrollview // | | └─ appmenu-categories-box // | └─vfade appmenu-applications-scrollview // | └─ appmenu-applications-box // └─ appmenu-sidebar // ├─ appmenu-sidebar-user-box // | └─ user-widget user-widget-label // ├─ appmenu-sidebar-scrollview // | └─ appmenu-sidebar-scrollbox // | ├─ appmenu-places-box // | └─ appmenu-favs-box // └─ appmenu-system-box $appmenu_small_padding: 5px; $appmenu_padding: 10px; $appmenu_large_padding: 15px; %appmenu_button { padding: $base_padding; spacing: $base_margin; border-radius: $base_border_radius; } .appmenu { // this can be used to color the entire menu background but we aren't using it here &-background { // using this to override the default padding on menus so widgets can span edge // to edge. The side effect is that some of our internal container widgets // will need to have a border-radius added to them or the corners will poke out // the edges of the menu. .popup-menu-content { padding: 0; } } &-main-box { spacing: $appmenu_padding; } &-right-box { spacing: $appmenu_small_padding; padding: $appmenu_padding $appmenu_padding; } &-categories-applications-box { spacing: $appmenu_large_padding; &:top { // Extra padding at the top of the categories/apps // when the search box is at the bottom padding-top: $appmenu_small_padding; } } &-applications-box { // Extra gap between the highlighted app and the scroll handle padding-right: $appmenu_small_padding; } &-search-box { spacing: $appmenu_padding; } &-sidebar { padding: $appmenu_padding 0px; background-color: $base_color; border-radius: $larger_border_radius 0 0 $larger_border_radius; border-right-width: 1px; border-color: $borders_color; &-user-box {} .appmenu-system-button { background-color: lighten($base_color, 10%); &-lock:hover { background-color: lighten($base_color, 15%); } &-logout:hover { background-color: lighten($base_color, 15%); } &-shutdown { background-color: $destructive_bg_color; } &-shutdown:hover { background-color: lighten($destructive_bg_color, 5%); } } } &-system-box { spacing: $appmenu_padding; } &-sidebar-button { @extend %appmenu_button; padding: 3px $base_padding 3px $base_padding; margin: 0 $appmenu_padding 0 $appmenu_padding; &:hover { background-color: $lighter_bg_color; border-color: $borders_color; } } &-system-button { padding: $base_padding * 1.4; border: 1px solid $borders_color; border-radius: 9999px; background-color: lighten($bg_color, 10%); &-shutdown { background-color: $destructive_bg_color; } &-lock:hover { background-color: lighten($bg_color, 15%); } &-logout:hover { background-color: lighten($bg_color, 15%); } &-shutdown:hover { background-color: $destructive_bg_color; } } &-application-button { @extend %appmenu_button; &-label { padding: 0; } &-description { @extend %caption; color: $light_text_color; } &:highlighted { font-weight: bold; } &-selected { @extend %appmenu_button; background-color: $light_bg_color; &:highlighted { font-weight: bold; } } } &-category-button { @extend %appmenu_button; &-label { padding: 0; } &:hover { background-color: $lighter_bg_color; } &-selected { @extend %appmenu_button; background-color: $light_bg_color; } &-greyed { @extend %appmenu_button; color: $insensitive_fg_color; font-style: italic; StIcon { opacity: 0.5; } } } &-search-entry-icon { icon-size: $scalable_icon_size; } } #appmenu-search-entry { @extend %entry; } cinnamon-6.6.8/data/theme/cinnamon-sass/widgets/_switch-check.scss0000664000175000017500000000266215167446463024151 0ustar fabiofabio// these are equal to the size of the svg $switch_height: 26px; $switch_width: 46px; $check_height: 20px; $check_width: 20px; // switch .toggle-switch { height: $switch_height; width: $switch_width; background-size: contain; background-image: url("toggle-off.svg"); &:checked { background-image: url("toggle-on.svg"); } } // check .check-box { CinnamonGenericContainer { spacing: 0.8em; } StBin { width: $check_width; height: $check_height; background-image: url("checkbox-off.svg"); } &:focus StBin { background-image: url("checkbox-off.svg"); } &:checked StBin { background-image: url("checkbox.svg"); } &:focus:checked StBin { background-image: url("checkbox.svg"); } } // New CheckBoxes .check-box-2 { StBoxLayout { spacing: 0.8em; } StBin { width: $check_width; height: $check_height; background-image: url("checkbox-off.svg"); } &:focus StBin { background-image: url("checkbox-off.svg"); } &:checked StBin { background-image: url("checkbox.svg"); } &:focus:checked StBin { background-image: url("checkbox.svg"); } } // radio .radiobutton { CinnamonGenericContainer { spacing: 0.8em; } StBin { width: $check_width; height: $check_height; background-image: url("radio-off.svg"); } &:focus StBin { background-image: url("radio-off.svg"); } &:checked StBin { background-image: url("radio.svg"); } &:focus:checked StBin { background-image: url("radio.svg"); } } cinnamon-6.6.8/data/theme/cinnamon-sass/widgets/_windowlist.scss0000664000175000017500000000747515167446463024007 0ustar fabiofabio // grouped window list .grouped-window-list { &-box {} &-item-label { width: 15em; min-width: 5px; } &-item-box { padding: 0 $base_padding; &.top, &.bottom { border-bottom-width: 2px; } &.right { padding-left: 0; padding-right: 0; border-right-width: 2px; & StBin { padding-right: 0; } } &.left { padding-left: 0; padding-right: 0; border-left-width: 2px; & StBin { padding-left: 1px; } } &:hover { background-color: $lighter_bg_color; } &:focus { background-color: $lightest_bg_color; } &:active { border-color: $accent_bg_color; } & .progress { background-color: transparentize($success_color, 0.2); } } &-item-demands-attention { background-color: $destructive_color; } &-thumbnail-label { padding-left: 4px; } &-thumbnail-alert { background: transparentize($destructive_color, 0.7); } &-thumbnail-menu { border: 1px solid $borders_color; margin: 6px; background-color: $bg_color; border-radius: $base_border_radius; box-shadow: 0 0 6px 0 $shadow_color; > StBoxLayout { padding: 4px; } .item-box { padding: 10px; spacing: 4px; border-radius: 0; &:first-child { border-radius: $base_border_radius 0 0 $base_border_radius; } &:last-child { border-radius: 0 $base_border_radius $base_border_radius 0; } &:outlined { border: 2px solid transparentize($fg_color, 0.5); &:first-child { border-radius: $base_border_radius 0 0 $base_border_radius; } &:last-child { border-radius: 0 $base_border_radius $base_border_radius 0; } } &:selected { background-color: $light_bg_color; &:only-child, &:first-child:last-child { border-radius: $base_border_radius; } &:first-child { border-radius: $base_border_radius 0 0 $base_border_radius; } &:last-child { border-radius: 0 $base_border_radius $base_border_radius 0; } } } .thumbnail { width: 256px; } .separator { width: 1px; background-color: $borders_color; } } &-button-label { padding-left: 4px;} &-number-label { font-size: 12px; } &-badge { border-radius: 99px; background-color: $bg_color; color: $fg_color; } &-notifications-badge { border-radius: 99px; background-color: $notification_badge_bg_color; color: $fg_color; } &-notifications-badge-label { font-size: 12px; } } // classic window list .window-list { &-box { spacing: $base_padding; padding-left: $base_padding; padding-top: 1px; &.vertical { spacing: $base_margin; padding: $base_padding 0; } &:highlight { background-color: transparentize($error_color, 0.5); } } &-item-label {} &-item-box { padding: 0 $base_padding; color: transparentize($fg_color, 0.2); &.top, &.bottom { border-bottom-width: 2px; StLabel { padding-left: 2px; } } &.right { padding-left: 0; padding-right: 0; border-right-width: 2px; StBin { padding-right: 0; padding-left: 5px; } } &.left { padding-left: 0; padding-right: 0; border-left-width: 2px; StBin { padding-left: 0; padding-right: 5px; } } &:hover { background-color: $light_bg_color; } &:focus { border-color: $accent_bg_color; background-color: $lightest_bg_color; } & .progress { background-color: transparentize($success_color, 0.2); } } &-item-demands-attention { background-color: $destructive_color; } &-preview { border: 1px solid $borders_color; background-color: $bg_color; border-radius: $base_border_radius; padding: $base_padding * 2; spacing: $base_margin; box-shadow: 0 0 6px 0 $shadow_color; } } cinnamon-6.6.8/data/theme/close.svg0000664000175000017500000001164415167446463016150 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/theme/corner-ripple.png0000664000175000017500000001156515167446463017613 0ustar fabiofabioPNG  IHDRhhnL4MO99/y<^9Ewff]Nt׭~l>SowPn򅏬zq|3 6^žcιƵq/dI:ԕKbŊ @ltݺZCڕ9blˮ ktf5;Vj{nMY5RoPczΧF 5*s5u{ Lա.uts E7H$ <ޚRm>1`cթο;^<ۯT띯UZ3FjJsv\sq{KYduSt FG~ "+vGGsLd۶`UF[Qi=TmW%'4f4fZjF:x>틲_sq{KYduSt FG91W6wXm2Q 4n̮ߎhE;6 /q쵀zDelߌBlߎqžcιƵq/dI:ԥNuӁ.tJQl*ugh?4}ڭcݕg@X6;@;" h Dl퉐s¶w?˝x?YduSt FGҙl` 叿H$bLpv>OϏ:'c@r::?;7"8qfžcιƵ鍸iP:MD7:ҕtg[66gF;c*S3 X_+b[#Z7(E #Yl_OyLȘ4:Cq.+s5u{ Lա.uWёН laV6Q'!m7gjj_Et xa"I눲8}߈R*ʖ57l=w9׸\AdC]T7B'ёt;&l , ^>Z5^բ [3qL@8E1uDC'4#"?*bL~Mcɯw/dIvNuӁ.tJg-l"le318G;7Ҙ:5Oj[6]S|td8Z2j!ePCyit׏4ֱů%luK]D7:ҕtg[66l LY9%۱VwhSz:;?^I7Oj\?Rܬ_`"Tۚ^NzMЉnt+k V6,%u0f俣 (3)}M9XoD4TЊPB'ёt;ؒlRN5\ LY'(nQvHMu%0BC_qQ')c.B9t;&lv,0#bNOLt3ȸ~̊>B*K]OT5t# aԆ 9΢;&lf;X` FXauNF ?NؗDPHK?C)UU/՗ laV6,0#0+֬'t̺G7i`rIq͚onlC~*tΝ6le31l0 30IJcjcg"RIک8v4mx]MMlc#[v  ; ~|Ǿ[* ei[c^=ϣj.ld+َA/<0C,1MxzSf'#BR 44r("}Cz*0iv;le31l0 30" 0f#irlAK4MۼLD*.lc&`fa%bgV44'"4* dL([TPf` 6avb)cgI ~\IRU*!H9Y&j K+Dv  ; [/y܎GߺɽI G4Fz_]7z @Y ; [Rꇿ#0WyTr΂IC( &`fabzK iFv iuĎ(a`)FXaXb-Xc4Z`]?\WCؓQkC%FnM|]90 30Sl12<n%~Bؾ4RVTS=/- FXaXb-Xc=\0z27\>-u:k/2V+̰KLḵQ'L0^;[!M/i+:̰KLḵ_W6슒yyEFbiKP̰KLḵEBJ..Hs<o bPbPm]j30Sl1s/ye w/Ѓ߳i2:eYb-Xc=ӼI󆿻1c&<24l~dzTy}2KLḵXl愒X Cۼ =ea)c9||7Y&lݚcPtӺq2[{> >ᛁ<{lƩy;Ik-Be:,b)c9|y675ohަLO)È KLḵț*`kl#=V[ߟc-Xc}b3'ng]Jσ,ck~ya-Xc=̀iWʼn[y7nz! ,b1֘c|'|3`hs^CiQt^I=_)[{> >Oz]wGK)7\R,1c1ǞOfۧo6<=&"ԼkfT='KLḵ08gH{<ǷцAk5INvޅVN^c1ǞOfFY >9Aɴjt8 U\Xc=9ʪkH<2IBTLḵ;tPћ+~P& O4ղZr؃`iѧ醂Oؕv. h\4ReW岫/\,.|o|ppȂ?D\>D\ "EL*bL|R_GV/+_WWb,Ke˗kb4@i\F?OS~x*?TOH+Gˏ 3g:CTtlN8?i~~#izQΤOГ6k$ijåёt;ؒlRN5\ L9K$FdZݕU`BD1꽠 zʝW=[[#qG$2Z&{euӁ.tJg66l L9G7Wm|.Zz$ 4n-k2*UUu/!}N\gQsq{KYduSt F1tc(̓!zօePkVѥf˛қ7WZr C&zk9׺ǽdE&P:MЉnt8DUltz|.}2h[DZjm-f'5A#;:5žcιƵq/dI:ԥNuӁ.y?@dD @LdaHq9<3JV;k\AdC]yEYR k ˟IENDB`cinnamon-6.6.8/data/theme/menu-symbolic.svg0000664000175000017500000001155715167446463017631 0ustar fabiofabio image/svg+xmlcinnamon-6.6.8/data/theme/meson.build0000664000175000017500000000003015167446463016447 0ustar fabiofabiosubdir('cinnamon-sass') cinnamon-6.6.8/data/theme/radio-off.svg0000664000175000017500000000267315167446463016713 0ustar fabiofabio cinnamon-6.6.8/data/theme/radio.svg0000664000175000017500000000316115167446463016134 0ustar fabiofabio cinnamon-6.6.8/data/theme/theme-changelog.txt0000664000175000017500000000113215167446463020101 0ustar fabiofabioSince 1.8... .notification-button { - border-radius: 18px; - font-size: 11pt; - padding: 4px 42px 5px; + border-radius: 5px; + padding: 4px 8px 5px; } .notification-button:focus { - padding: 3px 41px 4px; + padding: 3px 8px 4px; } +/* Snap/tile OSD popup */ + +.snap-osd { + font-size: 18pt; + border-radius: 24px; + background-color: rgba(85, 85, 85, 0.9); + border: 2px solid #868686; + color: #babdb6; + padding-right: 20px; + padding-left: 20px; + padding-bottom: 20px; + padding-top: 20px; + text-align: center; +} cinnamon-6.6.8/data/theme/thumbnail-generic.png0000664000175000017500000017076115167446463020433 0ustar fabiofabioPNG  IHDRh"IDATxLNAr0C@{_PBhGDhڄ"_W!zy\p3(m03w|qx i?=mfQ]ɠ'jVbyAЯFD-_uf1ʐZV/S4C^9eVra o!I& $ H+{̠# F6{UCDZ%":Xk273GGt"=NGHɣ6Y-Kq}cr窌qb(z5~(aK_s8'3>_?tV0=M(I3!SH&-8vCNUYˤYE&hu:ڪjhX(oTu lU1Vmj^L:4T e>GSA AA7G<;6y!&V l|mgξmI(OֹhBHf $$MPIÔlص'3wfkSϼ{;o͏VVk+ `r`~`B+kv*{G#nX݅L6|ñ}oyMw}son)8Q7=%toCS߻Ѕi`#mt)2Μ\p#"Ђzٜ 2-ia $ɖmy3*ȼ,ZZ07$<`8U BsZRkk&n0ݕ@8O^{?s 'n=/^{N>PJ9z'븺{+W>ugn喭C 8_|:̾o_c;;;?}p9)2BMnd3 H@'"l)_>{Vs(M.\hH^y=0ُ{rN4_IU][Bl B!&cY&Wp0Pm ^ ܗ#N!hX= d#;1["$s.[q6ǔdW3\ܜf (0/M.Hm-&BIEd.Mca_R,sqohD DԜx]t(!rLG3iZDG D-E\cS%}f,bƉ'Kvmy4gL#ZޯfEH1VZzǾwԷ^֬6q5֪2ql8^:P44na:/7-jW+⥛gHPLOiT(4:* @nꓻO *䢺grR}S)tE1V?2̒LؘAEL}2͜ #&7zI5 ^ i^ZP~^x,)SiE~hc8x틯?u^"\D)<,zL;P'jJrRe|F1[32!4SUK^%hM^S2М1(CY/ZWkd$0P?tppË:~KSφHC_̯0joyi~2!;8lf0JTnҲo.j>\5%85dDXJ'$ 'EI.YR4y$DXFs?ɳ8M A6gCa 3#z 5 ܹ,+lYāsX x]^\.Sj +t\hH7/ʊED6NP ~ -{难|/MO |l׽IҁIMp-3˦DVr0O5/,ec97ʧg!L&59aNSgp0OVvfY\/@,ҹ-"dޅyV&yLEPUt*@V@ CG'&[+:ֽή8ujб#EռF]9mavvL%|wNJN 3v~^C֭L{i̬L;:EvFQ>c]78ft7jr(< eb;㯉( L)5jIP2]&JdDˑ>Ɠ  OHgeuYd$9kS119o67%b-{*6YgB%vt }S+_re峯sqouw*u${[[ov Pj[s5h,qN Lk `SiLr@2lV.5 YI^gRKGuVaZ֛½}4Sy5GXHɥ"LC <*K@? uΘ9t! ̡s(Ry[J'i{QǛr~4y$-;Jj3g?#>˗!h{# k>w3?xV=~#B/BЂgigFt ;XDMq jv(b6*4Nr "(FU⦞prTA'8rDd(RdrPi"GU['" Ž# I23äD-ImMΓ >9T ͽ`D"lx="7ZU35)&sG<Νg}ꞟ[7_{|͛8v}kf{>-a*04#MHOXQs)ZɌLZP.G A:TNWGZH M !=ukΎt|_k۵6>vGC8Hzz:F4LU 7&On0iUXO$)-9aeKa&rN1 [ GA7$F0S")@Ut7k ,8'¡Og `}]L  Zm+C~˗zsϟ}>jNeGELZdؚQ3hSReڐMw,L"uHxfRvS ȩ`dnu(,4`[Fs)޻y{[~/1#Rqi5sNJGNQ/bmsGoc:'[,,ϧWMnhI$LE:u@& 57c2fVrYVV(EaCAaT,rXpT2@22]+*yg%Ջ?ӧ!7,:0- lm٬Cf a' YDK]$->M]fU4Jn^ah}u{J*kIYV,1!,` V/|p̖֗]wZ;ۓNN{#ؐ0D!AEHx牿! o %D $ G$qSC{wꜽtWܶn|tk ^edJm0c]pq~05$$w^x^麘 d9l֗PvNi<==1b^-%n4#@殗)NbYHiFDJ+B!Oh0H6 BivbJɃhSO3õP yRMԦb&V ʻ]{G~`o|?~vz ! Ђ<@ $3&}zh M#4Ea48BPaE@(C1(c09X-j%"`B1FbZBRT 9#E)T}E鎎vO}o<7O9jqH.hrRH~€$"kX&YL0Ju(ܣʊpgn{Cg:5d!fU rR)Ic$6W"!$ &>ӓOO?ҫ;˽FK`K1fY]>=~ͷ5-lJK<:[hF6w늬 !w{kn!* XB)ݛ7o͋c3s\,\bE}S IWu6଩HҊ"M%Si -SSVaUm^Pdl`lgO&55ᖯ m֫}uy>x/|n~~t[o`ZYȵf}^osѠhF6G>R.z%@)=KB`r{ iR CI]i@[Z|i) `pԆܢ"ydLK/@Ñ^":M!E/orN11:n=lveqIscGGG''':BB4FI^e)FvΑ3jg>yhms8#Ti2LpY%OtΎ@Z)f (A *Ma8uܻ'o?|/oݺuv:|kxŗk/jg9 qBCIY(&HON7o`/ZE,܍DE{KEt'fRX&Jj[H2$FBؑAeL#\4e"mV*aqIBg."%:+:'ۍ~ es!޲Ϟk!912dqW^@"wRV)UFTQ;_?,_(fZ*@'ԁG,çπPT`w~tngG_gv%9V^{yw6#3A3mm g_~knt"b)`FT""ytpS7nd27E0Xvxjo(,1Tq =>]*>|{9s[!TbfB獯Dvu_zJz'w~r*#T-]mD81`7n퀈 U}C)*Lz8фs&[q tF#͏vѻͰgz.zW7~'@"@='56hΘ 1e m!+6LM$2AcNo .=a<9~;o.wV;.Kv*ZAI4AD.%y@M$4KZYtKgF6AF%z6<ӷ:/#p ":QOSN?Ht˓SIh+<o=X_n_?_n&PTPK eۨ.O"`U #Ȝ+ }R-A%AƱ(eD!`)wfPPjBL5oE G[Ξ֚Yywp^N/߼[}^~/_9b,<!H{kTe\MBN7rzH$a٬q}"G7L^FR˅;=#$MT@Ý": z<;;}n(>$Lպ]וƜjd8!.+6<8~rx=. jm0^5G {֚z>yqBs\shiipԹIp_1(U Sͳ3DxTY*[g]DL1Q4+ZP@LE+ "dj]rϾO^K{_ß__/~r޷w/NTIZ"fqE"'zjaA0F Ԡ#5F j2krpEi(uҝ_\,6[s+(LJU٠I2V#Q/$'X&eRl c%(Hkp(D<:N{ޖ5F{deOZB{Xk f;$bFaT"rA߭.p>vw3)QBE(jFPCdżVhN%e; j6+U$M,!42Bֲ-kS]\^HSWBZRDJ+yMspo"JgsE:QRo/W?qỏKӟ^uw~~gM8zԘn6mxHTgZ7ТSt֋,D( Rʀ`E8|d4woVJ/eY?߸qY]u]GÑ8Eb&7j*hEԌ Pf #Y ҃#DVO?=[:]yV"&_-(qJWžyV" WEq}}飲\aQG L |zXEd!M̵$̙c0Q-$]W H uH+HF⤉ ĕAϺ\BVek^kx<B0JÜay rQIe@ O%S )+,3gyOKJ?'͗ocyn77Bh@&* J ĺn6f@aJ{k1VZJ -µýݝEHGhrDRkҬpo"X@poۏySCrs@x4"Bd&|R a ߽fҏ<' 1җnC8 "Ra.^rXtGrRʦ!/_9. [ob-7&̸v+'-g-cnmI2 =CfPA&*]oEad-ѩ>hˬd壢,LDg$$OLiDfJWbM3qOhy/fm~K?o ( jr92exny}Ve5oGh¥.E$.//(}V=:JQXq[VLg f$ *J4%D%<,x6l瑚Ӄk{K#?D(AfKdȘsJA2z_U-T-g=vw{ꝛsw%մ"[:Tmo}1;s5S$9F_w1PJ$eB2{h +jPP2+]/ ua|Z`uyuMO6 4>ſɳsi􁭈Jbn,g-ЌCp뤊JF!j%`w U 8V$`}/__K_qI!9}nH@ (nj)vL-*{fwb"'$= D^SћgDɔZZ[kdxrW ckyO`w1nmJLLSOB!_xD޶6&Eddf'.q_o6k[DFkGnz~ZDk-`aE ~ n#򢔲ZZdBs6/Ο?>=}b#'ml˵}(*^axB{X1{xxxfGYͮ~7~W^,|]&m@$G拄ò=țPG E@1 uW WW)( o|SV5cugW!4Dtl?~VQ%**ۇ-ڸP,$}׉Y#[| [BL*YIV_V[G}$luU)e]}֗㳧,.qy* Abh2R t68jBJ05hhAo>Ej/ʊbs\Zq]/FޟwZw7վÕ}XOM=`[zuDgBU5 `B)>:i.YP%h &["Z!(/O_FA&[W C袌dH\uBfQpdUJ9@Qf4=3!!/6 (dB|֝ZBQҕ7wvVik,"`^{s j8<|r +_X2!0`ri13qX߫Ȧ$VҧCuHyۜ_l=G\za%t%{ɓ{m9;O`{ygZkr<8Hz0kHkRH 2'c"J`Ycgugߣ=zub4fbIl,n}>߬ݾ[aE9dlg(!''/ݹ[ "0DiI:eZ셗oW?΢ -,ݞ&D4is^(Ӎ2YO/7ݧ;F名s1Ϙf|+Fw3wA7`סٗy׾G__g⵱:\Wߜ>?;`CGQ$H[4bCWRrƺn X[K1j*SiϬ7k޵VNG"Q%"paZʤ]<& c6Dh6DG ;l>9;;[쬖K6L|YyfJu]oaY~`O0Ezu|]:]&ȵFbnξFW !Bpu$UEu2 1is'x N*F𠺖vԠQexr-#Fk1"Pތ{R8J6n.݃IX_\$0V<;wXj2 H5r8$x>lPV7m+ ͔RGMu>pqYyVl֛zS7ץ6mشTeؕD&>UL4&Lշ[սHD ~.jEB4ܭoGC=#tQ y0M(#j5 Yvvz}@ܩZTAdET-]X!ReMd r3%bh͠;aO|*Ӝ0R5$ WMsPiݨȗWs;.%+zp5z 笈BC]&*+]JI1][UAq冁%/MZspo?o> 2ZMӗ_2wLPYRe+ ]!qCVJ  7y΢ӳ=w_\\ZkXt0zNu]W|?%7ߜPΊB,j(6sLG{}ߟeU*Vل Yf"fea#j;ҿZ @, ȥ@[i_^MPYUUf!xs'z3rZrf1ǹ4TC%wD\1',opo4/aiY`#L`+Hފv&_J1֛ræ|u]!ʝbXӳiױ=ڒ,2kht5ChXqxBnѕƓS^ ՍkA'])Eģwov}o˥uegYR?:Zf+e`[܆ `ή#"99Ӳ@ͥ尖^*Ѽ]7knAekѢˊ%P;Y9cTCã( ,G@ yhJonсJ Y]Igj9Z~~(>ڇ-HrP҄y% [Λ3 N1 :a076!1sS\#W$h[sUS`dXmwio{}3O}zbrbC$B% >0MlL-ےۼ[s_9sk虧]ZU0|ɝN{,f$86;Ophd(64;}g_Hn^@RVx j&` ,-=6>UoRi$!% E&˚$7&ʏ<~ϖ\rqy ˑw?Ғpkm!6ϔj5rwk_Ɨg.ZPȝffNd$yKU!waG2 Yj=9|." }7.zj̞L2uA$d10~Y5 ^+!y2r dR 8RYݮ|h)nUCJFuO @f-|h'8h%VnaiJN7V*(m{zpyxrOo{5(PdMq&J3$vj DLBĐ,y9? h.G4cIImP⨙jd$mJC a`ckKu&hq5EE :L5uKחǢш *F~*Zc,zfn۱;%ftzrTh9PU/tӜĹ1P3Dm>iPHE`vTci)cԦS:ם~9OaiG+V4y ` ɓ2(}{slfI{Na/lg/ r =6e T)FBz}#tnln% FbwC^c|owg #xln%M4lzP]O6tYʳcVpψH*KQlL0R9ڜ?fП(Ğ j;v(ɋal"~Pb'1'Y=glf nz3 ShM<}q t9(߫{ZpBUgL*"Ѣqfi(NZP1WQ ,K o:Z{z@4#&<`&Q]:PRe] zD/.a@>MKANEG:>kϿ5[()zܞNkRjudXޡh4kStE6B2 z~r)Ըq̉osłVwNNRp rv#a`Jj\&eɢ=H -x=tYIE-iK7/ȵ+ag4jXcBYk:'LAt]ІUk,~U"^|-&tgbZ]_(MNi,]GۆJUDgZ'5";ҡDqH%Yj{(Iʙ`FۼJ[t2(@p[~Z0C YΤ'Jj;kK֙Sj:]@dnrcpɶ U5$47%tC< [N.a9JT*fJ|QFGm2bC"~+[GR%PJcCcqL=6zAc$@&Fm j =Y0;${``#Eh0}rkKJ)ݬ$ Z^b ;"^O,"wZx0 €EaVj;*Oăgf="p}/ΒAmFT*;2jīZ+H3]nZP ,2Ơ&x5u5pzMoQivU ěȒ2FJck;j҆XLOsLE\\i<"\,WNEbzyi[UyHw}ߓ5@.xfS쿄EQcaXj}.1w҅iHťG˻{B*| ]R#Z2/сpxjrvsrl5$* m՜^ă#לPW1p*!t9l7\.7fLz(FKŢ\}Ć?oR|[!2T46뙤ǭ|H<رQSCHu!d禶BP6 n-@h :La|VgԕzZTIDK r `b/k1>=<XĖ`( QN%w.v<V5ޢ-}a2⮶۾hj{JmfHs!(WFvrl<.on -6q*KA69FZaQ4,X]@\V 82""`ARAaH:x+u=mW8SQjemG;a6 2rёtnvG,@B97rLPl5Z:?25=vׇ?qٰ"}k?xfjvpNF0)FBNӐ(]cqYX@R2 snIjj|qC'aH5Bj .<2rcǎ?G^4__oo~ V]#1(xDِ@L$. r H q"iRxH ʎV7+O=hX Y[2ƽ*6mAD$|ٓ~dA\ܮ`./WpM$Ȭ5vgD*!2>`u:DQ Ձs,.:}GH Ө5&S<pLRe-/߆7Yg7\D]Q׆]ޗ|mS5HB@ZkwzM)DVKT!_ ^]&+U!/}FX0TtZo7\ژ}82`T+Vy`h¾`' mL淇Α:pM!Dk4(v(v9O/'?_ٳg?}7t;d\RҔxJ3U[8ߣQ>:6E*ے}V:/h یvىmZV4qEޔyHU@*6 `;znˑDoA"B~ ts[>_,F[^E UյP$#XoPd:H6|8,P4Z9ʂp6=Y`,Aw5j|뀩O (X,<[lu^XrWS2;f2jSט)Ekg;8AY ݡȺ*䰰>s9bs%@<]AS;Zn9Yһ&||v!15[Igʟɟ| 8x>m\%*P  *GM`Y"H$3lrA$ y)峘)B$x"Y@I AX dK%Ek*8vYfMtUT(dNLdM oPJyS(z^< ^]B){fx sN| 8]אzV@S^| xZڍ R'&1j@\_b0EWFES Y\LE͐BNy~ѢG^VmkU1B 0Ch 0FP$pS$: O x7s,v6 1`PSx8R%MQ̪+Je@VN$^k߹qQ_NZ!O < &HPI8Va%z:7h:\،Me_Q d;fpb|=ZiJA[Mʅ-g9}x aSbt3˂Ұ:xI{|-p-I(9 h+vmⱴDGv L)̻^xrp߳3)rlt,5gUe|2E/+^uD"j5YyaH<+U ,ޛr`M!BUBa4ud;l.j  Λ,PV+?!QcC$q!s~kqjsܥW.s4ͤi$1Px׆ ] -e#&BO#wVF"rju[~h;9>+3bEBr''(4fF2j{ 6RCQ5Ζ@{tвIW"(!Q e?3FKN?o9zl #1KL%Z)i٣z޼A%S^U !Ƴi͒V#;AjVn iJT1~6Xy^St,4Os:;A~̓Y^5[K0I^i(\F ӣNb3l#3U/I>p]ÁC߾8ȷK.:Ф6]v9, hbMV+%XN ]GaqJ%a`Ǐ@Qx3xlc}|^L._ !y:TK== f>NJ!߉+NQ;+}!\BԲh/T84.E!_Yx(Nu4ʹ8jJ6!`tX`>%>^%7/ S"V[|EC}xXDrk7:g`>SհB5+t>TyL&xmz=>-KtrZif嶬zG7bqZ-KUI4,!EOLw^ܨML+ j[FMLiCFt'(pX"~ # HB??hFH&J%^kdYȉ\s62wtv,F2}[7o=BF^Q+hy5h6ݚ,2;/$6ju"+eӔc4>'skc#BjbPUhTCDr:66qZKٯyF)RPVVcwٝ%J6osfpx0D,/F4SfUT*d.q9rQTtlԙ՜4rTE,Dy:AzkQ-$8 !%G5Ik.)6S˔*ӹ$/}"|N eէQH&'!C2 @ SMJ=vZ7|.κ=ܮ<ԋẸ}܃ox饗x< KDYpjK&,1:_ Dʆxr0p(Rdj..݈;弴7MBEFOvI%(M$Z'QZXb imէ2bjޏQ@` x.*#8ONdzr\Kӛ%. `;:'Җ}`L?S{xk)?;՝rac GV|L`\ C ؈w`e! wmwrj:\|E|:a^[|n&z >Jxs$*h$_ҋ/Tz {yT ͖4@^N߸s;7=9gA]Q,z}S-׶w _"qe%Bí9>d"Wk[@N=ͷ]=:>X%6 2;$&b`6*b͠Vdɧe'&ZB FEv S.3(a[uw`K&n)2_ %{Eg]oVT&RYU=riqGT3KK6'n OllnB\.@E*,͒yqF=Rԋ.3/@9%C7-XnClTD$:+t4@m% 2C]vH^t !H`6`ΒZO  _E}Y{=$QR jR3ңs&%;71/׫ܽDbm}3總TWwɎ!Yu1Ҍq^dʚ J2PW׳Nh$+>dLwh_[M!CAcezv}9Uu{(\Ł'D3lXd˕|EXK߀޴H%敳ϰRx=eu1 zgr`̰ #8ʫYK)I6a!J5,yj9оl[+LC e}]rH:Zay= ^r3+?ـr$X4HF kͪI ?wGCBw~'~'O+^+(g.?@|M=栐.R9rfAr\LT޵H]kB %~6U5GFi眣N3їئ=NY!V6~(軽 P`CaKBE0hVS&I%(4A]SۉHvc9UrDh r"CX v\3reg5c6* Z>}sgNV3/2p7;\m10=2 s贆ThBO:''*Na`{Xúq˹(MOo篱2 hGI{p0NaX*Ԑłr)NPdL9uu.n7+'D9=PQXKrx±ǾoG>=~w|;oS*4) {l~Tu4?4Z漎YNL'W֮4{/ Õ9Lxzickfb6*$=pDf,ď\.ϴbb^=lOZRptr7&{ޕM(t4~XL{KRQs:>/|+4 R"!/C3cR{AAAT7E5M"N u$ 7?JQ={W U)Lj;hx^=oS q>A=1yH/X iBJȏLJ7\vtfl O"8xy ɓ'&&9``eo0ЊLYi=6uians$D&)p- R]{-#CN[Hoo}zϣom㧭B-l!QCCVwuN)j-#:͖ZE@'1[ׯb&wvz#O|ݪã+++6$24„TCgue +%CvES8 TsMhZl2b[ˍA/G8xڕىX.[±x`) 9'"dSϾtktvPFKi"Xsb"!k9.nh FJzuwV.Cٹ#,.,NMN`l||nvnjrڮB+e3nő+sЌj aƎ=27pȑ y=#8pHP$E+fTF*]44b)m 2#a5ZU*qS45F׆Cn>j*7ɰTۏ^x&"31~8|3S}Ʒ{PfKI.V#>03R$\K$ިfDp p WA ltq\rm4,1y}`ij/~ {e`zf[_PJ(Y>40#`bzl972m"L b  CvcMl~7bF6|R>H?*7WYL "򣎇BX㉈A Y>5'BqOϖU ~d4Îze~f?FhO﩯a@N{M4 j&NJٶ!Ax' WI˪/2&櫶1RHcv{K. Z1_f[}s{¬UV5}sPF:\1Q U&{žդtoO_.TTI$1CB)D@ |PY ̐xtWH`3oZ~P=G8lT%ń喒2F3gEMmlHmBeuob'ti ~&>Mn:~tt<,n>SoF,棥4ȮMW!vk_R9fomm[V4Z6[)M < yd|FѦcYi#DYm2Fl MRr7_m$> =!㇞8ラ"h,mKfV!bJU3XRb2iGoI^aϜ?dwcW*ػ+ԙgWLGR+.Ch#gIďff^0Lx<cfR,m'lх3c-gC!7EtZ !~#@v)O/(k{v{LGKp m|ԀGqh !X\_X ^j۴a%城jɆ, 9A䠟=}N@/`Q*ǠO 9{/Bi|l!/ $Jct qi1(qt!Ls9:-AV!ڱ.f^T>x:I{χ*??]'0 W+d\=V]^2X>NL[Hch/Z5n*)Ԫ v{SO}KG"cT&aњ2n>dI.PPV0Iۄx\ClMϟ47񹑑'5?Ndo ѥ +ח \d͔ ۋ j %A]Жxx}6o"lAN>f jٟ_|7  = M="TΜ=3oo7G?uꌴᷥ Bv5Q3V9x@ߤ~~W~ݏ9zA:}?wHG@7J5Op[tP͔u\M27\9.b{bWH*Ha9^yĄ]oRR9MCPOv ~ߍ4ӖJ"mL)Ƀ^J _:k;\6%"aJl5zfU'p>ˇ줙r00ZMpŭ'n69jZFSdR5Kn͍O36q؄8ld R5ip~!7T(p!+kQv.K^w}_6 %n2,` |:-Q-yJI>%Jn;?ߗ27>NQ W ǟO=wi=UK_|^x_v:Q<&P8>?DTL#?/R)GC@*ד]\M,.FU>+V%] l:GCmm *[&iɀky Pk6|`Qj!|lYEY(!Sv, ;.QM(KC惂Ưiz66g# Erx[Nl ŢMY7־J]8Q*t|tsc+\Y޾|ᣇPL* CRC!{Xz"J%*N N˦JBqqh8,!:\C|G %jS#4/yCC5&YVezZK%Jav3ORKvvd,&0 D84mŊ)5<xXD%mP١Fl&NUO~DAoBXhjyWH@ъWq%9F=gbz|ğf_xB C"MSC5=\WXB D j5󣚠 $Ii=.X}6OLE|aNqN#IsR+ۂ>{9ViWVo%~_O_=`xX^(kg]בO6I0~K'Z ]_C  pjMD[(CwRGS_w*ů\{K=Nh(斉 MuWl2P,}Dz31Յ[)2Q@ I4^  lg!_ѾQ'&xyUve4ҏ.u1$\;cI 2):K3k9C&w "L1sCf.z@4`#~ˣA9Ќ_ɏ|'Je}`Jٸ'2e~07k;=Pw0kNR5B$t< 4Ժ. ] ,:g8T oН PZkDiݘX?7?m$L+8 9J 2OJ1-.D9_11蚁|C.W6w  6_̤zmp،C*]<^@jҹ|6P|h⹧R~ڭhBZۼv?d @pq&jBS.HwoAޖJMאa.=vܙqJ^^sC.8bfoI NLOܼsˣx6VY+ao# ohc}a؈yMfn\CݬvZuR9AB \򻷮Z@7o.k܋~`?x%qaly+J 3YOHi*s?Zf3)zs~?\}2=A&4\b?!%NRnynv!ZsRWK^0.BˀXV+ :l^s8`|"(d5]G,zwOh"H};,s 'eNnSj,ր3459:>1bvaj*dP7ʀa"I<=Jb"p' QQ7^Y1AssJ~fB+O$@Yӫ*"ѭ`=lbt➣ᄛd8@o4UkEL&DR7-^Vv ~NQtlgՆTXIj~{W. E0XӶ͵~&`w4l|)t[̍F%$;E`ǵ&x+:ǧGFG;i5Pr'*"E%8P.xdS6k&9zPc+NNΊ5ʉ$5 txԩDу){n²7؂ͭb>[\uGs,'r|#8!\+|DV ,InDmb8I%dF|ѮSۼ{xr9[`~+OLQ%\vj<ڞQL֮a4uѨwnd Br7aEm:M Ƥ?$rBO`٦fH+GvRJnC1\(0<@% tCnZ2& ' |"G7# 0f.>>.7ёS]./+fKQ[c}<\wAXx(KݝLZ Ep$Ǽ|Zk=Rơ&O?&ȔXNW:0FvJ QD A,W*?13VP Jm7_5H_#1Ot:p{͓2s(s w_i/f! H:һ k?an鵣[_{|2D}#"i+%FIV ]V5.qFR<v;N Ǟ<ӧϼ oj#h^óe,l=5{~?K': #GfffϜ9s}MLN?q<%>z؁E;bjuƍTi|NӠB ;gg&L?iin10tH*;5 I-`w21Z@7x|>'K>Oʕ5577\|W&w^F꒢3}!ӢN;r'բk[ڿ{x \(lldr#Rpg7}GFM#1h y?kf:Nz u\M]/hOLoJH f~afH 3_CU6{F};~0FX8ZdijLt]We~(d7bƖ@acb4J:bMZ? тI\np}lR ×/ltW.ΐcc;[=9|jbf゗qB:Ww6cczA`\2q3ׁ6 4qŎ+ZVFT% js~'B4}gl M&W)[Hq7/ů=ÍJSZDr@A. ݴ l$ YdXY,,,(mlMgo"Peq;D솯9[ږ}d|ȬA !.~%M'U1Xi>{p: 10*W;;$"P3&SVamz&E1x3s +Z4kmGj-*FQ5#|#yeZxeavfȻ۳'`\- }mrz=|Tpi@ ]ց8&mZL‡^w]sdfn [KvPxl}w^Yܵ9O-E`:; 8fojzKf浝CGK5UvĢ-$WhՎC@hEܒl1XzAݎu \2>K>,+p=L`9ĸ} .mo"!6v;͗ڋ;˜;l 'xO**CxT$)P^%ƂlԀ(Ua#Ixj-W }D1Ŋ]|&6{ ID;>>IUptGahUI*MVJje8MsT\ 9L@GGe)OkjYmp(ǤwF>eYr+FSBMܤh(DVidrL'k;Hoŝs*jCnofb$ЪoMΣ!/t(3$‘-UAgsUeX>B0t6a:\I pL+/~ԉs@ŋOSsBG%j\a驇c+]x_<7!pťH(RZzЉŵNvũL'oM-Jool>q7M.f1OFBEXx K(=pY[D-H`|hGcSo$/p }yO`{3;9BCWwȉ9;R܄x\H,ZL6Bo`o  urƁݲX;-fM!Fu}8p`gp-./kY` @\Bz0rρQXgfcEo67ȺUAkd0}9Z$ckS>#0<<#idĐuXF,ujh{$h=NnhD= NZPm"+%e60}䖿9Y<.~/|La&L= WתLEd$ `BKk"NIhJ?Tڕ[ɍ <*^k OF5=;w|OTe*r=aH*[6}6ɧ ǙeE$'Zqhp_[bZ3 ]&Df/ ހS[cx(v9;>hHy:&^&bYQoseVUT|rPIQCX@"J*4o y :?kzuzgBGz-oi V?n'wōV Wk8e,fw_:#C0U02-^*D a<4=̌ c#c?0HSѣFFFO:s!Cd]j,M_ _"[W7S ad7L٥J]TǙ#Ru;1?!]nxţS/Uȣ4Vo~k !hG-3PwN`7[T3g\oX~=nc"S>򑏂ezϒagj5[)NNd1#D>k7ן{b oՇfƛJ:SC_|q9."(GX,Աb=3Hgnfdj,wcO9Bn44Uԡ&$0]#x4>\x)3##C& #9Vj)8Yf_gyNN%N4Z (8ѓc2IxiM)6[́*6~ O]xyPy_8 ;sWq;ck{[0mV[l|3q,QΎ/KjEĜ >y0u8_굫:|[7Bv.VWt|坪0i}Vki95r X"y*M,mu[Q`#+iuC{zb!Jrs; b /Y>(~@"??IE%+\DD\>Ύ^ 9pz\;BɃۅ)yb=qSWw<|O՝#,}$ 1EcxؑgPLH وtΎ&(q*IZ$l1>>9xlV6`: 0Ġ<O@ozn21H4kЎ<N}۷9|z\NsHϘ@[)_yn_,E RYuY^/,LΌIk8B.Gũb;Q/q&=6+뻞r_ x~a+w*aGl*:8` $d;TJ2i Nb$_ tJ)'g_Ϩ╗M!'>W}jn.]9$^3Cdm=}];2Kz⸣":%Lv-Ih 5i]Nth0q鳡xL֖.P5y; PݙR .Zc`Tzwf0C~Sww7PBVhC 8k?z(T8l/@zs?sdXKJr3K&6z|'5)^:=5Y,Z=KM7|a9u T.W:YH%TnWֹXLW3{jgJc½T.Y~{hzuJ>I:vߝe ߐK_z)hM:mdnqJ^40(،ܯ= |3066N.14?qҝH8 os~])M)Q%㞘ژM:~O͎ b<$d7MKEdqr]J[:rawk7-3/}C_ \7x]Iiq8j\)3O^@ ^qЛH j^‰Gn챇_+OCEx;n.\aS_43i|{"%XV<"-[,F!G#ͭHp{m5L,WVv8;"`ĿeSu zfJVWi\ijwzdռnx:y$IZiX[e]rd'f:Wd5/r?Itn^|@@ e [ߢ-b3:% ~@I,.L]ZzQ'\˗_A ٛVmNi02_vEۋ v~8 {b};rAj +y\`XrG& 4"k".Z.WohԏwAi[g8ZEb ΋fh.zTN-sv5.kC)iRe}z| 'OMZ*%NH@n878,` m|JB_%5!Yɡ uy"s1دơPO@Jt5`xPn cc Grg8I^}񏌇 %-!?]&o{ߙ/nK)#cfp7Ӹk^73Z+_NL'h9~ԉN?b()\\q=rmR߸sXh)C7l%,l'm\uޟ+`S {lyn{ݚM],7]S)y@˛WScr᱉؉KgÆ3/ E MCLn' eKe& WJ=9>zquɡE(98r E v4^0* 9! Ն0RªZ1 {KQbqcٺ~k?ĀX, ͓2B mT )pKa%;fP7SY8#i1Rn!f2d]NH=C=ĕHDeC70=ArTJX5춼B7RsYk̉pVF^R[&75>E͛w|:~v8vƚ'o4лJ&UQiJ=A:J2kmk0s1?ty_RJrx|.Fq8O$h C?OLxX(t&;/]bs<)Vf. b*LBAg~ѹٙG:B(87MO/s&\[+;YC2jctkbd/LHѯzB2"O{ڢJP|_=}nny 7n7N9uWWWjt%^q (C͵v EnΝ}jW+]Tk=O姞*JcֹZ,cG{Ic'6`Y\.i_#nP:UYdo[;DY/a\_OQf6Qgm%Xev9FZve@s:fMTR;f{׷7ws sNT,S"] f hg+GYI8v:Wv0¬9dE"gZ&ߟoѠ&l}|'`.].iavv%/<9eBI%F⼬bf|~zP' Ś;cTfՐT/-/~oIzgw\g>)fkp"΢ǓOASR8!ׯRv R>s`ZOOF*|k~u+yN<wwD;-h%;:<{\QAcwW??j}egtKeSPJQ/]ufsgGyq/zd(wŘͱF%Q |mz͵o\#= ;~laz;6ZͰ\6=1>d*3 ؍e sVQP(7(B`qWa;R 8rp93&Ò 훴 !n3_BXc+$kͶm'(RR T"jNEUZ{La4 G/QTaOlLF^*6Cu"i||&Ilq*fK%Yg">Qr;mgjןyru#k )ٻk[ޠ\:d%F[>L ٙ7N|3c 7^x&f'v:氹/ͥHYLvv`nsgp&*ݼykeY/|57K87u=$~.Wm qx! aL:aCC?Ϣm br>+E<1j Vvg;_)ypz8gk\(y*@$5eC@]kD%BDE_?/R6K굛Ddy^ Z:mhw-P“pqD)bW>v!@X4cx{Og.\xpccrĉ)F*' v{;^ҁYcAK$^n_^r 6;ְA97wGoqrbzu.]zᮛ: Qdi:j^V96Jog wnx}Pm/<\,ǻvw=[(tw( AL͌M/⳵::1Iߟxtf 98xy<_衉ģfkmj炗8qb͛C)Xq?[)9a7xW>"2cMD@x$Ϣ(CcR'z.Bh.⍍TÜH?[6Eowg#qQsi2.6`jQ:eQ6Y}-Ni js" okhݝf\Z]C=)o'MauK;t5Ʈ+ rR"@~u~,xU3 U{ΏOB\Yf767Y9]@tkNgЁW6o2M.m^AoPcS0h$ejzoI\nҵ@<2΄|g_Lyaa >gz|G.\2*DVtmz#=}K U4(0J>|p+t &2* ہ. NX2,+ۅәjv>y 8UB%3+KRw8l1E.o{<~1` GFba.ˆ40Qs T&CMD^"ǎ/JKC.tllJx\K⋗VbkH Vdե> Ex(d/Aslz. s{챉ȝmP&@n.;.TW۳y{=J0ãTτF5MdJ?_JC,}x(xi,rodS~@X<56I@@ry`5mH" ?!ӑlqc%- Q},[eAS?Z!-r@ Iv,3Hz^raka~H_!f!8. 2c3' u#G$d] ]LV+ndHՂ#! 5sKw#sS;>H:>t0PZۻqx<221 C @Qm@#:⾛@yn3]ghl3y"-?>=C֭L"S1zd(>O903=VL \( 籣nNεF81"DS[[>XKFݠTjŽJ=4+Y5RK{mYddnP֪w[eAP8{c$T n,眊am֜}lME_| ?=x#ӳǎbuh23?xG&>I@ÌjIW8~!1=+vexսQ\g-سDc,xKnSg>lyj<ꅀjoey HF Gow ~C>Hm(2KBb>2{iV! @{zJ:ՒBz`4)WCHDЎ ǀ74<$W\)EiB7,֓/{O c:n4, tz\;wk/_ya ԀG1g\?ͳ98JN7|E!B^ <b,AmTres# MʝU\Pi9 r1_f }#\(:&}~L|t:Ic[ ;IzhUY^kbZv_k1D|i}+aid8׾ lanmm^M[+f6ԏ'zygHܹ};P\BJYw*:+/V5px3Q7&/NS*vZHY,^hN-RbhAA)z{88cj]^ȵyL F(]&MOxWSS\JY9Z,^ 1^X_),YqWp&Zyd?rÊb~\rhvnkgjz|V."wP(N:H{ ݾ[$gCg S3P<n^Sa0+:'B ( 0nK"We͔ u/K$H*Y8k=x艩i*%?\\(1CNM12׬#Qx7nl䓹x"] } Mw[hё |w8H%`*VrS)Tx+ҳ/lLdWR(sXR YR'C+ăw'+`yJ_ړ~ Rë1kUvQ(KKZTYD@{/Z"iG9X$N[5C\*6ɷ X(eG|G `"ǡ#sr7ZWpʥ f"JqG`S}*iĩC=i}""r}39r+_o$77C矹Vŝ嵻D G.N5K@YE$)x pq #eqd畋ҵwMkاt.Dй4_M}KZWN9؁Wk x<wdzz׶}7~ /]_ QNo&-'0^rXƪeVKEP|`GVU^[k6QOqDǫBW?W%-oה(fJnSb!G<@3t,!Hz2qxgCGh*3VlG | & w.y.[Ϳݧ/*dWSy왐L8i#1ϳf9ϻe%"#~fT#ރ0@1>1H(iΏ?v~A/ga]ʋ/tpv!WĬo]`F+4Wzqaq,@p Cex|umvwx41́G SU_tdY^_vX_P<φE&f tkV p0Nh 4"1\z$|gILqb<ւ +t\$`e$4LN$vwz7=wXOf=1>b2-Ø1!GCdrh%a1=23^|^ JFQR]i6[ "EP n‹.z$"y@VvFkcQI/ HA#2 cMgNk4QjD) <D"T+^V*T#c0s\nL1TMI%^avjRE"A !T*kq?pwB]e!ٟ=[[],tÿ7_*BEZ$mVm}7$HD,S*ͬ68|V~CiHksse{3߸\{`R_s-Y˦)^"3lVGQh]t2{ಿ}c^nDٹDǨTI%mڧ>3W^\ʤ+o~#/KKVnG:3HEnq@2)2V7w}ϷJr0ƁA"K.h%Hq e.eJ]#K=W!?} .d˰ޡbq.!O.Wz%LL ǯV} 51))@۷|}KneNC~G>o#.a{F3c=&#r׫D?w>M!X0n6ADŽAL*QF$tO/Mˡ.q,`tjUF臸hdtvӬ\wp~=gVז"\N:G[ꭝ=2xxd<711  ; J'?^^m0~"a)JNF\d1X 17Igı333 pbp0\+;ۙ`?7Z'5+貑 i`7#ե'lǙpPnF}qΝ8:5:CcNГE5F1g҄Uu7"0Y_)e!jJt.SgOό%S9bZCTmVb_b\k8MMnG]ɏ(@aּS"8%C$uJYfheTj]nDUPk9V78WZ_x֘~ZKA{|ovMٿRhh< 9 S)u[31MR6W+ 9|o'?]Nh042?sջן#^ v#E9CO.LM~4ؒ(%&Xiq۰t9L>#R6F<>xp;V:,~~ QgV”\Ɛ{AzH+\q~Nި!N>wp"]/O?鋫 i Yn?MHo ibG|2T=GvR鏠h.4.Qk55 (r+6(kx*dP*8v"I"q:;+Ϙ|TX0KGueSO l*2ؑgD< :(yC2nH`i"i*۬JwN#AdԿp+)*ceAyU&l ki;K~'z W.:)#c!۫\x[_^Iԩӥr~yeU`6v>%7cP K$3n ;U<8v'`ܾ}Qll{.,}6]v4)p; f$pHD Ӱyp"HrՊ'+.ۗlH($F,I1C- UbF4a`{Є:L+"Xc ܥ;iF%WꀟX?ۼV(#KzaT!*2y.q<U<@Gv12yv7WIl3޿FN%s|ns$ȁrM 6᭭r<;9 -Pi|P;60wWZ7<`ʰ:Ijr*DQY?,'UW-75$C2EMC~;bzZnf uZCFaC#^|z'Y͕*BV8A$mb |Oc K' ehȤq)9R2?1>6[M% |CI  2:Q#L+%pJG>bnudGyȻ2*YSڀEP`u3< ezqք\Ʌ $^[EB@k ?Z|4Qρ۠vqz&ͩ ,~M2/mnm d5_8^{Axv׊Wn@a-+vNtKa0+|^rx{c$lڝZW j}B U6LEBY82kNݸ$V+ǫ7v}HS$S_H e5qk`g:ZkP|nP\84}wi#_m,S#@UKhx32:+me rw_zK~|˿~z fZaRz"{ݢeOybAMBPGu%;/\\r .?bGҍD iv{ЁC!HGk .ÿ*g{ל;<>PFAm$,E^Bo‹ZӁ6ER!fJ(`hHɜmK.Pz!fd, IJ|NXfXF+çϦÇ)=CLyC5K֛,aNݼYY u\@iI?x(GFk DHD_]DmZ-ED}~"h0Efo'$S8 z)y+%b_8UP5T0ц>PǏ_=GADNיmhu.O_]޼vu[gB|!dԉ?'=>VQgb5fNO$s]R)3⻛C~Xn-9 |꣱ Yrܩ9: s[euNN:6SvD'@4s{>~bX¹a 4tKB]Px1,<,",:Lr⩰۝m|*@eqnGrf}3Nt5qm7!bMچ{!(X^J2ifrAvq܎Fe #AK\8D VmگSi>IPPD%+qiGH c& &rԖk MU}|~P&x tR)UYl]xMjLJ¢GR/c_xoO_T&KFxpAAf^/$O3<cgv37_Çhw@C pEYKk[ INN Z>p̗ʀ%jAA}rVZ߳%L)@({{ui&H8 Hs"A^ ނlQki3ԆټDBV^Q&GolZYJL=rMi>K dǪ3?Ҫt)o0R_T Jf\{䵞%|f.2r915"rW\jFaO2ÛL~lwN1DIk1"g}`Jٛ1. B} 'Y2$s0\7dՊm6,L*E6G$&(sPcp`&&L7̹]d>'h&CG:9)Ѯپwg("a:AT+##;z<˪|ɡia_/dִ65j1O,#LHΑ5ϫoP@R6]v>4Ltew]/~_^=w{gg98lf'+O?{+vzt}{|pB 2tvX Cp]2yq3\P<etR:#q:%NDtvscSFřF#G&f;J̰x{k՗ripfH/Wr-$ݐjmwýƧGP+*B ++FLul<&7K9 `0ZTÛg:+pvj6'$0)E]>J§qUp#(s˻Lxqc8_q0],:H`+(YRoH"|x4vAl 6M[bJ,ehI(+#XQU7^8rM4$TJYˑTvX]4P&ai#r( Zp&c?dJMLƚ5F 9>=y>p%습ҍiϑRk~;8@}L^=ܜT܃gw18W9,XI1v+̧hS qn^ u>_`^13i,UbwWsJ ss(t\#,.àX"~%v o6/ 24Yzz1%fÊefPMj 2UhDz U2HPNFlk=TۍR[x2 R7nfo]Z/T4X,TWź@tR>,s< :ɫt_ Ν7n[`ٕ9>+kDZEffX*3VeX_<Զ>iTU;l*kճMf1ǎ~ɧ9B'ç&JhZ8xv׷s!(W_a3(?,y˛W6w;H`A*&lLiRs"_Hߐ3cDVU4Ȃ`05Ux Lr3J]> XB` LU@8ґHfRQkc.QBD̅LZhP2eaO N2@,WڐīqƩK&Gqk}ܽut:=YzyݳI,-?0yq( 90)o/" Av T1]veYKϫT ܯHlii`R@~ML y4pP1YUohXg^qU!@ա!Vn[*k6 quXO0yɭ=mrQ(> wnfGH*}lHHY.iҲ}[K/+D#/Fk3zF.| 10B b!m[%tϤŅa01.[!:Q6P?ZA'();$m0>EbER \r3+jZ={|AH= UZSRKcQ?lM*6oF[Pdj av5{SXv7Z|d`Ehpg~9{R:懲Od1̠'jDtͱ& +}Å=[ j 9tx1o`IL2݈"iLӾqna'n7OdԽHW׋Ç[k| zlcgȋ^3==%|mt-7NLtq{椐w!k( M޵[IO IO4UeMFq(l# @!S=v`hEZ^u:! +a|N\1M3B\$ D:Vn[Z>xrً$\ ml K~LGTd0)nW p{ZG BJ9\%R,DUc0Q[U4dd?|}o}b(+[:ЀbWPTS^K=̶qjp\CԃOi/4 ceZ fL G`TSIܽqYY^SG.X;M}KW T"B|6{ V+S}A׽ 2 %˾vx%ַgF9⇣Lgv) !jV޾~+eԉ7] = *B"E"7NzFK]nG(O.FoVfw 3+M-"R/"| ?C nvhb W+K6LN "]VJb;6-穎 `X,>0q @CRw_.- W2]yo 7Up;OJz<qW9x_Ve1'_y" VB5F^X7>*͂ 9}7N~A9V7N6Z~$iDĉ#`/.ߺFÎh"DEёM(&.|gnnxO9}`tR¡h`6eKx,(D>]]e1H|K(Tn \Q Oq_B#2#>J!ѣ2 A;D4|Mq* 1R!"">~{EMa\g"Uة8Xh'6VNV[7z˩Qc)2ֳVy^sh[JCvym ڋ&M+qY-JKj5@ vT?M YS3M3 I$>K̞Wb&B#P;.q鸵X^0H0dc2/>/_^]]t>@?˯9 ~aa~S9t0\|@7\@WDq:6Wޭ 8u]WhP2uc֍X9:$*U  sK)g` x XvE2ݰSn,:ÎbLO8,/fx'9'+ψxR,^vJ?4N=2uq0`*@7I\2CUƒ(z9Rpr<4ѡ*7AW)W[>M1W?73 ꀸpmĜL>pYSU~<z5͙?9*Yeʶ>]('>O`t #}/P\[`\s7XUb8'Oc6Zۻ,e 1 fƌDx;ѩz#6{`Bz8*ENc/Wo HKUixFFY"F|QD)팍_K0:4s50te%b|*8\TYɊ'lPgb4$HFg PdhԢ".5|ƆϊzNc$j&ȍ2 VAmALJ.\-%-N\:;I"UB%Se^,-:95'm_hjɳa:yR`B@?e 9ZɬH:tP"юFH$0IɘaWSSS1/ S@EUS!64(o;ukYs/;y Ӎ ]š>6>F2wF찣4 YC2J;6:fA-$NX, Mi?_>|"7?u@A;I0P'+"u_D1l&7IP3dMt{͐YvL&cnkFv-n?z"eu! {h"]HWxfYCMj~+κ+=9cb&L{$ C2@aN>TKmԘXڌmw[ "RifrRb5B5b_=MhFCk _lѐqghNA xj% Q,cOAkbfS,bWQR-FV_uc'̺R*x!.<`ai<A$ 3?mĝyTC1si GY%cPN<瘸s0{"=g?K?« =1>&߈Z] >bЙ3 Тy>q$g ĕ 8N64w`GϜ>aP%R=rh6!2;ㄾK%DJ+!v*<: f 0C՟hxfn&CJTFz[-u;R)a|Jr9m@K3 Tlf3HA]2z3597xؒFۓ&SnZIzsxL(k.3[~w d;u5zl2\%S{P.A j+m{˦ 2E.f 6sy٬wi8|I3~@d |oMzZ ]#3N$Gz0n gbo+a50w5lgEBƭ*WuV,pnts\u\&$] TO)pkww*H#Opm%V ʧ]I%SI A=9{ DOq>ZO &!7nm>p xA& O)Y>{ⰽ f5R$0}[MN3Oc陘r =6ivrSlMΎBBT)ɄgHǎU=bHa4^)n %W{19d*ݴDpl?Y «" IIEt6F'CJہ@=UB~r)h_&X:rZ9Zk5hFU|0pVcаomVORUDqڻl c熭?㰊2jOY,Yl Tܮ"I ͲAb'U ]["Oncc㥗^w{dcPիWx^gjZ ل>;;C;.S=B'XŁ1yrH҂'Ϝ9s}>}e6ӹ/.}_L?_Տ|#y{~5}oo_?s_KKkW>o__~?gg~g~G~ϛg??qn}}9kG?p7nOO# ??a{{ӟOO3}֓_nEҾ~~gg%dwx,o@տWy] aFj'>w~8S҇>aC$r}b=-`86sZ~iT{zfYT"1dK<,3f+F&ɊqK:eL?iy+fKݸ5uBSZ=MJ1f cxȘ3ے O}irɒ:AX kkBq2?}[%IENDB`cinnamon-6.6.8/data/theme/thumbnail.png0000664000175000017500000001601715167446463017012 0ustar fabiofabioPNG  IHDR;JzTXtRaw profile type exifxڥk {Y$r σdˤ4IE~?~qHTmn,q^ ~x:-#~dzϯ'J|w~V_&Bw~/TֽP٥.wrߵ ;RDREKSuώ[?n|2x$GP~ayWͿ "KA?U _s<} V,?gWQ `Y˟X)}_L`3t(̍Gw̟]*H[*7lϲ]x5az̛|,_|f_r`3gޒORMpN:W.%GF>R˿OnnGe%UZ{s.y^d^C!`ϽvUZL_M]D2˒vdSCHAկvgx"Crm6pA Pj9?Kߔs5}K4: Z]ˌR^=.-"/mH·<ϥ=BVRMMhKIlffcũ;7.8Ĭmcqfh?Qgu3,ZOdEMh373_uj;,=؎v#Z GǮN ey깴yΰsɞ*寭oayMd 9>9[0FayBP^/l! qE\+{è vs ݀k1|c!wW'ž[:W:L--lg 0FR4z  Buki>i$hR^;m+v r!99FeucCtgd@q0:掾E!ٻU jfHg1d=Ǧ9q*n-z (|v}ov\@4  g4~|{ ^8si69Bd\AU-/T/UY4װ@ 6'qH@/@@J l j&C]їrm+c@DO"H9.sBITOIDATx{tվW2i]BK7ُ6Bbb?n+<&&&22$IZM&SUUUEEŕ+WFѠ (LB`b.V@E%F4MDZ,q!DB8㲔vVk Þzꩅ N4 Bbe/_|ᢢ"ꪝ=eeY-΋Ф ӨI󰲲DUtU_tG_gAJfl6+ʐ$7l%LfNGQBd775#p֤o~QYt53 3#-F@SeL@ PRߺ盭} MEjZHQ02fE J-//'樨;v0L7nܨjjj8Az$dff޾}[̲l'X@%΂KmxGy0-TTVO?22299YR9;wfɖ:ASSSnm;b0N}zgg˂foY?18%=$W\ ׋,lBZ(JD MAl='$$/8ioaN'>egg3 #kبNKK[v#ׯpH/4 o;3c@max7r (JA5>|}W $IvsqEQ#G5jӡ0{%\p֭[.p䛣 l ͛7oٲE`Yoa&99!6mӧZRƖGN @墓g#sm7#""|xBTWW/`aSS;O04M[\iV{5{œ[ //oΝ.Xߛ\___Cꜜ~z p(aˇ[{_{4.nH5&^^^RP(7n\bEmm+_BnZ2dfop;6Ϯƍǧ/]-qى'NL0gOe,9d>>ǏjZW_3gNs-R1L6-%%E^3zqܩSΟ?X¾ðL>m6mNY֌ ;P,zMzGB T"H~Z ל`3J1 cEFF(:|pk)I`p֬YNE(s熆>Zft{ϙ3ĉg fƚJo@X:U?υp̶ܢa)@#۶mh4W^9zhssZU-ʮ.agggggftRX .a߾}[`Akk_-⼼_| @ɗAT:<  PD $9o_k{3;+$Hn;3{yY$[UgϞ-..޶mۈ#Ν;}+WOXXXLLƙ3g9@8i$>})7SNݺuڵkE6>3>Lh@0 ?XS/73[VniaȈ1SSe0Ԥ 4͓O>){-<LTTj2emJ߻w/a111?|C a***gvnWpCBaK#)+hC;]r6\8N-/G")IIPR8G5Xr EQNn[薮J~ & \RR">6tjժ$In$0uۜ^E AF  !*jo C"@()ٌ3RRRv痝Ͳsܨ5GGGׯ y*((#ʧQݽ{رc,YKQԍ7tLL _@.upNxeۮkCpAX!SNm߾]R{{{5k֔y'ǰ={?d0Μ9ç7l7x?~qee1caaa}_6G<8q\EA ͕37BD\HCQɓǏ?p@PPPZZa۹se9sf<A[#i 6HOOzmZ F2Qp,j)C}F0jlO΁Isv((tRJ5bb4J.==}ٲe= <@jj5kzEQtΝmiw 0FCZ/~J +PD_~Qt'Ҩm 7L8O?Pl6ESRRzw'Nܱc`,/I7o^yy9 b[`4=rr>e+1Οh)1t}`E@mxjI/Ǐ߹sgo9&&fB|}}:4l0>)%AmMVTp MB+x5IZ${N$Rlv;js7<iO8}m4gR3 nx^k? 8_ڵ{no(rrr#W}lB='{|P;fY8(`'j+6o]W͠(jX~op~TFD-Tܷo_[[͛e<4Wv\|V23bb CT1KR,|I ڑo=AQtřwtJ}};:$KP )?Kquei+_̘8M!,, A$I,[]]-yòӺ+R(OKK;v^zȑcǎoi:wraMpoW.Z\ S;8Fc``lX,Ň RDBSifaaaSL8qbttthh ôԔ bj8a $(FjHVVcmۑ?;h_qM& Bhd|0EuvvsG$j=HR}eiVpV"_1'hcb(8q4M[Vۨt u_o”d73&!& SoF(e[6d,֍ܿzQG5{ cinnamon-6.6.8/data/theme/toggle-on.svg0000664000175000017500000000365615167446463016742 0ustar fabiofabio cinnamon-6.6.8/data/theme/trash-icon.svg0000664000175000017500000002070015167446463017103 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/data/update-osk-layouts.sh0000775000175000017500000000235515167446463017330 0ustar fabiofabio#!/bin/env bash CLDR_LAYOUTS_TARBALL="http://www.unicode.org/Public/cldr/latest/keyboards.zip" WORKDIR=".osk-layout-workbench" CLDR2JSON="cldr2json/cldr2json.py" SRCDIR="$WORKDIR/keyboards/android" DESTDIR="osk-layouts" GRESOURCE_FILE="cinnamon-osk-layouts.gresource.xml" TMP_GRESOURCE_FILE=".$GRESOURCE_FILE.tmp" cd `dirname $0` # Ensure work/dest dirs rm -rf $WORKDIR mkdir -p $WORKDIR mkdir -p "osk-layouts" # Download stuff on the work dir pushd $WORKDIR gio copy $CLDR_LAYOUTS_TARBALL . unzip keyboards.zip popd # Transform to JSON files $CLDR2JSON $SRCDIR $DESTDIR # Generate new gresources xml file cat >$TMP_GRESOURCE_FILE < EOF for f in $DESTDIR/*.json do echo " $(basename $f)" >>$TMP_GRESOURCE_FILE done cat >>$TMP_GRESOURCE_FILE <emoji.json keyboard-caps-lock-filled-symbolic.svg keyboard-enter-symbolic.svg keyboard-hide-symbolic.svg keyboard-layout-filled-symbolic.svg keyboard-shift-filled-symbolic.svg EOF # Rewrite old gresources xml mv $TMP_GRESOURCE_FILE $GRESOURCE_FILE cinnamon-6.6.8/data/wayland_sessions/0000775000175000017500000000000015167446463016577 5ustar fabiofabiocinnamon-6.6.8/data/wayland_sessions/cinnamon-wayland.desktop.in0000664000175000017500000000027715167446463024044 0ustar fabiofabio[Desktop Entry] Name=Cinnamon on Wayland (Experimental) Comment=This session logs you into Cinnamon Exec=cinnamon-session-cinnamon --wayland TryExec=@bindir@/cinnamon Icon= Type=Application cinnamon-6.6.8/data/wayland_sessions/meson.build0000664000175000017500000000046015167446463020741 0ustar fabiofabiosession_deskop_files = [ 'cinnamon-wayland.desktop', ] foreach session_deskop_file : session_deskop_files configure_file( input: session_deskop_file + '.in', output: session_deskop_file, configuration: desktop_conf, install_dir: wayland_sessiondir ) endforeach cinnamon-6.6.8/data/xdg-portal/0000775000175000017500000000000015167446463015273 5ustar fabiofabiocinnamon-6.6.8/data/xdg-portal/meson.build0000664000175000017500000000016515167446463017437 0ustar fabiofabioinstall_data( 'x-cinnamon-portals.conf', install_dir: join_paths(get_option('datadir'), 'xdg-desktop-portal'), ) cinnamon-6.6.8/data/xdg-portal/x-cinnamon-portals.conf0000664000175000017500000000012115167446463021665 0ustar fabiofabio[preferred] default=xapp;gtk; org.freedesktop.impl.portal.Secret=gnome-keyring; cinnamon-6.6.8/data/xsessions/0000775000175000017500000000000015167446463015250 5ustar fabiofabiocinnamon-6.6.8/data/xsessions/cinnamon.desktop.in0000664000175000017500000000023315167446463021050 0ustar fabiofabio[Desktop Entry] Name=Cinnamon Comment=This session logs you into Cinnamon Exec=cinnamon-session-cinnamon TryExec=@bindir@/cinnamon Icon= Type=Application cinnamon-6.6.8/data/xsessions/cinnamon2d.desktop.in0000664000175000017500000000041415167446463021277 0ustar fabiofabio[Desktop Entry] Name=Cinnamon (Software Rendering) Comment=This session logs you into Cinnamon (using software rendering) Exec=cinnamon-session-cinnamon2d TryExec=@bindir@/cinnamon2d Icon= Type=Application X-Ubuntu-Gettext-Domain=cinnamon X-GNOME-Provides=cinnamon2d cinnamon-6.6.8/data/xsessions/meson.build0000664000175000017500000000047215167446463017415 0ustar fabiofabiosession_deskop_files = [ 'cinnamon.desktop', 'cinnamon2d.desktop', ] foreach session_deskop_file : session_deskop_files configure_file( input: session_deskop_file + '.in', output: session_deskop_file, configuration: desktop_conf, install_dir: x_sessiondir ) endforeach cinnamon-6.6.8/debian/0000775000175000017500000000000015167446463013523 5ustar fabiofabiocinnamon-6.6.8/docs/0000775000175000017500000000000015167446463013231 5ustar fabiofabiocinnamon-6.6.8/docs/applets-examples/0000775000175000017500000000000015167446463016515 5ustar fabiofabiocinnamon-6.6.8/docs/applets-examples/finder@cinnamon.org/0000775000175000017500000000000015167446463022375 5ustar fabiofabiocinnamon-6.6.8/docs/applets-examples/finder@cinnamon.org/applet.js0000664000175000017500000004064715167446463024233 0ustar fabiofabioconst Lang = imports.lang; const Applet = imports.ui.applet; const GLib = imports.gi.GLib; const Gtk = imports.gi.Gtk; const Gio = imports.gi.Gio; const Util = imports.misc.util; const Gettext = imports.gettext.domain('cinnamon-applets'); const PopupMenu = imports.ui.popupMenu; const St = imports.gi.St; const Mainloop = imports.mainloop; const Cinnamon = imports.gi.Cinnamon; const Main = imports.ui.main; const { AppletSettings } = imports.ui.settings; const _ = Gettext.gettext; const SearchProviderManager = imports.ui.searchProviderManager; const Clutter = imports.gi.Clutter; const RESULT_TYPES_LABELS = { software: _("Software"), pictures: _("Pictures"), videos: _("Videos"), music: _("Music"), folders: _("Folders"), files: _("Other Files"), provider: _("Other Results") } function SearchProviderResultButton(applet, provider, result) { this._init(applet, provider, result); } SearchProviderResultButton.prototype = { __proto__: PopupMenu.PopupBaseMenuItem.prototype, _init: function(applet, provider, result) { this.provider = provider; this.result = result; this._applet = applet; PopupMenu.PopupBaseMenuItem.prototype._init.call(this, {focusOnHover: false}); this.icon = null; if (result.icon){ this.icon = result.icon; }else if (result.icon_app){ this.icon = result.icon_app.create_icon_texture(16); }else if (result.icon_filename){ this.icon = new St.Icon({gicon: new Gio.FileIcon({file: Gio.file_new_for_path(result.icon_filename)}), icon_size: 16}); } if (this.icon){ this.addActor(this.icon); } this.label = new St.Label({ text: result.label }); this.addActor(this.label); if (this.icon) { this.icon.realize(); } this.label.realize(); this.connect('activate', Lang.bind(this, this._on_activate)); }, _onButtonReleaseEvent: function (actor, event) { if (event.get_button() == 1){ this.activate(event); } return true; }, _on_activate: function(event) { try{ this.provider.on_result_selected(this.result); this._applet._search_menu.close(); } catch(e) { global.logError(e); } } } function ApplicationResultButton(applet, app) { this._init(applet, app); } ApplicationResultButton.prototype = { __proto__: PopupMenu.PopupBaseMenuItem.prototype, _init: function(applet, app) { PopupMenu.PopupBaseMenuItem.prototype._init.call(this, {focusOnHover: false}); this._app = app; this._applet = applet; this.icon = this._app.create_icon_texture(16); this.addActor(this.icon); this.name = this._app.get_name(); this.label = new St.Label( { text: this.name }); this.label.set_style("width: 180px;"); this.addActor(this.label); this.icon.realize(); this.label.realize(); this.connect('activate', Lang.bind(this, this._on_activate)); }, _on_activate: function() { this._applet._search_menu.close(); this._app.open_new_window(-1); } } function FileResultButton(applet, result, type) { this._init(applet, result, type); } FileResultButton.prototype = { __proto__: PopupMenu.PopupBaseMenuItem.prototype, _init: function(applet, result, type, custom_label) { PopupMenu.PopupBaseMenuItem.prototype._init.call(this, {focusOnHover: false}); this._filename = result["url"]; this._applet = applet; try { let icon = Cinnamon.util_get_icon_for_uri(this._filename); if (icon) { this.icon = St.TextureCache.get_default().load_gicon(null, icon, 16); } } catch (e) { } if (!this.icon) { this.icon = new St.Icon( { icon_name: (type == "files" ? "text-x-preview" : "folder"), icon_size: 16, icon_type: St.IconType.FULLCOLOR }); } this.addActor(this.icon); this.label = new St.Label( { text: (custom_label ? custom_label : decodeURIComponent(this._filename)) }); this.addActor(this.label); this.icon.realize(); this.label.realize(); this.connect('activate', Lang.bind(this, this._on_activate)); }, _on_activate: function() { this._applet._search_menu.close(); Util.trySpawn(["xdg-open", this._filename]); } } function MusicResultButton(applet, result, type) { this._init(applet, result, type); } MusicResultButton.prototype = { __proto__: FileResultButton.prototype, _init: function(applet, result, type) { var basename = result["url"].split("/"); basename = decodeURIComponent(basename[basename.length - 1]); var label = (result["performer"] ? result["performer"] + " - " : "") + (result["musicAlbum"] ? result["musicAlbum"] + " - " : "") + (result["trackNumber"] ? result["trackNumber"] + " - " : "") + (result["title"] ? result["title"] : basename); FileResultButton.prototype._init.call(this, applet, result, type, label.trim()); } } function MyApplet(orientation, panel_height, instanceId) { this._init(orientation, panel_height, instanceId); } MyApplet.prototype = { __proto__: Applet.IconApplet.prototype, _init: function(orientation, panel_height, instanceId) { try { Applet.IconApplet.prototype._init.call(this, orientation, panel_height, instanceId); menuItem = new Applet.MenuItem(_("Indexing Preferences"), null, Lang.bind(this, function(actor, event) { Util.spawnCommandLine('tracker-preferences'); })); this._applet_context_menu.addMenuItem(menuItem); this.settings = new AppletSettings(this, "finder@cinnamon.org", instanceId); this.settings.bind("launch_shortcut", "launch_shortcut", this.on_launch_shortcut_changed, null); this.set_applet_icon_name("xsi-edit-find-symbolic"); this.set_applet_tooltip(_("Search using search providers")); let menuManager = new PopupMenu.PopupMenuManager(this); this._search_menu = new Applet.AppletPopupMenu(this, orientation); menuManager.addMenu(this._search_menu); let section = new PopupMenu.PopupMenuSection(); this._search_menu.addMenuItem(section); this.searchEntry = new St.Entry( { name: 'menu-search-entry', hint_text: _("Type to search..."), track_hover: true, can_focus: true }); section.actor.set_style("padding: 10px;"); this._searchInactiveIcon = new St.Icon( { style_class: 'menu-search-entry-icon', icon_name: 'edit-find', icon_type: St.IconType.SYMBOLIC }); this.searchEntry.set_secondary_icon(this._searchInactiveIcon); this._search_menu.actor.connect('key-release-event', Lang.bind(this, this._onKeyPress)); section.actor.add_actor(this.searchEntry); this._scrollBox = new St.ScrollView( { x_fill: true, y_fill: false, y_align: St.Align.START }); this._scrollBox.set_style("width: 500px;"); this._search_menu.addActor(this._scrollBox); this._container = new St.BoxLayout( { vertical:true }); this._scrollBox.add_actor(this._container); this._scrollBox.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC); this._scrollBox.set_clip_to_allocation(true); this._scrollBox.set_auto_scrolling(true); this.searchEntryText = this.searchEntry.clutter_text; this.searchEntryText.connect('text-changed', Lang.bind(this, this._onSearchTextChanged)); this._search_timer = null; this._appSys = Cinnamon.AppSystem.get_default(); this.on_launch_shortcut_changed(); } catch(e) { global.logError(e); } }, _onKeyPress: function(actor, event) { let symbol = event.get_key_symbol(); if (symbol != Clutter.KEY_Up && symbol != Clutter.KEY_Down) { global.stage.set_key_focus(this.searchEntry); } }, on_launch_shortcut_changed: function() { Main.keybindingManager.addXletHotKey(this, "finder_launch", this.launch_shortcut, Lang.bind(this, this.launch)); }, on_applet_removed_from_panel () { Main.keybindingManager.removeXletHotKey(this, "finder_launch"); }, _onSearchTextChanged: function(se, prop) { let searchString = this.searchEntry.get_text(); if (searchString != "") { if (this._search_timer) { Mainloop.source_remove(this._search_timer); this._search_timer = null; } this._search_timer = Mainloop.timeout_add(300, Lang.bind(this, function() { this._search_timer = null; this._process_search(searchString); })); } }, _process_search: function(searchString) { this._currentSearchString = searchString; var children = this._container.get_children(); var result_type; for (var i in children) { children[i].destroy(); } SearchProviderManager.launch_all(searchString, Lang.bind(this, function(provider, results, searchString){ query_results = {}; for (var i in results){ result_type = (results[i].type ? results[i].type : 'provider'); if (!query_results[result_type]) { query_results[result_type] = new Array(); } results[i].type = 'provider'; results[i].provider = provider; results[i].id = 'provider-' + results[i].id; results[i].id = 'provider-' + results[i].id; query_results[result_type].push(results[i]); } this._show_results(searchString, query_results); }, searchString)); }, _show_results: function(searchString, results) { if (searchString != this._currentSearchString) { return; } var results_buttons = {}; let button; let this_results; var all_result_types = new Array(); for (var result_type in results) { this_results = results[result_type]; if (this_results.length > 0) { all_result_types.push(result_type); results_buttons[result_type] = new Array(); for (var i in this_results) { button = null; switch (result_type) { case 'provider': button = new SearchProviderResultButton(this, this_results[i]['provider'], this_results[i]); break; case "software": var results_parts = this_results[i]["url"].split("/"); let app = this._appSys.lookup_app(results_parts[results_parts.length - 1].split(".desktop")[0] + ".desktop"); if (app) { let appinfo = app.get_app_info(); if (!appinfo || !appinfo.get_nodisplay()) { button = new ApplicationResultButton(this, app); } } break; case "music": button = new MusicResultButton(this, this_results[i], result_type); break; case "pictures": case "videos": case "folders": case "files": button = new FileResultButton(this, this_results[i], result_type); break; } if (button != null) { button.actor.connect("notify::hover", Lang.bind(this, this._scrollToButton)); button.actor.connect("key-focus-in", Lang.bind(this, this._scrollToButton)); if (result_type == 'provider') { if (!results_buttons['provider-' + SearchProviderManager.extensionMeta[this_results[i]['provider'].uuid].name]) { all_result_types.push('provider-' + SearchProviderManager.extensionMeta[this_results[i]['provider'].uuid].name); results_buttons['provider-' + SearchProviderManager.extensionMeta[this_results[i]['provider'].uuid].name] = new Array(); } results_buttons['provider-' + SearchProviderManager.extensionMeta[this_results[i]['provider'].uuid].name].push(button); } else { results_buttons[result_type].push(button); } } } } } all_result_types.sort(function(a, b) { var order = ["software", "music", "pictures", "videos", "folders", "files", "provider"]; return order.indexOf(a) - order.indexOf(b); }); let this_results_buttons, label; for (var i in all_result_types) { result_type = all_result_types[i]; this_results_buttons = results_buttons[result_type]; if (this_results_buttons.length > 0) { if (this._container.get_children().length > 0) { var separator = new PopupMenu.PopupSeparatorMenuItem(); this._container.add_actor(separator.actor); } if (result_type.substring(0, 9) == 'provider-') { label = result_type.substring(9); } else { label = RESULT_TYPES_LABELS[result_type]; } var result_type_label = new PopupMenu.PopupMenuItem(label, { reactive: false, hover: false, sensitive: false, focusOnHover: true }); result_type_label.actor.set_style("font-weight: bold;"); this._container.add_actor(result_type_label.actor); for (var i in this_results_buttons) { this._container.add_actor(this_results_buttons[i].actor); } } } }, on_applet_clicked: function(event) { if (event.get_button() == 1) { this.launch(); } }, launch: function() { this._search_menu.toggle(); global.stage.set_key_focus(this.searchEntry); this.searchEntryText.set_selection(0, this.searchEntry.get_text().length); }, _scrollToButton: function(button) { var current_scroll_value = this._scrollBox.get_vscroll_bar().get_adjustment().get_value(); var box_height = this._scrollBox.get_allocation_box().y2 - this._scrollBox.get_allocation_box().y1; var new_scroll_value = current_scroll_value; if (current_scroll_value > button.get_allocation_box().y1 - 10) new_scroll_value = button.get_allocation_box().y1 - 10; if (box_height + current_scroll_value < button.get_allocation_box().y2 + 10) new_scroll_value = button.get_allocation_box().y2-box_height + 10; if (new_scroll_value != current_scroll_value) this._scrollBox.get_vscroll_bar().get_adjustment().set_value(new_scroll_value); } } function main(metadata, orientation, panel_height, instanceId) { let myApplet = new MyApplet(orientation, panel_height, instanceId); return myApplet; } cinnamon-6.6.8/docs/applets-examples/finder@cinnamon.org/metadata.json0000775000175000017500000000024115167446463025050 0ustar fabiofabio{ "uuid": "finder@cinnamon.org", "name": "Search using search providers", "description": "Search using search providers", "icon": "xsi-edit-find-symbolic" } cinnamon-6.6.8/docs/applets-examples/finder@cinnamon.org/settings-schema.json0000664000175000017500000000022615167446463026366 0ustar fabiofabio{ "launch_shortcut": { "type" : "keybinding", "default" : "F1", "description" : "Keyboard shortcut to show the search entry" } } cinnamon-6.6.8/docs/reference/0000775000175000017500000000000015167446463015167 5ustar fabiofabiocinnamon-6.6.8/docs/reference/cinnamon-js/0000775000175000017500000000000015167446463017403 5ustar fabiofabiocinnamon-6.6.8/docs/reference/cinnamon-js/cinnamon-js-docs.sgml0000664000175000017500000000103415167446463023427 0ustar fabiofabio ]> Cinnamon Javascript Reference Manual This document is for Cinnamon &version;. cinnamon-6.6.8/docs/reference/cinnamon-js/gen_doc.py0000775000175000017500000002573415167446463021371 0ustar fabiofabio#!/usr/bin/python3 # coding: utf-8 # This parser starts by parsing all the javascript code, and representing each # file/object/function as a python class. Afterwards, each object is gone # through individually to produce the gtk-doc-friendly xml files # # The parsers uses the concept of state. At each line, the parser takes a # particular state, and behaves accordingly. Conversely, the contents of the # lines can cause the parser to change state. # In normal text, the parser is in STATE_NORMAL, in which all it does is keep # track of scopes and the number of '{' and '}' brackets. In a comment block # that is not documentation, the parser takes STATE_COMMENT and ignores # everything until we leave the comment. # # When the parser sees /**, it enters STATE_INIT, which tells us that the next # line is important. The next line is usually in the form # # * function_name: # # or # # * #ObjectName: # # At this point, we create a JSFunction or JSObject object, and enter the next # STATE_PROPERTY. Here the parser parses the properties of the form # # * @prop (type): description # # until it reaches something that is not a property (signified by two line # breaks not followed by another property). Then the parser drops to # STATE_DESCRIPTION, and reads every line and puts it into the object's # description. # # STATE_DESCRIPTION continues until the comment block ends, or if it encounters # # * Returns (type): description # # Then it morphs into STATE_RETURN, and puts the remaining lines into the # description of the return value. Alternatively, in the case of objects, # # * Inherits: Object.Class # # specifies the ancestor of an object. If the parser reads this line, it drops # to STATE_COMMENT because there shouldn't be anything interesting afterwards. import sys import os import re from gen_lib import * files = [] objects = {} ROOT_DIR = os.path.abspath(os.path.dirname(sys.argv[0])) + '/../../../' if len(sys.argv) > 1: ROOT_DIR = sys.argv[1] if len(sys.argv) > 2: DEST_DIR = sys.argv[2] os.chdir(DEST_DIR) JS_UI_DIR = os.path.join(ROOT_DIR, 'js/ui/') JS_MISC_DIR = os.path.join(ROOT_DIR, 'js/misc/') # Allow types like "object/string" COMMENT_REGEX = re.compile(r'/\*([^*]|(\*[^/]))*\*+/') RETURNS_REGEX = re.compile(r'^Returns\s*\(?(\w*\.?\w+/?\w*\.?\w*)?\)?:(.*)') INHERITS_REGEX = re.compile(r'^Inherits:\s*(\w*\.?\w+/?\w*\.?\w*)\s*$') PROPERTY_REGEX = re.compile(r'^@(\w+)\s*\(?(\w*\.?\w+/?\w*\.?\w*)?\)?:(.*)') FILE_NAME_REGEX = re.compile(r'FILE:\s*(\w+\.js):?') SIGNAL_NAME_REGEX = re.compile(r'SIGNAL:\s*([\w-]+):?') ENUM_NAME_REGEX = re.compile(r'ENUM:\s*(\w+):?') FUNCTION_NAME_REGEX = re.compile(r'^(\w+):?\s*$') OBJECT_NAME_REGEX = re.compile(r'^#(\w+):?\s*$') FILE_REGEX = re.compile(r'\w*\.js') COMMENT_START_REGEX = re.compile(r'^\s*\* ?') BLOCK_START_REGEX = re.compile(r'^\s*/\*\*\s*$') STRING_REGEX = re.compile(r'\'[^\']*\'|"[^"]*"') STATE_NORMAL = 0 STATE_PROPERTY = 1 STATE_DESCRIPTION = 2 STATE_RETURN = 3 STATE_NAME = 4 STATE_INIT = 5 STATE_COMMENT = 6 ################################################################################ ################################################################################ ## The legendary parse function ## ################################################################################ ################################################################################ ui_files = [os.path.join(JS_UI_DIR, x) for x in os.listdir(JS_UI_DIR)] ui_files.sort() misc_files = [os.path.join(JS_MISC_DIR, x) for x in os.listdir(JS_MISC_DIR)] misc_files.sort() _files = ui_files + misc_files for _file in _files: parts = _file.split("/") if not FILE_REGEX.match(parts[-1]): continue file_obj = open(_file, 'r', encoding="utf-8") curr_file = JSFile(parts[-2], parts[-1][:-3]) files.append(curr_file) bracket_count = 0 # no. of '{' - no. of '}' # The current object - it is either the top-level file or the JSObject we # are parsing. curr_obj = curr_file # The current item being processed, either the top-level file, description # of the object or a function curr_item = curr_file # The current property, if any curr_prop = None state = STATE_NORMAL scope = '' for line in file_obj: ################################################################################ # Process all unimportant comments # ################################################################################ # Strip ' * ' at the beginning of each long comment block if state == STATE_PROPERTY or \ state == STATE_DESCRIPTION or \ state == STATE_RETURN or \ state == STATE_INIT: line = COMMENT_START_REGEX.sub('', line) if len(line) > 0 and line[0] == '/': state = STATE_NORMAL curr_item = None continue # If we are in a (useless) comment, skip unless comment ends in this row elif state == STATE_COMMENT: if line.find('*/') == -1: continue else: line = line[line.find('*/') + 2:] state = STATE_NORMAL # In normal cases, strip comments if necessary, unless it is the # beginning of a doc block, in which case we set the STATE_INIT state else: if '//' in line: line = line[:line.find(r'//')] if '/*' in line: # Strip all in-line comments, eg. 'asdf /* asdf */ asdf' line = COMMENT_REGEX.sub('', line) if BLOCK_START_REGEX.match(line): state = STATE_INIT continue if '/*' in line: line = line[:line.find(r'/*')] state = STATE_COMMENT ################################################################################ # Process actual useful content # ################################################################################ if state == STATE_INIT: if FILE_NAME_REGEX.match(line) and bracket_count == 0: curr_item = curr_file curr_obj = curr_file objects[curr_file.name] = curr_file state = STATE_PROPERTY elif OBJECT_NAME_REGEX.match(line) and bracket_count == 0: curr_item = JSObject(OBJECT_NAME_REGEX.match(line).group(1)) curr_obj = curr_item objects[curr_file.name + '.' + curr_obj.name] = curr_item curr_file.add_object(curr_item) state = STATE_PROPERTY elif FUNCTION_NAME_REGEX.match(line) and \ ((bracket_count == 1 and curr_obj != curr_file) or \ (bracket_count == 0 and curr_obj == curr_file)): curr_item = JSFunction(FUNCTION_NAME_REGEX.match(line).group(1)) curr_obj.add_function(curr_item) state = STATE_PROPERTY elif SIGNAL_NAME_REGEX.match(line) and \ (bracket_count > 0 and curr_obj != curr_file): curr_item = JSSignal(SIGNAL_NAME_REGEX.match(line).group(1)) curr_obj.add_signal(curr_item) state = STATE_PROPERTY elif ENUM_NAME_REGEX.match(line) and bracket_count == 0: curr_item = JSEnum(ENUM_NAME_REGEX.match(line).group(1)) objects[curr_file.name + '.' + curr_item.name] = curr_item curr_file.add_enum(curr_item) state = STATE_PROPERTY else: state = STATE_COMMENT continue if state == STATE_PROPERTY: if len(line.strip()) == 0: if curr_prop is not None: curr_prop = None continue else: # Ignore blank lines if nothing has happened yet continue prop = PROPERTY_REGEX.match(line) if prop: curr_prop = JSProperty(*prop.groups()) curr_item.add_property(curr_prop) else: if curr_prop: curr_prop.append_description(line) else: # The next block will parse this description properly state = STATE_DESCRIPTION if state == STATE_DESCRIPTION: if RETURNS_REGEX.match(line): state = STATE_RETURN curr_prop = JSProperty('Returns', *RETURNS_REGEX.match(line).groups()) curr_item.set_return(curr_prop) elif INHERITS_REGEX.match(line): # Anything after the inherit line shouldn't be there state = STATE_COMMENT curr_item.set_inherit(INHERITS_REGEX.match(line).group(1)) else: curr_item.append_description(line) continue if state == STATE_RETURN: curr_prop.append_description(line) # Here state should be STATE_NORMAL. It might be, in fact, # STATE_COMMENT, since the line ends with /*, and the state is set to # STATE_COMMENT for preparation of the next line. However, the # remaining of the line should be treated as a normal line. If we are # genuinely inside a comment, we would have `continue`ed at the # beginning. if state == STATE_NORMAL or state == STATE_COMMENT: # the "scope" variable will be last updated before we enter the # scope, so will be the "function thing() {}" or "thing.prototype = # {" line. We use this to check if we are parsing the right thing. if bracket_count == 0: scope = line # Don't count the brackets inside strings. STRING_REGEX recognizes # ' and " but doesn't know if they are escaped. So replace away all # escaped quotes line = STRING_REGEX.sub('', line.replace("\\'", "").replace('\\"', '')) bracket_count += line.count('{') - line.count('}') if bracket_count == 0: # Cinnamon-style objects and Lang.Class objects if curr_obj.orig_name + '.prototype' in scope or \ re.match(curr_obj.orig_name + r'\s*=\s*Lang\.Class', scope): curr_obj = curr_file curr_item = curr_file ################################################################################ ################################################################################ ## Generate the XML ## ################################################################################ ################################################################################ write_chapters_file(files) try: os.mkdir('ui') except OSError: pass try: os.mkdir('misc') except OSError: pass for _file in files: for obj in _file.objects: create_file(obj) cinnamon-6.6.8/docs/reference/cinnamon-js/gen_lib.py0000775000175000017500000006343515167446463021372 0ustar fabiofabio#!/usr/bin/python3 # coding: utf-8 # Dear future self, # # You're looking at this file because # the parse function finally broke. # # It's not fixable. You have to rewrite it. # Sincerely, past self # # Also, it's probably at least # 2013. Did you ever take # that trip to Iceland? import re def get_type_link(typ, file): from gen_doc import objects if typ == '': return "void" else: if typ in objects: return "cinnamon-js-" + objects[typ].prefix elif file.name + "." + typ in objects: return "cinnamon-js-" + objects[file.name + "." + typ].prefix elif typ.endswith("s") and typ[:-1] in objects: return "cinnamon-js-" + objects[typ[:-1]].prefix elif typ.endswith("s") and file.name + "." + typ[:-1] in objects: return "cinnamon-js-" + objects[file.name + "." + typ[:-1]].prefix elif typ.startswith("Gio"): return typ.replace("Gio.", "G") elif typ.startswith("GLib"): return typ.replace("GLib.", "G") else: return typ.replace('.', '') def markup(line, obj): line = re.sub(r'@(\w*)', r'\g<1>', line) line = re.sub(r'`([^`]*)`', r'\g<1>', line) line = re.sub(r'\*\*([^*]*)\*\*', r'\g<1>', line) line = re.sub(r'\*([^*]*)\*', r'\g<1>', line) def format_type_link(match): res = match.group(1) return '{name}'.format( link = get_type_link(res, obj.file), name = res) line = re.sub(r'#(([\w]*\.)?[\w]+)', format_type_link, line) def format_ext_link(match): if match.group(1): full = match.group(1) + match.group(3) else: full = match.group(3) if match.group(4): full += match.group(4) owner = match.group(1) if owner: owner = owner[:-1] # remove trailing . else: owner = "this" thing = match.group(3) from gen_doc import objects object = None if owner == "this": object = obj.object if owner in objects: object = objects[owner] elif obj.file.name + "." + owner in objects: object = objects[obj.file.name + "." + owner] if object is None: return '{name}'.format(name = full) func_names = [x.name for x in object.functions] enum_names = [x.name for x in object.enums] prop_names = [x.name for x in object.properties] if thing in prop_names and not full.endswith("()"): return '{full}'.format( prefix = object.prefix, thing = thing, full = full) elif thing in func_names or (thing in enum_names and not full.endswith("()")): return '{full}'.format( prefix = object.prefix, thing = thing, full = full) else: return '{name}'.format(name = full) line = re.sub(r'%(([\w]+\.)?[\w]+\.)?([\w]+)(\(\))?', format_ext_link, line) return line class JSThing: def append_description(self, desc): self.description += desc.replace('<', '<').replace('>', '>') def get_xml_description(self, description = None): if description is None: description = self.description stuff = description.split('\n') joined = [''] in_code = False in_list = False for line in stuff: if line.strip() == '```': if in_code: joined[-1] += '```' joined.append('') else: if in_list: joined[-1] += '\n```' else: joined.append('```\n') in_code = not in_code continue if in_code: joined[-1] += '\n' + line continue line = line.strip() if line == '\\' and in_list: joined[-1] += '\n\n' elif len(line) == 0 or line == '\\': # New line if empty joined.append('') in_list = False else: if joined[-1] == '' and line.startswith('- '): in_list = True if line.startswith('- '): joined.append('') joined[-1] += ' ' + line description = '' in_list = False list_buffer = [] for line in joined: if line.split('\n')[0].strip() == '```': description += '{0}'\ .format(line.replace('```', '')) continue if line == '': continue line = line.strip() if line.startswith('-'): in_list = True list_buffer.append(self.get_xml_description(line[1:])) continue if in_list: description += '' + \ '\n'.join('{0}'.format(item) for item in list_buffer) + \ '' list_buffer = [] in_list = False line = markup(line, self) description += '{0}'.format(line) if in_list: description += '' + \ '\n'.join('{0}'.format(item) for item in list_buffer) + \ '' list_buffer = [] return description def add_property(self, prop): if prop.name == "short_description": self.short_description = prop else: self.properties.append(prop) prop.file = self.file prop.object = self.object class JSSignal(JSThing): def __init__ (self, name): self.name = name self.description = '' self.short_description = JSProperty(None, '', '') self.properties = [] class JSFunction(JSThing): def __init__ (self, name): self.name = name self.description = '' self.short_description = JSProperty(None, '', '') self.properties = [] self.return_value = JSProperty(None, '', '') def set_return(self, retval): self.return_value = retval retval.file = self.file retval.obj = self.object class JSProperty(JSThing): def __init__ (self, name, arg_type, desc): self.name = name self.arg_type = arg_type if arg_type else '' self.description = '' self.append_description(desc + "\n") class JSFile(JSThing): def __init__ (self, directory, name): self.directory = directory self.name = name[0].capitalize() + name[1:] self.orig_name = self.name self.imports = "imports.{0}.{1}".format(directory, name) self.prefix = directory + "-" + name self.description = '' self.short_description = JSProperty(None, '', '') self.properties = [] self.objects = [] self.signals = [] self.enums = [] self.functions = [] self.file = self self.object = self def is_interesting(self): return len(self.functions) + len(self.properties) + len(self.description) > 0 def add_function(self, func): self.functions.append(func) func.file = self func.object = self def add_object(self, obj): self.objects.append(obj) obj.parent = self obj.directory = self.directory obj.prefix = self.prefix + "-" + obj.name obj.name = self.name + "-" + obj.name obj.file = self def add_enum(self, obj): self.enums.append(obj) obj.parent = self obj.directory = self.directory obj.prefix = self.prefix + "-" + obj.name obj.file = self class JSObject(JSThing): def __init__ (self, name): self.name = name self.orig_name = name self.inherit = '' self.description = '' self.short_description = JSProperty(None, '', '') self.parent = None self.directory = None self.prefix = None self.functions = [] self.properties = [] self.signals = [] self.enums = [] self.object = self def add_function(self, func): self.functions.append(func) func.file = self.file func.object = self def add_signal(self, signal): self.signals.append(signal) signal.file = self signal.object = self def set_inherit(self, inherit): self.inherit = inherit class JSEnum(JSThing): def __init__ (self, name): self.name = name self.description = '' self.short_description = JSProperty(None, '', '') self.properties = [] self.object = self PART_FORMAT = '''\ ]> {chapters} ''' SGML_CHAPTER_FORMAT = ''' {title} {entries} ''' SGML_ENTRY_FORMAT = '' FILE_FORMAT = '''\ ]> {name} 3 {name} {name} {short_description} {func_header} {prop_header} {signal_header} {enum_header} {hierarchy} {description} {functions} {properties} {signals} {enums} ''' FUNCTION_HEADER_FORMAT = ''' Functions {function_headers} ''' FUNCTION_HEADER_ITEM_FORMAT = ''' {return_name} {name} () ''' PROPERTY_HEADER_FORMAT = ''' Properties {property_headers} ''' SIGNAL_HEADER_FORMAT = ''' Signals {signal_headers} ''' SIGNAL_HEADER_ITEM_FORMAT = ''' {name} ''' ENUM_HEADER_FORMAT = ''' Types and Values {enum_headers} ''' ENUM_HEADER_ITEM_FORMAT = ''' enum {name} ''' PROPERTY_HEADER_ITEM_FORMAT = ''' {type_name} {name} ''' HIERARCHY_FORMAT = ''' Object Hierarchy Object {hierarchy} ''' HIERARCHY_ITEM_FORMAT = '{spacing}╰── {name}' DESCRIPTION_FORMAT = ''' Description {description} ''' FUNCTIONS_FORMAT = ''' Functions {functions} ''' FUNCTION_ITEM_FORMAT = ''' {name} () {name} {return_type} {name} ({inline_params}); {description} {params} {return_desc} ''' SIGNALS_FORMAT = ''' Signal details {signals} ''' SIGNAL_ITEM_FORMAT = ''' The <literal>“{name}”</literal> signal {prefix}::{name} user_function ({inline_params}); {description} {params} ''' FUNC_PARAMETERS_FORMAT = ''' Parameters {param_items} ''' INLINE_PARAMETER_FORMAT = '{type_name}{name}' FUNC_PARAMETERS_ITEM_FORMAT = ''' {name} {description} ''' FUNC_RETURN_FORMAT = ''' Returns {desc} ''' PROPERTIES_FORMAT = ''' Property Details {properties} ''' PROPERTIES_ITEM_FORMAT = ''' The <literal>“{name}”</literal> property cinnamon-js-{prefix}:{name} {disp_name} {type_name} {description} ''' ENUMS_FORMAT = ''' Types and Values {enums} ''' ENUMS_ITEM_FORMAT = ''' enum {name} {name} {description} Members {enum_items} ''' ENUMS_ITEM_ROW_FORMAT = ''' {name} {description} ''' def write_chapters_file(files): chapters = {'ui': [], 'misc': []} for _file in files: if not _file.is_interesting() and len(_file.objects) == 0: continue entries = [] if _file.is_interesting(): _file.objects.insert(0, _file) entries = [SGML_ENTRY_FORMAT.format( directory = _file.directory, name = obj.name) for obj in _file.objects] chapters[_file.directory].append(SGML_CHAPTER_FORMAT.format( prefix = _file.prefix, title = _file.imports, entries = "\n".join(entries))) for directory, formatted_chapters in chapters.items(): with open(directory + '.xml', 'w') as part_file: part_file.write(PART_FORMAT.format(title=directory, chapters="\n".join(formatted_chapters))) def create_file(obj): file_obj = open('{0}/{1}.xml'.format(obj.directory, obj.name), 'w', encoding="utf-8") short_description = obj.short_description.description.replace("\n", " ").strip() file_obj.write(FILE_FORMAT.format( prefix = obj.prefix, name = obj.name.replace("-", "."), short_description = markup(short_description, obj), func_header = get_function_header(obj), signal_header = get_signal_header(obj), prop_header = get_properties_header(obj), enum_header = get_enum_header(obj), hierarchy = get_hierarchy(obj), description = get_description(obj), functions = get_functions(obj), signals = get_signals(obj), properties = get_properties(obj), enums = get_enums(obj))) file_obj.close() def get_function_header(obj): if len(obj.functions) == 0: return "" functions = [FUNCTION_HEADER_ITEM_FORMAT.format( return_link = get_type_link(func.return_value.arg_type, obj.file), return_name = func.return_value.arg_type, prefix = obj.prefix, name = func.name) for func in obj.functions] return FUNCTION_HEADER_FORMAT.format( prefix = obj.prefix, function_headers = "\n".join(functions)) def get_signal_header(obj): if len(obj.signals) == 0: return "" signals = [SIGNAL_HEADER_ITEM_FORMAT.format( prefix = obj.prefix, name = sig.name) for sig in obj.signals] return SIGNAL_HEADER_FORMAT.format( prefix = obj.prefix, signal_headers = "\n".join(signals)) def get_properties_header(obj): if len(obj.properties) == 0: return "" properties = [PROPERTY_HEADER_ITEM_FORMAT.format( type_link = get_type_link(prop.arg_type, obj.file), type_name = prop.arg_type, prefix = obj.prefix, name = prop.name) for prop in obj.properties] return PROPERTY_HEADER_FORMAT.format( prefix = obj.prefix, property_headers = "\n".join(properties)) def get_enum_header(obj): if len(obj.enums) == 0: return "" enums = [ENUM_HEADER_ITEM_FORMAT.format( prefix = obj.prefix, name = enum.name) for enum in obj.enums] return ENUM_HEADER_FORMAT.format( prefix = obj.prefix, enum_headers = "\n".join(enums)) def get_hierarchy(obj): from gen_doc import objects if isinstance(obj, JSFile): return "" name = obj.name.replace('-', '.') hierarchy = [] try: while True: name = objects[name].inherit if name in hierarchy: break if name: hierarchy.insert(0, name) except KeyError: pass count = 1 hierarchy_strs = [] for item in hierarchy: try: hierarchy_strs.append(HIERARCHY_ITEM_FORMAT.format( spacing = ' ' * count * 4, prefix = objects[item].prefix, name = item)) except KeyError: hierarchy_strs.append(HIERARCHY_ITEM_FORMAT.format( spacing = ' ' * count * 4, prefix = "void", name = item)) count += 1 hierarchy_strs.append(HIERARCHY_ITEM_FORMAT.format( spacing = ' ' * count * 4, prefix = "void", name = obj.name.replace('-', '.'))) return HIERARCHY_FORMAT.format( prefix = obj.prefix, hierarchy = "\n".join(hierarchy_strs)) def get_description(obj): if len(obj.description) == 0: return "" return DESCRIPTION_FORMAT.format( prefix=obj.prefix, description = obj.get_xml_description()) def get_functions(obj): if len(obj.functions) == 0: return "" functions = [] for func in obj.functions: inline_params = "" params = "" if len(func.properties) > 0: # Calculate how long the argument types are and make the arguments # align max_length = max(len(x.arg_type) for x in func.properties) + 3 # If no parameter has argument types, don't show that silly # whitespace if max_length == 3: max_length = 0 inline_params = [INLINE_PARAMETER_FORMAT.format( type_link = get_type_link(param.arg_type, obj.file), type_name = param.arg_type, name = " " * (max_length - len(param.arg_type)) + param.name) for param in func.properties] inline_params = (',\n' + ' ' * (len(func.name) + 2)).join(inline_params) params = [FUNC_PARAMETERS_ITEM_FORMAT.format( name = param.name, description = param.get_xml_description()) for param in func.properties] params = FUNC_PARAMETERS_FORMAT.format(param_items = '\n'.join(params)) return_desc = "" if func.return_value.name is not None: return_desc = FUNC_RETURN_FORMAT.format(desc=func.return_value.get_xml_description()) functions.append(FUNCTION_ITEM_FORMAT.format( prefix = obj.prefix, name = func.name, return_link = get_type_link(func.return_value.arg_type, obj.file), return_type = func.return_value.arg_type, description = func.get_xml_description(), inline_params = inline_params, params = params, return_desc = return_desc)) return FUNCTIONS_FORMAT.format( prefix = obj.prefix, functions = "\n".join(functions)) def get_signals(obj): if len(obj.signals) == 0: return "" signals = [] for sig in obj.signals: inline_params = "" params = "" if len(sig.properties) > 0: # Calculate how long the argument types are and make the arguments # align max_length = max(len(x.arg_type) for x in sig.properties) + 3 # If no parameter has argument types, don't show that silly # whitespace if max_length == 3: max_length = 0 inline_params = [INLINE_PARAMETER_FORMAT.format( type_link = get_type_link(param.arg_type, obj.file), type_name = param.arg_type, name = " " * (max_length - len(param.arg_type)) + param.name) for param in sig.properties] inline_params = (',\n' + ' ' * (len(sig.name) + 2)).join(inline_params) params = [FUNC_PARAMETERS_ITEM_FORMAT.format( name = param.name, description = param.get_xml_description()) for param in sig.properties] params = FUNC_PARAMETERS_FORMAT.format(param_items = '\n'.join(params)) signals.append(SIGNAL_ITEM_FORMAT.format( prefix = obj.prefix, name = sig.name, description = sig.get_xml_description(), inline_params = inline_params, params = params)) return SIGNALS_FORMAT.format( prefix = obj.prefix, signals = "\n".join(signals)) def get_properties(obj): if len(obj.properties) == 0: return "" properties = [PROPERTIES_ITEM_FORMAT.format( prefix = obj.prefix, name = prop.name, disp_name = ('“' + prop.name + '”').ljust(25), type_link = get_type_link(prop.arg_type, obj.file), type_name = prop.arg_type, description = prop.get_xml_description()) for prop in obj.properties] return PROPERTIES_FORMAT.format( prefix = obj.prefix, properties = "\n".join(properties)) def get_enums(obj): if len(obj.enums) == 0: return "" enums = [] for enum in obj.enums: items = [ENUMS_ITEM_ROW_FORMAT.format( name = item.name, description = item.get_xml_description()) for item in enum.properties] enums.append(ENUMS_ITEM_FORMAT.format( prefix = enum.prefix, name = enum.name, description = enum.get_xml_description(), enum_items = "\n".join(items))) return ENUMS_FORMAT.format( prefix = obj.prefix, enums = "\n".join(enums)) cinnamon-6.6.8/docs/reference/cinnamon-js/meson.build0000664000175000017500000000070015167446463021542 0ustar fabiofabiogen_doc = files('gen_doc.py') parts_files = custom_target( 'js-doc-gen', command: [python, gen_doc, meson.project_source_root(), join_paths(meson.project_build_root(), '@OUTDIR@')], # input: ['cinnamon-js-docs.sgml'], output: ['ui.xml', 'misc.xml'], build_by_default: true, ) gnome.gtkdoc( 'cinnamon-js', mode: 'xml', main_xml: 'cinnamon-js-docs.sgml', src_dir: meson.current_build_dir(), install: true, ) cinnamon-6.6.8/docs/reference/cinnamon-tutorials/0000775000175000017500000000000015167446463021015 5ustar fabiofabiocinnamon-6.6.8/docs/reference/cinnamon-tutorials/building.xml0000664000175000017500000000737115167446463023344 0ustar fabiofabio Building Cinnamon
Debian-based systems
Add APT sources repositories Open /etc/apt/sources.list. For each deb line, add the same line with deb replaced with deb-src. For instance, here's how it should look like in Linux Mint 13: deb http://packages.linuxmint.com maya main upstream import deb-src http://packages.linuxmint.com maya main upstream import deb http://archive.ubuntu.com/ubuntu/ precise main restricted universe multiverse deb-src http://archive.ubuntu.com/ubuntu/ precise main restricted universe multiverse deb http://archive.ubuntu.com/ubuntu/ precise-updates main restricted universe multiverse deb-src http://archive.ubuntu.com/ubuntu/ precise-updates main restricted universe multiverse deb http://extras.ubuntu.com/ubuntu precise main deb-src http://extras.ubuntu.com/ubuntu precise main
Get build dependencies Then we install the packages needed to compile the cinnamon stack. Run the following in a terminal (as root): apt-get update apt-get install dpkg-dev sudo apt-get build-dep cinnamon cinnamon-control-center cinnamon-desktop cinnamon-menus cinnamon-screensaver cinnamon-session cinnamon-settings-daemon cinnamon-translations cjs muffin nemo Now get the latest git code for everything. Run (not as root): git clone git://github.com/linuxmint/cinnamon.git git clone git://github.com/linuxmint/cinnamon-control-center.git git clone git://github.com/linuxmint/cinnamon-desktop.git git clone git://github.com/linuxmint/cinnamon-menus.git git clone git://github.com/linuxmint/cinnamon-screensaver.git git clone git://github.com/linuxmint/cinnamon-session.git git clone git://github.com/linuxmint/cinnamon-settings-daemon.git git clone git://github.com/linuxmint/cinnamon-translations.git git clone git://github.com/linuxmint/cjs.git git clone git://github.com/linuxmint/muffin.git git clone git://github.com/linuxmint/nemo.git
Compile and install the stack Build and install in the following order. Some packages are required to be installed prior to building later packages. See below for how to build and install. cinnamon-translations cinnamon-desktop cinnamon-menus **INSTALL PRECEDING PACKAGES** cinnamon-session cinnamon-settings-daemon cinnamon-screensaver cjs **INSTALL PRECEDING PACKAGES** cinnamon-control-center muffin **INSTALL PRECEDING PACKAGES** cinnamon nemo **INSTALL PRECEDING PACKAGES** To build a package: cd *package-name* dpkg-buildpackage cd .. To install a package: sudo dpkg -i *packages produced*
Optional: Compiling from stable branch The instructions above compile the Cinnamon stack from their "master" branch, which isn't always stable. To compile from the stable branch, instead of the usual building procedure, you need to to the following (for all packages): cd *package-name* git checkout stable dpkg-buildpackage cd ..
cinnamon-6.6.8/docs/reference/cinnamon-tutorials/cinnamon-tutorials-docs.sgml0000664000175000017500000000211315167446463026452 0ustar fabiofabio ]> Cinnamon Tutorials This document is for Cinnamon &version;. Documentation Cjs Extension system cinnamon-6.6.8/docs/reference/cinnamon-tutorials/documenting-source.xml0000664000175000017500000002220315167446463025350 0ustar fabiofabio Writing documentation in source The C part of Cinnamon can be documented using standard gtk-doc format, and there should be plenty of tutorials on that. The JavaScript part of Cinnamon can also be documented using something that resembles gtk-doc format. Currently, we support documenting files (eg. main.js), objects (eg. Applet.Applet), functions (including functions of files and functions of objects), signals and enums. The documentation appears as a comment right before the thing it describes. In the case of a file, it should appear at the very beginning of the file. If a object is declared using prototype, then it can appear right before either the function declaration or the prototype declaration, ie. before line 1 or line 5 in the example below. The documentation of signal can be placed anywhere within the prototype scope since there is no proper declaration of signals in javascript. function Applet() { this._init() } Applet.prototype = { _init: function() { } } The general format of a piece of code documentation is as follows: /** * name_of_thing: * @short_description: one-line description * @prop1 (type): description * @prop2 (type): description * @prop3 (type): description * * Long description * * Second paragraph of long description */ A comment block should always start with /** Avoid starting comments with this (use /* instead) even though the parser should be smart enough to not parse them, but if they look too like a piece of documentation, the parser might get confused. The next line is the name of the thing being documented. Function, object, signal, file and enum documentations are distinguished using this line. They should look, respectively, like this: * function_name: * #ObjectName: * FILE:filename.js * ENUM:EnumName * SIGNAL:signal-name Note that we do not have to include the namespace of an object, ie. it is #ObjectName, not #FileName.ObjectName. Afterwards is a short description. This is only needed for files and objects, and will be ignored for functions. It is optional, but things look ugly without it. Note that it has to be short, hence the name. It is shown in the contents page in the form Object.Name - short description Afterwards, all the properties of the thing should be listed. A "property" is a globally accessible variable in the case of a file, a genuine property in the case of an object, a parameter for a function, an argument passed in the case of a signal, or an element of the enum for an enum. The type of the property is optional, but leaving it out makes the documentation less helpful and also more ugly (except for enums, where types should not appear). If the description is too long to fit in one line, break it into two rows using a *single* line break. Single line breaks are always ignored when parsing. For example, * @prop (type): this is a very long description. Oh my gosh I am * running out of space! After the properties, a description of the thing should be given. Use *two* line breaks to signify the end of the properties section, and write as normal. It is okay to separate two properties with two line breaks. For example, * @prop1 (type): hello * * @prop2 (type): world is fine, but two line breaks within a property description is not. eg * @prop1 (type): line 1 * * line 2 * @prop2 (type): hello world is bad (line 2 will be treated as a description of the object itself). Instead, if you want the property description to have multiple paragraphs, put a \ character in place of the empty line, ie. * @prop1 (type): line 1 * \ * line 2 * @prop2 (type): hello world In the description section, two line breaks will be translated into an actual line break, and single line breaks are ignored. At the end, in the case of a function, a return value can be specified in the form * Returns (type): description of what is returned Despite looking like a property, the description can in fact have multiple paragraphs. The following is valid * Returns (type): hey this function returns a really cool thing! * Want to know what it is? * * It is a random number! Objects should indicate what they directly inherit in the description, using the form * Inherits: Applet.Applet Note that the namespace is required. Automatic substitutions The current parser is able to perform several substitutions: The type of a property specified will be automatically converted to a link to the documentation of that type, if available. In the description of items, @word will be automatically converted to code format, ie. enclosed within <code> tags. In the description of items, *text more text* will be shown in italics and **text more text** will be shown in bold. Note that using _underlines to highlight_ is not supported since the parser will confuse it with private variables. Links to other objects can be done with a #Hash. If you are linking to an object within the same file, you may omit the namespace, eg. using #Applet in Applet.AppletContextMenu. However, if it is from a different file, the namespace must be included. Links to functions, properties or enums of other objects with a %percentage sign. If you wish to link to functions of the same object, the following four are acceptable: this.func this.func() func func() Of course, if it is a property, then you would never want to include the () brackets. To refer to functions of other objects, you have to type the full name of the object. The namespace can be omitted if the object is in the same file. For example, the following are acceptable (assuming you are inside popupMenu.js. PopupMenu.PopupBaseMenuItem._init PopupMenu.PopupBaseMenuItem._init() PopupBaseMenuItem._init PopupBaseMenuItem._init() If there are functions, properties and enums that take the same name, the property will be linked to, unless the name ends with (), in which case it will always be a function. If a function and an enum have the same name, the whole thing will explode into pieces and don't do that. It is a bad idea to have things with the same name anyway. Code blocks can be enclosed in descriptions as follows: ``` this.is = some + code ``` Unordered lists can be created as follows: - List item 1 - List item 2 \ Continuing item 2 with `\` No longer an item Lists cannot be nested, but code blocks can appear in lists cinnamon-6.6.8/docs/reference/cinnamon-tutorials/documenting-tutorial.xml0000664000175000017500000002120315167446463025712 0ustar fabiofabio Writing tutorials It is also possible to write tutorials that are not part of the code. For example, this. They can be found in docs/reference/cinnamon-tutorials/, and are included into the cinnamon documentation via the docs/reference/cinnamon-tutorials/cinnamon-tutorials-docs.sgml.in file. These are plain docbook items, and existing docbook tutorials are suitable. This is intended to be a quick guide on the DocBook syntax. Overall structure DocBook is a markup language that vaguely resembles HTML, but the tag names are more verbose. A significant difference is that DocBook is more structured, where we have a top level <book>, containing different <parts> that have <chapter>s that in turn contain <section>s. The general structure of a regular DocBook item might look like <book> <part> <chapter> <section> <section> ... </section> <section> ... </section> </section> <section> ... </section> </chapter> <chapter> ... </chapter> </part> <part> <chapter> ... </chapter> </part> </book> As shown above, sections can be nested. In the example, we have layer 1 sections and layer 2 sections. It is possible to skip section layers and, say, directly include a layer 2 section inside a chapter. This can be done via using the <sect2> instead of the <section> tag (you can specify up to the 5th layer). You can also skip parts or chapters. For example, you might have <book> <part> <sect2> ... </sect2> <chapter> ... </chapter> </part> </book> This is helpful because sections in layers behave differently. Parts are numbered with Roman numerals. For example, a part might be labeled I. Code documentation On the other hand, chapters and sections are not numbered. More importantly, using <sect2> directly will affect chunking and the table of contents. Chunking is the act of splitting different sections into different pages when presented to the user. Different parts and chapters are always chunked, and so are layer 1 sections. A section appears on the table of contents if and only if it is a part, a chapter, or a layer 1 section inside a chapter (but a layer 1 section directly inside a part is not displayed). So if you wish to use chapters but do not want the layer 1 sections to be chunked, you will want to directly place a layer 2 section inside the chapter. Similarly, if you don't want your subsections to appear in the table of contents, use a layer 2 section without a layer 1 section. Escaping characters Similar to HTML, certain characters have to be escaped. For example, the > symbol is typed as &gt; and < is &lt;. Similarly, the ampersand & has to be escaped as &amp;. <code>xi:include</code> It is possible to include content from other xml files via xi:include. The precise syntax is <xi:include href="building.xml"/> The path is relative to the top-level document (ie. $(DOC_MODULE)-docs.sgml). To use this feature, you need to declare the xi: namespace. This is done via using the following doctype declaration: <!DOCTYPE book PUBLIC '-//OASIS//DTD DocBook XML V4.3//EN' 'http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd' [ <!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'"> ]> Tags and attributes The "title" tag It is (and recommended) to give each part/chapter/section a title. This can be done via the <title> tag. For example, a section might look like <section> <title>The title</title> ... </section> You should give all part/chapter/sections a title. If you cannot think of any sensible title, you probably don't want a separate section. The "para" tag This is the tag you will use the most often. It denotes a paragraph, and is equivalent to the HTML <p> tag. For example, <section> <title>The title</title> <para>Lorem ipsum dolor sit amet</para> </section> The "code" tag To display inline code, you will need the <code> tag. This is functionally the same as the HTML <code> tag. For example, <para>Lorem <code>ipsum</code> dolor sit amet.</para> will be displayed as Lorem ipsum dolor sit amet. The "programlisting" tag This is used to display multiple lines of code, such as the examples shown above. For example, the example above is <programlisting> &lt;section&gt; &lt;title&gt;The title&lt;/title&gt; &lt;para&gt;Lorem &lt;code&gt;ipsum&lt;/code&gt; dolor sit amet.&lt;/para&gt; &lt;/section&gt;</programlisting> There are a few things to take note of. Firstly, the < and > items are escaped. Secondly, the contents of the <programlisting> is flushed to the left, regardless of the current indentation of the xml. This is since all whitespace is rendered verbatim. Thirdly, the end </programlisting tag> is put on the same row as the last line, or else an extra row will appear in the output. If you are intending to show code, you will want to do syntax highlighting. Doing so via the regular DocBook way is useless. Instead, you need some magic, namely enclosing your <programlisting> inside an <informalexample> tag, eg. <informalexample> <programlisting> function foo () { return bar } </programlisting> <informalexample> If you do so, then you are allowed to have a line break before the closing <programlisting> tag as well as indent all your code by a common indent to follow the indent of your xml code. gtk-doc will automatically fix all those problems for you (assuming you are using gtk-doc 1.22 or above). Note that the language of syntax highlighting is specified on a per-project basis inside the Makefile (for gtk-doc 1.24 or above; it is hardcoded to be always C for gtk-doc 1.23 or below). The syntax highlight for this tutorial is for Javascript, so if you are writing about something that doesn't resemble Javascript even vaguely (eg. xml), don't use syntax highlighting. The "itemizedlist" tag This generates an itemized list, similar to the HTML <ul> tag. Individual items are put inside <listitem> tags, similar to the HTML <li>. An example usage is as follows: <itemizedlist> <listitem> A “<code>metadata.json</code>” file which contains information about the applet, such as its name, description etc.. </listitem> <listitem> An “<code>applet.js</code>” file which contains its code. </listitem> </itemizedlist> Lists can be nested, and markup can also be used. Sometimes you might want to enclose the contents of each line with a <para> tag. cinnamon-6.6.8/docs/reference/cinnamon-tutorials/importer.xml0000664000175000017500000001677615167446463023421 0ustar fabiofabio The Importer To access code of other JavaScript files, cjs has the imports object. In cjs in combination with Cinnamon you can use following statements to import statements: imports.* imports.gi.* imports.ui.* imports.misc.* <code>imports.*</code> This is the normal form of importing modules. You can think of this object like nested objects which properties are the JavaScript files or directories. All functions, variables (var, let, const) in a JavaScript file can be accessed like this file is an object. To clarify, an example: //Direct access to file a.js const A = imports.a; //Directories must be also typed in, in order to get file c.js in directory b const C = imports.b.c; log(A.foo); //"Property foo" log(A.bar()); //"Method bar" log(C.baz); //"Property baz" a.js let foo = "Property foo"; function bar(){ return "Method bar"; } c.js in a directory named b let baz = "Property baz"; In every case, you can include cjs core modules. Those provide you useful functions or (less often) bindings to C libraries. Examples are: const Cairo = imports.cairo; //Cairo graphics const Lang = imports.lang; //useful JavaScript functions for extensing the language const Gettext = imports.gettext; //Gettext translation const TweenEquations = imports.tweener.equations; //Tween equations for animations As you can see, it is common to assign the import to a constant in UpperCamelCase which looks like the imported module. To view the source of those cjs modules, you should visit the GitHub page. <code>imports.gi.*</code> As Cinnamon uses C libraries like Clutter, Muffin and more, there is a little problem: How can those libraries be used in cjs? For this, there is GObject Introspection. In short, it allows you to use C libraries in cjs, Python and other languages. C libraries are included like this: const St = imports.gi.St; //Shell Toolkit, the normal way to display widgets on the Cinnamon screen const Cinnamon = imports.gi.Cinnamon; //Cinnamon C libraries, e.g. AppSystem Note: Not like normal imports.*, imports.gi.* imports needs to have the first letter after gi. be in upper case. <code>imports.ui.*</code> Those imports under imports.ui.* are core Cinnamon modules. Some important modules: const PopupMenu = imports.ui.popupMenu; //High-level classes for building menus for applets or context menus const Applet = imports.ui.applet; //Base applet classes The source is in /usr/share/cinnamon/js/ui/ <code>imports.misc.*</code> Those imports under imports.misc.* belong to Cinnamon, but aren't tied to it as much as imports.ui.*. const Util = imports.misc.util; //useful functions const Interfaces = imports.misc.interfaces; //DBus stuff The source is in /usr/share/cinnamon/js/misc/ Importing xlet modules When you want to split a big xlet file into smaller files, you'll need to import them. The best way is using imports.ui.manager.xlet[UUID]. manager is one of appletManager, deskletManager, or extensionSystem. xlet is the xlet type pluralized and is one of applets, desklets, or extensions. UUID is the string of your xlet's UUID. Importing for applets: const Module = imports.ui.appletManager['foo@bar'].module; // get module.js in your applet directory Importing for desklets: const Module = imports.ui.deskletManager['foo@bar'].module; // get module.js in your desklet directory Importing for extensions: const Module = imports.ui.extensionSystem['foo@bar'].module; // get module.js in your extension directory In Cinnamon 3.6+, there is now a simpler way to import files using require. This method is not compatible with previous versions of Cinnamon. Importing GI modules: const Cinnamon = require('gi.Cinnamon'); Importing Cinnamon modules: const DND = require('ui.dnd'); Importing other JS files (".js" extension is optional): const MenuItem = require('./menuItem.js').MenuItem; You can also manually export your modules by adding them to module.exports at the end of the file. Inside your module file: function MenuItem() {...} ... module.exports = MenuItem; Then from the file you want import MenuItem from: const MenuItem = require('./menuItem'); cinnamon-6.6.8/docs/reference/cinnamon-tutorials/meson.build0000664000175000017500000000121615167446463023157 0ustar fabiofabiognome.gtkdoc( 'cinnamon-tutorials', mode: 'xml', main_xml: 'cinnamon-tutorials-docs.sgml', src_dir: [ join_paths(meson.project_source_root(), 'src'), join_paths(meson.project_build_root(), 'src'), ], mkdb_args: ['--xml-mode', '--output-format=xml'], html_assets: 'settings.png', content_files: [ 'building.xml', 'documenting-source.xml', 'documenting-tutorial.xml', 'using-documentation.xml', 'write-applet.xml', 'xlet-settings.xml', 'xlet-settings-ref.xml', 'xlet-versioning.xml', 'xlet-translating.xml', ], install: true, ) cinnamon-6.6.8/docs/reference/cinnamon-tutorials/settings.png0000664000175000017500000004031715167446463023370 0ustar fabiofabioPNG  IHDRX/EgAMA a cHRMz&u0`:pQ<bKGD?IDATxyTyϹ3g~w{R⪩([krE:rpڄ*z ǏsǕ_OOOwwwWWWgggGGb1jLX,]]]===\rE#lo|!]]]fd2Fu:V beYVtz`0Fd6;::"|!փŶ-zCpdr===d2 NDz,M*JTRP(rL&dRJR)WGr\PPT*U*M,t:`2,KgggOOw;Xj[p TÇ{{{,hOR) T*B@ hnnnjjjlllhhhhhzP(RTPT*Fb}+o wDZK@L&Accc]]]uuuEEEyyyYYYIIIIIIqqqqqquHeeeuuu@,d2. C{{{ggcį7V&I4-E"QCCCFF;B?q)LSǎbGXFFFCCH$4Mt:4_N wPǏ=VVUTRT dOxyqGGc'ВJ*JZ[ѣG?|7|ޮ lnnnnn>w`x^0gϞ>AȵNkooo|cXzZ*za=:E=vkAZ-KOOÇ/yɝcNȲ\.555)))<(U<y<^JJJMM@ ,ξ>۝>' sTT"t{HN(JN$T*NA'_sB;YtdbYV&qN:d^^wX&,k2O r> 0 jZ,gdd={V 0QH$ﶲXS1]p!##N,j$]_}>y;.l6u:Byyy<osiӇv$I>ɋ0/<4IʷqG.ވ[[I$#r$荢I+rkVtx<^rrr^^^ee@ P(:l6sG ~@ÇqaTXZZ406Vw>fGTGTUF$InXz{⍸Ek᧟~nyT7[W`bn A160 xFT>&Ch44-Hjkk ޽x>E$In?WfOo-jhżP$w-FJNo'IrוrJQ6Ĝ:%G(  Q&A$y\Mkb$IIʻsH(IJK>IR`'ȣ"=rBX`AShԵqH$$\:$deIg]E$yWD둡\;Pb,-#+#/@eU$|ۍjVݒ]>̧% ˎ{$InP,?K$7b١իgqsXʌށ5v;PQuխ{nbbիWrL&vիWtwڵ۷oUUU BJe0:;;E^i=e;SD+J@PQQte iu6GW;@4PGH$Oe iVVr1$RUV] %Ipw_zdkH$_O?C$IGO~-_$IA,f2ǵԡ;}r%$I2"b콢f/i=,0~}MQI$#$ʺ$I!~7ڄH3b]ZfFeWv$=Zc`+ϓ$I@aWw}wUH$\3{5vᛶ|>s-Kzz7_~ƍ 2|rRRRnnnEE@ P*z;_%O~Nr [,L򬬬(shL}Z$eiף"YwiaX}K$i-a$I+j\<ɨ5raq&ahIir4dj 3)7$I+7hYFv$I{Wx(mͦt,è  7pF2Nƅk (ӎo5FyCIqVeLo;I;/lxe2$I^Cވ=6{1A Z;77͛7o,((j|:NjJHH*//oiiX,_cZ,V+˛233oܸqGoXy9$IrwtiѲ緓$y4!.$d( MӌRp;wށ2EEӊbFPˊrxwmd \M'֎g U4lN9L$*PMh|Grq j۫9"5MӃ-pI4MTW!k AwZX(+%B %/nm} -TOps XNtaJeaaaFFFFFF^^EQ.ǻp7233ʚrVX,+_"k6NNOO~sϧ?9I$Wj.$} Jnh= Jp}$o~~뷢BHUUv$I+r/1goBs{__A\Y!eg!- ؋=+\ ew$I^'P*{g!h Yӷ:^=3uW]zpck4+U0~{Vm"mk<zAryzzzvvvyyyyyyNNNzzL&;w܉\fk7YDV+[ӹ ?~!wq(:{:$#*5,Uj58ZM5 `rbMkF"{G*ZM jZް{;'V&D%Ȏ$IΫ՞'I~:Uh= ݳg0fǾ[ mWvjܿ/ܪޞ Ξ=VRRȝq}k 'Op!΅`CCCqqqjjjllӧ!wʩ#{ =p%0w10Zy*!';PU˕Ŏ_^uZMk a٠Ԙ-!$I! U #q|!u+GBHrǁ iQ317D(#}xj{*>w*~`r剧v$+FĪm~{UvW}c7wO>Gb{o-gK]]fUOL׹]Dy4?<};4Cn~V#2ӿM~`SP c;l& Wvp_,3 ]esq!ZTT J!s`}}}QQݻwn'IrgLL?6 z3gNvN]7nUN^f wBYC0:::22)H΋!Sj6 Pc{sz- .!i Dxi</222::6YE8 w^#1mko-<ޥQM^A ^ Bm ARArx&MB +5CP,,X_epؑݔd6޽+Ib;۟Laqqqb !Oy|>S=AA.E0b\}/\./0#SB`G&͙3Wկ~9sd2]B;|7SCD$)))##C** wywqqqQ(R޽{D$gIv l&\淿 w}{}Æ oW\B ?0XC׳^=G=B86P>~߽{{zggg B A|>s*o$mmtԇ?V!teX6g:A>{w x6°;w+_'>/ZZZ<ޥv҄` nWKyz%K7eovwrӠlKU!Fp\@"\vm]&Hsu.م뒊K{-uw#,XD4!lz~UTw___6<`:˳l B'y뤺gC5m,sٛҙsyF~B{fR}}W斺Xǟ=]e3y-}}~򘮾nc|~38Hxxx Zz5˲r\.,zj]|APPH$jiicp>֥0=}\y!k\ܽ~3Ai>s͡yw(Wzmя?}|W:"Wi3W7ps.k߱zK_XKE!!(H}||l B1B0..^wwwD !dC0y] !8p#Gk~|z+bm>A̜=wgoUٌ>*[x-"2Soo['^u 뼈O>d n!/((O>$""+1w~2mӝVC\Y>PiHS"%z -u==E+NL]=]&0_1xЫ nC_?G7:3yGk{z̢r"O#}vSJ%˲!!!-Z=,,,,,}ѢEֻBBBXU*cWd ;|~=`繇*ln6Y>^c6`<qA9K>?0sw幧? p"'%Suv%7CܜmM|Uslhi>'S[qiYt7ONDmxXsӅ^3t>>Q $$$|dcɒ%K,=!!A 466>wXG.IX-LyA;T1CLV+;;y,jixjhh(((X~qX~}AAACCs4!Xg1N4gޤ TUUmڴi˖-)))Xo)))[lٴiSUUUKKxtU(D"TVwڵqƍ7ڵKVKRH$ [[[*k@r!X Sɿ͛7o޼9**4GsLyAN.3 0\.{A&M˲y h4ׯ_)6^lIv(Y*֭[iii4C*--))66655!XB!v`%R&+B |Ԥ rx&M4!B!@"A B!@"A B!@"A B!8噙!++L.`jrye?of8 JKK;::'vttO!HKN)*+&q&%% nnX`jrye?of8L&QO!x O)*+&}\ ގ6S*3fydps;}m_m_m@>wz!ث65*L_CBBL&w# ˖-{w}e˖q[[񵵵A\wyvwS:{{{ c2RM*F[!0CpyM TTT466J$溻%IcccEEEssar9=sF!sUnoo3 ;0 Kv}_\/mӃ!8VPP`b&ݨ{Lxʀޕ}gk&`2GG'S|[[ۃӧg9XvȤϲѳ>=ԫl2f̘1cƌy˅Kvc /ztggggg|ln B&Evm߱ᑝ"ZнԷ{oϪ"?<Ʈov* <B鋿iZL'k X6fSv$h熠pٻw*Ntz^7EW;_ۧtQΙ͋prtZ@ +;fq1,,,4""yu:ɒ:+ʻ'bNHPcᷫ(Vw;P{uS3r~9-nbZ,'=&n_L崜_NPq&v ^ei4Nm/eΠ...-k=J+㳹M6܍BPhG(Ƹ qs=7_|Axo:%L6Ƃ:ފFqH2,h:tˆdAoooooo{!;쫧.Z!ݭjZh\zJW[[<3g߶6nkTիWFU?[pT^-G,_pW)Vղu f1oMFj[Gw%b_\oZVݘ. Yܰ~NZ(`\JjS9VdI @/SBduRbqqL&jZΫĚTZh"V^YtWuGnX50]:,pn>Ggl!pfV;7lSX J4%W~5 F㐧 tg,8UIۛC/Y;w&A/ߟPwŜDۖlttǵ2:}]P3;}}Q8Vٚ1\خmX,3+&}j4FUTT?󻻻uwwps<<GZ}l b"%7y"sjZeUL3yė`\J {UA՚MFg*~=mԋUfQyڳM*#"3ًp >W 51ݝ."[tRhy,򞐦y';W9}Mh4y 8V`0 aj掎bo[[P 3f9sd2٦4&̙33f 2  Iܱ&hL ڗX9[Y?w܆sKlȝTn_72ז{9Y 3`jFyAS:?LRԃ 3{!>y\Ċns}qsf9ܧ,9=jDN| A,&d5mEyed>/?U(cs*I2FuQק4E^_ vB~`j4ZMfZfZ7UM:9X~sgCP~/d/dds,K7|}Ւ[ aauc*75An ,Wrh0Ut6lvvv`gg 6LCqy3!H4Md2q;ҹ-LݮvL&FjN?mUAً6Oh9;|'_'eE5MӴ.!lw?Xrd[24M˫|YDN}~I%^,m Buuu󉣊?'+J;JG&yb9MW iO:oBge'zo͒6O|h&zW'p]U7rS4j3gU3zم YņiZg#3/{v'u_zVI4-iZ-)dۥ"Ƹt|Q`hrss7mڴΎM6涵8ABк!8ÍVl B!h;/)/E|I^^ NBjA%Q7:8CeY}~*OiEse{͠ݹz#OTn[kUf`0p'e6 çCqB5T hXd#V/Ew"@L6ggf8Vz_~5jbc33'2P YrJ^gO)&8wLxVk.{~4&+AoؽR?k̥ZVv*ۋHa4MXX󦡜¬3p|ҥK.]2Mx AZRRiKKKg ?gIiiiJ*j3.ӧ;9(4\:^A-eCk N&|hlTxV %L[[[BB֡ڬeJjL4M,Ydɒ%%%%4MbA9[^3hgXӯǻH5٫"{h4Fd+Zm45c2˲k֬YvN[v5kXw WntU`Y?->J%W\m۶m۶\R.T*b r1ߵE7oVVVVVVf߼Yv+'s0̩S"##ZmddSN1 =FVt:t:ZhW8r2 }?<44444?߾}u!`\./**-b(??_.#lU*h44MvZh4111fXN4U*4MGiZTf3B`*99*s17ju[[Z~pt_ @"ʯ+&q&&&jZP*&11 &^fsMfVy]1C ??E>QP(rss `jry%?of8rynnn\\!\~=77,^fsMfVy]1C^B!@"A B!@"o*`-@"A B!@"A B!@"m ;G=pے.Cђ}zc+AnA/*! W/i攭]Wk4eGtRAp$g [ye(/f{lӊA 8|JO:mvk,s:].Æ B=y:|S0p)~x ApGr BDR->qٕ}FPA3DQ$Iݭ^S$LAQhN: [e-yWa@"˛89JQy~{ u7g yܸ]p[|GJ2pxPyiQ&;YCFttfM*CvJ"9p[j!؜mWSzB!BPRʝ@Z93?IKw'U kexC2k:ALZť ZBlB|HخK P; \<<<殏Y7:1{edיjuv"pe>s7t>6G EQk=gw!b6k7vgpIُmUPZ!w.uG5 '}sgblZՑ9M2quξnZ*k-\R)EQ;}]l3O,w hUJ EI#FNGpMܖ_YйswܪQLPq/^ƽ˺RV^[(yCfLb^H.o-ӯ(Y v'>)̂&9E ~x0F"UZNn/G]a!8<۽'}#`OFC[va)5 ǿ>̐9ΫoesfoND} EQ܇n (J}זԁiM6{1Bp,n|_}|;!(wGɥMRųys a{D١ޞ.@N̓_"cBpԵ.q^Yյ>.[va)5 ǻ>;{pHQ/p1%m U(O_P.'@/2֡a뀒c pZg?GNRܨ@'cцu2JI8|,8cVRm_5yPpskY` b /kCv 94< QgMIq%.WX\k@s}MI1y֬Yf9;1@xkkڰ=v)z.:3hys1$mw~׶t(rV Ȗs)#=y-2$>OC}F sw і6Mwv?y,NnwF,lo!8Q}Ili݀{gx#֌P?~$5eOHzBV~fU2<΅;vJ>ʣo'%72+2BRu}9dHIz3lɚ-7WDQs}En&>OR]ݬ)¬Mr^JmT<Q4il>^,k555)))|>?:::>>[A Ay>;mEpc׶q h-mtp\5UAQ%˵~^.sshV\DT;kx,wl|ALw X>xh؏D"0+**RRRfW_}U\\? D"'ܯs)[_{0OC׃SJ1~)rk\LLLLLL|||rr؟G#8H^+;bKwǕ퉯<`{Q?!!o_gϦLrwMIIuVbbblllLL B?]oիWXÇ?}ܹLI.===555999)))&&&..!.:z:eKx (#[ZZbbbbccRRR***A,66G._ SB茌Q+0%%իDDcJ/^lnn|qOOOkkkTT*Ap|7n8|DDę3g=D A B!D A B!D A B!D A B!D A B B!D A B!D A B!D A B!D A B!D A@B@"A B!@"A B!@"A B!@"A B!@"A B!A@B!@"A B!@"A B!@"A B!@"A B!@"A !A@ A B!D A B!D A B!D A B!D A B! !D A B!D A B!D A B!D A B!DL 1%tEXtdate:create2019-02-08T18:47:29+00:00%tEXtdate:modify2019-02-08T18:47:29+00:00\$CIENDB`cinnamon-6.6.8/docs/reference/cinnamon-tutorials/using-documentation.xml0000664000175000017500000002721615167446463025543 0ustar fabiofabio Using documentation Overview The documentation of Cinnamon is separated into 4 different parts (5 if you count muffin). What you are currently reading is the tutorials, which includes the general top-level overviews and tutorials you will need for Cinnamon. This is named "Cinnamon Tutorials". The second part is the Javascript reference, which describes the Javascript part of Cinnamon. This is named the "Cinnamon Javascript Reference Manual". This is a technical reference for the individual functions and objects available in Cinnamon. Note that this documentation is aimed at both applet/extension developers and Cinnamon developers themselves. So depending on who you are, some of the information might be entirely irrelevant. The third part of the documentation is for the C part of Cinnamon, which is simply referred to as the "Cinnamon Reference Manual". The last part is the documentation for Shell toolkit, or St. This is the graphical toolkit used to draw widgets on the screen (similar to Gtk). The modules covered by the Javascript documentation are those imported via imports.ui.* and imports.misc.*. The global object is documented in the C part of Cinnamon, as well as things accessed through imports.gi.Cinnamon. Things accessed through imports.gi.St are, unsurprisingly, documented in the St part. imports.gi.Meta refers to Muffin, while others (eg. imports.gi.Gio) are third-party (usually GNOME) libraries that are documented elsewhere. Accessing the documentation There are two ways of accessing this documentation, one of which is what you are currently using. The first method is accessing it online, which will be available at http://linuxmint.github.io. The second method is to access it locally. Install the program devhelp and the cinnamon-doc package (might be named differently in different distros or included in the cinnamon package itself). Then run the program devhelp to access all documentations you have installed in your system (not limited to Cinnamon). Javascript documentation The Javascript documentation is divided into sections according to the files they are from. The title of each section is how you want to import it. For example, if you want to use the IconApplet object from imports.ui.applet, then you type imports.ui.applet.IconApplet. Since that is very cumbersome to type, we usually declare it as a constant first. For example, you will often see const Applet = imports.ui.applet; This way you can access the IconApplet object via Applet.IconApplet instead. This is how the individual pages are named as well. The _init function of each object is the constructor. So if you want to know what happens when you call new Applet.Applet, you look at the _init function of Applet.Applet. There usually isn't much helpful information apart form what each argument does. Certain variables and functions are prepended with _, eg. _showPanel. These are private variables and functions which shouldn't be accessed normally, and is there purely for referential purposes. It is generally not a good idea to use them in applets/desklets. Within Cinnamon itself, you may use them when necessary. Note that the _init is also a private function, and you also shouldn't call it directly (unless you are inheriting the object). It is implicitly called when you call the constructor (which technically can be totally unrelated to the _init function. Each object comes with an object hierarchy, documented in the Object Hierarchy section. For example, Applet.IconApplet inherits Applet.Applet. The child can, obviously, access the functions and properties of the parent. However, this information is not repeated in every child. So if you cannot find the function you want in the Applet.IconApplet page, you can look at the Applet.Applet page as well. This is also true for the C documentation. C documentation The items described here are common to all C modules imported, not just those relating to Cinnamon. Reading the documentation of C modules is tricky, since they are written for C, and we are in Javascript. In particular, C has no concept of objects, while Javascript does. Thus the naming conventions of many things are different when used in Cinnamon, and the documentation is not directly applicable. The following sections will describe how to translate C into Javascript. Note that most of these apply to Python and other non-C languages. Objects C has no concept of objects, but GObject allows C code to create things that look like objects. For example, St.Bin is something that looks like an object, and acts like an object in Javascript. If you want to look up the documentation of St.Bin, you search for StBin (without the ".") and the documentation will come up. The "." is removed since, in Javascript, we first import the whole St, and then take the "Bin" object from St. This concept is non-existent in C. In C, it is simply StBin. A notable exception is with Gio and GLib objects, in which the G prefix is used in C for both while Gio and GLib is used in Javascript. For example, the C object is GSettings while the Javascript object is Gio.Settings. Translating object names is the easiest of all. Functions If you look at the page of StBin, you will see that the functions have very long names like st_bin_get_child. Since we are just pretending to have objects via GObjects, and objects do not genuinely exist in C, the functions do not "belong" to the objects. We simply put the name of the object in front of the function name and trust people will actually use it on the proper object. In C, objects are imported as if they were objects, and functions do belong to the objects. So if actor is an StBin, we do not do st_bin_get_child(actor), but simply actor.get_child(). Note that the C documentation always tells you that the first argument to the function is the object itself. For example, st_bin_get_child takes in an StBin as the argument. We do not need to supply this. Note also that not all functions are available for use in Javascript. If some functions are considered to be too C-like to be used in other languages, it will not be available. There is generally no simple way to figure out whether the functions are available, but usually they are. If they are not, Cinnamon will complain loudly that the function doesn't exist. So the best way to know is to try it. Again, Gio and GLib functions use the g_ prefix, eg g_settings_set_int instead of gio_settings_get_int. Properties GObjects have properties. These can generally be accessed directly. For example, if actor is an StBin and you want to access the x-fill property, you can use actor.x_fill. Note that we translate - to _. Sometimes, for some absurd reason, the properties cannot be accessed directly. In this case, there is still hope. You can access the property via actor.get_property("x-fill") and actor.set_property("x-fill", false). Enums Enums are the trickiest of all. An example of an enum you might see is as follows: enum StButtonMask StButtonMask A mask representing which mouse buttons an StButton responds to. Members ST_BUTTON_ONE button 1 (left) ST_BUTTON_TWO button 2 (middle) ST_BUTTON_THREE button 3 (right) The correct way to access these enums is St.ButtonMask.ONE. We first start with the namespace St, then the name of the enums. Note that this does not relate to the name of the members of the enum. For example, if the individual enum members are called HELLO_WORLD in C, you still access them by starting with St.ButtonMask. What to put after St.ButtonMask is trickier - it is the name of the member, but what should you take? You usually have to strip out some things from the left. In this case, you remove the ST_BUTTON and retain ONE. There is no fixed rule to what to remove. However, it is usually the name of the object (StButton in this case), or the name of the whole group of enum. You can save yourself some guessing by typing St.ButtonMask in looking glass. Double-clicking into it will show you what you can access. In this case it shows ONE, TWO, THREE. Note that both St and ButtonMask are in CamelCase, but the name of the enum member uses CAPS_WITH_UNDERSCORE. cinnamon-6.6.8/docs/reference/cinnamon-tutorials/write-applet.xml0000664000175000017500000003303115167446463024154 0ustar fabiofabio ]> Writing applets Introduction In this tutorial, we will go through the process of creating a simple applet to learn about the Applet API. Here we will create a Notify Me applet. Clicking on this applet will send a notification containing the user name as returned by the “echo -n $USER” command. Creating the basic structure of the applet An applet has to be given a unique ID (uuid). In this tutorial we will name it "notify-me@cinnamon.org". Of course, you should give your applets your own UUIDs, using either your name or your domain name behind the @ sign. An applet is basically a directory, whose name is the UUID, containing two files: A “metadata.json” file which contains information about the applet, such as its name, description etc.. An “applet.js” file which contains its code. Applets go in ~/.local/share/cinnamon/applets (or in /usr/share/cinnamon/applets if you want them installed system-wide). So let's go ahead and create the files and folders required for any Cinnamon applet. cd mkdir -p .local/share/cinnamon/applets/notify-me@cinnamon.org/icons cd .local/share/cinnamon/applets/notify-me@cinnamon.org touch metadata.json touch applet.js # Only for this applet: cp /usr/share/cinnamon/applets/notifications@cinnamon.org/icons/empty-notif-symbolic.svg ./icons/bell-notif-symbolic.svg Defining the applet metadata Let's open metadata.json and describe our applet. This file defines the UUID, name, description, and icon of your applet and is used by Cinnamon to identify it and display it to the user in Cinnamon Settings. { "uuid": "notify-me@cinnamon.org", "name": "Notify Me", "description": "Click on the applet to send a notification", "icon": "cs-notifications", "version": "1.0.0" } By default, only one instance of every applet can be placed on the user's panel. But if the user has multiple panels, they cannot have one notify-me applet on each panel, which is bad. Hence we should also add a max-instance property. We can specify any number we want (eg 3), or we can make it unlimited by making it -1. In this case, our new metadata.json would be { "uuid": "notify-me@cinnamon.org", "name": "Notify Me", "description": "Click on the applet to send a notification", "icon": "cs-notifications", "version": "1.0.0", "max-instances": "-1" } There are more things we can add to metadata.json, but they will not be covered here. Writing our applet Here is the code for our applet: const Applet = imports.ui.applet; const Util = imports.misc.util; const GLib = imports.gi.GLib; /** * Variables (and other constants) */ var user = GLib.get_user_name(); // String.capitalize() is a function implemented by Cinnamon. user = user.capitalize(); // Turns the first character into uppercase. /** * Declaration of the 'NotifyMe' class, which extends * the 'IconApplet' class of the 'Applet' library. */ class NotifyMe extends Applet.IconApplet { constructor (metadata, orientation, panelHeight, instance_id) { super(orientation, panelHeight, instance_id); this.set_applet_icon_symbolic_name("bell-notif"); this.set_applet_tooltip("Click here to send a notification"); } on_applet_clicked(event) { // Please consult 'man notify-send'. let command = `bash -c 'notify-send -u normal `; command += `"Thank you ${user}" "for improving Cinnamon!"'`; Util.spawnCommandLineAsync(command) } } function main(metadata, orientation, panelHeight, instance_id) { return new NotifyMe(metadata, orientation, panelHeight, instance_id); } Now we'll go through the code line by line, starting from the bottom. function main(metadata, orientation, panel_height, instance_id) { return new NotifyMe(orientation, panel_height, instance_id); } The main function is the only thing Cinnamon understands. To load an applet, Cinnamon calls the main function in the applet's code, and expects to get an Applet object, which it will add to the panel. So here we instantiate a NotifyMe object (whose details are defined above), and return it. You will notice that there are a lot of parameters floating around. metadata contains, basically, the information inside metadata.json plus some more. This is not very helpful in general, but can sometimes provide some useful information. orientation is whether the panel is at the top or the bottom, at the left or the right. The applet can behave differently depending on its position, eg. to make the popup menus show up on the right side. panel_height tells you, unsurprisingly, the height of the panel. This way we can scale the icons up and down depending on how large the panel is. instance_id tells you which instance of the applet you are, since there can be multiple instances of the applet present. While this is just a number assigned to the applet and doesn't have much meaning by itself, it is required to access, say, the individual settings of an applet (which will be described later). If that sounds like a lot of things to take care of, you should be relieved that the applet API handles all that for you! All you have to do is to pass it to the applet API. Here we are passing this information to the constructor, and the constructor will later pass it to the applet API. So what exactly happens when we create the applet? We first look at the first three lines: const Applet = imports.ui.applet; const Util = imports.misc.util; const GLib = imports.gi.GLib; Here we import certain APIs provided by Cinnamon. The most important one is, of course, the Applet API. We will also need Util in order to run an external program (notify-send). When we write imports.ui.applet, we are accessing the functions defined in /usr/share/cinnamon/js/ui/applet.js. Similarly, imports.misc.util accesses /usr/share/cinnamon/js/misc/util.js. We then call these things Applet and Util respectively to avoid typing the long bunch of code. The third line imports the GLib, which contains the get_user_name() method to access to the Linux user name. Next! constructor (metadata, orientation, panelHeight, instance_id) { super(orientation, panelHeight, instance_id); this.set_applet_icon_symbolic_name("bell-notif"); this.set_applet_tooltip("Click here to send a notification"); } This is the standard constructor of a Javascript Object. It is called each time the object is instantiated. Here, instantiation takes place in the main() function. Also note that we pass all the metadata, orientation etc. information down the chain until it ultimately reaches the applet API. super refers to the constructor of the parent of this object (here, Applet.IconApplet). The next two lines initialize your applet, defining its icon and tooltip. this.set_applet_icon_symbolic_name("bell-notif"); this.set_applet_tooltip("Click here to send a notification"); However, contrary to popular belief, the applet API is not psychic. It has no idea what your applet wants to do (apart from displaying an icon). You have to first tell it what icon you want, in the line this.set_applet_icon_symbolic_name("bell-notif"); Note that set_applet_icon_symbolic_name is a function defined inside Applet.IconApplet, which makes the applet display the corresponding symbolic icon. By using the applet API, we have saved ourselves from the hassle of creating icons and putting them in the right place. (bell-notif is the name of an icon from the user's icon set. The icons available for use can be found in /usr/share/icons/ or in the icons/ folder of this applet) The next line is: this.set_applet_tooltip("Click here to send a notification"); which says that the applet should have a tooltip called Click here to send a notification. There is a way to translate messages such as "Click here to send a notification". Please see Translating applets. The class not only defines the constructor, but also methods, which are functions accessible by the instantiated object. Like the on_applet_clicked function, which is all we need. on_applet_clicked(event) { // Please consult 'man notify-send'. let command = `bash -c 'notify-send -u normal `; command += `"Thank you ${user}" "for improving Cinnamon!"'`; Util.spawnCommandLineAsync(command) } on_applet_clicked is a part of the applet API and is called whenever the applet is clicked. command is the command to execute. Please note that three types of string delimiters are used here: `, ' and ". Last, Util.spawnCommandLineAsync(command) executes this command in an asynchronous manner (i.e "as soon as the computer is ready for that"). Cinnamon's UI runs in a single thread, and synchronous methods that involve i/o can block this thread, causing the desktop to stop responding. Asynchronous methods are preferable, but can sometimes be more complicated to use (though that is not the case here). Here we see what I've referred to as the "applet API" all the time. A few barebone applet objects are defined in applet.js, and we inherit one of them. Here we choose to inherit Applet.IconApplet, which is an applet that displays an icon. Inheritance in JavaScript is slightly weird. We first copy over Applet.IconApplet's prototype (or class) using the class NotifyMe extends Applet.IconApplet { line. This copies all the functions found in Applet.IconApplet to our applet, which we are going to use. Next, in our constructor function, we call the _init (or constructor) function of Applet.IconApplet. Here we pass on all the information about orientation etc. to this _init (orconstructor) function, and this function will help us sort out all the mess required to make the applet display properly. cinnamon-6.6.8/docs/reference/cinnamon-tutorials/xlet-settings-ref.xml0000664000175000017500000007130615167446463025132 0ustar fabiofabio Applet, desklet and extension settings reference This is the reference for the settings API. Basic settings types switch type: should be switch default: true or false (no quotes) description: String describing the setting A simple switch that controls a boolean type value. New in Cinnamon 3.2 spinbutton type: should be spinbutton default: default value to use - must be number min: minimum value max: maximum value units: (optional) String describing the unit type (pixels, bytes, etc..) step: adjustment amount description: String describing the setting Provides a spin button and entry that control a number value. This can be integer or floating point format. For floating point, all values must have leading 0's. scale type: should be scale default: default value to use - must be number min: minimum value max: maximum value step: adjustment amount show-value: (optional) whether to show the current value on the slider - default: true description: String describing the setting Provides a scale widget that allows you to pick a number value between min and max, by step amount. Integer or floating point numbers can be used. For floating point, all values must have leading 0's. entry type: should be entry default: default string value description: String describing the setting expand-width: (optional) true or false, or leave off entirely. Forces editable fields of entry's elements to occupy the entire space available in a row A single-line text entry field that stores a string. textview type: should be textview default: default string value description: String describing the setting height: (optional) Number indicating the height of the textview in pixels or leave off for default height (200 px) A multi-line text entry field that stores a string. New in Cinnamon 2.0 File chooser widgets filechooser type: should be filechooser description: String describing the setting default: Default filename to use select-dir: (optional) true or false, or leave off entirely. Forces directory selection. Opens a file chooser dialog that allows you to choose a filename. If select-dir is true, it will only allow directories to be selected. Stores as a string. iconfilechooser type: should be iconfilechooser description: String describing the setting default: default icon path or icon name to use expand-width: (optional) true or false, or leave off entirely. Forces editable fields of iconfilechooser's elements to occupy the entire space available in a row Provides a preview button and text entry field. You can open a file dialog to pick an image-type file, or enter a registered icon name in the text field. Stores as a string. soundfilechooser type: should be soundfilechooser description: String describing the setting default: default icon path or icon name to use event-sounds: (optional) true or false, or leave off entirely. Unless this property is set to false, the file chooser will only allow wav and ogg/oga type files as these are the only types currently supported by cinnamon sound events. (New in Cinnamon 4.2) Provides a button which shows the currently selected file name and opens a file dialog when clicked. A preview button is also provided to allow the user to test the selected sound. Stores as a string. New in Cinnamon 3.2 Other chooser widgets combobox type: should be combobox default: default value to set description: String describing the setting options: node of desc:val pair options, where desc is the displayed option name, val is the stored value Provides a dropdown list from which you can select from description:value pairs defined by options. The values can be string, number, or boolean. colorchooser type: should be colorchooser default: default color string - can be "red" or "rgba(x,x,x,x)", etc... description: String describing the setting A Color button that lets you choose a color. Stores an RGBA color code as a string fontchooser type: should be fontchooser default: default font string - should be the font name followed by the font size. (eg. "sans 12") description: String describing the setting A button that opens a dialog that lets you select a font. Stores a font string as a string New in Cinnamon 3.2 datechooser type: should be datechooser default: default date - should be of the form {'d': 1, 'm': 1, 'y': 2025} description: String describing the setting A button that opens a dialog that lets you select a date. The date is stored as three key/value pairs representing the numerical value for the day('d'), month('m'), and year('y'). New in Cinnamon 3.2 timechooser type: should be timechooser default: default time - should be of the form {'h': 12, 'm': 0, 's': 0} description: String describing the setting A button that opens a dialog that lets you select a time. The time is stored as three key/value pairs representing the numerical value for the hour('h'), minute('m'), and second('s'). New in Cinnamon 4.2 tween type: should be tween default: default tween value description: String describing the setting Provides a dropdown list from which you can select a tween type. A tween value is a string of the form ease<direction><shape> where direction can be In, Out, InOut, or OutIn and shape can be Quad, Cubic, Quart, Quint, Sine, Expo, Circ, Elastic, Back, or Bounce. For example, to specify a direction of In and a shape of Quad, the resultant string would be easeInQuad. To specify no tween, use the special tween value easeNone. New in Cinnamon 2.6 effect type: should be effect default: default effect type description: String describing the setting Provides a dropdown list from which you can select an effect type. An effect type specifies what an animation looks like. Stores as a string. New in Cinnamon 3.2 Layout types section type: should be section description: String to display as the section title A non-setting widget, this specifies a new section for assisting in organizing your settings. New in Cinnamon 3.2 layout type: should be layout pages: An array of strings representing page items A non-setting widget, this allows you to specify a particular layout for your settings rather than relying on the order they appear in your settings-schema.json file. This has the added advantage of using settings pages to further organize your settings into tabs. This is only recommended when you have a large number of settings that wont all fit without scrolling. To use the layout object, you must place it at the beginning of the settings-schema.json file as the first "setting". Any section items not placed within the layout object will be ignored. To use the layout object, you must define any number of page and section types as key/value pairs in the layout item. Each page will include a sections key which is an array of section items. Each section item in turn will contain a property called keys which is an array of key. In addition, the layout object also must include the pages key which is an array that contains a list of the pages in your layout. The each item in pages and sections must correspond to a page or section key in the layout property and each item in keys must correspond to one of the settings keys in your settings-schema.json file. The pages, sections and keys will be displayed in the order in which their key names appear in their respective arrays and do not depend on their order in the layout object or your settings file. Here is an example of what a layout object might look like: "customLayout" : { "type" : "layout", "pages" : ["page1", "page2"], "page1" : { "type" : "page", "title" : "1st page", "sections" : ["section1", "section2"] }, "page2" : { "type" : "page", "title" : "2nd page", "sections" : ["section3", "section4"] }, "section1" : { "type" : "section", "title" : "1st section", "keys" : ["setting1", "setting2"] }, "section2" : { "type" : "section", "title" : "2nd section", "keys" : ["setting3", "setting4"] }, "section3" : { "type" : "section", "title" : "3rd section", "keys" : ["setting5", "setting6"] }, "section4" : { "type" : "section", "title" : "4th section", "keys" : ["setting7", "setting8"] } } All settings (here "setting1" to "setting8") must be defined after the layout definition. { "customLayout" : { "type" : "layout", [...] }, "setting1" : { [...] }, [...] "setting8" : { [...] } } New in Cinnamon 3.2 Other settings types keybinding type: should be keybinding default: default keybinding string - i.e. <Control>F8 or other string parseable by gtk_accelerator_parse. description: String describing the setting An input that allows you to select a keybinding for an action. generic type: should be generic default: default value A generic storage object for any type of value. This is generally intended for internal settings that won't be adjusted by the user. For example, a history, or most recent command. There is no corresponding widget for it in Cinnamon Settings. label type: should be label description: String to display as a label A non-setting widget, this provides a label for making a note or describing something. Unlike a header which is bold-faced to stand out, a label is formatted just like the description of most of the other setting types. New in Cinnamon 2.6 button type: should be button description: Label for the button callback: string of callback method name (no "this", just "myFunc") A non-setting widget, this provides a button, which, when clicked, activates the callback method in your applet, desklet, or extension. The callback value should be a string of the method name only. For instance, to call this.myCallback(), you would put myCallback for the callback value. Note: for an applet or desklet, the callback function must be a method of the applet or desklet object. For an extension, it can be a method of any object, but that object must be returned from the enabled() function of your extension in order for it to work. list type: should be list description: (optional) String to describe the setting columns: Array of objects specifying the columns in the list widget default: default value show-buttons: (optional) Whether to show the action buttons below the list (true by default) This widget provides a list with columns, and rows which can be created, edited, deleted and reordered. The columns in the list are specified by the columns property. All columns have the following properties: id: a unique string for identifying the column title: the title that will be displayed in the column header type: the data type for the column default: (optional) a default value for the column when a new row is being created. This will only be used to auto-populate the corresponding widget when it is first generated in the add row dialog. If this property is omitted, the default will be determined by the widget. options: (optional) A list of acceptable values for that column. Either an array or an object with key value pairs may be used. If an object is given, the key is displayed as the text of the widget, and must be a string; the value must match the data type of the column (ie. string, integer, boolean, etc). align: (optional) A number between 0 and 1 indicating how the value should be aligned with respect to the column in which it is displayed. 0 aligns to the left of the cell, 1 to the right, and 0.5 in the center. (New in Cinnamon 4.2) The column type determines the type of data that will be stored. When the user presses the add or edit button, a dialog is generated with a widget for each column definition. Starting in Cinnamon 3.8, if the options property is given, the widget will be a combo box. Otherwise the widget will be determined by the data type of the column as listed below. These widgets act just like the corresponding widgets in this document, and all the same properties can be included in the column definition, with the exception of description and type. The following types are currently available: string: this type stores data as a string. An entry is generated in the add/edit dialog. The default value for new entries is an empty string unless specified with the default property. file: this type stores data as a string. A filechooser is generated in the add/edit dialog. The default value for new entries is an empty string unless specified with the default property. integer: this type stores data as an integer. A spinbutton is generated in the add/edit dialog. The default value for new entries is 0 unless specified with the default property. float: this type stores data as a floating point number. A spinbutton is generated in the add/edit dialog. The default value for new entries is 0.0 unless specified with the default property. boolean: this type stores data as a boolean. A switch is generated in the add/edit dialog. The default value for new entries is false unless specified with the default property. The values are stored as an array of objects where each object in the array corresponds to a row in the list, and each entry in the row object is a key:value pair where the key being the column id of the column to which the value corresponds. For an example of how to use this widget, see the settings example applet that is included with Cinnamon. The source code for it can be found in /usr/share/cinnamon/applets/settings-example@cinnamon.org Note: For appearance, it is recommended that you do not use the description property of this setting, but rather place it in it's own section. New in Cinnamon 3.4 Deprecated settings types Please do not use the following settings types in new code. They may be removed in future versions. checkbox type: should be checkbox default: true or false (no quotes) description: String describing the setting Formerly generating a checkbox widget, this widget type now functions exactly like the switch settings type. Deprecated since Cinnamon 3.2 radiogroup type: should be radiogroup default: default value from the list of options, or it can be a custom value if custom is defined description: String describing the setting options: node of desc:val pair options, where desc is the displayed option name, val is the stored value Formerly generating a series of radio buttons this widget now functions exactly like the combobox settings type. Deprecated since Cinnamon 3.2 header type: should be header description: String to display as a bold header A non-setting widget, it formerly generated a bold-faced label for assisting in organizing your settings. It now functions exactly like the section type. Deprecated since Cinnamon 3.2 separator type: should be separator A non-setting widget, it formerly drew a horizontal separator for assisting in organizing your settings. It currently is ignored. It is recommended that you use sections instead. Deprecated since Cinnamon 3.2 Additional setting options Additional Setting Options These fields can be added to any widget: dependency: Shows or hides the settings widget based on the value of another key in the settings-schema file. There are several possible values for this option: The most common value for this option is simply the key of the setting you wish to depend on. This is most useful for depending on a boolean setting such as a switch. This will make your setting hide if the key you're depending on is false, and show it when the key is true. If you wish to 'invert' the dependence you can precede the key with a !. This will make your setting hide if the key you're depending on is true, and show it when the key is false. For non-boolean values, you can use a simple expression of the form my-key=value where my-key is the key you're depending on, and value is the value that wish to compare to. In addition to '=' you can also use '<', '<=', '>', '>=', and '!='. In addition to settings widgets, a dependency can also be added to a section to show or hide the section and all it's widgets. This works with or without the layout item. New in Cinnamon 3.8. tooltip: Adds a popup tooltip to the widget indent: true: Indent the widget in the settings page to help with organizing your layout. Note: this key has been deprecated since Cinnamon 3.2 and will be ignored. Signals <code>settings-changed</code> Signal when the underlying config file has changed and the in-memory values have been updated. <code>changed::<key></code> Signals when key has changed in the configuration file. Use this in conjunction with getValue if you want to handle your own updating in a more traditional way (like gsettings). The callback function will be called with three parameters: settingProvider, oldval, newval, which are, respectively, the settings object (which you usually don't need), the original value and the updated value. Additional options in metadata.json You can add the following items to metadata.json to affect how the settings are presented to the user: hide-configuration: Hides the configure button in Cinnamon Settings. Set to true if you are using only generic-type settings that should be hidden from the user. This is not a mandatory key. Omitting it will allow the configuration button to hide or display depending on whether you are utilizing the settings API or not. external-configuration-app: Allows you to define an external settings app to use instead of the built-in settings GUI. This should be a string with the name of your executable settings app (path relative to the applet's install directory). Note, this key can be overridden by the hide-configuration key. This is not a mandatory key. Omitting it will allow the configuration button to hide or display depending on whether you are utilizing the settings API or not. Accessing the settings window from command-line You can access the settings with one of the following commands: xlet-settings <type> <uuid> <instanceid> xlet-settings <type> <uuid> -i <instanceid> -t <tabnumber> Where type is applet, desklet or extension depending on what type it is. The instanceid is optional. The tabnumber is optional and designates the tab (or page) you want to access; the tabs are numbered from 0 to number of tabs - 1. The second command is new in Cinnamon 4.2. cinnamon-6.6.8/docs/reference/cinnamon-tutorials/xlet-settings.xml0000664000175000017500000003110215167446463024346 0ustar fabiofabio Applet, desklet and extension settings Introduction Once you have written an applet, desklet or extension you will often find that you want to offer some configuration options to your users. Fortunately, Cinnamon provides an easy-to use API to do just that. In this tutorial, we will go over the ins and outs of the settings API. Overview Part of the API for applet settings is an automatically generated settings window for user configuration. This means that you will not have to worry about building the application, the settings widgets, or the back-end that notifies your applet when something changes. Because of this, there are really only two things that you will have to worry about: defining the settings, and using them in your applet. The settings-schema.json file The first thing you will need to do is create a file named settings-schema.json in your applet directory. This file is where you will define all your settings. It is also the place where the API will go to figure out how to generate the settings window. We will talk about some of the more advanced options we can use in this file later, but for now we will keep it simple. Let's suppose we want to define two settings which will allow the user to configure the width and height of our applet. In that case our settings-schema.json file might look something like this: { "width": { "type" : "scale", "default" : 50, "min" : 10, "max" : 400, "step" : 1, "description" : "Width of the applet in pixels" }, "height": { "type" : "scale", "default" : 50, "min" : 10, "max" : 400, "step" : 1, "description" : "Height of the applet in pixels" } } The first thing you will need is the outer brackets {}. All of your settings will be placed inside these brackets. If you have more than one, they must be separated with commas, just like a javascript object. Each setting consists of a key, followed by a colon, and then the definition in it's own set of brackets. The purpose of the key is to identify which setting is being referenced. The key can be whatever you want, but it must be unique. So, for example, we could just as easily use "John" and "Fred" for our keys instead of "height" and "width", or "height1" and "height2", but we could not call them both "height". Each definition contains it's own set of key/value pairs. The keys we include in each definition will vary depending on the type of setting we use, but there are a few that are always or almost always used: type: This defines what type of setting, widget, or layout element you are defining. This is always required. default: Every key that stores a setting must specify a default value. Unless you are using a non-setting type, you must include this. It is your responsibility to make sure this value is supported by the setting type. description: Any type that will show up in the settings window needs a description to specify the text that will appear. For settings, this will describe the purpose For a complete list of all settings types and the keys they require, see the page. Using the settings in your applet Now that you have your settings defined in settings-schema.json, you will need to set up your applet to use them. The first thing you will need to do is import the settings library. To do so, simply place the following line with the other imports at the beginning of your file: const Settings = imports.ui.settings; Now you will need to initialize the settings provider. It is recommended that you do this early in the _init function of your applet, since you can't use any of the settings until the provider is initialized. We do this by using the AppletSettings class as follows: this.settings = new Settings.AppletSettings(bindObject, uuid, instanceId); Now let's take a look at these arguments and what they do. bindObject: This is an object (usually the applet itself though it can be anything you want) to which the settings will be bound by default. We'll talk about the ins and outs of bindings later, but for now, suffice it to say that they allow you to access the value directly from the bind object without having to make a call to the settings provider. uuid: This is your applet uuid. It can be obtained from the metadata, which is passed as the first argument in the main function of your applet, or you can hard-code it directly with a string. This is needed so that the settings provider can find the settings-schema.json file you created earlier. instanceId: This is the unique identifier that represents a particular instance of the applet. It is passed to the main function as the fourth argument. This is what the settings provider will use to differentiate the settings of one instance of the applet from another. Note: you will want to save a reference to your settings provider as we did above. This is what you will use to access and change your settings. Now that you've initialized the settings provider, you're ready to start accessing your settings so you can use them in your applet. Accessing your settings in your applet There are three different ways you can interface with the settings provider to access and change your settings: Getters and Setters The settings provider has methods for getting and setting values directly. In our example above, if we want to set the applet height when we first load the applet, we could do something like this.actor.set_height(this.settings.getValue("height")); This is useful for setting the initial state, but we probably want to update the height of our applet if the user changes the height in settings. In that case we would either have to poll the settings frequently to see if anything changed (very costly in resources), or else find another way to interface with the settings provider. Connecting to signals Fortunately, the next interface method allows us to react when the setting changes. The are two different types of signals that the provider emits. One is a generic changed signal that is emitted by any key that's changed. The other is only emitted when a particular setting is changed, and has a signal name of "changed::" followed by the key name. Now lets suppose that we write a function to update the applet height, and we want to call it every time the user changes the height setting. We would include a line like this.settings.connect("changed::height", Lang.bind(this, this.setAppletHeight)); Binding your settings Often we want to be able to both access the setting and react to changes. Binding is our third method for interfacing with the settings, and provides us an easy way to do both at once. Because of it's versatility, this is generally the method you will use. The settings provider offers several methods for binding a setting, but for this tutorial we will only use bind as it is sufficient for almost all situations. In our example it would look something like this: this.settings.bind("height", "appletHeight", this.setAppletHeight); Now lets take a close look at what's happening here. The first argument is of course the name of the key in your settings-schema.json file. The third argument is a callback function which, like before, is called whenever the value changes. You don't need to pass a callback, but you wont be able to react to changes if you don't. However, it's the second argument that makes bindings so powerful. During the binding process, a new property is created on the bindObject. The bindObject is usually the one we passed to the provider when we initialized it, but there is now a bind function that will allow us to bind to something else if we want. The property can be used just like any variable, but it always reflects the current value of the settings, and if you assign a value to it, it will update the settings accordingly. This means that we can do things like this: this.settings.bind("height", "appletHeight", this.setAppletHeight); this.actor.set_height(this.height); this.height = 100; //now our height is 100 Overrides As of Cinnamon 4.4, it is now possible to override individual settings and their properties. This is to allow distributions to make changes that help cinnamon feel more 'at home' in that distribution, such as default icons, strings, etc. To create an override, place a file called settings-override.json, in the folder of the applet, desklet or extension you wish to override. This file will have the same format as settings-schema.json, but you only need to include the settings you wish to override. Note: the settings need to have the same settings 'key' as the one you're overriding - otherwise it will add a new, unused setting rather than replacing the old. If you would just like to add or replace one or two properties, there is an additional option as well. In the settings key, include the property override-prop (it's value can be anything - even false), and it will use the original setting definition and only add or change the properties you define. This is particularly useful if you want to change a default, add a tooltip, or other minor changes like that. Tip: If you wish to remove a setting, you can do that too! Because the applet almost certainly relies on there being a value for that setting, you will need to replace it, rather than removing it completely. All you need to do, is redefine the setting with a type of generic. Be sure to also define the default property. Please note that if a user already has a value set that is not the default, it will continue to use the old value rather than the default, but the user will no longer be able to set it. More information The available settings items and widgets can be found an the , alongside with some extra options. The settings objects themselves are Settings.AppletSettings, Settings.DeskletSettings and Settings.ExtensionSettings, which all inherit Settings._provider. Most useful functions will be found inside the _provider object. cinnamon-6.6.8/docs/reference/cinnamon-tutorials/xlet-translating.xml0000664000175000017500000001407715167446463025050 0ustar fabiofabio ]> Translating applets Prepare translation function Make sure the following two lines are imported in your applet.js file: const GLib = imports.gi.GLib; const Gettext = imports.gettext; Add the following lines to your applet before function MyApplet(...): // l10n/translation support const UUID = "yourApplet@You"; Gettext.bindtextdomain(UUID, GLib.get_home_dir() + "/.local/share/locale"); function _(str) { return Gettext.dgettext(UUID, str); } function MyApplet(metadata, orientation, panelHeight, instance_id) { ...... And don't forget to change the const UUID above to your applets UUID. Prepare translatable strings Every String in applet.js you want to be translated, needs to be put in brackets with underscore _(""), for example _("This is a text, which needs to be translated") Create translation template for the first time Create a directory called po in the directory of your applet, where the metadata.json file is saved. Open a terminal in the directory where the metadata.json file is saved. Type in the command cinnamon-xlet-makepot The command creates a translation template file yourApplet.pot in the po directory. Create a translation for the first time with the application Poedit Install the program "Poedit": sudo apt install poedit Open Poedit and click on Create new translation. Open the file yourApplet.pot. Once the file is loaded, Poedit will ask you to choose a language for the translation. At this point, the .po file can be saved and the name will automatically reflect the locale code. Poedit usage is pretty much straight forward: There is the Source text box that contains the string to be translated (usually in English). There is the Translation box that will contain the translated text. If there is a .mo file saved, when you save your .po file, the .mo file should be deleted. You could also disable MO files creation from Poedit preferences (go to Edit > Preferences > General tab and uncheck the option called Automatically compile MO file when saving). Update an existing translation template Open a terminal in the directory where the metadata.json file is saved. Type in the command cinnamon-xlet-makepot The command overwrites yours translation template file yourApplet.pot in the po directory. Updating an existing translation file Open the .po file with Poedit. Go to the menu Catalog and choose the Update from POT file... menu item. Select yourApplet.pot file from which your .po file was based on. Translate the new untranslated strings and save the changes. Testing your translations The translations will be installed automatically, when the applet is installed through System Settings > Applets > Applet available (online). If you have installed your applet manually and you want to test your translations: Open a terminal in the directory where the metadata.json file is saved. Type in the command cinnamon-xlet-makepot -i to install the existing translations (i.e. the .po files) Restart Cinnamon: CTRL+ALT+ESC If you want to remove your translations manually: Open a terminal in the directory where the metadata.json file is saved. Type in the command cinnamon-xlet-makepot -r to remove the installed translations. Restart Cinnamon: CTRL+ALT+ESC cinnamon-6.6.8/docs/reference/cinnamon-tutorials/xlet-versioning.xml0000664000175000017500000000557615167446463024711 0ustar fabiofabio ]> Supporting multiple versions With a new version of Cinnamon coming out every 6 months, there might be some cool new feature you want to use in your applet. However, you also don't want to leave out the poor users using the older versions of Cinnamon. Alternatively, when a new version of Cinnamon comes out, your extension is no longer compatible with it. Updating it would, again, leave out the users running older Cinnamons. Here extension versioning comes to the rescue. As of Cinnamon 2.6, it is possible to ship different versions of your extension for different versions of Cinnamon. Here "extension" will refer to all extensions, applets and desklets. The different versions should be put in different subdirectories. For example, the version for 2.6 should be put in extension@uuid/2.6/. The contents in 2.6/ should be exactly what you will normally put in extension@uuid/, apart from metadata.json, which should always be put in the parent directory, ie. extension@uuid/. You do not need to create a subdirectory for every single Cinnamon version out there. Cinnamon looks for the most recent subdirectory that is not newer than the running Cinnamon version. For example, if you are running 2.6 and there are 2.4, 2.8 directories, the 2.4 directory will be loaded, until the you upgrade to 2.8 in which case the 2.8 directory will be used. Minor version numbers can also be used, eg. 2.6.4, and are sorted accordingly. If no suitable directory is found, then the contents in extension@uuid/ will be loaded. Note that Cinnamon versions prior to 2.6 will not understand this directory magic, and will always try to load the contents in extension@uuid/. Hence it is suggested that extension maintainers put the version for 2.4 in extension@uuid, and create new directories if changes specific to newer Cinnamon versions are made. Don't make a new directory whenever a Cinnamon version is out since it is just a waste of space (and maintenance effort). Note that this also allows you to support future versions of Cinnamon. For example, if you see a cool feature in the development branch of Cinnamon, you can modify your code and put it in the 2.6 folder (assuming the current version is 2.4). Then once the user upgrades their Cinnamon version, the new code will be used instead. This also allows extensions to be smoothly upgraded between versions. cinnamon-6.6.8/docs/reference/cinnamon/0000775000175000017500000000000015167446463016771 5ustar fabiofabiocinnamon-6.6.8/docs/reference/cinnamon/cinnamon-docs.sgml0000664000175000017500000000370315167446463022410 0ustar fabiofabio ]> Cinnamon Reference Manual This document is for Cinnamon &version;. Actors Application tracking Search Tray Icons Integration helpers and utilities Object Hierarchy API Index Index of deprecated API cinnamon-6.6.8/docs/reference/cinnamon/meson.build0000664000175000017500000000136515167446463021140 0ustar fabiofabioignore = [ 'cinnamon-recorder-src.h', 'cinnamon-recorder.h', st_headers, st_private_headers, tray_headers, sniffer_headers, ] if not internal_nm_agent ignore += 'cinnamon-network-agent.h' endif if not get_option('build_recorder') ignore += 'cinnamon-recorder.h' endif gnome.gtkdoc( 'cinnamon', mode: 'xml', main_xml: 'cinnamon-docs.sgml', gobject_typesfile: 'cinnamon.types', dependencies: [libcinnamon_deps, st_dep, cinnamon_dep], src_dir: [ join_paths(meson.project_source_root(), 'src'), join_paths(meson.project_build_root(), 'src'), ], scan_args: '--rebuild-types', mkdb_args: ['--xml-mode', '--output-format=xml'], ignore_headers: ignore, install: true, ) cinnamon-6.6.8/docs/reference/meson.build0000664000175000017500000000052115167446463017327 0ustar fabiofabioif get_option('docs') version_conf = configuration_data() version_conf.set('VERSION', version) configure_file( input: 'version.xml.in', output: 'version.xml', configuration: version_conf, ) subdir('cinnamon') subdir('cinnamon-js') subdir('cinnamon-tutorials') subdir('st') endif cinnamon-6.6.8/docs/reference/st/0000775000175000017500000000000015167446463015615 5ustar fabiofabiocinnamon-6.6.8/docs/reference/st/cinnamon-st-docs.sgml0000664000175000017500000000413615167446463021661 0ustar fabiofabio ]> Cinnamon St Reference Manual This document is for Cinnamon &version;. API reference Abstract classes and Interfaces Widgets Containers Styling Object Hierarchy API Index Index of deprecated API cinnamon-6.6.8/docs/reference/st/meson.build0000664000175000017500000000070715167446463017763 0ustar fabiofabiognome.gtkdoc( 'cinnamon-st', mode: 'xml', main_xml: 'cinnamon-st-docs.sgml', gobject_typesfile: 'cinnamon-st.types', dependencies: [st_dep], src_dir: [ join_paths(meson.project_source_root(), 'src', 'st'), join_paths(meson.project_build_root(), 'src', 'st'), ], scan_args: '--rebuild-types', mkdb_args: ['--xml-mode', '--output-format=xml'], ignore_headers: st_private_headers, install: true, ) cinnamon-6.6.8/docs/reference/version.xml.in0000664000175000017500000000001215167446463017774 0ustar fabiofabio@VERSION@ cinnamon-6.6.8/docs/search-providers-examples/0000775000175000017500000000000015167446463020325 5ustar fabiofabiocinnamon-6.6.8/docs/search-providers-examples/apt@cinnamon.org/0000775000175000017500000000000015167446463023522 5ustar fabiofabiocinnamon-6.6.8/docs/search-providers-examples/apt@cinnamon.org/metadata.json0000664000175000017500000000017715167446463026202 0ustar fabiofabio{ "description": "Provides packages search results", "uuid": "apt@cinnamon.org", "name": "APT search provider" } cinnamon-6.6.8/docs/search-providers-examples/apt@cinnamon.org/search_provider.js0000664000175000017500000000156015167446463027241 0ustar fabiofabioconst Util = imports.misc.util; const Cinnamon = imports.gi.Cinnamon; const SearchProviderManager = imports.ui.searchProviderManager; const Lang = imports.lang; var default_icon_app = Cinnamon.AppSystem.get_default().lookup_app("mintinstall.desktop"); var current_pattern; function dbus_push_results(results, pattern) { if (pattern == current_pattern) { results = JSON.parse(results); for (var i in results) { results[i].icon_app = default_icon_app; } send_results(results); } } function perform_search(pattern) { current_pattern = pattern; Util.spawn_async(['python', SearchProviderManager.extensionMeta['apt@cinnamon.org'].path + '/search_provider.py', pattern], Lang.bind(this, dbus_push_results, pattern)); } function on_result_selected(result){ Util.spawn(['xdg-open', 'apt://' + result.id]); } cinnamon-6.6.8/docs/search-providers-examples/apt@cinnamon.org/search_provider.py0000664000175000017500000000101115167446463027244 0ustar fabiofabio# -*- coding=utf-8 -*- import subprocess import sys import gettext import json gettext.install("cinnamon", "/usr/share/locale") if __name__ == "__main__": results = [] packages = subprocess.check_output(["apt-cache", "search"] + sys.argv[1].split(" ")).splitlines()[:10] for p in packages: i = p.index(" - ") name = p[:i] description = p[i+3:] results.append({'id': name, 'label': _("Install package : ") + name, 'description': description}) print(json.dumps(results)) cinnamon-6.6.8/docs/search-providers-examples/calc@cinnamon.org/0000775000175000017500000000000015167446463023640 5ustar fabiofabiocinnamon-6.6.8/docs/search-providers-examples/calc@cinnamon.org/metadata.json0000664000175000017500000000021315167446463026307 0ustar fabiofabio{ "description": "Solves basic mathematical operations", "uuid": "calc@cinnamon.org", "name": "Calculator Search Provider" } cinnamon-6.6.8/docs/search-providers-examples/calc@cinnamon.org/search_provider.js0000664000175000017500000000203315167446463027353 0ustar fabiofabioconst Cinnamon = imports.gi.Cinnamon; const St = imports.gi.St; function perform_search(pattern){ /* Test for numbers and operators and make sure it does not end with an operator, as that is not a valid operation */ if (/^[0-9.+*/()-]+[0-9\)]$/.test(pattern)) { let solution = 0; try { solution = eval(pattern); }catch(err){} let awns = (Math.round(solution * 10000) / 10000).toString(); if (awns != pattern) { let default_icon_app = Cinnamon.AppSystem.get_default().lookup_app("org.gnome.Calculator.desktop"); let result = { id: awns, label: _("Solution: %s").format(awns), icon_app: default_icon_app }; send_results([result]); } } } function on_result_selected (result) { let awns = result.id; copy_to_clipboard(awns); } function copy_to_clipboard (str) { let clipboard = St.Clipboard.get_default() clipboard.set_text(St.ClipboardType.CLIPBOARD, str); } cinnamon-6.6.8/docs/search-providers-examples/chromium-history@cinnamon.org/0000775000175000017500000000000015167446463026260 5ustar fabiofabiocinnamon-6.6.8/docs/search-providers-examples/chromium-history@cinnamon.org/metadata.json0000664000175000017500000000017115167446463030732 0ustar fabiofabio{ "description": "Chromium history", "uuid": "chromium-history@cinnamon.org", "name": "Chromium history" } cinnamon-6.6.8/docs/search-providers-examples/chromium-history@cinnamon.org/search_provider.js0000664000175000017500000000212115167446463031771 0ustar fabiofabioconst Mainloop = imports.mainloop; const Gio = imports.gi.Gio; const GLib = imports.gi.GLib; const Lang = imports.lang; const Util = imports.misc.util; const Cinnamon = imports.gi.Cinnamon; const SearchProviderManager = imports.ui.searchProviderManager; const MAX_SEARCH_RESULTS = 10; var default_icon_app = Cinnamon.AppSystem.get_default().lookup_app("chromium-browser.desktop"); var current_pattern; function dbus_push_results(results, pattern) { var basename; if (pattern == current_pattern) { results = JSON.parse(results); for (var i in results) { if (!results[i].icon_filename) { results[i].icon_app = default_icon_app; } } send_results(results); } } function perform_search(pattern){ current_pattern = pattern; Util.spawn_async(['python', SearchProviderManager.extensionMeta['chromium-history@cinnamon.org'].path + '/search_provider.py', pattern], Lang.bind(this, dbus_push_results, pattern)); } function on_result_selected(result){ Util.spawn(['xdg-open', result.url]); } cinnamon-6.6.8/docs/search-providers-examples/chromium-history@cinnamon.org/search_provider.py0000664000175000017500000000527115167446463032016 0ustar fabiofabio#! /usr/bin/python3 # -*- coding=utf-8 -*- import os import sys import tempfile import shutil import sqlite3 import json import urllib.parse import subprocess FAVICON_CACHE_DIR = os.path.join(os.path.split(__file__)[0], "favicon_cache") if __name__ == "__main__": if len(sys.argv) > 1: fd, temp_filename = tempfile.mkstemp() os.close(fd) shutil.copyfile(os.path.join(os.getenv("HOME"), ".config", "chromium", "Default", "History"), temp_filename) conn = sqlite3.Connection(temp_filename) cur = conn.cursor() words = [] for i in sys.argv[1:]: words += i.split() query = "SELECT url, title FROM urls WHERE " + " AND ".join(len(words) * ["(url LIKE ? OR title LIKE ?)"]) + " ORDER BY last_visit_time DESC, visit_count DESC LIMIT 10" params = [] for word in words: params.append("%" + word + "%") params.append("%" + word + "%") cur.execute(query, tuple(params)) results = [] domains_list = [] for url, title in cur.fetchall(): url_parsed = urllib.parse.urlparse(url) domain = url_parsed.scheme + '://' + url_parsed.netloc if domain not in domains_list: domains_list.append(domain) if url and title: results.append({ "id": url, "url": url, "domain": domain, "description": url, "label": title }) cur.close() os.unlink(temp_filename) if not os.path.exists(FAVICON_CACHE_DIR): os.mkdir(FAVICON_CACHE_DIR) fd, temp_filename = tempfile.mkstemp() os.close(fd) shutil.copyfile(os.path.join(os.getenv("HOME"), ".config", "chromium", "Default", "Favicons"), temp_filename) conn = sqlite3.Connection(temp_filename) cur = conn.cursor() domains_to_favicons = {} for domain in domains_list: cur.execute("SELECT id, url FROM favicons WHERE url LIKE ?", [domain + "%"]) for favicon_id, url in cur.fetchall(): filename = os.path.join(FAVICON_CACHE_DIR, str(favicon_id)) if not os.path.exists(filename): subprocess.check_call(['wget', '-O', filename, url]) if os.path.exists(filename): domains_to_favicons[domain] = filename cur.close() os.unlink(temp_filename) for i in range(len(results)): if results[i]['domain'] in domains_to_favicons: results[i]['icon_filename'] = domains_to_favicons[results[i]['domain']] print(json.dumps(results)) cinnamon-6.6.8/docs/search-providers-examples/trackerprovider@cinnamon.org/0000775000175000017500000000000015167446463026144 5ustar fabiofabiocinnamon-6.6.8/docs/search-providers-examples/trackerprovider@cinnamon.org/metadata.json0000664000175000017500000000017215167446463030617 0ustar fabiofabio{ "description": "Search using tracker", "uuid": "trackerprovider@cinnamon.org", "name": "Tracker search" } cinnamon-6.6.8/docs/search-providers-examples/trackerprovider@cinnamon.org/search_provider.js0000664000175000017500000000471215167446463031665 0ustar fabiofabioconst Lang = imports.lang; const Util = imports.misc.util; const Cinnamon = imports.gi.Cinnamon; const SearchProviderManager = imports.ui.searchProviderManager; var current_pattern; function dbus_push_results(results, pattern) { var basename; var final_results = new Array(); if (pattern == current_pattern) { try{ results = JSON.parse(results); for (var i in results) { switch (results[i].type) { case "music": basename = results[i]["url"].split("/"); basename = decodeURIComponent(basename[basename.length - 1]); results[i]["performer"] = decodeURIComponent(results[i]["performer"]).substring(11); results[i]["musicAlbum"] = decodeURIComponent(results[i]["musicAlbum"]).substring(10); results[i].label = (results[i]["performer"] ? results[i]["performer"] + " - " : "") + (results[i]["musicAlbum"] ? results[i]["musicAlbum"] + " - " : "") + (results[i]["trackNumber"] ? results[i]["trackNumber"] + " - " : "") + (results[i]["title"] ? results[i]["title"] : basename); break; case "software": var results_parts = results[i]["url"].split("/"); var app = Cinnamon.AppSystem.get_default().lookup_app(results_parts[results_parts.length - 1].split(".desktop")[0] + ".desktop"); if (!app) { continue; } results[i].label = app.get_name(); results[i].icon_app = app; break; default: results[i].label = (decodeURIComponent(results[i]["url"])).split("/").pop(); break; } final_results.push(results[i]); } send_results(results); } catch(e) { global.logError(e); } } } function perform_search(pattern) { current_pattern = pattern; Util.spawn_async(['python', SearchProviderManager.extensionMeta['trackerprovider@cinnamon.org'].path + '/search_provider.py', pattern], Lang.bind(this, dbus_push_results, pattern)); } function on_result_selected(result){ Util.spawn(['xdg-open', result.url]); } cinnamon-6.6.8/docs/search-providers-examples/trackerprovider@cinnamon.org/search_provider.py0000664000175000017500000000475715167446463031712 0ustar fabiofabio# -*- coding=utf-8 -*- import sys import gettext import json from gi.repository import Tracker gettext.install("cinnamon", "/usr/share/locale") CONVERT_TYPES = { "http://www.tracker-project.org/temp/nmm#MusicPiece": "music", "http://www.tracker-project.org/temp/nmm#Video": "videos", "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#SoftwareApplication": "software", "http://www.tracker-project.org/temp/nmm#Photo": "pictures", "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#Folder": "folders", "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#FileDataObject": "files" } if __name__ == "__main__": results = {} conn = Tracker.SparqlConnection.get() words = sys.argv[1].split(" ") query_params = [] for i in words: if i: if i[0] == '"' and i[-1] == '"': query_params.append("?s fts:match \"" + Tracker.sparql_escape_string(i[1:-1]) + "\"") else: query_params.append("?s fts:match \"" + Tracker.sparql_escape_string(i) + "*\"") query = """SELECT ?s nie:url(?s) nmm:musicAlbum(?s) nmm:performer(?s) nmm:trackNumber(?s) nie:title(?s) nie:mimeType(?s) rdf:type(?s) WHERE { """ + " . ".join(query_params) + """ } ORDER BY DESC (fts:rank(?s)) LIMIT 100""" cursor = conn.query(query) while cursor.next(): defined_type = None if not cursor.get_string(7)[0] or not cursor.get_string(1)[0]: #If we have no defined file type or no file url, skip continue result_types = cursor.get_string(7)[0].split(",") while len(result_types) > 0 and defined_type is None: t = result_types.pop() if t in CONVERT_TYPES: defined_type = CONVERT_TYPES[t] if defined_type is None: defined_type = "files" if len(results.setdefault(defined_type, [])) < 10: results.setdefault(defined_type, []).append({ "id": cursor.get_string(0)[0], "url": cursor.get_string(1)[0], "musicAlbum": cursor.get_string(2)[0], "performer": cursor.get_string(3)[0], "trackNumber": cursor.get_string(4)[0], "title": cursor.get_string(5)[0], "mimeType": cursor.get_string(6)[0], "type": defined_type }) final_results = [] for i in results: final_results += results[i] print(json.dumps(final_results)) cinnamon-6.6.8/docs/search-providers-examples/wikipedia@cinnamon.org/0000775000175000017500000000000015167446463024704 5ustar fabiofabiocinnamon-6.6.8/docs/search-providers-examples/wikipedia@cinnamon.org/metadata.json0000664000175000017500000000045515167446463027363 0ustar fabiofabio{ "description": "Wikipedia", "uuid": "wikipedia@cinnamon.org", "name": "Wikipedia", "supported_locales": ["en"], "locale_data": { "wikipedia_url": { "en": "https://en.wikipedia.org/w/api.php?action=opensearch&search=%s&format=json&limit=5" } } } cinnamon-6.6.8/docs/search-providers-examples/wikipedia@cinnamon.org/search_provider.js0000664000175000017500000000441715167446463030427 0ustar fabiofabioconst Mainloop = imports.mainloop; const Cinnamon = imports.gi.Cinnamon; const Gio = imports.gi.Gio; const St = imports.gi.St; const Util = imports.misc.util; const Lang = imports.lang; const Soup = imports.gi.Soup; const _httpSession = new Soup.SessionAsync(); Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault()); var results_cache = {}; var last_search; var wikipedia_icon_file = Gio.file_new_for_path('/usr/share/icons/Mint-X/apps/22/wikipedia.png'); var wikipedia_gicon = new Gio.FileIcon({ file: wikipedia_icon_file }); function perform_search(pattern){ try{ if (results_cache[pattern]) { last_search = ''; push_results(results_cache[pattern]); }else{ last_search = pattern; let message = Soup.Message.new('GET', get_locale_string("wikipedia_url").replace("%s", pattern)); _httpSession.queue_message(message, Lang.bind(this, function (session, message, p) { try{ if (p != last_search) return; if( message.status_code == 200) { var results = JSON.parse(message.response_body.data.toString()); let result_titles = results[1]; let result_descriptions = results[2]; let result_urls = results[3]; results_cache[p] = new Array(); for (var i = 0; i < result_urls.length; i++) { results_cache[p].push({ id: result_urls[i], url: result_urls[i], label: result_titles[i], description: result_descriptions[i] }); } push_results(results_cache[p]); } else { global.logWarning("Error retrieving address " + url + ". Status: " + message.status_code + ": " + message.reason_phrase); } }catch(e){global.logError(e);} }, pattern)); } }catch(e){global.logError(e);} } function push_results(results){ for (var i in results) { results[i].icon = new St.Icon({gicon: wikipedia_gicon, icon_size: 22, icon_type: St.IconType.FULLCOLOR, reactive: true, track_hover: true, style_class: 'applet-icon'}); } send_results(results); } function on_result_selected(result){ Util.spawn(['xdg-open', result.url]); } cinnamon-6.6.8/docs/search-providers-examples/yahoo@cinnamon.org/0000775000175000017500000000000015167446463024055 5ustar fabiofabiocinnamon-6.6.8/docs/search-providers-examples/yahoo@cinnamon.org/metadata.json0000664000175000017500000000050415167446463026527 0ustar fabiofabio{ "description": "Yahoo", "uuid": "yahoo@cinnamon.org", "name": "Yahoo", "supported_locales": ["en"], "locale_data": { "yahoo_url": { "en": "https://search.yahoo.com/yhs/search?p=%s&fr=sfp&fr2=&type=__alt__ddc_linuxmint_com&hspart=ddc&hsimp=yhs-linuxmint&iscqry=" } } } cinnamon-6.6.8/docs/search-providers-examples/yahoo@cinnamon.org/search_provider.js0000664000175000017500000000155515167446463027600 0ustar fabiofabioconst Mainloop = imports.mainloop; const Gio = imports.gi.Gio; const St = imports.gi.St; const Util = imports.misc.util; function perform_search(pattern){ push_results(pattern); } function push_results(results){ var file = Gio.file_new_for_path('/usr/share/icons/Mint-X/apps/22/yahoo.png'); var gicon = new Gio.FileIcon({ file: file }); var myicon = new St.Icon({gicon: gicon, icon_size: 22, icon_type: St.IconType.FULLCOLOR, reactive: true, track_hover: true, style_class: 'applet-icon'}); var pattern = results.replace(" ", "+"); var results_array = new Array(); results_array.push({ id: pattern, label: _("Search '" + results + "'"), icon: myicon }); send_results(results_array); } function on_result_selected(result){ Util.spawn(['xdg-open', get_locale_string("yahoo_url").replace("%s", result.id)]); } cinnamon-6.6.8/files/0000775000175000017500000000000015167446463013403 5ustar fabiofabiocinnamon-6.6.8/files/etc/0000775000175000017500000000000015167446463014156 5ustar fabiofabiocinnamon-6.6.8/files/etc/xdg/0000775000175000017500000000000015167446463014740 5ustar fabiofabiocinnamon-6.6.8/files/etc/xdg/menus/0000775000175000017500000000000015167446463016067 5ustar fabiofabiocinnamon-6.6.8/files/etc/xdg/menus/cinnamon-applications.menu0000664000175000017500000001215615167446463023250 0ustar fabiofabio Applications cinnamon-menu-applications.directory Accessories cinnamon-utility.directory Utility Accessibility System Universal Access cinnamon-utility-accessibility.directory Accessibility Settings Development cinnamon-development.directory Development emacs.desktop Education cinnamon-education.directory Education Science Games cinnamon-game.directory Game Graphics cinnamon-graphics.directory Graphics Internet cinnamon-network.directory Network Multimedia cinnamon-audio-video.directory AudioVideo Office cinnamon-office.directory Office Science cinnamon-science.directory Science System cinnamon-system-tools.directory Other cinnamon-other.directory Core Settings Screensaver wine-wine wine-wine.directory Wine Preferences cinnamon-settings.directory Settings System Administration cinnamon-settings-system.directory Settings System System Settings Accessories Education Games Graphics Internet Office Other Development Multimedia System Universal Access wine-wine Preferences Administration cinnamon-6.6.8/files/usr/0000775000175000017500000000000015167446463014214 5ustar fabiofabiocinnamon-6.6.8/files/usr/bin/0000775000175000017500000000000015167446463014764 5ustar fabiofabiocinnamon-6.6.8/files/usr/bin/cinnamon-dbus-command0000775000175000017500000001311615167446463021065 0ustar fabiofabio#!/usr/bin/python3 from gi.repository import GLib, Gio import sys import signal from xml.etree import ElementTree signal.signal(signal.SIGINT, signal.SIG_DFL) class MethodArg: def __init__(self, method, arg_index, arg_type): self.method = method self.arg_index = arg_index self.arg_type = arg_type class CinnamonDBusCommand: def __init__(self, mainloop): self.mainloop = mainloop try: self.cinnamon_proxy = Gio.DBusProxy.new_for_bus_sync(Gio.BusType.SESSION, Gio.DBusProxyFlags.NONE, None, "org.Cinnamon", "/org/Cinnamon", "org.Cinnamon", None) except GLib.Error: self.cinnamon_proxy = None print("Cannot acquire org.Cinnamon proxy") introspection_info = Gio.DBusConnection.call_sync(Gio.bus_get_sync(Gio.BusType.SESSION), "org.Cinnamon", "/org/Cinnamon", "org.freedesktop.DBus.Introspectable", "Introspect", None, GLib.VariantType(type_string="(s)"), 0, -1, None) unpacked = introspection_info.unpack()[0] self.tree = ElementTree.fromstring(unpacked) self.arg_list = [] list_methods = False if len(sys.argv) < 2: list_methods = True print("\nProvide a method name and any parameters. Available commands are:\n") for interface in self.tree: if interface.attrib["name"] == "org.Cinnamon": for entry in interface: if entry.tag != "method": continue arg_str = "" i = 0 for arg in entry: if arg.attrib["direction"] != "in": continue if list_methods: arg_str += "--- %s ('%s') " % (arg.attrib["name"], arg.attrib["type"]) self.arg_list.append(MethodArg(entry.attrib["name"], i, arg.attrib["type"])) i += 1 if list_methods: print("%s %s" % (entry.attrib["name"], arg_str)) if list_methods: print("\nNote: boolean arguments should be specified as 0 (false) and 1 (true)") print("\nAn example is: cinnamon-dbus-command GetMonitorWorkRect 0\n") exit(1) self.parse_command(sys.argv[1:]) def method_call_finished_callback(self, proxy, result, data=None): try: variant = proxy.call_finish(result) print("Returned: %s" % str(variant.unpack())) except GLib.Error as e: print("An error occurred attempting to run the command: %s" % e.message) self.mainloop.quit() def parse_command(self, args): method_name = args[0] parameters = self.build_variant(method_name, args[1:]) try: self.cinnamon_proxy.call(method_name, parameters, 0, -1, None, self.method_call_finished_callback, None) except TypeError as e: print("Could not send command over the bus: %s" % str(e)) exit(1) def build_variant(self, method_name, in_args): parsed_args = [] i = 0 variant_string = "(" while i < len(in_args): arg = in_args[i] arg_info = self.lookup_arg(method_name, i) if arg_info: variant_string += arg_info.arg_type else: print("The parameter '%s' seems invalid for method '%s'" % (arg, method_name)) exit(1) match arg_info.arg_type: case "i" | "u" | "x" | "t" | "q" | "n" | "b": parsed_args.append(int(arg)) case "d": parsed_args.append(float(arg)) case "s" | "o" | "g": parsed_args.append(str(arg)) case _: parsed_args.append(eval(arg)) i += 1 variant_string += ")" print("Parsed: %s(format_string='%s', args=%s)\n" % (method_name, variant_string, parsed_args)) try: variant = GLib.Variant(variant_string, tuple(parsed_args)) except TypeError as e: print("Could not construct argument variant for method: %s" % str(e)) exit(1) return variant def lookup_arg(self, method_name, index): for arg in self.arg_list: if arg.method == method_name and arg.arg_index == index: return arg return None if __name__ == "__main__": ml = GLib.MainLoop.new(None, True) main = CinnamonDBusCommand(ml) ml.run() cinnamon-6.6.8/files/usr/bin/cinnamon-desktop-editor0000775000175000017500000000043715167446463021453 0ustar fabiofabio#!/usr/bin/python3 """ Launch the cinnamon desktop editor utility See cinnamon/cinnamon-desktop-editor/cinnamon-desktop-editor.py for usage info """ import os import sys os.execvp("/usr/share/cinnamon/cinnamon-desktop-editor/cinnamon-desktop-editor.py", (" ",) + tuple(sys.argv[1:])) cinnamon-6.6.8/files/usr/bin/cinnamon-file-dialog0000775000175000017500000000432715167446463020674 0ustar fabiofabio#!/usr/bin/python3 """ Allows you to open a Gtk file dialog from and get the selected file in return Used by a couple of Cinnamon spices via Javascript Usage: cinnamon-file-dialog {0|1|2} -{p|n|d|f} [path] ... """ import sys from setproctitle import setproctitle setproctitle("cinnamon-file-dialog") import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk cancelButton = (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL) typeArg = int(sys.argv[1]) fdType = typeArg % 3 if fdType == 0: msg = "Open" action = Gtk.FileChooserAction.OPEN okButton = (Gtk.STOCK_OPEN, Gtk.ResponseType.OK) elif fdType == 1: msg = "Select Folder" action = Gtk.FileChooserAction.SELECT_FOLDER okButton = (Gtk.STOCK_OPEN, Gtk.ResponseType.OK) elif fdType == 2: msg = "Save" action = Gtk.FileChooserAction.SAVE okButton = (Gtk.STOCK_SAVE, Gtk.ResponseType.OK) buttons = cancelButton + okButton filechooserdialog = Gtk.FileChooserDialog(title=msg, action=action, buttons=buttons) for i in range(2, len(sys.argv)): if sys.argv[i] == "-p": filechooserdialog.set_filename(sys.argv[i + 1]) elif sys.argv[i] == "-n": filechooserdialog.set_current_name(sys.argv[i + 1]) elif sys.argv[i] == "-d": filechooserdialog.set_current_folder(sys.argv[i + 1]) elif sys.argv[i] == "-f": filterList = sys.argv[i + 1].split(",") for filterInfo in filterList: [name, filters] = filterInfo.split(";") filterObj = Gtk.FileFilter() filterObj.set_name(name) rules = filters.split(":") for rule in rules: [ftype, value] = rule.split("=") if ftype == "m": filterObj.add_mime_type(value) elif ftype == "p": filterObj.add_pattern(value) filechooserdialog.add_filter(filterObj) if fdType == 2: filechooserdialog.set_do_overwrite_confirmation(True) if typeArg > 2: filechooserdialog.set_select_multiple(True) response = filechooserdialog.run() if response == Gtk.ResponseType.OK: if typeArg > 2: print(filechooserdialog.get_filenames()) else: print(filechooserdialog.get_filename()) filechooserdialog.destroy() cinnamon-6.6.8/files/usr/bin/cinnamon-hover-click0000775000175000017500000002215215167446463020722 0ustar fabiofabio#! /usr/bin/python3 """ Close dialog spawned by cinnamon (closeDialog.js) that prompts the user to kill a hung window. """ import signal import gettext import gi gi.require_version('Gtk', '3.0') gi.require_version('XApp', '1.0') from gi.repository import GLib, Gtk, Gdk, XApp, Gio signal.signal(signal.SIGINT, signal.SIG_DFL) gettext.install("cinnamon", "/usr/share/locale", names=["ngettext"]) KEY_ACTION = "hoverclick-action" KEY_GEOMETRY = "hoverclick-geometry" KEY_LAYOUT = "hoverclick-layout" class HoverClickWindow(XApp.GtkWindow): def __init__(self): XApp.GtkWindow.__init__(self, type_hint=Gdk.WindowTypeHint.UTILITY) self.set_keep_above(True) self.stick() self.set_title(_("Hover click")) self.set_default_size(1, 1) self.set_icon_name("input-mouse") # default position - utility windows normally spawn at screen 0,0 primary = Gdk.Display.get_default().get_primary_monitor() workarea = primary.get_workarea() self.move(workarea.x + workarea.width / 2, workarea.y + workarea.height / 2) self.orientation = None self.button_style = None self.buttons = [] self.popup = None self.settings = Gio.Settings(schema_id="org.cinnamon") self.mainbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, margin=4) self.add(self.mainbox) self.button_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=4, homogeneous=True) self.mainbox.pack_start(self.button_box, True, True, 0) self.action = self.settings.get_string("hoverclick-action") self.doing_setup = True self.last_button = None self.start_button = None def make_button(label, icon_name, action): button = Gtk.RadioButton(label=label, image=Gtk.Image(icon_name=icon_name, no_show_all=True), image_position=Gtk.PositionType.TOP, relief=Gtk.ReliefStyle.NONE, always_show_image=False, draw_indicator=False) button._saved_label = label if self.action == action: self.start_button = button button.connect("toggled", self.action_changed, action) button.connect("button-press-event", self.on_button_press_event) if self.last_button is not None: button.join_group(self.last_button) else: self.last_button = button self.buttons.append(button) return button self.single_click_button = make_button(_("Single Click"), "cinnamon-hc-single-click", "single") self.button_box.pack_start(self.single_click_button, True, True, 0) self.double_click_button = make_button(_("Double Click"), "cinnamon-hc-double-click", "double") self.button_box.pack_start(self.double_click_button, True, True, 0) self.drag_button = make_button(_("Drag"), "cinnamon-hc-drag-click", "drag") self.button_box.pack_start(self.drag_button, True, True, 0) self.right_click_button = make_button(_("Secondary Click"), "cinnamon-hc-right-click", "secondary") self.button_box.pack_start(self.right_click_button, True, True, 0) if self.start_button is not None: self.start_button.set_active(True) self.update_layout() self.setup_menu() self.position_window() self.doing_setup = False self.show_all() self.settings.connect("changed::hoverclick-layout", self.update_layout) self.settings.connect("changed::hoverclick-action", self.on_action_changed) self.connect("delete-event", self.exit) GLib.unix_signal_add(GLib.PRIORITY_DEFAULT, signal.SIGTERM, self.exit) def action_changed(self, button, action): if self.doing_setup: return if not button.get_active(): return self.settings.set_string("hoverclick-action", action) def on_action_changed(self, settings, key): if self.doing_setup: return action = settings.get_string("hoverclick-action") button_map = { "single": self.single_click_button, "double": self.double_click_button, "drag": self.drag_button, "secondary": self.right_click_button } button = button_map.get(action) if button and not button.get_active(): self.doing_setup = True button.set_active(True) self.doing_setup = False def on_button_press_event(self, button, event): had_button, button = event.get_button() if button == Gdk.BUTTON_SECONDARY: self.menu.popup_at_pointer(event) return Gdk.EVENT_PROPAGATE def update_layout(self, *args): layout = self.settings.get_string("hoverclick-layout") try: orientation, button_style = layout.split("::", maxsplit=2) except Exception as e: print("Could not load user layout from settings: ", e) if orientation != self.orientation: if orientation == "vertical": self.button_box.set_orientation(Gtk.Orientation.VERTICAL) elif orientation == "horizontal": self.button_box.set_orientation(Gtk.Orientation.HORIZONTAL) self.orientation = orientation # snap size self.resize(1, 1) if button_style != self.button_style: if button_style == "icons": self.show_icons(True) self.show_labels(False) elif button_style == "text": self.show_icons(False) self.show_labels(True) else: self.show_icons(True) self.show_labels(True) self.button_style = button_style self.resize(1, 1) def show_icons(self, show): for button in self.buttons: button.set_always_show_image(show) button.get_image().set_visible(show) def show_labels(self, show): for button in self.buttons: # set label doesn't allow None, and will not 'hide' the label if it's only an empty string button.props.label = button._saved_label if show else None def setup_menu(self): self.menu = Gtk.Menu() self.menu.attach_to_widget(self) text = Gtk.RadioMenuItem.new_with_mnemonic(None, _("_Text")) text.props.active = self.button_style == "text" self.menu.append(text) icons = Gtk.RadioMenuItem.new_with_mnemonic(text.get_group(), _("_Icons")) icons.props.active = self.button_style == "icons" self.menu.append(icons) both = Gtk.RadioMenuItem.new_with_mnemonic(text.get_group(), _("_Both")) both.props.active = self.button_style == "both" self.menu.append(both) text.connect("activate", self.change_buttons, "text") icons.connect("activate", self.change_buttons, "icons") both.connect("activate", self.change_buttons, "both") self.menu.append(Gtk.SeparatorMenuItem()) horiz = Gtk.RadioMenuItem.new_with_mnemonic(None, _("_Horizontal")) horiz.props.active = self.orientation == "horizontal" self.menu.append(horiz) vert = Gtk.RadioMenuItem.new_with_mnemonic(horiz.get_group(), _("_Vertical")) vert.props.active = self.orientation == "vertical" self.menu.append(vert) horiz.connect("activate", self.change_orientation, "horizontal") vert.connect("activate", self.change_orientation, "vertical") self.menu.show_all() def change_buttons(self, menu, style): try: orientation, old_style = self.settings.get_string("hoverclick-layout").split("::", maxsplit=2) except Exception as e: print("Could not change user button style: ", e) return if style != old_style: new_layout = "%s::%s" % (orientation, style) self.settings.set_string("hoverclick-layout", new_layout) def change_orientation(self, menu, orientation): try: old_orientation, button_style = self.settings.get_string("hoverclick-layout").split("::", maxsplit=2) except Exception as e: print("Could not change user button style: ", e) return if orientation != old_orientation: new_layout = "%s::%s" % (orientation, button_style) self.settings.set_string("hoverclick-layout", new_layout) def position_window(self): pos_str = self.settings.get_string("hoverclick-position") try: x, y = pos_str.split("::", maxsplit=2) self.move(int(x), int(y)) except: pass def store_position(self): x, y = self.get_position() self.settings.set_string("hoverclick-position", "%d::%d" % (x, y)) def exit(self, *args): self.store_position() self.destroy() Gtk.main_quit() if __name__ == "__main__": window = HoverClickWindow() Gtk.main() # Make sure position is updated Gio.Settings.sync() exit(0) cinnamon-6.6.8/files/usr/bin/cinnamon-install-spice0000775000175000017500000000473215167446463021267 0ustar fabiofabio#!/usr/bin/python3 import sys import os import argparse import gi gi.require_version('Gtk', '3.0') sys.path.append('/usr/share/cinnamon/cinnamon-settings/bin') from Spices import Spice_Harvester USAGE_DESCRIPTION = 'Installs an applet, desklet, extension, or theme from a local folder. Rather than just doing a shallow copy, it will also install translations, schema files (if present) and update the metadata with a timestamp for version comparison.' USAGE_EPILOG = 'This script is designed for developers to test their work. It is recommended that everyone else continue to use cinnamon-settings to install their spices as this script has no safeguards in place to prevent malicious code.' SPICE_TYPES = ['applet', 'desklet', 'extension', 'theme', 'search_provider'] parser = argparse.ArgumentParser(description=USAGE_DESCRIPTION, epilog=USAGE_EPILOG) parser.add_argument('spice_type', type=str, choices=SPICE_TYPES, help='The type of spice you are installing.') parser.add_argument('path', type=str, default=os.getcwd(), nargs='?', help='The path from which you are installing. Default is the current directory.') args = parser.parse_args() source_dir = os.path.abspath(args.path) spice_type = args.spice_type if not os.path.exists(source_dir): print('invalid directory - %s does not exist' % source_dir) quit() uuid = os.path.basename(source_dir) if os.path.exists(os.path.join(source_dir, 'files', uuid)): source_dir = os.path.join(source_dir, 'files', uuid) if spice_type == 'theme': theme_file = os.path.join(source_dir, 'cinnamon/cinnamon.css') if not os.path.exists(theme_file): print('Invalid theme - missing file cinnamon.css') quit() else: # we always need metadata.json as well as the corresponding applet.js, deskelt.js, etc. if not os.path.exists(os.path.join(source_dir, 'metadata.json')): print('Invalid %s - metadata.json not found' % spice_type) quit() if not os.path.exists(os.path.join(source_dir, '%s.js' % spice_type)): # multi-version xlets may not have it in the root directory, so check subdirectories as well found = False for name in os.listdir(source_dir): if os.path.exists(os.path.join(source_dir, name, '%s.js' % spice_type)): found = True break if not found: print('Invalid %s - %s.js not found' % (spice_type, spice_type)) quit() spices = Spice_Harvester(spice_type) spices.install_from_folder(source_dir, uuid) cinnamon-6.6.8/files/usr/bin/cinnamon-json-makepot0000775000175000017500000000206415167446463021123 0ustar fabiofabio#!/usr/bin/python3 """ This script is now just a wrapper around the cinnamon-xlet-makepot utility. It is kept for backwards compatibility as it is currently used by other scripts (notably the cinnamon-spices-makepot script found in the 3rd party spices repos). for usage info type: cinnamon-xlet-makepot -h * Note that the Javascript argument is inverted because previously Javascript files were not scanned by default, but now are. """ import os import sys args = sys.argv[1:] if '-h' in args: print("cinnamon-json-makepot is deprecated - please use cinnamon-xlet-makepot instead\ntype cinnamon-xlet-makepot -h for usage information.") quit() if '-i' not in args and '--install' not in args and \ '-r' not in args and '--remove' not in args: potfile = args.pop() if '-j' in args: args.remove('-j') elif '--js' in args: args.remove('--js') else: args.append('-j') args.append('-o') args.append(potfile) args.append(os.getcwd()) command = 'cinnamon-xlet-makepot' args.insert(0, command) os.execvp(command, args) cinnamon-6.6.8/files/usr/bin/cinnamon-killer-daemon0000775000175000017500000000354415167446463021243 0ustar fabiofabio#!/usr/bin/python3 """ Creates a keybinding that allows cinnamon to be restarted by pressing Ctrl + Alt + Esc, and runs in the background to detect that keybinding """ import os import syslog from setproctitle import setproctitle import gi gi.require_version('Keybinder', '3.0') # noqa gi.require_version('Gtk', '3.0') # noqa from gi.repository import Keybinder from gi.repository import Gtk, Gio SETTINGS_SCHEMA = 'org.cinnamon.desktop.keybindings.media-keys' SETTINGS_KEY = 'restart-cinnamon' class KillerDaemon: def __init__(self): Keybinder.init() self.bindings = None self.settings = Gio.Settings(schema_id=SETTINGS_SCHEMA) self.apply_bindings() self.settings.connect('changed::' + SETTINGS_KEY, self.apply_bindings) def apply_bindings(self, settings=None, key=None): # Ubind the previous bindings try: if self.bindings is not None: for binding in self.bindings: Keybinder.unbind(binding) except Exception as detail: syslog.syslog(detail) # Get the new ones self.bindings = self.settings.get_strv(SETTINGS_KEY) # Bind them try: if self.bindings is not None: for binding in self.bindings: if Keybinder.bind(binding, self.restart_cinnamon, None): syslog.syslog("Bound Cinnamon restart to %s." % binding) except Exception as detail: syslog.syslog(detail) def restart_cinnamon(self, keystring, data): os.system("nemo -n &") # restart nemo if it's not running already os.system("cinnamon-launcher &") # restart Cinnamon whether it's running or not (can be handy in case of a DE freeze) if __name__ == '__main__': setproctitle("cinnamon-killer-daemon") daemon = KillerDaemon() Gtk.main() cinnamon-6.6.8/files/usr/bin/cinnamon-launcher0000775000175000017500000001654415167446463020325 0ustar fabiofabio#!/usr/bin/python3 # """ Launches or restarts cinnamon """ import os import sys import time import gettext from setproctitle import setproctitle from pathlib import Path import psutil import subprocess import threading import gi import shutil gi.require_version('Gtk', '3.0') # noqa from gi.repository import Gtk, GLib, Gio, GLib FALLBACK_COMMAND = "metacity" FALLBACK_ARGS = ("--replace",) gettext.install("cinnamon", "/usr/share/locale") panel_process_name = None panel_cmd = None if shutil.which("mate-panel"): panel_process_name = "mate-panel" panel_cmd = "mate-panel --replace &" elif shutil.which("gnome-panel"): panel_process_name = "gnome-panel" panel_cmd = "gnome-panel --replace &" elif shutil.which("tint2"): panel_process_name = "tint2" panel_cmd = "killall tint2; tint2 &" # Used as a decorator to run things in the background def async_function(func): def wrapper(*args, **kwargs): thread = threading.Thread(target=func, args=args, kwargs=kwargs) thread.daemon = True thread.start() return thread return wrapper # Used as a decorator to run things in the main loop, from another thread def idle_function(func): def wrapper(*args): GLib.idle_add(func, *args) return wrapper class Launcher: def __init__(self): self.fb_pid = 0 self.kill_lock = threading.Lock() self.polkit_agent_proc = None self.nm_applet_proc = None self.cinnamon_pid = os.fork() if self.cinnamon_pid == 0: os.execvp("cinnamon", ("cinnamon", "--replace", ) + tuple(sys.argv[1:])) else: self.settings = Gio.Settings(schema="org.cinnamon.launcher") self.settings.connect("changed::memory-limit-enabled", self.on_settings_changed) self.killed = False if self.settings.get_boolean("memory-limit-enabled"): print("Cinnamon memory limit enabled: %d MB" % self.settings.get_int("memory-limit")) self.monitor_memory() self.wait_for_process() Gtk.main() def on_settings_changed(self, settings, key): print("Memory profiler status changed, restarting Cinnamon.") self.restart_cinnamon() @async_function def wait_for_process(self): exit_status = os.waitpid(self.cinnamon_pid, 0)[1] if not os.WIFEXITED(exit_status): with self.kill_lock: if self.killed: # Restart Cinnamon self.restart_cinnamon() else: self.fb_pid = os.fork() if self.fb_pid == 0: # Start the fallback panel if panel_cmd is not None: os.system(panel_cmd) # Start the fallback window manager os.execvp(FALLBACK_COMMAND, (FALLBACK_COMMAND,) + FALLBACK_ARGS) else: self.launch_fallback_helpers() self.confirm_restart() else: Gtk.main_quit() def launch_fallback_helpers(self): agents = ("/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1", "/usr/libexec/polkit-gnome-authentication-agent-1", "/usr/libexec/polkit-mate-authentication-agent-1") for path in agents: if Path(path).exists(): print(f"Launching for fallback session: {path}") self.polkit_agent_proc = subprocess.Popen([path]) break # Start NM applet if shutil.which("nm-applet"): print(f"Launching for fallback session: nm-applet") self.nm_applet_proc = subprocess.Popen(["nm-applet"]) def kill_fallback_helpers(self): if self.polkit_agent_proc is not None: print("Killing fallback polkit agent") self.polkit_agent_proc.terminate() try: self.polkit_agent_proc.wait(timeout=5) except subprocess.TimeoutExpired: self.polkit_agent_proc.kill() self.polkit_agent_proc = None if self.nm_applet_proc is not None: print("Killing fallback nm-applet") self.nm_applet_proc.terminate() try: self.nm_applet_proc.wait(timeout=5) except subprocess.TimeoutExpired: self.nm_applet_proc.kill() self.nm_applet_proc = None @async_function def monitor_memory(self): if psutil.pid_exists(self.cinnamon_pid): process = psutil.Process(self.cinnamon_pid) while True: delay = self.settings.get_int("check-frequency") limit = self.settings.get_int("memory-limit") time.sleep(delay) if not process.is_running(): break memory = ((process.memory_full_info().rss - process.memory_full_info().shared) / 1024 ** 2) if memory > limit: print ("Memory threshold reached: %d" % memory) self.log_kill(memory, limit, delay) with self.kill_lock: self.killed = True process.kill() break def restart_cinnamon(self): os.execvp(sys.argv[0], sys.argv) def log_kill(self, memory, limit, delay): try: directory = os.path.join(GLib.get_user_state_dir(), 'cinnamon') except AttributeError: directory = os.path.expanduser("~/.cinnamon") string = "%s - Usage: %d MB - Limit: %d MB - Freq: %s sec" % (time.strftime("%Y.%m.%d %H:%M:%S"), memory, limit, delay) if not os.path.exists(directory): os.mkdir(directory) with open(os.path.join(directory, "restarts.log"), "a") as log_file: print(string, file=log_file) @idle_function def confirm_restart(self): d = Gtk.MessageDialog(title=None, parent=None, flags=0, message_type=Gtk.MessageType.WARNING) d.add_buttons(_("No"), Gtk.ResponseType.NO, _("Yes"), Gtk.ResponseType.YES) d.set_keep_above(True) d.set_position(Gtk.WindowPosition.CENTER) d.set_title(_("Cinnamon just crashed")) box = d.get_content_area() checkbutton = Gtk.CheckButton(label=_("Disable downloaded applets, desklets and extensions")) d.set_markup("%s\n\n%s\n\n%s\n\n" % ( _("You are currently running in fallback mode."), _("If you suspect the source of the crash is a local extension, applet or desklet, you can disable downloaded add-ons using the checkbox below."), _("Do you want to restart Cinnamon?"), )) box.set_border_width(20) box.add(checkbutton) checkbutton.show_all() resp = d.run() d.destroy() if resp == Gtk.ResponseType.YES: if checkbutton.get_active(): os.environ["CINNAMON_TROUBLESHOOT"] = "1" os.system("killall %s" % panel_process_name) self.kill_fallback_helpers() os.system("kill %d" % self.fb_pid) os.waitpid(self.fb_pid, 0) self.restart_cinnamon() else: Gtk.main_quit() if __name__ == "__main__": setproctitle("cinnamon-launcher") Launcher() cinnamon-6.6.8/files/usr/bin/cinnamon-looking-glass0000775000175000017500000000037615167446463021271 0ustar fabiofabio#!/usr/bin/python3 """ Launch the cinnamon looking glass utility Usage: cinnamon-looking-glass {daemon|inspect} """ import os import sys os.execvp("/usr/share/cinnamon/cinnamon-looking-glass/cinnamon-looking-glass.py", (" ",) + tuple(sys.argv[1:])) cinnamon-6.6.8/files/usr/bin/cinnamon-menu-editor0000775000175000017500000000111615167446463020741 0ustar fabiofabio#!/usr/bin/python3 """ Launch the Cinnamon menu editor utility Usage: cinnamon-menu-editor """ import sys from setproctitle import setproctitle sys.path.insert(0, '/usr/share/cinnamon/cinnamon-menu-editor') # noqa from cme import MainWindow def main(): try: from MenuEditor import config datadir = config.pkgdatadir version = config.VERSION except Exception: datadir = '.' version = '0.9' app = MainWindow.MainWindow(datadir, version) app.run() if __name__ == '__main__': setproctitle("cinnamon-menu-editor") main() cinnamon-6.6.8/files/usr/bin/cinnamon-preview-gtk-theme0000775000175000017500000000243515167446463022062 0ustar fabiofabio#!/usr/bin/python3 """ Preview a Cinnamon gtk theme in a small window Usage: cinnamon-preview-gtk-theme theme-name """ import sys from setproctitle import setproctitle import gi gi.require_version("Gtk", "3.0") # noqa from gi.repository import Gtk if __name__ == '__main__': setproctitle("cinnamon-preview-gtk-theme") import signal signal.signal(signal.SIGINT, signal.SIG_DFL) if len(sys.argv) != 2: print("Usage: cinnamon-preview-gtk-theme theme-name") exit(1) else: theme_name = sys.argv[1] settings = Gtk.Settings.get_default() settings.set_string_property("gtk-theme-name", theme_name, "gtkrc:0") window = Gtk.Window() vbox = Gtk.VBox() hbox = Gtk.HBox() button = Gtk.Button() check = Gtk.CheckButton() check.set_active(True) radio = Gtk.RadioButton() hbox.pack_start(button, False, False, 2) button.set_label("Button") hbox.pack_start(check, False, False, 2) hbox.pack_start(radio, False, False, 2) vbox.pack_start(hbox, False, False, 2) window.add(vbox) window.set_default_size(320, 200) window.set_decorated(False) window.show_all() window.connect("destroy", Gtk.main_quit) Gtk.main() cinnamon-6.6.8/files/usr/bin/cinnamon-screensaver-lock-dialog0000775000175000017500000000027215167446463023216 0ustar fabiofabio#!/usr/bin/python3 """ Launch the cinnamon screensaver lock dialog """ import os os.system("/usr/share/cinnamon/cinnamon-screensaver-lock-dialog/cinnamon-screensaver-lock-dialog.py") cinnamon-6.6.8/files/usr/bin/cinnamon-session-cinnamon0000775000175000017500000000023115167446463021771 0ustar fabiofabio#!/bin/sh if [ "$1" = "--wayland" ]; then exec cinnamon-session --session cinnamon-wayland else exec cinnamon-session --session cinnamon "$@" ficinnamon-6.6.8/files/usr/bin/cinnamon-session-cinnamon2d0000775000175000017500000000007315167446463022223 0ustar fabiofabio#!/bin/sh exec cinnamon-session --session cinnamon2d "$@" cinnamon-6.6.8/files/usr/bin/cinnamon-settings0000775000175000017500000000011715167446463020351 0ustar fabiofabio#!/bin/sh exec /usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py "$@" cinnamon-6.6.8/files/usr/bin/cinnamon-settings-users0000775000175000017500000000026715167446463021516 0ustar fabiofabio#!/usr/bin/python3 """ Launch the cinnamon users and groups editor utility """ import os os.system("pkexec /usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py") cinnamon-6.6.8/files/usr/bin/cinnamon-slideshow0000775000175000017500000000026315167446463020514 0ustar fabiofabio#!/usr/bin/python3 """ Starts a slideshow of images with the desktop background """ import os os.execvp("/usr/share/cinnamon/cinnamon-slideshow/cinnamon-slideshow.py", (" ",)) cinnamon-6.6.8/files/usr/bin/cinnamon-spice-updater0000775000175000017500000000704315167446463021263 0ustar fabiofabio#!/usr/bin/python3 import os import sys import argparse import json class UpdateSpices: def __init__(self): parser = argparse.ArgumentParser(description='Cinnamon Spice Updater', epilog="spice-type should be 'applet', 'desklet', 'extension' or 'theme'.") parser.add_argument("--update-all", dest="update_all", action="store_const", const=True, help="Update all spices to their latest versions.") choices = ["applet", "desklet", "extension", "theme"] ex_group = parser.add_mutually_exclusive_group() ex_group.add_argument("--update", dest="update_spice_type", action="store", choices=choices, metavar="", help="Update all spices of a given type") ex_group.add_argument("--list-simple", dest="list_simple_spice_type", action="store", choices=choices, metavar="", help="Simple list of UUIDs (or theme names) with available updates, for a given type") ex_group.add_argument("--list-json", dest="list_json_spice_type", action="store", choices=choices, metavar="", help="Prints complete information on updates for spices of a given type, formatted as json.") args = parser.parse_args() if len(sys.argv) == 1: parser.print_help() exit(1) try: import cinnamon self.updater = cinnamon.UpdateManager() if args.update_all: self.update_all() else: self.update_spice_of_type(args.update_spice_type) self.list_simple(args.list_simple_spice_type) self.list_json(args.list_json_spice_type) except Exception as e: print("Cinnamon updates failed: %s" % e) def update_all(self): self.updater.refresh_all_caches() updates = self.updater.get_updates() if len(updates) == 0: print("There are no Spice updates") return print("Updating all spices.") for update in updates: print("%s: %s" % (update.spice_type, update.uuid)) self.updater.upgrade(update) def update_spice_of_type(self, spice_type): if spice_type is None: return self.updater.refresh_cache_for_type(spice_type) updates = self.updater.get_updates_of_type(spice_type) if len(updates) == 0: print("There are no %s updates" % spice_type) return print("Updating %d %s spices." % (len(updates), spice_type)) for update in updates: print("%s: %s" % (update.spice_type, update.uuid)) self.updater.upgrade(update) def list_simple(self, spice_type): if spice_type is None: return self.updater.refresh_cache_for_type(spice_type) updates = self.updater.get_updates_of_type(spice_type) for update in updates: print(update.uuid) def list_json(self, spice_type): if spice_type is None: return self.updater.refresh_cache_for_type(spice_type) updates = self.updater.get_updates_of_type(spice_type) jsonified_updates = {} for update in updates: jsonified_updates[update.uuid] = update.__dict__ print(json.dumps(jsonified_updates, sort_keys=True, indent=4)) if __name__ == "__main__": if os.getuid() == 0: print("Error: Do not run this as root") exit(1) UpdateSpices() exit(0) cinnamon-6.6.8/files/usr/bin/cinnamon-subprocess-wrapper0000775000175000017500000000220515167446463022357 0ustar fabiofabio#!/usr/bin/python3 """ Runs a command and then passes the output to Cinnamon via DBus asynchronously Usage: cinnamon-subprocess-wrapper ls ~/ """ import subprocess import sys from setproctitle import setproctitle from gi.repository import GLib, Gio if __name__ == "__main__": setproctitle("cinnamon-subprocess-wrapper") process_id = int(sys.argv[1]) try: result = subprocess.check_output(sys.argv[2:]) success = True except Exception: result = b'' success = False try: connection = Gio.bus_get_sync(Gio.BusType.SESSION, None) connection.call_sync("org.Cinnamon", "/org/Cinnamon", "org.Cinnamon", "PushSubprocessResult", GLib.Variant("(isb)", (process_id, result.decode(errors="replace"), success)), None, Gio.DBusCallFlags.NONE, 2000, None) except GLib.Error as e: print("Could not send response (ID: %d): %s" % (process_id, e.message)) cinnamon-6.6.8/files/usr/bin/cinnamon-xlet-makepot0000775000175000017500000002753315167446463021136 0ustar fabiofabio#!/usr/bin/python3 import os import json import subprocess import collections import argparse from datetime import datetime import pytz LOCALE_DIR = os.path.join(os.path.expanduser('~'), '.local/share/locale') USAGE_DESCRIPTION = """\ Parses files in an applet, desklet or extension's directories, \ extracts translatable strings, and then generates a .pot file for them. """ USAGE_EPILOG = """\ For example: cinnamon-xlet-makepot example@mydomain.org/ Will generate a file called example@mydomain.org.pot, in the directory \ example@mydomain.org/po/ which contains all of the strings that need to be \ translated. Translators can then use this pot file to generate .po \ files which contain translations for the extracted strings. """ try: import polib except Exception: print("""\ Module "polib" not available. You will need to install this module using your distribution's package manager (in debian-based systems "apt-get install python3-polib") """) quit() def scan_json(dir, pot_path): append = os.path.exists(pot_path) if append: pot_file = polib.pofile(pot_path) pot_file.metadata['Content-Type'] = 'text/plain; charset=UTF-8' else: pot_file = polib.POFile() pot_file.header = 'SOME DESCRIPTIVE TITLE.\n' \ 'Copyright (C) YEAR THE PACKAGE\'S COPYRIGHT HOLDER\n' \ 'This file is distributed under the same license as the PACKAGE package.\n' \ 'FIRST AUTHOR , YEAR.\n' \ '\n' \ ', fuzzy' pot_file.metadata = { 'Project-Id-Version': 'PACKAGE VERSION', 'Report-Msgid-Bugs-To': '', 'POT-Creation-Date': '%s' % datetime.now(pytz.utc).strftime("%Y-%m-%d %H:%M%z"), 'PO-Revision-Date': 'YEAR-MO-DA HO:MI+ZONE', 'Last-Translator': 'FULL NAME ', 'Language-Team': 'LANGUAGE ', 'Language': '', 'MIME-Version': '1.0', 'Content-Type': 'text/plain; charset=UTF-8', 'Content-Transfer-Encoding': '8bit', } for root, dirs, files in os.walk(dir): rel_root = os.path.relpath(root) for file in sorted(files): if rel_root == '.': rel_path = file else: rel_path = os.path.join(rel_root, file) if file == 'settings-schema.json': fp = open(os.path.join(root, file)) data = json.load(fp, object_pairs_hook=collections.OrderedDict) fp.close() extract_settings_strings(data, rel_path.replace('/', '->'), pot_file) elif file == 'metadata.json': fp = open(os.path.join(root, file)) data = json.load(fp, object_pairs_hook=collections.OrderedDict) fp.close() extract_metadata_strings(data, rel_path.replace('/', '->'), pot_file) if append: pot_file.save(pot_path) else: pot_file.save(fpath=pot_path) def extract_settings_strings(data, dir, pot_file, parent=""): for key in data.keys(): if parent != "": if key in ("description", "tooltip", "units", "title"): comment = "%s->%s->%s" % (dir, parent, key) save_entry(data[key], comment, pot_file) elif key in "options": opt_data = data[key] for option in opt_data.keys(): if opt_data[option] == "custom": continue comment = "%s->%s->%s" % (dir, parent, key) save_entry(option, comment, pot_file) elif key == "columns": columns = data[key] for i, col in enumerate(columns): for col_key in col: if col_key in ("title", "units"): comment = "%s->%s->columns->%s" % (dir, parent, col_key) save_entry(col[col_key], comment, pot_file) try: extract_settings_strings(data[key], dir, pot_file, key) except AttributeError: pass def extract_metadata_strings(data, dir, pot_file): for key in data: if key in ("name", "description", "comments"): comment = "%s->%s" % (dir, key) save_entry(data[key], comment, pot_file) elif key == "contributors": comment = "%s->%s" % (dir, key) values = data[key] if isinstance(values, str): values = values.split(",") for value in values: save_entry(value.strip(), comment, pot_file) def save_entry(msgid, comment, pot_file): if not isinstance(msgid, str): print("Warning: expected string and got %s of type %s instead" % (str(msgid), type(msgid))) return if not msgid.strip(): return entry = pot_file.find(msgid) if entry: if comment not in entry.comment: if entry.comment: entry.comment += "\n" entry.comment += comment else: entry = polib.POEntry(msgid=msgid, comment=comment) pot_file.append(entry) def remove_empty_folders(path): if not os.path.isdir(path): return # remove empty subfolders files = os.listdir(path) if len(files): for f in sorted(files): fullpath = os.path.join(path, f) if os.path.isdir(fullpath): remove_empty_folders(fullpath) # if folder empty, delete it files = os.listdir(path) if len(files) == 0: print('Removing empty folder:', path) os.rmdir(path) def do_install(uuid, dir): podir = os.path.join(dir, "po") files_installed = 0 for root, subFolders, files in os.walk(podir): for file in sorted(files): locale_name, ext = os.path.splitext(file) if ext == '.po': lang_locale_dir = os.path.join(LOCALE_DIR, locale_name, 'LC_MESSAGES') os.makedirs(lang_locale_dir, mode=0o755, exist_ok=True) subprocess.call(["msgfmt", "-c", os.path.join(root, file), "-o", os.path.join(lang_locale_dir, '%s.mo' % uuid)]) files_installed += 1 if files_installed == 0: print('Nothing to install') else: print('installed %i files' % files_installed) def do_remove(uuid): files_removed = 0 if os.path.exists(LOCALE_DIR): locale_names = os.listdir(LOCALE_DIR) for locale_name in locale_names: lang_locale_dir = os.path.join(LOCALE_DIR, locale_name) mo_file = os.path.join(lang_locale_dir, 'LC_MESSAGES', "%s.mo" % uuid) if os.path.isfile(mo_file): os.remove(mo_file) files_removed += 1 remove_empty_folders(lang_locale_dir) if files_removed == 0: print("Nothing to remove") else: print('removed %i files' % files_removed) def scan_xlet(): parser = argparse.ArgumentParser(description=USAGE_DESCRIPTION, epilog=USAGE_EPILOG, formatter_class=argparse.RawDescriptionHelpFormatter) parser.add_argument('-j', '--skip-js', action='store_false', dest='js', default=True, help='If this option is not included, javascript files will be scanned for translatable strings.') parser.add_argument('-p', '--skip-python', action='store_false', dest='python', default=True, help='If this option is not included, python files will be scanned for translatable strings.') parser.add_argument('-i', '--install', action='store_true', dest='install', default=False, help=('Compiles and installs any .po files contained in a po folder to the system locale store. ' 'Use this option to test your translations locally before uploading to Spices. ' 'It will use the applet, desklet, or extension UUID as the translation domain.')) parser.add_argument('-r', '--remove', action='store_true', dest='remove', default=False, help=('The opposite of install, removes translations from the store. Again, it uses the UUID ' 'to find the correct files to remove.')) parser.add_argument('-k', '--keyword', dest='keyword', default='_', help='Change the variable name gettext is assigned to in your files. The default is _.') parser.add_argument('-o', '--potfile', dest='out_file', default=None, help=('Use this option to specify the location for the generated .pot file. By default ' '/po/.pot is used. This is where translators are expecting to find the pot ' 'file, so you should only use this option if you want the pot file elsewhere for your own use.')) parser.add_argument('-m', '--makepot', action='store_true', dest='makepot', default=False, help=('This is used by makepot to tell this script not to remove the existing pot file.')) parser.add_argument('dir', help='the path to the applet/desklet/extension directory') args = parser.parse_args() dir = os.path.abspath(args.dir) if not os.path.exists(dir): print('%s does not exist' % dir) quit() uuid = os.path.basename(dir) if os.path.exists(os.path.join(dir, 'files', uuid)): dir = os.path.join(dir, 'files', uuid) if args.install: do_install(uuid, dir) quit() if args.remove: do_remove(uuid) quit() if args.out_file is not None: pot_path = os.path.abspath(args.out_file) else: pot_path = os.path.join(dir, 'po', uuid + '.pot') pwd = os.getcwd() os.chdir(dir) if args.js or args.python: try: subprocess.check_output(["xgettext", "--version"]) except OSError: print("xgettext not found, you may need to install the gettext package") quit() os.makedirs(os.path.dirname(pot_path), mode=0o755, exist_ok=True) pot_exists = False if os.path.exists(pot_path) and not args.makepot: os.remove(pot_path) if args.js: print("Scanning JavaScript files...") js_files = [] for root, dirs, files in os.walk(dir): rel_root = os.path.relpath(root) js_files += [os.path.join(rel_root, file) for file in sorted(files) if file.endswith('.js')] if len(js_files) == 0: print('none found') else: print('found %i file(s)\n' % len(js_files)) command_args = [ 'xgettext', '--language=JavaScript', '--from-code=UTF-8', '--keyword=%s' % args.keyword, '--output=%s' % pot_path ] command_args += js_files subprocess.run(command_args) pot_exists = os.path.exists(pot_path) if args.python: print("Scanning for python files...") py_files = [] for root, dirs, files in os.walk(dir): rel_root = os.path.relpath(root) py_files += [os.path.join(rel_root, file) for file in sorted(files) if file.endswith('.py')] if len(py_files) == 0: print('none found') else: print('found %i file(s)\n' % len(py_files)) command_args = [ 'xgettext', '--language=Python', '--from-code=UTF-8', '--keyword=%s' % args.keyword, '--output=%s' % pot_path ] if pot_exists: command_args.append('-j') command_args += py_files subprocess.run(command_args) print("Scanning metadata.json and settings-schema.json...") scan_json(dir, pot_path) os.chdir(pwd) print("Extraction complete") quit() if __name__ == "__main__": scan_xlet() cinnamon-6.6.8/files/usr/bin/cinnamon2d0000775000175000017500000000024715167446463016745 0ustar fabiofabio#!/bin/bash CLUTTER_PAINT=disable-culling LIBGL_ALWAYS_SOFTWARE=1 CINNAMON_2D=1 CINNAMON_SLOWDOWN_FACTOR=0.0001 MUFFIN_NO_SHADOWS=1 CLUTTER_DEFAULT_FPS=15 cinnamon $@ cinnamon-6.6.8/files/usr/bin/xlet-about-dialog0000775000175000017500000001120015167446463020225 0ustar fabiofabio#!/usr/bin/python3 import argparse import sys import os import json import gettext import datetime import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, GdkPixbuf, GLib gettext.install('cinnamon', '/usr/share/locale') home = os.path.expanduser('~') class AboutDialog(Gtk.AboutDialog): def __init__(self, metadata, stype): super().__init__() self.metadata = metadata self.stype = stype self.set_icon() if 'version' in metadata: version = self.metadata['version'] if 'last-edited' in metadata: timestamp = datetime.datetime.fromtimestamp(self.metadata['last-edited']).isoformat(' ') self.props.version = _("Version %s (%s)") % (version, timestamp) else: self.props.version = _("Version %s") % version elif 'last-edited' in metadata: timestamp = datetime.datetime.fromtimestamp(int(self.metadata['last-edited'])).isoformat(' ') self.props.version = _("Updated on %s") % timestamp comments = self._(self.metadata.get('description', '')) if 'comments' in self.metadata: comments += '\n\n' + self._(self.metadata['comments']) self.props.comments = comments s_id = self.get_spices_id() if s_id: self.props.website = f'https://cinnamon-spices.linuxmint.com/{self.stype}/view/{s_id}' self.props.website_label = _("More info") if 'contributors' in self.metadata: self.props.authors = self.metadata['contributors'].split(',') xlet_name = self._(self.metadata.get('name')) self.props.program_name = f"{xlet_name} ({self.metadata.get('uuid')})" self.connect('response', self.close) self.set_title(_("About %s") % self.props.program_name) self.show() def close(self, *args): Gtk.main_quit() def set_icon(self): # Use the generic type icon self.set_logo_icon_name(f"cs-{self.metadata['type']}") # Override with metadata if set.. if 'icon' in self.metadata: self.set_logo_icon_name(self.metadata['icon']) # Override with icon.png if present icon_path = os.path.join(self.metadata['path'], 'icon.png') if os.path.exists(icon_path): icon = GdkPixbuf.Pixbuf.new_from_file_at_size(icon_path, 48, 48) self.set_logo(icon) self.set_default_icon_name(f"cs-{self.metadata['type']}") def _(self, msg): gettext.bindtextdomain(self.metadata.get('uuid'), home + '/.local/share/locale') translation = gettext.dgettext(self.metadata.get('uuid'), msg) # try with cinnamon domain if the xlet domain doesn't work if translation == msg: return _(msg) return translation def get_spices_id(self): try: cache_path = os.path.join(GLib.get_user_cache_dir(), 'cinnamon', 'spices', self.stype[0:-1], 'index.json') if os.path.exists(cache_path): with open(cache_path, 'r', encoding='utf-8') as cache_file: index_cache = json.load(cache_file) if self.metadata['uuid'] in index_cache: return index_cache[self.metadata['uuid']]['spices-id'] return None except Exception as e: print('Failed to load/parse index.json') print(e) return None if __name__ == "__main__": parser = argparse.ArgumentParser() parser.description = 'Arguments for xlet-about-dialog' parser.add_argument('xlet_type', type=str, help=_('the type of the Spice'), choices=['applets', 'desklets', 'extensions', 'actions', 'themes']) parser.add_argument('uuid', type=str, metavar='UUID', nargs=1, help=_('the UUID of the Spice')) _args = parser.parse_args() xlet_type = _args.xlet_type uuid = _args.uuid[0] suffix = f'share/nemo/actions/{uuid}' if xlet_type == 'actions' else f'share/cinnamon/{xlet_type}/{uuid}' prefixes = [os.path.join(home, '.local'), '/usr'] path = None for prefix in prefixes: path = os.path.join(prefix, suffix) if os.path.exists(path): break if path is None: print(_('Unable to locate %s %s') % (xlet_type, uuid)) sys.exit(1) try: with open(os.path.join(path, 'metadata.json'), encoding='utf-8') as meta: _metadata = json.load(meta) _metadata['path'] = path _metadata['type'] = xlet_type AboutDialog(_metadata, xlet_type) Gtk.main() except FileNotFoundError: pass cinnamon-6.6.8/files/usr/bin/xlet-settings0000775000175000017500000000011315167446463017517 0ustar fabiofabio#!/bin/sh exec /usr/share/cinnamon/cinnamon-settings/xlet-settings.py "$@" cinnamon-6.6.8/files/usr/share/0000775000175000017500000000000015167446463015316 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/applications/0000775000175000017500000000000015167446463020004 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/applications/cinnamon-killer-daemon.desktop0000664000175000017500000000031015167446463025714 0ustar fabiofabio[Desktop Entry] Name=Cinnamon Killer Daemon Comment=Restarts Cinnamon and Nemo when a key combination is pressed Icon=reload Exec=cinnamon-killer-daemon Terminal=false Type=Application NoDisplay=true cinnamon-6.6.8/files/usr/share/applications/cinnamon-menu-editor.desktop0000664000175000017500000000042015167446463025423 0ustar fabiofabio[Desktop Entry] Name=Cinnamon Menu Editor Comment=Edit the entries of the Cinnamon menu applet Exec=cinnamon-menu-editor Icon=alacarte OnlyShowIn=X-Cinnamon; Terminal=false Type=Application NoDisplay=true Categories=GNOME;GTK;Settings;DesktopSettings; StartupNotify=false cinnamon-6.6.8/files/usr/share/applications/cinnamon-onscreen-keyboard.desktop0000664000175000017500000001743715167446463026625 0ustar fabiofabio[Desktop Entry] Exec=cinnamon-dbus-command ToggleKeyboard Icon=cinnamon-virtual-keyboard Terminal=false Type=Application Categories=Utility; OnlyShowIn=X-Cinnamon; Keywords=onboard;keyboard;caribou; Name=Virtual keyboard Name[af]=Virtuele sleutelbord Name[am]=የሚታይ የ ፊደል ገበታ Name[ar]=لوحة المفاتيح الافتراضية Name[ast]=Teclaú virtual Name[ay]=Pantallan tiklado Name[az]=Sanal düyməlik Name[be]=Віртуальная клавіятура Name[bg]=Виртуална клавиатура Name[bn]=ভার্চুয়াল কিবোর্ড Name[br]=Klavier galloudel Name[ca]=Teclat virtual Name[ca@valencia]=Teclat virtual Name[cs]=Virtuální klávesnice Name[cy]=Rhith fysellfwrdd Name[da]=Virtuelt tastatur Name[de]=Bildschirmtastatur Name[el]=Εικονικό πληκτρολόγιο Name[eo]=Virtuala klavaro Name[es]=Teclado virtual Name[es_AR]=Teclado virtual Name[et]=Virtuaalne klaviatuur Name[eu]=Teklatu birtuala Name[fa]=صفحه‌کلید مجازی Name[fi]=Virtuaalinäppäimistö Name[fr]=Clavier visuel Name[fr_CA]=Clavier visuel Name[he]=מקלדת מדומה Name[hi]=आभासी कुंजीपटल Name[hr]=Virtualna tipkovnica Name[hsb]=Wirtuelna tastatura Name[hu]=Virtuális billentyűzet Name[ia]=Claviero virtual Name[id]=Papan ketik maya Name[ie]=Tastatura virtual Name[is]=Sýndarlyklaborð Name[it]=Tastiera virtuale Name[ja]=仮想キーボード Name[ka]=ვირტუალური კლავიატურა Name[kab]=Anasiw aḥlis Name[ko]=가상 키보드 Name[la]=Claviatura virtualis Name[lo]=ແປ້ນພິມສະເໝືອນ Name[lt]=Virtuali klaviatūra Name[lv]=Virtuālā tastatūra Name[nap]=Tastiera faveza Name[nb]=Virtuelt tastatur Name[nl]=Virtueel toetsenbord Name[nn]=Virtuelt tastatur Name[oc]=Clavièr visual Name[pl]=Klawiatura wirtualna Name[pt]=Teclado virtual Name[pt_BR]=Teclado virtual Name[ro]=Tastatură virtuală Name[ru]=Виртуальная клавиатура Name[rue]=Віртуална клавешниця Name[sc]=Tastiera virtuale Name[sk]=Virtuálna klávesnica Name[sl]=Virtualna tipkovnica Name[sq]=Tastiera virtuale Name[sr]=Виртуелна тастатура Name[sr@ijekavian]=Виртуелна тастатура Name[sr@ijekavianlatin]=Виртуелна тастатура Name[sr@latin]=Virtuelna tastatura Name[sv]=Virtuellt tangentbord Name[ta]=திரைப்பலகை Name[th]=แป้นพิมพ์เสมือนจริง Name[tr]=Sanal klavye Name[uk]=Віртуальна клавіатура Name[ur]=ورچول کیی بورڈ Name[uz]=Virtual klaviatura Name[vi]=Bàn phím ảo Name[zh_CN]=虚拟键盘 Name[zh_HK]=虛擬鍵盤 Name[zh_TW]=虛擬鍵盤 Comment=Turn on-screen keyboard on or off Comment[af]=Skakel die sleutelbord op die skerm aan of af Comment[am]=የመመልከቻውን ፊደል ገበታ ማብሪያ ወይንም ማጥፊያ Comment[ar]=تشغيل أو إيقاف تشغيل لوحة المفاتيح على الشاشة Comment[ast]=Prender o apagar la pantalla del tecláu Comment[ay]=Pantallan tiklado uk naktayaña jan ukax jiwt'ayaña Comment[az]=Göstərici düyməliyini işlət ya da söndür Comment[be]=Уключыць/выключыць экранную клавіятуру Comment[bg]=Включване или изключване на екранната клавиатура Comment[bn]=পর্দার কিবোর্ড বন্ধ অথবা সচল করুন Comment[bs]=Uključi/isključi ekransku tastaturu Comment[ca]=Activa o desactiva el teclat en pantalla Comment[ca@valencia]=Activa o desactiva el teclat en pantalla Comment[cs]=Zapnout nebo vypnout klávesnici na obrazovce Comment[cy]=Cychwyn neu ddiffodd y bysellfwrdd ar sgrin Comment[da]=Slå skærmtastatur til/fra Comment[de]=Bildschirmtastatur ein-/ausschalten Comment[el]=Εναλλαγή λειτουργίας πληκτρολογίου οθόνης Comment[eo]=En- aŭ elŝalti la ekranklavaron Comment[es]=Activar o desactivar el teclado en pantalla Comment[es_AR]=Activar o desactivar el teclado en pantalla Comment[et]=Ekraaniklaviatuuri sisse või välja lülitamine Comment[eu]=Aktibatu edo desaktibatu pantailako teklatua Comment[fa]=روشن یا خاموش کردن صفحه‌کلیدِ روی-صفحه Comment[fi]=Näyttönäppäimistö päälle/pois Comment[fil]=Buksan o patayin ang on-screen keyboard Comment[fr]=Activer ou désactiver le clavier visuel Comment[fr_CA]=Activer ou désactiver le clavier visuel Comment[ga]=Cas air nó as méarchlár scáileáin Comment[gd]=Cuir am meur-chlàr air an sgrìn air no dheth Comment[gl]=Activar ou desactivar o teclado en pantalla Comment[he]=הפעלת או כיבוי מקלדת־מרקע Comment[hi]=ऑन स्क्रीन कुंजीपटल चालू या बंद करें Comment[hr]=Uključi/Isključi zaslonsku tipkovnicu Comment[hsb]=Tastaturu na wobrazowce za/wušaltować Comment[hu]=Képernyő-billentyűzet be- vagy kikapcsolása Comment[ia]=Activar o stoppar le claviero sur-le-schermo Comment[id]=Mengaktifkan atau menonaktifkan keyboard di layar Comment[is]=Skjályklaborð af eða á Comment[it]=Attiva/disattiva la tastiera sullo schermo Comment[ja]=スクリーンキーボードをオン/オフ Comment[ka]=ეკრანზე ნაჩვენებ კლავიატურის ჩართვა/გამორთვა Comment[kab]=Rmed neɣ ssens anasiw amwalan Comment[kk]=Экрандағы пернетақтаны қосу/сөндіру Comment[ko]=가상 키보드 켜고 끄기 Comment[lo]=ເປີດ ຫຼື ປິດແປ້ນພິມເທິງໜ້າຈໍ Comment[lt]=Įjungti arba išjungti ekraninę klaviatūrą Comment[lv]=Ieslēgt vai izslēgt ekrāna tastatūru Comment[ms]=Hidup atau matikan papan kekunci skrin Comment[nb]=Slå av/på skjermtastatur Comment[nds]=Bildschirmtastatur ein- oder ausschalten Comment[nl]=Schermtoetsenbord in- of uitschakelen Comment[nn]=Slå av/på skjermtastatur Comment[oc]=Activar o desactivar lo clavièr visual Comment[om]=Furtuu gabatee argiirratii bantuufi cuftuu Comment[pa]=ਆਨ-ਸਕਰੀਨ ਕੀਬੋਰਡ ਚਾਲੂ ਜਾਂ ਬੰਦ ਕਰੋ Comment[pl]=Włącz/Wyłącz klawiaturę ekranową Comment[pt]=Ativar ou desativar teclado no ecrã Comment[pt_BR]=Ativar ou desativar o teclado virtual Comment[ro]=Activează sau dezactivează tastatura pe ecran Comment[ru]=Включить или выключить экранную клавиатуру Comment[rue]=Уключити наекранну клавешницю вадь выключити Comment[sc]=Ativa o disativa sa tastiera in s'ischermu Comment[sk]=Zapnúť alebo vypnúť klávesnicu na obrazovke Comment[sl]=Omogoči ali onemogoči zaslonsko tipkovnico Comment[sq]=Aktivizo ose çaktivizo tastierën në ekran Comment[sr]=Укључи/искључи тастатуру на екрану Comment[sr@ijekavian]=Укључи/искључи тастатуру на екрану Comment[sr@ijekavianlatin]=Укључи/искључи тастатуру на екрану Comment[sr@latin]=Uključi ili isključi tastaturu na ekranu Comment[sv]=Aktivera eller inaktivera skärmtangentbord Comment[ta]=திரைப்பலகை ஆன் அல்லது ஆஃப் செய் Comment[tg]=Хомӯш ё фаъол кардани ҳарфкалиди экранӣ Comment[th]=เปิดหรือปิดแป้นพิมพ์บนจอ Comment[tr]=Ekran klavyesini aç ya da kapat Comment[uk]=Увімкнути або вимкнути екранну клавіатуру Comment[ur]=سکرین کیبورڈ چالو یا بند کریں Comment[uz]=Ekran klaviaturasini yoqish yoki o‘chirish Comment[vi]=Bật tắt bàn phím màn hình Comment[zh_CN]=开关屏幕键盘 Comment[zh_HK]=開啟或關閉熒幕鍵盤 Comment[zh_TW]=開啟或關閉螢幕鍵盤 cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-actions.desktop0000664000175000017500000001241615167446463026501 0ustar fabiofabio[Desktop Entry] Icon=cs-actions Exec=cinnamon-settings actions Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Actions Name[am]=ተግባሮች Name[ar]=الإجراءات Name[ast]=Aiciones Name[ay]=Lurawinaka Name[az]=Eyləmlər Name[be]=Дзеянні Name[bg]=Действия Name[br]=Gweredoù Name[ca]=Accions Name[ca@valencia]=Accions Name[cs]=Akce Name[cy]=Gweithredoedd Name[da]=Handlinger Name[de]=Aktionen Name[el]=Ενέργειες Name[eo]=Agoj Name[es]=Acciones Name[es_AR]=Acciones Name[et]=Tegevused Name[eu]=Ekintzak Name[fa]=اقدامات Name[fi]=Toiminnot Name[gd]=Gnìomhan Name[gl]=Accións Name[he]=פעולות Name[hi]=कार्य Name[hr]=Radnje Name[hu]=Műveletek Name[ia]=Actiones Name[id]=Tindakan Name[ie]=Actiones Name[is]=Aðgerðir Name[it]=Azioni Name[ja]=アクション Name[ka]=ქმედებები Name[kab]=Tigawin Name[ko]=동작 Name[ku]=Tevger Name[la]=Actiones Name[lo]=ການກະທຳ Name[lt]=Veiksmai Name[lv]=Darbības Name[nb]=Handlinger Name[nds]=Aktionen Name[nl]=Acties Name[nn]=Handlingar Name[oc]=Accions Name[pl]=Działania Name[pt]=Ações Name[pt_BR]=Ações Name[ro]=Acțiuni Name[ru]=Действия Name[rue]=Дїї Name[sc]=Atziones Name[sk]=Akcie Name[sl]=Dejanja Name[sq]=Veprimet Name[sr]=Радње Name[sr@ijekavian]=Радње Name[sr@ijekavianlatin]=Радње Name[sr@latin]=Radnje Name[sv]=Åtgärder Name[th]=การทำงาน Name[tr]=Aksiyonlar Name[uk]=Дії Name[ur]=عمل Name[uz]=Amallar Name[vi]=Hành động Name[zh_CN]=菜单操作 Name[zh_HK]=動作 Name[zh_TW]=動作 Comment=Manage your actions Comment[ar]=إدارة actions Comment[ast]=Xestiona les tos aiciones Comment[be]=Кіраваць вашымі дзеяннямі Comment[bg]=Управление на действията Comment[br]=Merañ ho kweredoù Comment[ca]=Gestioneu les accions Comment[ca@valencia]=Gestioneu les accions Comment[cs]=Spravovat své akce Comment[cy]=Rheoli eich gweithredoedd Comment[da]=Håndtér dine handlinger Comment[de]=Ihre Aktionen verwalten Comment[el]=Διαχείριση των ενεργειών σας Comment[eo]=Administri viajn agojn Comment[es]=Gestione sus acciones Comment[es_AR]=Gestione sus acciones Comment[et]=Hallake oma tegevusi Comment[eu]=Kudeatu zure ekintzak Comment[fa]=اعمال خود را مدیریت کنید Comment[fi]=Hallinnoi toimintoja Comment[fil]=I-manage ang actions mo Comment[fr]=Gérez vos actions Comment[fr_CA]=Gérez vos actions Comment[he]=ניהול פעולות Comment[hi]=अपने कार्यों को प्रबंधित करें Comment[hr]=Upravljanje akcijama Comment[hu]=Műveletek kezelése Comment[ia]=Gerer tu actiones Comment[id]=Kelola tindakan Anda Comment[is]=Sýslaðu með aðgerðirnar þínar Comment[it]=Gestisci le tue azioni Comment[ja]=アクションを管理します Comment[ko]=동작 관리 Comment[lo]=ຈັດການການກະທຳຂອງທ່ານ Comment[lv]=Pārvaldīt savas darbības Comment[nb]=Administrer handlingene dine Comment[nl]=Uw acties beheren Comment[nn]=Handsam handlingane dine Comment[oc]=Gerissètz vòstras accions Comment[pl]=Zarządzaj działaniami Comment[pt]=Gerir as suas ações Comment[pt_BR]=Gerencie suas ações Comment[ro]=Gestionați-vă acțiunile Comment[ru]=Управляйте своими действиями Comment[sk]=Spravujte vaše akcie Comment[sl]=Upravljajte svoja dejanja Comment[sq]=Menaxho veprimet e tua Comment[sr]=Управљајте вашим радњама Comment[sr@ijekavian]=Управљајте вашим радњама Comment[sr@ijekavianlatin]=Управљајте вашим радњама Comment[sr@latin]=Управљајте вашим радњама Comment[sv]=Hantera dina åtgärder Comment[tr]=Aksiyonları yönetin Comment[uk]=Керуйте своїми діями Comment[uz]=Harakatlaringizni boshqaring Comment[vi]=Quản lý hành động của bạn Comment[zh_CN]=管理你的菜单操作 Comment[zh_TW]=管理您的動作 Keywords=action; Keywords[ast]=aición; Keywords[be]=дзеянне; Keywords[bg]=действие; Keywords[br]=gwered; Keywords[ca]=acció; Keywords[ca@valencia]=acció; Keywords[cs]=akce; Keywords[cy]=gweithred; Keywords[da]=handling; Keywords[de]=Aktion; Keywords[el]=ενέργεια; Keywords[eo]=ago; Keywords[es]=acción; Keywords[es_AR]=acción; Keywords[et]=toiming; Keywords[eu]=ekintza; Keywords[fa]=عملیات; Keywords[fi]=toiminto; Keywords[he]=פעולה; Keywords[hi]=कार्य; Keywords[hr]=akcija; Keywords[hu]=művelet; Keywords[id]=tindakan; Keywords[is]=aðgerð; Keywords[it]=azione; Keywords[ja]=action;アクション; Keywords[ka]=ქმედება; Keywords[ko]=동작; Keywords[lo]=ການກະທຳ; Keywords[lv]=darbība; Keywords[nb]=handling; Keywords[nl]=actie; Keywords[nn]=handling; Keywords[oc]=accion; Keywords[pl]=działanie; Keywords[pt]=ação; Keywords[pt_BR]=ação; Keywords[ro]=acţiune; Keywords[ru]=действие; Keywords[sk]=akcia; Keywords[sl]=dejanje; Keywords[sq]=veprim; Keywords[sr]=радња; Keywords[sr@ijekavian]=радња; Keywords[sr@ijekavianlatin]=радња; Keywords[sr@latin]=радња; Keywords[sv]=åtgärd; Keywords[tr]=aksiyon; Keywords[uk]=дія; Keywords[uz]=harakat; Keywords[vi]=hành động; Keywords[zh_CN]=菜单操作; Keywords[zh_TW]=動作; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-applets.desktop0000664000175000017500000001735715167446463026522 0ustar fabiofabio[Desktop Entry] Icon=cs-applets Exec=cinnamon-settings applets Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Applets Name[af]=Toepassingtjies Name[am]=ፕሮግራሞች Name[ar]=البريمجات Name[ay]=Jisk'a-aplikasiyunanaka Name[az]=Uyğulamalar Name[be]=Аплеты Name[bg]=Аплети Name[bn]=অ্যাপলেট Name[br]=Arloadigoù Name[bs]=Apleti Name[ca]=Miniaplicacions Name[ca@valencia]=Miniaplicacions Name[cs]=Applety Name[csb]=Apletë Name[cy]=Rhaglenigau Name[da]=Panelprogrammer Name[el]=Μικροεφαρμογές Name[eo]=Aplikaĵetoj Name[es]=Miniaplicaciones Name[es_AR]=Miniaplicaciones Name[et]=Rakendid Name[eu]=Applet-ak Name[fa]=برنامک‌ها Name[fi]=Sovelmat Name[ga]=Feidhmchláiríní Name[gd]=Aplaidean Name[gl]=Miniaplicativos Name[he]=יישומונים Name[hi]=एप्लेट्स Name[hr]=Apleti Name[hu]=Kisalkalmazások Name[id]=Applet Name[ie]=Applettes Name[is]=Smáforrit Name[it]=Applet Name[ja]=アプレット Name[ka]=აპლეტი Name[kab]=Tiplatin Name[kk]=Апплеттер Name[km]=អាប់​ភ្លេត Name[ko]=애플릿 Name[ku]=Sepanok Name[la]=Miniapplicationes Name[lo]=ແອັບເພັດ Name[lt]=Įskiepiai Name[lv]=Sīklietotnes Name[mai]=एप्लेट Name[ml]=ആപ്‌ലെറ്റുകൾ Name[ms]=Aplet Name[nb]=Miniprogrammer Name[ne]=एप्प्लेट्स Name[nl]=Werkbalkhulpjes Name[nn]=Panelprogram Name[om]=Apleetota Name[pa]=ਐਪਲਿਟ Name[pl]=Aplety Name[ro]=Applet-uri Name[ru]=Апплеты Name[rue]=Аплікації Name[sk]=Aplety Name[sl]=Apleti Name[so]=Kaabayaasha Name[sq]=Programthet Name[sr]=Програмчићи Name[sr@ijekavian]=Програмчићи Name[sr@ijekavianlatin]=Програмчићи Name[sr@latin]=Apleti Name[sv]=Panelprogram Name[szl]=Aplety Name[ta]=குறுநிரல்கள் Name[te]=ఆప్లెట్లు Name[tg]=Барномаҳо Name[th]=แอปเพล็ต Name[tr]=Uygulamacıklar Name[ts]=Tiphurogireme-ntsongo Name[tt]=Апплетлар Name[uk]=Аплети Name[ur]=ایپلیٹ Name[uz]=Appletlar Name[vi]=Applet Name[zh_CN]=面板小工具 Name[zh_HK]=應用小程式 Name[zh_TW]=面板小程式 Comment=Manage Cinnamon applets Comment[af]=Bestuur Cinnamon-paneelprogramme Comment[am]=የ ሲናሞን አፕሌቶች አስተዳዳሪ Comment[ar]=إدارة بريمجات سينامُن Comment[ast]=Alministra los applets de Cinnamon Comment[ay]=Cinnamon ukat jisk'a-aplikasiyunanak irpaña Comment[az]="Cinnamon" uyğulamalarını Yönəlt Comment[be]=Кіраваць аплетамi Cinnamon Comment[bg]=Управление на аплетите за Cinnamon Comment[br]=Merañ arloadigoù Cinnamon Comment[bs]=Upravljaj Cinnamon apletima Comment[ca]=Gestioneu les miniaplicacions de Cinnamon Comment[ca@valencia]=Gestioneu les miniaplicacions de Cinnamon Comment[cs]=Správa Cinnamon appletů Comment[cy]=Rheoli apledi Cinnamon Comment[da]=Administrér Cinnamon-panelprogrammer Comment[de]=Cinnamon-Applets verwalten Comment[el]=Διαχείριση μικροεφαρμογών Cinnamon Comment[eo]=Administri Cinnamon-aplikaĵetojn Comment[es]=Gestionar las miniaplicaciones de Cinnamon Comment[es_AR]=Gestionar las miniaplicaciones de Cinnamon Comment[et]=Cinnamoni rakendite haldamine Comment[eu]=Kudeatu Cinnamon applet-ak Comment[fa]=مدیریت برنامک‌های Cinnamon Comment[fi]=Hallitse Cinnamon-sovelmia Comment[fil]=I-manage ang Cinnamon applets Comment[fr]=Gérer les applets de Cinnamon Comment[fr_CA]=Gérer les applets de Cinnamon Comment[fy]=Cinnamon applets beheare Comment[gd]=Stiùirich aplaidean Cinnamon Comment[gl]=Administración dos miniaplicativos de Cinnamon Comment[he]=ניהול יישומוני סינמון Comment[hi]=सिनेमन एप्लेट प्रबंधन Comment[hr]=Upravljajte Cinnamon apletima Comment[hu]=Cinnamon kisalkalmazások kezelése Comment[ia]=Administrar le applets de Cinnamon Comment[id]=Kelola aplet Cinnamon Comment[is]=Sýsla með Cinnamon forritlinga Comment[it]=Gestione applet di Cinnamon Comment[ja]=Cinnamon のアプレットを管理 Comment[kab]=Sefrek tiplatin n Cinnamon Comment[ko]=시나몬 애플릿 관리 Comment[la]=Miniapplicationes Cinnamonis Cura Comment[lo]=ຈັດການແອັບເພັດ Cinnamon Comment[lt]=Tvarkyti Cinnamon įskiepius Comment[lv]=Pārvaldīt Cinnamon sīkrīkus Comment[ms]=Mengurus applet Cinnamon Comment[nap]=Cagn l'applets 'e Cinnamon Comment[nb]=Håndter miniprogrammer i Cinnamon Comment[nds]=Cinnamon Minianwendungen bearbeiten Comment[nl]=Werkbalkhulpjes van Cinnamon beheren Comment[nn]=Handter panelprogram i Cinnamon Comment[oc]=Gerir los applets de Cinnamon Comment[pl]=Zarządzaj apletami Cinnamon Comment[pt]=Gerir applets Cinnamon Comment[pt_BR]=Gerenciar applets do Cinnamon Comment[ro]=Gestionează appleturile Cinnamon Comment[ru]=Управление апплетами Cinnamon Comment[rue]=Справованя аплікаціями Cinnamon Comment[sc]=Manìgia applets de Cinnamon Comment[sk]=Spravuje aplety prostredia Cinnamon Comment[sl]=Upravljajte z apleti Cinnamona Comment[sq]=Menaxho programthet e Cinnamon Comment[sr]=Управљање програмчићима Цимета Comment[sr@ijekavian]=Управљање програмчићима Цимета Comment[sr@ijekavianlatin]=Управљање програмчићима Цимета Comment[sr@latin]=Upravljanje apletima Cinnamona Comment[sv]=Hantera Cinnamons panelprogram Comment[tg]=Идоракунии зербарномаҳои Cinnamon Comment[th]=จัดการแอปเพล็ตต่าง ๆ ของ Cinnamon Comment[tr]=Cinnamon uygulamacıklarını yönet Comment[uk]=Керування аплетами Cinnamon Comment[ur]=سنامون کے ایپلیٹس کا انتظام Comment[uz]=Sinnamon appletlarini boshqarish Comment[vi]=Quản lý các Applet Cinnamon Comment[zh_CN]=管理Cinnamon面板小工具 Comment[zh_HK]=管理 Cinnamon 應用小程式 Comment[zh_TW]=管理 Cinnamon 面板小程式 Keywords=applet; Keywords[af]=paneelprogram; Keywords[am]=አፕሌት; Keywords[ar]=البريمج; Keywords[ay]=jisk'a-aplikasiyuna; Keywords[az]=uyğulama; Keywords[be]=аплет; Keywords[bg]=аплет; Keywords[br]=arloadig; Keywords[bs]=aplet; Keywords[ca]=miniaplicació; Keywords[ca@valencia]=miniaplicació; Keywords[cy]=apled; Keywords[da]=panelprogram; Keywords[de]=Applet; Keywords[el]=μικροεφαρμογή; Keywords[eo]=apleto; Keywords[es]=miniaplicación; Keywords[es_AR]=miniaplicación; Keywords[et]=rakend; Keywords[fa]=برنامک; Keywords[fi]=sovelma; Keywords[ga]=feidhmchláirín; Keywords[gd]=aplaid; Keywords[gl]=miniaplicativo; Keywords[he]=יישומון; Keywords[hi]=एप्लेट; Keywords[hr]=aplet; Keywords[hu]=kisalkalmazás; Keywords[id]=aplet; Keywords[is]=smáforrit; Keywords[ja]=applet;アプレット; Keywords[kab]=tapleḍt; Keywords[ko]=애플릿; Keywords[la]=mimniapplicatio; Keywords[lo]=ແອັບເພັດ; Keywords[lt]=įskiepis; Keywords[lv]=sīkrīks; Keywords[ms]=aplet; Keywords[nb]=miniprogram; Keywords[nds]=Minianwendung / Applet; Keywords[nl]=werkbalkhulpje; Keywords[nn]=panelprogram; Keywords[pa]=ਐਪਲਿਟ; Keywords[pl]=aplet; Keywords[ru]=апплет; Keywords[rue]=аплікація; Keywords[sk]=aplet; Keywords[sl]=aplet; Keywords[sq]=programth; Keywords[sr]=програмче; Keywords[sr@ijekavian]=програмче; Keywords[sr@ijekavianlatin]=програмче; Keywords[sr@latin]=aplet; Keywords[sv]=panelprogram; Keywords[ta]=குறுநிரல்; Keywords[tg]=зербарнома; Keywords[th]=แอปเพล็ต; Keywords[tr]=uygulamacık; Keywords[uk]=аплет; Keywords[ur]=ایپلیٹ; Keywords[zh_CN]=面板小工具; Keywords[zh_HK]=應用小程式; Keywords[zh_TW]=面板小程式; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-backgrounds.desktop0000664000175000017500000002242615167446463027345 0ustar fabiofabio[Desktop Entry] Icon=cs-backgrounds Exec=cinnamon-settings backgrounds Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Backgrounds Name[af]=Agtergronde Name[am]=መደቦች Name[ar]=الخلفيات Name[ast]=Fondos de pantalla Name[ay]=Manqhaxanaka Name[az]=Arxaplanlar Name[be]=Фонавыя выявы Name[bg]=Фон Name[br]=Drekleurioù Name[bs]=Pozadine Name[ca]=Fons de l'escriptori Name[ca@valencia]=Fons de l'escriptori Name[cs]=Pozadí Name[cy]=Cefndiroedd Name[da]=Baggrunde Name[de]=Hintergrundbilder Name[el]=Φόντο Name[eo]=Fonoj Name[es]=Fondos Name[es_AR]=Fondos Name[et]=Taustad Name[eu]=Atzeko planoak Name[fa]=پس‌زمینه‌ها Name[fi]=Taustat Name[fr]=Fonds d’écran Name[fr_CA]=Arrière-plans Name[fy]=Eftergrûn Name[ga]=Cúlraí Name[gd]=Cùlaibhean Name[gl]=Fondos Name[he]=רקעים Name[hi]=बैकग्राउंड Name[hr]=Pozadine Name[hu]=Háttérképek Name[ia]=Fundos Name[id]=Latar belakang Name[ie]=Fundes Name[is]=Bakgrunnar Name[it]=Sfondi Name[ja]=背景 Name[ka]=ფონები Name[kab]=Idren n wegdil Name[ko]=배경화면 Name[ku]=Paşxane Name[la]=Fundi Name[lo]=ພື້ນຫຼັງ Name[lt]=Fonai Name[lv]=Fona attēli Name[mo]=Фундалурь Name[ms]=Latar Belakang Name[nb]=Bakgrunner Name[nds]=Hintergrundbilder Name[nl]=Achtergronden Name[nn]=Bakgrunnar Name[oc]=Rèireplans Name[pa]=ਬੈਕਗਰਾਉਂਡ Name[pl]=Tła Name[pt]=Fundos Name[pt_BR]=Planos de Fundo Name[ro]=Fundaluri Name[ru]=Фоновые рисунки Name[rue]=Позадины Name[sc]=Fundales Name[sk]=Pozadia Name[sl]=Ozadja Name[sq]=Sfondet Name[sr]=Позадине Name[sr@ijekavian]=Позадине Name[sr@ijekavianlatin]=Позадине Name[sr@latin]=Pozadine Name[sv]=Bakgrundsbilder Name[ta]=பின்னணிகள் Name[tg]=Пасзаминаҳо Name[th]=พื้นหลัง Name[tr]=Arkaplanlar Name[uk]=Зображення тла Name[ur]=پسِ منظر Name[uz]=Fonlar Name[vi]=Hình nền Name[zh_CN]=背景 Name[zh_HK]=背景 Name[zh_TW]=背景 Comment=Change your desktop's background Comment[af]=Verander u werkskermagtergrond Comment[am]=የ ዴስክቶፕ መደብ መቀየሪያ Comment[ar]=تغيير خلفية سطح المكتب الخاص بك Comment[ast]=Camuda'l fondu del to escritoriu Comment[ay]=Iskrituryu manqhaxa (fondo) mayjaptayaña Comment[az]=İş qoyacağı'nın arxaplanını dəyiş Comment[be]=Змянiць фон працоўнага стала Comment[bg]=Промяна на фона на работния плот Comment[br]=Cheñch drekleur ho purev Comment[bs]=Promjenite vašu pozadinu na desktopu Comment[ca]=Canvieu el vostre fons de l'escriptori Comment[ca@valencia]=Canvieu el vostre fons de l'escriptori Comment[cs]=Změna pozadí plochy Comment[cy]=Newid cefndir eich bwrdd gwaith Comment[da]=Ændr din skrivebordsbaggrund Comment[de]=Schreibtischhintergrund ändern Comment[el]=Άλλαξε το φόντο της επιφάνειας εργασίας Comment[eo]=Ŝanĝu la fonon de via labortablo Comment[es]=Cambiar el fondo del escritorio Comment[es_AR]=Cambiar el fondo del escritorio Comment[et]=Töölaua tausta muutmine Comment[eu]=Aldatu mahaigainaren atzeko planoa Comment[fa]=پس‌زمینه‌ی میزکارتان را تغییر دهید Comment[fi]=Muuta taustakuvaa Comment[fil]=Palitan ang desktop background Comment[fr]=Changer le fond d’écran de votre bureau Comment[fr_CA]=Changer l’arrière-plan de votre bureau Comment[fy]=Bureaublêd eftergrûn feroarje Comment[gd]=Atharraich cùlaibh an desktop agad Comment[gl]=Cambia o fondo do escritorio Comment[he]=החלפת רקע שולחן העבודה Comment[hi]=डेस्कटॉप बैकग्राउंड बदलें Comment[hr]=Promijenite pozadinu svoje redne površine Comment[hu]=Asztal hátterének megváltoztatása Comment[ia]=Cambia le fundo de tu scriptorio Comment[id]=Ubah latar belakang desktop Comment[is]=Breyta bakgrunni skjáborðs Comment[it]=Cambia sfondo del desktop Comment[ja]=デスクトップの背景を変更します Comment[kab]=Beddel agilal n tnarit-ik Comment[ko]=배경화면 변경 Comment[la]=Fundum scriptorii tui muta Comment[lo]=ປ່ຽນພື້ນຫຼັງໜ້າຈໍຂອງເຈົ້າ Comment[lt]=Pakeisti darbalaukio foną Comment[lv]=Mainīt darbvirsmas fona attēlu Comment[ms]=Tukar latar belakang desktop Comment[nap]=Cagn 'o sfunn d''o desktop Comment[nb]=Endre skrivebordsbakgrunnen din Comment[nds]=Desktophintergrund ändern Comment[nl]=Verander de achtergrond van uw bureaublad Comment[nn]=Byt bakgrunn på skrivebordet Comment[oc]=Cambiar lo rèireplan de vòstre burèu Comment[pl]=Zmień tło pulpitu Comment[pt]=Mudar fundo do ambiente de trabalho Comment[pt_BR]=Alterar plano de fundo de sua área de trabalho Comment[ro]=Schimbă imaginea de fundal Comment[ru]=Изменить обои рабочего стола Comment[rue]=Перемінити позадину роботного стола Comment[sc]=Càmbia su fundale de s'iscrivania Comment[sk]=Zmeniť pozadie plochy Comment[sl]=Spremenite ozadje namizja Comment[sq]=Ndryshoni sfondin e desktopit tuaj Comment[sr]=Промените позадину радне површи Comment[sr@ijekavian]=Промените позадину радне површи Comment[sr@ijekavianlatin]=Промените позадину радне површи Comment[sr@latin]=Promeni pozadinu radne površine Comment[sv]=Ändra skrivbordsbakgrund Comment[ta]=பணிமேடையின் பின்னணியை மாற்று Comment[tg]=Тағйир додани пасзаминаи мизи корӣ Comment[th]=เปลี่ยนพื้นหลังบนพื้นโต๊ะของคุณ Comment[tr]=Masaüstü arkaplan resmini değiştir Comment[uk]=Змінити тло робочого столу Comment[ur]=ڈیسک ٹاپ پس منظر تبدیل کریں Comment[uz]=Ish stoli fonini o‘zgartiring Comment[vi]=Đổi hình nền của màn hình chính Comment[zh_CN]=修改桌面背景 Comment[zh_HK]=變更你桌面的背景 Comment[zh_TW]=變更您的桌面背景 Keywords=background;picture;slideshow; Keywords[am]=መደብ: ስእል: ተንሸራታች ማሳያ; Keywords[ar]=الخلفية;صورة;عرض شرائح; Keywords[ast]=fondu;imaxe;slideshow; Keywords[ay]=manqhaxa;jamuqa;uñacht'ayañataki (diapositivas); Keywords[be]=фон;выява;слайды; Keywords[bg]=фон;картина;слайдшоу; Keywords[ca]=fons;imatge;passi de diapositives; Keywords[ca@valencia]=fons;imatge;pas de diapositives; Keywords[cs]=pozadí;obrázek;prezentace; Keywords[cy]=cefndir;llun;sioe sleidiau; Keywords[da]=baggrund;billede;slideshow; Keywords[de]=Hintergrundbild;Diashow; Keywords[el]=Φόντο;εικόνα;παρουσίαση; Keywords[eo]=fono;bildo;bildoprezento; Keywords[es]=fondo;imagen;diapositivas; Keywords[es_AR]=fondo;imagen;diapositivas; Keywords[et]=taust;tapeet;pilt;slaidiseanss;slaidiesitlus; Keywords[eu]=atzeko planoa;irudia;diaporama; Keywords[fa]=پس‌زمینه، تصویر، نمایش‌اسلاید; Keywords[fi]=tausta;kuva;diaesitys; Keywords[fr]=arrière-plan;fond d’écran;image;diaporama; Keywords[fr_CA]=arrière-plan;fond d’écran;image;diaporama; Keywords[he]=רקע;תמונה;תצלום;מצגת; Keywords[hi]=बैकग्राउंड;चित्र;स्लाइडशो; Keywords[hr]=pozadina;slika;prezentacija; Keywords[hu]=háttér;kép;képernyőkép;diavetítés;background;picture;slideshow; Keywords[ia]=fundo;photo;presentation de photos; Keywords[id]=latar belakang;gambar;slideshow; Keywords[is]=bakgrunnur;mynd;skyggnusýning; Keywords[it]=sfondo;immagine;presentazione; Keywords[ja]=background;picture;slideshow;背景;ピクチャ;画像;写真;スライドショー; Keywords[kab]=agilal;tugna;askan n tmaccagin; Keywords[ko]=배경화면;사진;슬라이드쇼; Keywords[lo]=ພື້ນຫຼັງ;ຮູບພາບ;ສະໄລດ໌ໂຊ; Keywords[lt]=fonas;fono;paveikslas;paveikslėlis;paveiksliukas;skaidrių rodymas;paveikslelis;skaidriu rodymas; Keywords[lv]=fons;attēls;slaidrāde; Keywords[nb]=bakgrunn;bilde;lysbildevisning; Keywords[nl]=achtergrond;foto;diavoorstelling; Keywords[nn]=bakgrunn;bilete;lysbileteframvising; Keywords[oc]=rèireplan;fons;imatge;diapo; Keywords[pl]=tło;obraz;pokaz slajdów; Keywords[pt]=fundo;imagem;diapositivo; Keywords[pt_BR]=plano de fundo;imagem;apresentação de slides; Keywords[ro]=fundal;imagine;prezentare de diapozitive; Keywords[ru]=фон;картинка;слайд-шоу; Keywords[rue]=позадина;образчик;слайдшоу; Keywords[sk]=pozadie;obrázok;prezentácia; Keywords[sl]=ozadje;slika;predstavitev; Keywords[sq]=sfond;fotografi;paraqitje me diapozitiva.; Keywords[sr]=позадина;лика;покретни приказ; Keywords[sr@ijekavian]=позадина;лика;покретни приказ; Keywords[sr@ijekavianlatin]=позадина;лика;покретни приказ; Keywords[sr@latin]=pozadina;slika;prezentacija; Keywords[sv]=bakgrund;bilder;bildspel; Keywords[tr]=arkaplan;resim;slayt; Keywords[uk]=тло;картинка;показ слайдів; Keywords[uz]=fon;rasm;slayd-shou; Keywords[vi]=ảnh nền;hình ảnh;trình chiếu; Keywords[zh_CN]=背景,图片,幻灯片; Keywords[zh_HK]=背景,圖片,幻燈片; Keywords[zh_TW]=背景、圖片和幻燈片秀; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-calendar.desktop0000664000175000017500000003135315167446463026613 0ustar fabiofabio[Desktop Entry] Icon=cs-date-time Exec=cinnamon-settings calendar Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Date & Time Name[af]=Datum en Tyd Name[am]=ቀን & ሰአት Name[ar]=التاريخ والوقت Name[ast]=Data & hora Name[ay]=Uru jakhumpi urasampi Name[az]=Gün ilə Vaxt Name[be]=Дата і час Name[bg]=Дата и час Name[br]=Deiziad hag eur Name[bs]=Datum i vrijeme Name[ca]=Data i hora Name[ca@valencia]=Data i hora Name[cs]=Datum a čas Name[cy]=Dyddiad ac Amser Name[da]=Dato og tid Name[de]=Datum & Zeit Name[el]=Ημερομηνία & Ώρα Name[eo]=Dato kaj tempo Name[es]=Fecha y hora Name[es_AR]=Fecha y hora Name[et]=Kuupäev & kellaaeg Name[eu]=Data eta ordua Name[fa]=تاریخ و زمان Name[fi]=Päivä ja aika Name[fil]=Petsa & Oras Name[fr]=Date et heure Name[fr_CA]=Date et heure Name[fy]=Datum en Tiid Name[gd]=Ceann-là ⁊ Àm Name[gl]=Data e hora Name[he]=תאריך וזמן Name[hi]=दिनांक व समय Name[hr]=Datum i Vrijeme Name[hu]=Dátum és idő Name[ia]=Data & tempore Name[id]=Tanggal & Waktu Name[ie]=Date e hora Name[is]=Dagsetning og tími Name[it]=Data e ora Name[ja]=日付と時刻 Name[ka]=თარიღი & დრო Name[kab]=Azemz & Akud Name[ko]=날짜 & 시간 Name[ku]=Roj & Dem Name[la]=Dies Horaque Name[lo]=ວັນແລະເວລາ Name[lt]=Data ir laikas Name[lv]=Datums un laiks Name[mo]=Датэ ши орэ Name[ms]=Tarikh & Masa Name[nb]=Dato og klokkeslett Name[nds]=Datum & Zeit Name[nl]=Datum en tijd Name[nn]=Dato & tid Name[oc]=Data & ora Name[pa]=ਮਿਤੀ ਤੇ ਸਮਾਂ Name[pl]=Data i godzina Name[pt]=Data e hora Name[pt_BR]=Data e Hora Name[ro]=Dată și oră Name[ru]=Дата и время Name[rue]=Дата и час Name[sc]=Data e oràriu Name[sk]=Dátum a čas Name[sl]=Datum in čas Name[sq]=Data dhe Ora Name[sr]=Датум и време Name[sr@ijekavian]=Датум и време Name[sr@ijekavianlatin]=Датум и време Name[sr@latin]=Datum i vreme Name[sv]=Datum och tid Name[szl]=Data i czas Name[ta]=தேதியும் நேரமும் Name[tg]=Сана ва вақт: Name[th]=วันที่และเวลา Name[tr]=Tarih & Zaman Name[uk]=Дата та час Name[ur]=وقت اور تاريخ Name[uz]=Sana & Vaqt Name[vi]=Ngày giờ Name[zgh]=ⴰⵙⴰⴽⵓⴷ ⴷ ⵡⴰⴽⵓⴷ Name[zh_CN]=日期和时间 Name[zh_HK]=日期與時間 Name[zh_TW]=日期與時間 Comment=Manage date and time settings Comment[af]=Bestuur datum- en tydinstellings Comment[am]=የ ቀን እና ሰአት ማሰናጃ አስተዳዳሪ Comment[ar]=إدارة إعدادات التاريخ والوقت Comment[ast]=Alministra los axustes de data y tiempu Comment[ay]=Uru jakhumpi urampi (hora) mayjachaña Comment[az]=Gün, vaxt quruluşlarını yönəlt Comment[be]=Кіраваць наладамi даты і часу Comment[bg]=Управление на часа и датата Comment[br]=Merañ arventennoù an deiziad hag an eur Comment[bs]=Upravljajte postavkama datuma i vremena Comment[ca]=Gestioneu els ajusts de la data i l'hora Comment[ca@valencia]=Gestioneu els ajusts de la data i l'hora Comment[cs]=Nastavení data a času Comment[cy]=Rheoli gosodiadau dyddiad ac amser Comment[da]=Administrér dato- og tidsindstillinger Comment[de]=Datum- und Zeiteinstellungen verwalten Comment[el]=Διαχειρίσου τις ρυθμίσεις ημερομηνίας και ώρας Comment[eo]=Administri agordojn de dato kaj tempo Comment[es]=Gestionar la configuración de la fecha y la hora Comment[es_AR]=Gestionar la configuración de la fecha y la hora Comment[et]=Kuupäeva ja kellaaja sätete haldamine Comment[eu]=Kudeatu data eta orduaren ezarpenak Comment[fa]=مدیریت تنظیمات تاریخ و زمان Comment[fi]=Muuta aikaan liittyviä asetuksia Comment[fil]=I-manage ang settings ng petsa at oras Comment[fr]=Gérer les paramètres de date et d’heure Comment[fr_CA]=Gérer les paramètres de date et d’heure Comment[gd]=Stiùirich roghainnean a' chinn-là 's an ama Comment[gl]=Administrar a configuración de data e hora Comment[he]=ניהול הגדרות תאריך וזמן Comment[hi]=दिनांक व समय सेटिंग्स प्रबंधन Comment[hr]=Upravljajte postavkama datuma i vremena Comment[hu]=Dátum és idő beállítások kezelése Comment[ia]=Administrar configurationes de data e tempore Comment[id]=Atur pengaturan tanggal dan waktu Comment[is]=Sýsla með stillingar fyrir dagsetningu og tíma Comment[it]=Impostazioni data e ora Comment[ja]=日付と時刻の設定を管理 Comment[kab]=Sefrek iɣewwaṛen n wazemz akked wakud Comment[ko]=날짜 및 시간 설정 관리 Comment[la]=Configurationem diei and horae cura Comment[lo]=ຈັດການການຕັ້ງຄ່າວັນແລະເວລາ Comment[lt]=Keisti datos ir laiko nustatymus Comment[lv]=Pārvaldīt datuma un laika iestatījumus Comment[ms]=Mengurus tetapan tarikh dan masa Comment[nb]=Behandle innstillinger for dato og tid Comment[nds]=Datums- und Zeiteinstellung bearbeiten Comment[nl]=Instellingen voor datum en tijd beheren Comment[nn]=Administrer innstillingar for dato og klokkeslett Comment[oc]=Gerir los paramètres de data e d'ora Comment[pl]=Zarządzaj ustawieniami daty i czasu Comment[pt]=Gerir definições de data e de hora Comment[pt_BR]=Gerenciar configurações de data e hora Comment[ro]=Gestionează setările datei și orei Comment[ru]=Управление параметрами даты и времени Comment[rue]=Справованя даты тай часу Comment[sc]=Manìgia cunfiguratziones de data e oràriu Comment[sk]=Spravuje nastavenia dátumu a času Comment[sl]=Upravljajte z nastavitvami datuma in časa Comment[sq]=Menaxho parametrat e datës dhe orës Comment[sr]=Управљање поставкама датума и времена Comment[sr@ijekavian]=Управљање поставкама датума и времена Comment[sr@ijekavianlatin]=Управљање поставкама датума и времена Comment[sr@latin]=Upravljaj podešavanjima datuma i vremena Comment[sv]=Hantera datum och tidsinställningar Comment[tg]=Идоракунии танзимоти вақт ва сана Comment[th]=จัดการการตั้งค่าวันและเวลา Comment[tr]=Tarih ve zaman ayarlarını yönet Comment[uk]=Керування налаштуваннями дати та часу Comment[ur]=وقت اور تاریخ کی ترتیبات کا انتظام کریں Comment[uz]=Sana va vaqt sozlamalarini boshqarish Comment[vi]=Quản lý cài đặt ngày và giờ Comment[zh_CN]=管理时间/日期设置 Comment[zh_HK]=管理日期與時間設定 Comment[zh_TW]=管理日期與時間設定 Keywords=time;date;calendar;format;network;sync; Keywords[af]=tyd;datum;kalender;formaat;netwerk;sinchroniseer; Keywords[am]=ሰአት : ቀን : ቀን መቁጠሪያ : አቀራረብ : ኔትዎርክ : ማስማሚያ; Keywords[ar]=الوقت، التاريخ، التنسيق، الشبكة، المزامنة; Keywords[ast]=tiempu;hora;data;calendariu;calandariu;formatu;rede;sincronizar;sincronización; Keywords[ay]=ura;uru jakhu;pacha-mara-jakhu;utt'ayawi;llika;pacha kikipayaña;hora;fecha;calendario;formato;red;sincronización; Keywords[az]=vaxt;gün;ilgün;boyut;tor işi;sinxronlaşma; Keywords[be]=час;дата;каляндар;фармат;сетка;сінхранізацыя; Keywords[bg]=време;дата;календар;формат;мрежа;синхронизиране; Keywords[bs]=vrijeme;datum;kalendar;format;mreža;sinhronizacija; Keywords[ca]=hora;data;calendari;format;xarxa;sincronització; Keywords[ca@valencia]=hora;data;calendari;format;xarxa;sincronització; Keywords[cs]=čas;datum;kalendář;formát;síť;synchronizace; Keywords[cy]=amser;dyddiad;calendr;fformat;rhwydwaith;cydweddu; Keywords[da]=tid;dato;kalender;format;netværk;synkronisering; Keywords[de]=Zeit;Datum;Kalender;Format;Netzwerk;Synchronisierung; Keywords[el]=ώρα;ημερομηνία;ημερολόγιο;μορφοποίηση;δίκτυο;συγχρονισμός; Keywords[eo]=tempo;dato;kalendaro;aranĝo;reto;sinkronigi; Keywords[es]=hora;fecha;calendario;formato;red;sincronización; Keywords[es_AR]=hora;fecha;calendario;formato;red;sincronización; Keywords[et]=aeg;kellaaeg;kuupäev;kalender;vorming;võrk;sünkroniseerimine; Keywords[eu]=ordua;data;egutegia;formatua;sarea;sinkronizazioa; Keywords[fa]=زمان، تاریخ، تقویم، قالب‌بندی، شبکه، هم‌زمانی; Keywords[fi]=aika;päiväys;kalenteri;formaatti;verkko;synkronointi; Keywords[fil]=oras;petsa;kalendaryo;format;network;sync; Keywords[fr]=heure;date;calendrier;agenda;format;réseau;synchronisation; Keywords[fr_CA]=heure;date;calendrier;agenda;format;réseau;synchronisation; Keywords[fy]=tiid;datum;kalinder;opset;netwurk;syngronisaasje; Keywords[ga]=am;dáta;féilire;formáid;líonra;sync; Keywords[gd]=àm;tìm;ceann-là;mìosachan;fòrmat;lìonra;sioncronachadh;tìm;ceann-latha;mìosachan;fòrmat;lìonra;sionc; Keywords[gl]=hora;data;calendario;formato;rede;sincronización; Keywords[he]=זמן;תאריך;לוח שנה;תבנית;רשת;סנכרון; Keywords[hi]=समय;दिनांक;दिनदर्शिका;प्रारूप;नेटवर्क;समकालीन; Keywords[hr]=vrijeme;datum;kalendar;format;mreža;usklađivanje; Keywords[hu]=idő;dátum;naptár;formátum;hálózat;szinkronizálás; Keywords[ia]=tempore;data;calendario;formato;rete;synchronisation; Keywords[id]=waktu;tanggal;kalender;format;jaringan;cocokkan; Keywords[is]=tími;dagsetning;cdagatal;snið;netkerfi;samstilling; Keywords[it]=ora;data;calendario;formato;rete;sync; Keywords[ja]=time;date;calendar;format;network;sync;時刻;時間;日付;カレンダー;フォーマット;形式;書式;ネットワーク;同期; Keywords[kab]=akud;azemz;awiyat;amasal;aẓeṭṭa;amtawi; Keywords[ko]=시간;날짜;달력;형식;네트워크;동기화; Keywords[lo]=ເວລາ;ວັນ;ປະຕິທິນ;ຮູບແບບ;ເຄືອຂ່າຍ;ຊິງຄ໌; Keywords[lt]=laikas;data;kalendorius;formatas;tinklas;sinchronizacija; Keywords[lv]=laiks;datums;kalendārs;formāts;tīkls;sinhronizācija; Keywords[ms]=masa;tarikh;kalendar;format;rangkaian;segerak; Keywords[nb]=tid;dato;kalender;format;nettverk;synkroniser; Keywords[nds]=Zeit;Datum;Kalender;Format;Netzwerk;Synchronisation; Keywords[nl]=tijd;datum;kalender;bestandtype;netwerk;synchroniseren; Keywords[nn]=tid;dato;kalender;format;nettverk;synkronisering; Keywords[oc]=ora;data;calendièr;calendari;format;ret;malhum;sincronizacion; Keywords[pa]=ਸਮਾਂ;ਮਿਤੀ;ਕਲੈੰਡਰ;ਸਵਰੂਪ;ਨੈੱਟਵਰਕ;sync; Keywords[pl]=czas;data;kalendarz;format;sieć;synchronizacja; Keywords[pt]=hora;data;calendário;formato;rede;sincronização; Keywords[pt_BR]=hora;data;calendário;formato;rede;sincronização; Keywords[ro]=timp;dată;calendar;format;rețea;sincronizare; Keywords[ru]=время;дата;календарь;формат;сеть;синхронизация; Keywords[rue]=час;дата;календарь;формат;мрежа;сінхронізація; Keywords[sc]=oràriu;data;calendàriu;formatu;retza;sinc; Keywords[sk]=čas;dátum;kalendár;formát;siete;synchorizácia; Keywords[sl]=čas;datum;koledar;oblika;omrežje;usklajevanje; Keywords[sq]=ora;data;kalendari;formati;rrjeti;sinkronizo; Keywords[sr]=време;датум;календар;формат;мрежа;усклађивање; Keywords[sr@ijekavian]=време;датум;календар;формат;мрежа;усклађивање; Keywords[sr@ijekavianlatin]=време;датум;календар;формат;мрежа;усклађивање; Keywords[sr@latin]=vreme;datum;kalendar;format;mreža;usklađivanje; Keywords[sv]=tid;datum;kalender;format;nätverk;synkronisering; Keywords[ta]=நேரம்;தேதி;நாட்காட்டி;வடிவம்;பிணையம்;ஒத்திசைவு; Keywords[tg]=вақт;сана;тақвим;формат;шабака;ҳамоҳангсозӣ; Keywords[th]=เวลา;วัน;ปฏิทิน;รูปแบบ;เครือข่าย;การโอนข้อมูล; Keywords[tr]=zaman;tarih;takvim;biçim;ağ;eşitleme; Keywords[uk]=час;дата;календар;формат;мережа;синхронізація; Keywords[ur]=وقت، تاریخ، تقویم، ساخت، نیٹورک، سنک، کالینڈر، فارمیٹ; Keywords[uz]=vaqt;sana;kalendar;format;tarmoq;sync; Keywords[vi]=thời gian;ngày tháng;lịch;định dạng;mạng;đồng bộ; Keywords[zh_CN]=time;date;calendar;format;network;sync;时间;日期;日历;日程;格式;网络;同步; Keywords[zh_HK]=時間;日期;日曆;格式;網絡;同步; Keywords[zh_TW]=時間;日期;行事曆;格式;網路;同步; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-default.desktop0000664000175000017500000004535715167446463026477 0ustar fabiofabio[Desktop Entry] Icon=cs-default-applications Exec=cinnamon-settings default Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Preferred Applications Name[af]=Voorkeurtoepassings Name[am]=የ መረጥኩት መተግበሪያ Name[ar]=التطبيقات المفضلة Name[ast]=Aplicaciones preferíes Name[ay]=Munat aplikasiyunanaka Name[az]=Üstünlük verilən Uyğulamalar Name[be]=Праграмы па змаўчанні Name[bg]=Предпочитани програми Name[bn]=পছন্দের অ্যাপ্লিকেশন Name[br]=Arloadoù gwellañ karet Name[bs]=Preferirane aplikacije Name[ca]=Aplicacions preferides Name[ca@valencia]=Aplicacions preferides Name[cs]=Upřednostňované aplikace Name[cy]=Rhaglenni Dewisol Name[da]=Foretrukne programmer Name[de]=Bevorzugte Anwendungen Name[el]=Προτιμώμενες Εφαρμογές Name[eo]=Preferaj Aplikaĵoj Name[es]=Aplicaciones preferidas Name[es_AR]=Aplicaciones preferidas Name[et]=Eelistatud rakendused Name[eu]=Hobetsitako aplikazioak Name[fa]=برنامه های ترجیح داده شده Name[fi]=Ohjelmat ja oletukset Name[fil]=Gustong Apps Name[fr]=Applications par défaut Name[fr_CA]=Applications par défaut Name[gd]=Aplacaidean as fhearr leat Name[gl]=Aplicativos preferidos Name[he]=יישומים מועדפים Name[hi]=इच्छित अनुप्रयोग Name[hr]=Željene aplikacije Name[hu]=Alapértelmezett alkalmazások Name[ia]=Applicationes preferite Name[id]=Aplikasi Pilihan Name[ie]=Applicationes preferet Name[is]=Sjálfgefin forrit Name[it]=Applicazioni preferite Name[ja]=お気に入りのアプリ Name[ka]=სასურველი პროგრამები Name[kab]=Isnasen imenyafen Name[ko]=기본 애플리케이션 Name[ku]=Sepanên ku Têne Tercîhkirin Name[lo]=ໂປຣແກຣມທີ່ເລືອກ Name[lt]=Pageidaujamos programos Name[lv]=Noklusētās programmas Name[ms]=Aplikasi Digemari Name[nb]=Foretrukne programmer Name[nds]=Bevorzugte Anwendungen Name[nl]=Voorkeurstoepassingen Name[nn]=Føretrekte program Name[oc]=Aplicacions preferidas Name[pl]=Preferowane programy Name[pt]=Aplicações preferidas Name[pt_BR]=Aplicativos Preferenciais Name[ro]=Aplicații preferate Name[ru]=Предпочтительные приложения Name[rue]=Майлюбимі придаткы Name[sc]=Aplicatziones preferidas Name[sk]=Uprednostňované aplikácie Name[sl]=Prednostni programi Name[sq]=Programet e preferuara Name[sr]=Омиљени програми Name[sr@ijekavian]=Омиљени програми Name[sr@ijekavianlatin]=Омиљени програми Name[sr@latin]=Preferirane aplikacije Name[sv]=Förvalda program Name[th]=โปรแกรมที่ชอบ Name[tr]=Tercih Edilen Uygulamalar Name[uk]=Усталені програми Name[ur]=ترجیحی ایپلی کیشنز Name[uz]=Tanlangan dasturlar Name[vi]=Ứng dụng Ưa thích Name[zh_CN]=默认应用程序 Name[zh_HK]=喜好的應用程式 Name[zh_TW]=偏好的應用程式 Comment=Preferred Applications Comment[af]=Voorkeurtoepassings Comment[am]=የ መረጥኩት መተግበሪያ Comment[ar]=التطبيقات المفضلة Comment[ast]=Aplicaciones preferíes Comment[ay]=Munat aplikasiyunanaka Comment[az]=Üstünlük verilən Uyğulamalar Comment[be]=Праграмы па змаўчанні Comment[bg]=Предпочитани програми Comment[bn]=পছন্দের অ্যাপ্লিকেশন Comment[br]=Arloadoù gwellañ karet Comment[bs]=Preferirane aplikacije Comment[ca]=Aplicacions preferides Comment[ca@valencia]=Aplicacions preferides Comment[cs]=Upřednostňované aplikace Comment[cy]=Rhaglenni Dewisol Comment[da]=Foretrukne programmer Comment[de]=Bevorzugte Anwendungen Comment[el]=Προτιμώμενες Εφαρμογές Comment[eo]=Preferaj Aplikaĵoj Comment[es]=Aplicaciones preferidas Comment[es_AR]=Aplicaciones preferidas Comment[et]=Eelistatud rakendused Comment[eu]=Hobetsitako aplikazioak Comment[fa]=برنامه های ترجیح داده شده Comment[fi]=Ohjelmat ja oletukset Comment[fil]=Gustong Apps Comment[fr]=Applications par défaut Comment[fr_CA]=Applications par défaut Comment[gd]=Aplacaidean as fhearr leat Comment[gl]=Aplicativos preferidos Comment[he]=יישומים מועדפים Comment[hi]=इच्छित अनुप्रयोग Comment[hr]=Željene aplikacije Comment[hu]=Alapértelmezett alkalmazások Comment[ia]=Applicationes preferite Comment[id]=Aplikasi Pilihan Comment[ie]=Applicationes preferet Comment[is]=Sjálfgefin forrit Comment[it]=Applicazioni preferite Comment[ja]=お気に入りのアプリ Comment[ka]=სასურველი პროგრამები Comment[kab]=Isnasen imenyafen Comment[ko]=기본 애플리케이션 Comment[ku]=Sepanên ku Têne Tercîhkirin Comment[lo]=ໂປຣແກຣມທີ່ເລືອກ Comment[lt]=Pageidaujamos programos Comment[lv]=Noklusētās programmas Comment[ms]=Aplikasi Digemari Comment[nb]=Foretrukne programmer Comment[nds]=Bevorzugte Anwendungen Comment[nl]=Voorkeurstoepassingen Comment[nn]=Føretrekte program Comment[oc]=Aplicacions preferidas Comment[pl]=Preferowane programy Comment[pt]=Aplicações preferidas Comment[pt_BR]=Aplicativos Preferenciais Comment[ro]=Aplicații preferate Comment[ru]=Предпочтительные приложения Comment[rue]=Майлюбимі придаткы Comment[sc]=Aplicatziones preferidas Comment[sk]=Uprednostňované aplikácie Comment[sl]=Prednostni programi Comment[sq]=Programet e preferuara Comment[sr]=Омиљени програми Comment[sr@ijekavian]=Омиљени програми Comment[sr@ijekavianlatin]=Омиљени програми Comment[sr@latin]=Preferirane aplikacije Comment[sv]=Förvalda program Comment[th]=โปรแกรมที่ชอบ Comment[tr]=Tercih Edilen Uygulamalar Comment[uk]=Усталені програми Comment[ur]=ترجیحی ایپلی کیشنز Comment[uz]=Tanlangan dasturlar Comment[vi]=Ứng dụng Ưa thích Comment[zh_CN]=默认应用程序 Comment[zh_HK]=喜好的應用程式 Comment[zh_TW]=偏好的應用程式 Keywords=media;defaults;applications;programs;removable;browser;email;calendar;music;videos;photos;images;cd;autoplay;favorite;apps; Keywords[ar]=الوسائط، الافتراضية، التطبيقات، البرامج، القابلة للإزالة، المتصفح، البريد الإلكتروني، التقويم، الموسيقى، الفيديو، الصور، الصور، القرص المضغوط، التشغيل التلقائي، المفضلة، التطبيقات; Keywords[ast]=multimedia;predetermináos;aplicaciones;programas;desaniciable;restolador;corréu lletrónicu;calendariu;música;videos;semeyes;imáxenes;cd;reproducción automática;favoritu;apps; Keywords[ay]=yanapa;qalltatpach ajllita;aplikasiyunanaka;programanaka;siksuñataki;tuyuri;e-chaski;pacha-mara-jakhu;kirkiwi;videos;phutunaka;jamuqanaka;cd;justupak kirkiyawi;munata;jisk'a-aplikasiyunanaka;soporte;predeterminadas;aplicaciones;programas;extraíble;navegador;correo;calendario;música;vídeos;fotos;imágenes;reproducción;automática;favoritas;apps; Keywords[be]=медыя;перадвызначаныя;праграмы;здымныя;браўзер;пошта;каляндар;музыка;відэа;фота;выявы;дыск;аўтапрайграванне;абраныя; Keywords[bg]=медия;стандартни;приложения;програми;преносими;браузър;имейл;календар;музика;видео;снимки;изображения;cd;автоматично;л'бими;приложения; Keywords[ca]=mitjans;valors per defecte;aplicacions;programes;extraïble;navegador;correu electrònic;calendari;música;vídeos;fotos;imatges;CD;reproducció automàtica;preferits; Keywords[ca@valencia]=mitjans;valors per defecte;aplicacions;programes;extraïble;navegador;correu electrònic;calendari;música;vídeos;fotos;imatges;CD;reproducció automàtica;preferits;aplicacions; Keywords[cs]=média;výchozí;aplikace;programy;vyjímatelné;prohlížeč;e-mail;kalendář;hudba;videa;fotky;obrázky;cd;automatické spouštění;oblíbené; Keywords[cy]=cyfryngau;rhagosodiadau;rhaglenni;symudadwy;porwr;e-bost;calendr;cerddoriaeth;fideos;ffotograffau;delweddau;cd;awtochwarae;hoff;apiau; Keywords[da]=medier;standarder;programmer;applikationer;flytbar;browser;e-mail;kalender;musik;videoer;billeder;fotos;cd;automatisk afspilning;favorit;app; Keywords[de]=Medien;Vorgaben;Standards;Anwendungen;Programme;entfernbar;Browser;E-Mail;Kalender;Musik;Videos;Fotos;Bilder;CD;automatische Wiedergabe;Favoriten;Apps;defaults;removable;email;calendar;photos;images;pictures;autoplay;favorite; Keywords[el]=μέσα;προεπιλογές;εφαρμογές;προγράμματα;αφαιρούμενο μέσο;πρόγραμμα περιήγησης;πρόγραμμα ηλεκτρονικού ταχυδρομείου;ημερολόγιο;μουσική;βίντεο;φωτογραφίες;εικόνες;cd;αυτόματη αναπαραγωγή;αγαπημένα;εφαρμογές; Keywords[en_GB]=media;defaults;applications;programs;removable;browser;email;calendar;music;videos;photos;images;cd;autoplay;favourite;apps; Keywords[eo]=datumportilo;defaŭltoj;aplikaĵoj;programoj;demetebla;foliumilo;retpoŝto;kalendaro;muziko;filmetoj;fotoj;bildoj;lumdisko;aŭtomate ludi;preferaĵo;apoj; Keywords[es]=soporte;predeterminadas;aplicaciones;programas;extraíble;navegador;correo;calendario;música;vídeos;fotos;imágenes;cd;reproducción;automática;favoritas; Keywords[es_AR]=soporte;predeterminadas;aplicaciones;programas;extraíble;navegador;correo;calendario;música;vídeos;fotos;imágenes;cd;reproducción;automática;favoritas; Keywords[et]=meedia;vaikimisi;rakendused;programmid;eemaldatav;brauser;e-post;email;e-mail;kalender;muusika;videod;fotod;pildid;cd;plaat;automaatne;lemmik;äpid; Keywords[eu]=multimedia;lehenetsiak;aplikazioak;programak;aldagarria;arakatzailea;posta;egutegia;musika;bideoak;argazkiak;irudiak;cd;erreproduzitu automatikoki;gogokoak;app-ak; Keywords[fa]=رسانه، پیش‌فرض‌ها، برنامه ها، نرم‌افزارها، قابل‌جداسازی، مرورگر، ایمیل، تقویم، موسیقی، ویدیوها، عکس‌ها، تصاویر، cd ، پخش‌خودکار، علاقه‌مندی، برنامه ها; Keywords[fi]=media;oletukset;sovellukset;ohjelmat;poistettavat;selain;sähköposti;kalenteri;musiikki;videot;valokuvat;kuvat;cd;automaattitoisto;suosikki;sovellukset; Keywords[fr]=supports;support;défaut;applications;programmes;amovible;navigateur;e-mail;email;courriel;calendrier;agenda;musique;vidéos;photos;images;cd;lecture automatique;favoris;favorites;applications; Keywords[fr_CA]=supports;support;défaut;applications;programmes;amovible;navigateur;e-mail;email;courriel;calendrier;agenda;musique;vidéos;photos;images;cd;lecture automatique;favoris;favorites;applications; Keywords[he]=מדיה;ברירות מחדל;יישום;תכנות;ניתנים להסרה;דפדפן;דוא"ל;לוח שנה;מוזיקה;חוזי;תמונות;דמויות;תקליטור;נגינה אוטומטית;מועדפים;יישומים;יישומונים; Keywords[hi]=मीडिया;डिफ़ॉल्ट;अनुप्रयोग;प्रोग्राम;हटाने योग्य;ब्राउज़र;ईमेल;दिनदर्शिका;संगीत;वीडियो;फोटो;चित्र;सीडी;स्वतः चालू;पसंदीदा;ऐप; Keywords[hr]=medija;zadano;aplikacije;programi;uklonjivo;preglednik;e-pošta;kalendar;glazba;video;fotografije;slike;cd;automatska reprodukcija;omiljeno;aplik; Keywords[hu]=média;alapértelmezett;alkalmazások;programok;cserélhető;böngésző;e-mail;naptár;zene;videók;fényképek;fotók;képek;cd;automatikus;lejátszás;kedvenc;appok; Keywords[ia]=medios;valores predefinite;applicationes;programmas;removibile;navigator;email;calendario;musica;videos;photos;imagines;cd;autoreproduce;favorito;applicationes; Keywords[id]=media;baku;aplikasi;program;lepasan;peramban;surel;kalender;musik;video;foto;gambar;CD;autoplay;favorit;aplikasi; Keywords[is]=miðlar;sjálfgefið;forrit;útskiptanleg;vafri;póstur;dagatal;tónlist;vídeó;myndskeið;myndir;cd;sjálfspila;eftirlæti;smáforrit;forrit; Keywords[it]=media;predefiniti;applicazioni;programmi;rimuovibili;browser;email;calendario;musica;video;foto;immagini;cd;autoplay;preferiti;apps; Keywords[ja]=media;defaults;applications;programs;removable;browser;email;calendar;music;videos;photos;images;cd;autoplay;favorite;apps;メディア;デフォルト;既定;アプリケーション;プログラム;リムーバブル;ブラウザー;メール;カレンダー;ミュージック;音楽;ビデオ;動画;フォト;写真;イメージ;画像;自動再生;お気に入り;アプリ; Keywords[kab]=allal n teywalt;imezwar;isnasen;ahilen;allalen yettwakkasen;iminig;email;awitay;aẓawan;tividyutin;tiwtafin;tugniwin;cd;taɣuri tawurmant;inurifen;izegrar; Keywords[ko]=미디어;기본;애플리케이션;프로그램;제거가능;브라우저;이메일;달력;음악;비디오;사진;이미지;cd;자동재생;즐겨찾기;앱; Keywords[lo]=ສື່;ຄ່າເລີ່ມຕົ້ນ;ແອັບພລິເຄຊັນ;ໂປຣແກຣມ;ຖອດໄດ້;ບຣາວເຊີ;ອີເມວ;ປະຕິທິນ;ເພງ;ວິດີໂອ;ຮູບຖ່າຍ;ຮູບພາບ;ຊີດີ;ຫຼິ້ນອັດຕະໂນມັດ;ລາຍການທີ່ມັກ;ແອັບ; Keywords[lt]=medija;numatytosios;programos;keičiamieji;naršyklė;el. paštas;kalendorius;muzika;vaizdo įrašai;video;nuotraukos;paveikslai;paveikslėliai;cd;automatinis paleidimas;mėgstamos; Keywords[lv]=multivide;noklusējumi;lietotnes;programmas;noņemams;pārlūks;e-pasts;kalendārs;mūzika;video;fotoattēli;attēli;cd;automātiskā atskaņošana;iecienītākās;lietotnes; Keywords[nb]=media;standarder;applikasjoner;programmer;flyttbar;nettleser;e-post;kalender;musikk;videoer;fotoer;bilder;cd;automatisk avspilling;favoritt;apper; Keywords[nl]=media;standaarden;toepassingen;programma's;verwijderbaar;webbrowser;email;kalender;muziek;video's;foto's;afbeeldingen;CD;automatisch afspelen;favoriet; Keywords[nn]=medium;standardar;applikasjonar;program;flyttbar;nettlesar;e-post;kalender;musikk;videoar;foto;bilete;cd;automatisk avspeling;favorittar;appar; Keywords[oc]=mèdia;defaut;aplicacions;programas;amovible;navegador;navigador;corrièl;musica;vidèos;fòtos;imatges;cd;lectura automatica;favorits;apps; Keywords[pl]=media;ustawienia domyślne;aplikacje;programy;przenośne;przeglądarka;poczta elektroniczna;kalendarz;muzyka;filmy;zdjęcia;obrazy;cd;autoodtwarzanie;ulubione;aplikacje; Keywords[pt]=multimédia;predefinidos;aplicações;programas;removível;navegador;e-mail;calendário;música;vídeos;fotos;imagens;CD;reprodução automática;favoritos;aplicações; Keywords[pt_BR]=mídia;padrões;aplicativos;programas;removível;navegador;email;calendário;música;vídeos;fotos;imagens;cd;autoinício;favorito;apps; Keywords[ro]=media;implicite;aplicații;programe;amovibile;browser;e-mail;calendar;muzică;clipuri video;fotografii;imagini;cd;redare automată;preferate;aplicații; Keywords[ru]=носители;настройки по умолчанию;приложения;программы;съемные устройства;браузер;электронная почта;календарь;музыка;видео;фото;изображения;CD;автозапуск;избранное; Keywords[rue]=носителі;стандардні штімованя;придаткы;проґрамы;знимані девайсы;браузер;електрона пошта;календарь;музика;відео;фотькы;образчикы;CD;аутобавеня;убраноє; Keywords[sk]=médiá;predvolené;aplikácie;programy;odstrániteľné;prehliadač;email;kalendár;hudba;videá;fotky;obrázky;cd;autoprehrávače;obľúbené;appy; Keywords[sl]=mediji;privezete;aplikacije;programi;izmenljiv;brskalnik;e-pošta;koledar;glasba;videi;fotografije;slike;cd;samodejno predvajanje;pribljubljeno;apps; Keywords[sq]=media;parazgjedhje;aplikacione;programe;i lëvizshëm;shfletues;email;kalendar;muzikë;video;foto;imazhe;cd;luajtje automatike;të preferuara;aplikacione; Keywords[sr]=медија;подразумевано;апликације;програми;уклоњиво;прегледач;е-пошта;календар;музика;видео;фотографија;слике;цд;аутоматска репродукција;омиљено;програми; Keywords[sr@ijekavian]=медија;подразумевано;апликације;програми;уклоњиво;прегледач;е-пошта;календар;музика;видео;фотографија;слике;цд;аутоматска репродукција;омиљено;програми; Keywords[sr@ijekavianlatin]=медија;подразумевано;апликације;програми;уклоњиво;прегледач;е-пошта;календар;музика;видео;фотографија;слике;цд;аутоматска репродукција;омиљено;програми; Keywords[sr@latin]=mediji;podrazumevane vrednosti;aplikacije;programi;uklonjivi;pretraživač;e-pošta;kalendar;muzika;video;fotografije;slike;cd;automatska reprodukcija;omiljeno;aplikacije; Keywords[sv]=media;standard;program;program;flyttbar;webbläsare;e-post;kalender;musik;videor;foton;bilder;cd;autoplay;favorit;appar; Keywords[tr]=ortam;varsayılanlar;uygulamalar;programlar;çıkartılabilir;gözat;eposta;takvim;müzik;videolar;fotoğraflar;resimler;cd;otomatik oynat;sevilenler;uyg; Keywords[uk]=носії;типові налаштування;додатки;програми;знімні пристрої;бравзер;електронна пошта;календар;музика;відео;світлини;зображення;CD;автозапуск;обране;додатки; Keywords[uz]=media;standart;ilovalar;dasturlar;olinadigan;brauzer;e-pochta;taqvim;musiqa;videolar;foto;rasmlar;cd;avtomatik ijro;sevimli;ilovalar; Keywords[vi]=phương tiện truyền thông;mặc định;ứng dụng;chương trình;có thể xóa được;trình duyệt;email;lịch;nhạc;video;hình ảnh;hình chụp;hình ảnh;cd;tự động chạy;ưa thích;các ứng dụng.; Keywords[zh_CN]=媒体,默认,应用程序,程序,可移动,浏览器,电子邮件,日历,音乐,视频,照片,图像,CD,自动播放,收藏,应用程序; Keywords[zh_HK]=媒體;預設值;應用程式;程式;可移除式媒體;瀏覽器;Email;日曆;音樂;影片;圖片;影像;CD;自動播放;喜愛項目;Apps; Keywords[zh_TW]=媒體;預設值;應用程式;程式;可移除式媒體;瀏覽器;Email;日曆;音樂;影片;圖片;影像;CD;自動播放;喜愛項目;Apps; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-desklets.desktop0000664000175000017500000002557115167446463026665 0ustar fabiofabio[Desktop Entry] Icon=cs-desklets Exec=cinnamon-settings desklets Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Desklets Name[af]=Werkskermprogramme Name[am]=ዴስክሌቶች Name[ar]=التطبيقات المكتبية Name[ay]=Iskrituryut jisk'a-aplikasiyunanaka Name[az]=Qoyacaq uyğulamaları Name[be]=Дэсклеты Name[bg]=Десклети Name[br]=Arloadigoù-burev Name[bs]=Deskleti Name[ca]=Miniaplicacions d'escriptori Name[ca@valencia]=Miniaplicacions d'escriptori Name[cs]=Miniaplikace plochy Name[cy]=Desgledi Name[da]=Skrivebordsprogrammer Name[el]=Εφαρμογές Οθόνης Name[eo]=Deskletoj Name[es]=Miniaplicaciones del escritorio Name[es_AR]=Miniaplicaciones del escritorio Name[et]=Töölauavidinad Name[eu]=Desklet-ak Name[fa]=رومیزی Name[fi]=Sovelmia työpöydälle Name[ga]=Deiscíní Name[gl]=Trebellos Name[he]=יישומוני־שולחן־עבודה Name[hi]=डेस्क्लेट Name[hr]=Deskleti Name[hu]=Asztalkalmazások Name[id]=Desklet Name[ie]=Desklettes Name[is]=Skjáborðsgræjur Name[it]=Desklet Name[ja]=デスクレット Name[kab]=Tideskeltin Name[ko]=데스크릿 Name[lo]=ເດສເລັດ Name[lt]=Ekrano programėlės Name[lv]=Sīkrīki Name[ms]=Desklet Name[nb]=Skrivebordsprogrammer Name[nl]=Bureaubladmini's Name[nn]=Skrivebordsprogram Name[pa]=ਡੈਸਕਲੇਟਸ Name[pl]=Desklety Name[ro]=Deskleturi Name[ru]=Десклеты Name[rue]=Помагала Name[sc]=Desklet Name[sk]=Desklety Name[sl]=Namizni vstavki Name[sq]=Desklet-ët Name[sr]=Справице Name[sr@ijekavian]=Справице Name[sr@ijekavianlatin]=Справице Name[sr@latin]=Deskleti Name[sv]=Skrivbordsprogram Name[ta]=திரை நிரல்கள் Name[tg]=Барномаҳои мизи корӣ Name[th]=เดสก์เล็ต Name[tr]=Masaüstü Uygulamacıkları Name[uk]=Десклети Name[ur]=ڈیسکلیٹ Name[uz]=Deskletlar Name[vi]=Desklet Name[zh_CN]=桌面小工具 Name[zh_HK]=桌面小工具 Name[zh_TW]=桌面小程式 Comment=Manage your Cinnamon desklets Comment[af]=Bestuur u Cinnamon-werkskermprogramme Comment[am]=የሲናሞን ዴስክሌትስ አስተዳዳሪ Comment[ar]=إدارة تطبيقات سينامُن المكتبية الخاصة بك Comment[ast]=Alministra los tos desklets de Cinnamon Comment[ay]=Cinnamon iskrituryut jisk'a-aplikasiyunanak irpaña Comment[az]=Öz "Cinnamon" qoyacaq uyğulamalarınızı yönəldin Comment[be]=Кiраванне дэсклетамi Cinnamon Comment[bg]=Управлявайте Вашите Cinnamon десклети Comment[br]=Merañ arloadigoù-burev Cinnamon Comment[bs]=Upravljajte vašim Cinnamon deskletima Comment[ca]=Gestioneu les vostres miniaplicacions d'escriptori de Cinnamon Comment[ca@valencia]=Gestioneu les vostres miniaplicacions d'escriptori de Cinnamon Comment[cs]=Spravovat Cinnamon miniaplikace pracovní plochy Comment[cy]=Rheoli eich desgledi Cinnamon chi Comment[da]=Administrér dine Cinnamon-skrivebordsprogrammer Comment[de]=Cinnamon-Desklets verwalten Comment[el]=Διαχείριση των εφαρμογών οθόνης του Cinnamon Comment[eo]=Administri viajn Cinnamon-labortablaĵojn Comment[es]=Gestionar las miniaplicaciones del escritorio de Cinnamon Comment[es_AR]=Gestionar las miniaplicaciones del escritorio de Cinnamon Comment[et]=Sinu Cinnamoni laiendite haldamine Comment[eu]=Kudeatu zure Cinnamon desklet-ak Comment[fa]=رومیزی‌های Cinnamon را مدیریت کنید Comment[fi]=Hallitse Cinnamon työpöydän sovelmia Comment[fil]=I-manage ang Cinnamon desklets Comment[fr]=Gérer vos desklets Cinnamon Comment[fr_CA]=Gérer vos desklets Cinnamon Comment[gd]=Stiùirich na desklets Cinnamon agad Comment[gl]=Administra os trebellos do Cinnamon Comment[he]=ניהול יישומוני־שולחן־עבודה סינמון Comment[hi]=सिनेमन डेस्क्लेट प्रबंधन Comment[hr]=Upravljajte Cinnamon deskletima Comment[hu]=Cinnamon asztalkalmazások kezelése Comment[ia]=Administrar tu desklets de Cinnamon Comment[id]=Kelola desklet Cinnamon Anda Comment[is]=Sýsla með stillingar fyrir Cinnamon skjáborðsgræjur (desklets) Comment[it]=Gestisci i desklet di Cinnamon Comment[ja]=Cinnamon のデスクレットを管理します Comment[kab]=Sefrek tideskeltin-ik (m) n Cinnamon Comment[ko]=시나몬 데스크릿을 관리합니다 Comment[lo]=ຈັດການເດສເລັດ Cinnamon ຂອງເຈົ້າ Comment[lt]=Tvarkyti Cinnamon ekrano programėles Comment[lv]=Pārvaldīt savus Cinnamon sīkrīkus Comment[ms]=Mengurus desklet Cinnamon anda Comment[nb]=Behandle Cinnamon-skrivebordsprogrammene dine Comment[nds]=Cinnamon Desklets bearbeiten Comment[nl]=Beheer uw bureaubladmini's voor Cinnamon Comment[nn]=Handter skrivebordsprogramma i Cinnamon Comment[oc]=Gerir vòstres desklets Cinnamon Comment[pl]=Zarządaj swoimi deskletami Cinnamon Comment[pt]=Gerir desklets do Cinnamon Comment[pt_BR]=Gerenciar seus desklets do Cinnamon Comment[ro]=Gestionează deskleturile Cinnamon Comment[ru]=Управление десклетами Cinnamon Comment[rue]=Справованя помагалами Cinnamon Comment[sc]=Manìgia sos desklet de Cinnamon tuos Comment[sk]=Spravuje vaše desklety prostredia Cinnamon Comment[sl]=Upravljajte z namiznimi vstavki Cinnamon Comment[sq]=Menaxhoni desklet-ët tuaj në Cinnamon Comment[sr]=Управљање справицама Циметове површи Comment[sr@ijekavian]=Управљање справицама Циметове површи Comment[sr@ijekavianlatin]=Управљање справицама Циметове површи Comment[sr@latin]=Upravljaj deskletima Cinnamona Comment[sv]=Hantera Cinnamons skrivbordsprogram Comment[tg]=Идоракунии барномаҳои мизи кории Cinnamon Comment[th]=จัดการเดสก์เล็ต Cinnamon ของคุณ Comment[tr]=Cinnamon masaüstü uygulamacıklarını yönet Comment[uk]=Керування десклетами Cinnamon Comment[ur]=اپنے سنامون کے ڈیسکلیٹ کا انتظام کریں Comment[uz]=Sinnamon deskletlarni boshqarish Comment[vi]=Quản lý các Desklet Cinnamon Comment[zh_CN]=管理桌面小工具 Comment[zh_HK]=管理你的 Cinnamon 桌面小工具 Comment[zh_TW]=管理您的 Cinnamon 桌面小程式 Keywords=desklet;desktop;slideshow; Keywords[af]=werkskermprogram;werkskerm;skyfievertoning; Keywords[am]=ዴስክሌት : ዴስክቶፕ : ተንሸራታች : ማሳያ; Keywords[ar]=التطبيقات المكتبية، سطح المكتب، عرض الشرائح; Keywords[ast]=desklet;escritoriu;slideshow; Keywords[ay]=jisk'a-aplikasiyuna;iskrituryu;uñachayawi;diapositivas;miniaplicación;desklet;escritorio;presentación;diapositivas;slideshow; Keywords[az]=qoyacaq uyğulaması;iş qoyacağı;sürüşməli göstəriş; Keywords[be]=дэсклет;працоўны стол;слайды; Keywords[bg]=десклет;работен плот;слайдшоу; Keywords[bs]=desklet;desktop;prezentacijski slajdovi; Keywords[ca]=miniaplicació d'escriptori;escriptori;diapositives; Keywords[ca@valencia]=miniaplicació d'escriptori;escriptori;diapositives; Keywords[cs]=miniaplikace;plocha;prezentace; Keywords[cy]=desgled;bwrdd gwaith;sioe sleidiau; Keywords[da]=skrivebordsprogram;skrivebord;slideshow; Keywords[de]=Desklet;Arbeitsfläche;Desktop;Schreibtisch;Diaschau;Diashow; Keywords[el]=εφαρμογές οθόνης;επιφάνεια εργασίας;προβολή διαφανειών; Keywords[eo]=labortablaĵo;labortablo;bildoprezento; Keywords[es]=miniaplicación;escritorio;presentación;diapositivas; Keywords[es_AR]=miniaplicación;escritorio;presentación;diapositivas; Keywords[et]=töölauavidin;töölaud;slaidiesitus; Keywords[eu]=desklet;mahaigaina;diaporama; Keywords[fa]=رومیزی، میزکار، نمایش‌اسلاید; Keywords[fi]=sovelma;työpöytä;diaesitys; Keywords[fr]=desklet;bureau;diaporama; Keywords[fr_CA]=desklet;bureau;diaporama; Keywords[ga]=deiscín;deasc;taispeántas sleamhnán; Keywords[gd]=desklet;desktop;slideshow;taisbeanadh-shleamhnagan; Keywords[gl]=trebello;escritorio;diaporama; Keywords[he]=יישומון־שולחן־עבודה;שולחן־עבודה;מצג שקופיות; Keywords[hi]=डेस्कटॉप;डेस्क्लेट;स्लाइडशो; Keywords[hr]=desklet;radna površina;promjena pozadine; Keywords[hu]=asztalkalmazás;asztal;diavetítés; Keywords[ia]=desklet;scriptorio;presentation de photos; Keywords[id]=desklet;desktop;pertunjukan salindia; Keywords[is]=skjáborðsgræja;skjáborð;skyggnusýning; Keywords[ja]=desklet;desktop;slideshow;デスクレット;デスクトップ;スライドショー; Keywords[kab]=tadisklet;tanarit;tigri; Keywords[ko]=데스크릿;바탕화면;슬라이드쇼; Keywords[lo]=ເດສເລັດ;ພື້ນທີ່ໜ້າຈໍ;ສະໄລໂຊວ໌; Keywords[lt]=programėlė;darbalaukis;skaidrių rodymas; Keywords[lv]=sīkrīks;darbvirsma;slīdrāde; Keywords[ms]=desklet;desktop;paparan slaid; Keywords[nb]=skrivebordsprogram;skrivebord;bildefremvisning; Keywords[nds]=Desklet;Desktop;Diashow; Keywords[nl]=bureaubladmini;bureaublad;diapresentatie; Keywords[nn]=skrivebordsprogram;skrivebord;lysbiletevising; Keywords[oc]=desklet;burèu;diaporama; Keywords[pa]=ਡੈਸਕਲੇਟ;ਡੈਸਕਟਾੱਪ;ਸਲਾਇਡਸ਼ੋ; Keywords[pl]=desklet;pulpit;pokaz slajdów; Keywords[pt]=desklet;ambiente de trabalho;apresentação; Keywords[pt_BR]=desklet;área de trabalho;apresentação de slides; Keywords[ru]=десклет;рабочий стол;слайд-шоу; Keywords[rue]=помагало;роботный стул;слайдшоу; Keywords[sc]=desklet;iscrivania;presentatzione; Keywords[sk]=desklet;plocha;prezentácia; Keywords[sl]=namizni vstavek;namizje;aplet namizje;predstavitev; Keywords[sq]=desklet;desktop;prezantim; Keywords[sr]=справица;површ;покретни приказ; Keywords[sr@ijekavian]=справица;површ;покретни приказ; Keywords[sr@ijekavianlatin]=справица;површ;покретни приказ; Keywords[sr@latin]=desklet;radna površina;pokretni prikaz; Keywords[sv]=skrivbordsprogram;skrivbord;bildspel; Keywords[ta]=திரை நிரல்;பணிமேடை;சறுக்குகாட்சி; Keywords[tg]=барномаи мизи корӣ;мизи корӣ;намоиши слайдҳо; Keywords[th]=เดสก์เล็ต;พื้นโต๊ะ;การนำเสนอภาพนิ่ง; Keywords[tr]=masaüstü uygulamacığı;masaüstü;slayt gösterisi; Keywords[uk]=дисклет;робочий стіл;показ слайдів; Keywords[ur]=ڈیسکلیٹ، ڈیسک ٹاپ، سلائیدشو; Keywords[uz]=desklet;ish stoli;slayd-shou; Keywords[vi]=desklet;màn hình chính;trình chiếu; Keywords[zh_CN]=桌面小工具、桌面、背景切换; Keywords[zh_HK]=桌面小工具;桌面;幻燈片; Keywords[zh_TW]=桌面小程式;桌面;幻燈片放映; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-desktop.desktop0000664000175000017500000002520615167446463026513 0ustar fabiofabio[Desktop Entry] Icon=cs-desktop Exec=cinnamon-settings desktop Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Desktop Name[af]=Werkskerm Name[am]=ዴስክቶፕ Name[ar]=سطح المكتب Name[ast]=Escritoriu Name[ay]=Iskrituryu Name[az]=İş qoyacağı Name[be]=Працоўны стол Name[bg]=Работен плот Name[br]=Burev Name[ca]=Escriptori Name[ca@valencia]=Escriptori Name[cs]=Pracovní plocha Name[cy]=Bwrdd Gwaith Name[da]=Skrivebord Name[de]=Schreibtisch Name[el]=Επιφάνεια εργασίας Name[eo]=Labortablo Name[es]=Escritorio Name[es_AR]=Escritorio Name[et]=Töölaud Name[eu]=Mahaigaina Name[fa]=میزکار Name[fi]=Pöytä Name[fil]=Pook ng Likha Name[fr]=Bureau Name[fr_CA]=Bureau Name[ga]=Deasc Name[gl]=Escritorio Name[he]=שולחן־עבודה Name[hi]=डेस्कटॉप Name[hr]=Radna površina Name[hu]=Asztal Name[ia]=Scriptorio Name[ie]=Pupitre Name[is]=Skjáborð Name[ja]=デスクトップ Name[ka]=სამუშაო მაგიდა Name[kab]=Tanarit Name[ko]=바탕화면 Name[ku]=Sermasê Name[la]=Scriptorium Name[lo]=ພື້ນທີ່ໜ້າຈໍ Name[lt]=Darbalaukis Name[lv]=Darbvirsma Name[mo]=Спациу де лукру Name[nb]=Skrivebord Name[nl]=Bureaublad Name[nn]=Skrivebord Name[oc]=Burèu Name[pa]=ਡੈਸਕਟਾਪ Name[pl]=Pulpit Name[pt]=Ambiente de trabalho Name[pt_BR]=Área de Trabalho Name[ro]=Birou Name[ru]=Рабочий стол Name[rue]=Роботный стул Name[sc]=Iscrivania Name[sk]=Pracovná plocha Name[sl]=Namizje Name[sq]=Desktopi Name[sr]=Радна површ Name[sr@ijekavian]=Радна површ Name[sr@ijekavianlatin]=Радна површ Name[sr@latin]=Radna površina Name[sv]=Skrivbord Name[ta]=பணிமேடை Name[tg]=Мизи корӣ Name[th]=พื้นโต๊ะ Name[tl]=Pook ng likha Name[tr]=Masaüstü Name[uk]=Робочий стіл Name[ur]=ڈیسک ٹاپ Name[uz]=Ish stoli Name[vi]=Màn hình chính Name[zh_CN]=桌面 Name[zh_HK]=桌面 Name[zh_TW]=桌面 Comment=Manage your desktop icons Comment[af]=Bestuur u werkskermikone Comment[am]=የ ዴስክቶፕ ምልክቶች አስተዳዳሪ Comment[ar]=إدارة أيقونات سطح المكتب Comment[ast]=Xestiona los tos iconos d'escritoriu Comment[ay]=Iskrituryu ukan saltanak irpaña Comment[az]=İş qoyacağınızın simgələrini yönəldin Comment[be]=Наладзіць значкі на працоўным стале Comment[bg]=Управлявайте Вашите иконки на работния плот Comment[br]=Merañ arlunioù ho purev Comment[bs]=Upravljajte vašim desktop ikonama Comment[ca]=Gestioneu les vostres icones d'escriptori Comment[ca@valencia]=Gestioneu les vostres icones d'escriptori Comment[cs]=Správa ikon na ploše Comment[cy]=Rheoli eiconau eich bwrdd gwaith Comment[da]=Administrér dine skrivebordsikoner Comment[de]=Schreibtischsymbole verwalten Comment[el]=Διαχείριση εικονιδίων επιφάνειας εργασίας Comment[eo]=Administri viajn labortablajn piktogramojn Comment[es]=Gestionar los iconos del escritorio Comment[es_AR]=Gestionar los iconos del escritorio Comment[et]=Halda oma töölaua ikoone Comment[eu]=Kudeatu mahaigaineko ikonoak Comment[fa]=نماد‌های میزکارتان را مدیریت کنید Comment[fi]=Hallitse pöydän kuvakkeita Comment[fil]=I-manage ang desktop icons Comment[fr]=Gérer les icônes de votre bureau Comment[fr_CA]=Gérer les icônes de votre bureau Comment[gd]=Stiùirich ìomhaigheagan an deasga agad Comment[gl]=Xestiona as iconas do escritorio Comment[he]=ניהול הסמלי שולחן־העבודה Comment[hi]=डेस्कटॉप आइकन प्रबंधन Comment[hr]=Upravljajte svojim ikonama radne površine Comment[hu]=Asztal ikonjainak kezelése Comment[ia]=Gerer tu icones del scriptorio Comment[id]=Atur icon di desktop Comment[is]=Sýsla með táknmyndir á skjáborði Comment[it]=Gestione delle icone sul desktop Comment[ja]=デスクトップアイコンを管理します Comment[kab]=Sefrek taykunin n tnarit-inek Comment[ko]=바탕화면 아이콘을 관리합니다 Comment[la]=Icones scriptorii cura Comment[lo]=ຈັດການໄອຄອນພື້ນທີ່ໜ້າຈໍຂອງເຈົ້າ Comment[lt]=Tvarkyti darbalaukio piktogramas Comment[lv]=Pārvaldīt savas darbvirsmas ikonas Comment[ms]=Mengurus ikon desktop anda Comment[nb]=Behandle skrivebordsikonene Comment[nds]=Desktopsymbole bearbeiten Comment[nl]=Uw bureaubladpictogrammen beheren Comment[nn]=Handter skrivebordsikon Comment[oc]=Gerir las icònas de vòstre burèu Comment[pl]=Zarządzaj swoimi ikonami pulpitu Comment[pt]=Gerir ícones do ambiente de trabalho Comment[pt_BR]=Gerenciar seus ícones da área de trabalho Comment[ro]=Gestionează pictogramele de pe birou Comment[ru]=Настроить значки на рабочем столе Comment[rue]=Справовати обрисы на роботному столови Comment[sc]=Manìgia sas iconas de s'iscrivania Comment[sk]=Spravuje vaše ikony pracovnej plochy Comment[sl]=Upravljajte z ikonami namizja Comment[sq]=Menaxhoni ikonat e desktopit tuaj Comment[sr]=Управљање иконицама радне површи Comment[sr@ijekavian]=Управљање иконицама радне површи Comment[sr@ijekavianlatin]=Управљање иконицама радне површи Comment[sr@latin]=Upravljanje ikonama na radnoj površini Comment[sv]=Hantera dina skrivbordsikoner Comment[tg]=Идоракунии нишонаҳои мизи корӣ Comment[th]=จัดการไอคอนพื้นโต๊ะของคุณ Comment[tr]=Masaüstü simgelerini yönet Comment[uk]=Керування піктограмами робочого столу Comment[ur]=ڈیسک ٹاپ کے آئکن کا انتظام کریں Comment[uz]=Ish stolidagi rasmchalarni boshqarish Comment[vi]=Quản lý các biểu tượng trên màn hình chính Comment[zh_CN]=管理桌面图标 Comment[zh_HK]=管理你的桌面圖示 Comment[zh_TW]=管理您的桌面圖示 Keywords=desktop;home;button;trash; Keywords[af]=werkskerm;tuis;knop;vullis; Keywords[am]=ዴስክቶፕ : ቤት : ቁልፍ : ቆሻሻ; Keywords[ar]=سطح المكتب، المجلد الرئيسي، الزر، سلة المهملات; Keywords[ast]=escritoriu;home;botón;basura; Keywords[ay]=iskrituryu;qalltawi;wutuna;t'una uchawi; Keywords[az]=iş qoyacağı;ev;düymə;çöplük; Keywords[be]=працоўны стол;хатняя;кнопка;сметніца; Keywords[bg]=Работен плот;домашна папка;бутон;кошче; Keywords[br]=burev;gêr;bouton;lastez; Keywords[bs]=desktop;naslovna;dugme;smeće; Keywords[ca]=escriptori;casa;botó;paperera; Keywords[ca@valencia]=escriptori;casa;botó;paperera; Keywords[cs]=plocha;domů;tlačítko;koš; Keywords[cy]=bwrdd gwaith;cartref;botwm;sbwriel; Keywords[da]=skrivebord;hjem;knap;papirkurv; Keywords[de]=Arbeitsfläche;Schreibtisch;Persönlicher Ordner;Knopf;Papierkorb;Müll;desktop;home;button;trash; Keywords[el]=επιφάνεια εργασίας;αρχικός φάκελος;κουμπί;απορρίματα; Keywords[eo]=labortablo;hejmo;butono;rubujo; Keywords[es]=escritorio;inicio;botón;papelera; Keywords[es_AR]=escritorio;inicio;botón;papelera; Keywords[et]=töölaud;kodu nupp;prügikast; Keywords[eu]=mahaigaina;etxea;botoia;zakarrontzia; Keywords[fa]=میزکار، خانه، دکمه، زباله‌دان; Keywords[fi]=työpöytä;koti;näppäin;roskakori; Keywords[fil]=desktop;bahay;button;basurahan; Keywords[fr]=bureau;dossier personnel;bouton;corbeille; Keywords[fr_CA]=bureau;dossier personnel;bouton;corbeille; Keywords[ga]=deasc;baile;cnaipe;bruscar; Keywords[gd]=desktop;home;button;trash;dhachaigh;putan;sgudal; Keywords[gl]=escritorio;cartafol persoal;botón;lixo; Keywords[he]=שולחן־עבודה;בית;לחצן;סל מחזור; Keywords[hi]=डेस्कटॉप;होम;बटन;ट्रैश; Keywords[hr]=radna površina;osobna mapa;tipka;smeće; Keywords[hu]=asztal;saját mappa;gomb;kuka; Keywords[ia]=scriptorio;initio;button;immunditia; Keywords[id]=desktop;rumah;tombol;tong sampah; Keywords[is]=skjáborð;heimamappa;hnappur;rusl; Keywords[it]=desktop;home;pulsante;cestino; Keywords[ja]=desktop;home;button;trash;デスクトップ;ホーム;ボタン;ゴミ箱; Keywords[kab]=tanarit;akaram udmawan;taqeffalt;taqerṭilt;iḍumman; Keywords[ko]=바탕화면;홈;버튼;휴지통; Keywords[lo]=ພື້ນທີ່ໜ້າຈໍ;ໜ້າທຳອິດ;ປູ່ມ;ຖັງຂີ້ເຫຍື້ອ; Keywords[lt]=darbalaukis;namai;mygtukas;šiukšlinė; Keywords[lv]=darbvirsma;mājas;poga;miskaste; Keywords[ms]=desktop;rumah;butang;tong sampah; Keywords[nb]=skrivebord;hjem;knapp;søppel; Keywords[nds]=Desktop;Home;Knopf;Papierkorb; Keywords[nl]=bureaublad;persoonlijke map;knop;prullenbak; Keywords[nn]=skrivebord;heim;knapp;papirkorg; Keywords[oc]=burèu;dorsièr;dossièr;repertòri;personal;boton;escobilhièr;banasta; Keywords[om]=foddaa;ka'uumsa;qabduu;korboo balfaa; Keywords[pa]=ਡੈਸਕਟਾੱਪ;ਘਰ;ਬਟਨ;ਕੂੜੇਦਾਨ; Keywords[pl]=pulpit;home;przycisk;kosz; Keywords[pt]=ambiente de trabalho;pasta pessoal;botão;lixo; Keywords[pt_BR]=área de trabalho;pasta pessoal;botão;lixeira; Keywords[ro]=birou;dosar personal;buton;gunoi; Keywords[ru]=рабочий стол;домашняя;кнопка;корзина; Keywords[rue]=роботный стул;домув;клопка;смітник; Keywords[sc]=iscrivania;domo;butone;àliga; Keywords[sk]=plocha;domov;tlačidlo;kôš; Keywords[sl]=namizje;dom;gumb;smeti; Keywords[sq]=desktop;shtëpi;buton;kosh; Keywords[sr]=радна површ;лично;дугме;смеће; Keywords[sr@ijekavian]=радна површ;лично;дугме;смеће; Keywords[sr@ijekavianlatin]=радна површ;лично;дугме;смеће; Keywords[sr@latin]=radna površina;lični direktorijum;dugme;kanta za smeće; Keywords[sv]=skrivbord;hem;knapp;papperskorg; Keywords[ta]=பணிமேடை;முகப்பு;பொத்தான்;குப்பை; Keywords[tg]=мизи корӣ;асосӣ;тугма;сабад; Keywords[th]=พื้นโต๊ะ;บ้าน;ปุ่ม;ถังขยะ; Keywords[tr]=masaüstü;ev;düğme;çöp; Keywords[uk]=робочий стіл;домашній каталог;кнопка;смітник; Keywords[ur]=ڈیسک ٹاپ، ھوم، بٹن، ردی; Keywords[uz]=ish stoli;asosiy jild;tugma;chiqindilar qutisi; Keywords[vi]=màn hình chinh;thư mục chính;nút;thùng rác; Keywords[zh_CN]=desktop;home;button;trash;桌面;按钮;回收站;主目录; Keywords[zh_HK]=桌面;家目錄;按鈕;垃圾桶; Keywords[zh_TW]=桌面;家屋;按鍵;回收筒; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-effects.desktop0000664000175000017500000002024415167446463026456 0ustar fabiofabio[Desktop Entry] Icon=cs-desktop-effects Exec=cinnamon-settings effects Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Effects Name[af]=Effekte Name[am]=ውጤቶች Name[ar]=المؤثرات Name[ast]=Efeutos Name[ay]=Jamuq unxtawinaka Name[az]=Etgilər Name[be]=Эфекты Name[bg]=Ефекти Name[br]=Efedoù Name[bs]=Efekti Name[ca]=Efectes Name[ca@valencia]=Efectes Name[cs]=Efekty Name[cy]=Effeithiau Name[da]=Effekter Name[de]=Effekte Name[el]=Εφέ Name[eo]=Efektoj Name[es]=Efectos Name[es_AR]=Efectos Name[et]=Efektid Name[eu]=Efektuak Name[fa]=جلوه‌ها Name[fi]=Tehosteet Name[fr]=Effets Name[fr_CA]=Effets Name[ga]=Maisíochtaí Name[gd]=Èifeachdan Name[gl]=Efectos Name[he]=אפקטים Name[hi]=प्रभाव Name[hr]=Efekti Name[hu]=Effektusok Name[ia]=Effectos Name[id]=Efek Name[ie]=Efectes Name[is]=Viðmótsbrellur Name[it]=Effetti Name[ja]=視覚効果 Name[ka]=ეფექტები Name[kab]=Isemda Name[ko]=효과 Name[ku]=Efekt Name[la]=Effecta Name[lo]=ເອັບເຟັກ Name[lt]=Efektai Name[lv]=Efekti Name[mo]=Ефекте Name[ms]=Kesan Name[nb]=Effekter Name[nds]=Effekte Name[nl]=Effecten Name[nn]=Effektar Name[oc]=Efièits Name[om]=galteelee Name[pa]=ਪ੍ਰਭਾਵ Name[pl]=Efekty Name[pt]=Efeitos Name[pt_BR]=Efeitos Name[ro]=Efecte Name[ru]=Эффекты Name[rue]=Ефекты Name[sc]=Efetos Name[sk]=Efekty Name[sl]=Učinki Name[sq]=Efektet Name[sr]=Дејства Name[sr@ijekavian]=Дејства Name[sr@ijekavianlatin]=Дејства Name[sr@latin]=Efekti Name[sv]=Effekter Name[ta]=விளைவுகள் Name[tg]=Таъсирҳо Name[th]=ลูกเล่น Name[tr]=Efektler Name[uk]=Ефекти Name[ur]=اثرات Name[uz]=Effektlar Name[vi]=Hiệu ứng Name[zh_CN]=特效 Name[zh_HK]=效果 Name[zh_TW]=效果 Comment=Control Cinnamon visual effects. Comment[af]=Beheer Cinnamon se visuele effekte. Comment[am]=የ ሲናሞን መመልከቻ ውጤቶች መቆጣጠሪያ Comment[ar]=التحكم في مؤثرات سينامُن المرئية. Comment[ast]=Controlar efeutos visuales en Cinnamon. Comment[ay]=Cinnamon jamuqanakan unxtawinaka uk mayjachaña. Comment[az]="Cinnamon" görsəl etgilərini yönəlt. Comment[be]=Кіраваць візуальнымі эфектамі Cinnamon. Comment[bg]=Контролиране на визуалните ефекти на Cinnamon Comment[bs]=Upravljaj Cinnamon vizuelnim efektima Comment[ca]=Controleu els efectes visuals de Cinnamon. Comment[ca@valencia]=Controleu els efectes visuals de Cinnamon. Comment[cs]=Nastavení vizuálních efektů prostředí Cinnamon. Comment[cy]=Rheoli effeithiau gweledol Cinnamon. Comment[da]=Kontrollér Cinnamons visuelle effekter. Comment[de]=Cinnamons visuelle Effekte steuern. Comment[el]=Ρυθμίστε τα οπτικά εφέ του Cinnamon Comment[eo]=Stiri vidajn efektojn de Cinnamon. Comment[es]=Configurar los efectos visuales de Cinnamon Comment[es_AR]=Configurar los efectos visuales de Cinnamon Comment[et]=Cinnamoni visuaalsete efektide juhtimine. Comment[eu]=Kontrolatu Cinnamonen efektu bisualak Comment[fa]=جلوه‌های بصری Cinnamon را کنترل کنید. Comment[fi]=Hallitse Cinnamonin ilmettä. Comment[fil]=Ikontrol ang Cinnamon visual effects. Comment[fr]=Contrôler les effets visuels de Cinnamon. Comment[fr_CA]=Contrôler les effets visuels de Cinnamon. Comment[gd]=Stiùirich èifeachdan lèirsinneach Cinnamon. Comment[gl]=Control dos efectos visuais de Cinnamon. Comment[he]=שליטה באפקטים של קינמון. Comment[hi]=सिनेमन दृश्य प्रभाव नियंत्रण। Comment[hr]=Upravljajte Cinnamon vizualnim efektima. Comment[hu]=Cinnamon vizuális effektusok beállítása. Comment[ia]=Controlar le effectos visual de Cinnamon. Comment[id]=Atur efek visual Cinnamon. Comment[is]=Stýra viðmótsbrellum í Cinnamon. Comment[it]=Controllo effetti grafici di Cinnamon. Comment[ja]=Cinnamon の視覚効果を制御します。 Comment[kab]=Sefrek isemda imeẓriyen n Cinnamon. Comment[ko]=시나몬 비주얼 효과를 조절합니다. Comment[la]=Cinnamonis effecta visionis cura. Comment[lo]=ຈັດການ Cinnamon visual effects. Comment[lt]=Valdyti Cinnamon vaizdo efektus. Comment[lv]=Pārvaldīt Cinnamon vizuālos efektus. Comment[ms]=Kawalan kesan visual Cinnamon Comment[nb]=Styr Cinnamons visuelle effekter Comment[nds]=Cinnamons Visuelle Effekte bearbeiten Comment[nl]=Visuele effecten van Cinnamon beheren Comment[nn]=Styr visuelle effektar i Cinnamon. Comment[oc]=Gerissètz los efièits visuals de Cinnamon. Comment[pl]=Kontroluj efekty wizualne Cinnamon. Comment[pt]=Controlar os efeitos visuais Cinnamon. Comment[pt_BR]=Controle os efeitos visuais do Cinnamon. Comment[ro]=Controlează efectele vizuale Cinnamon. Comment[ru]=Управление визуальными эффектами Cinnamon. Comment[rue]=Рядованя візуалными ефектами Cinnamon. Comment[sk]=Ovláda vizuálne efekty prostredia Cinnamon. Comment[sl]=Upravljajte z vidnimi učinki Cinnamona. Comment[sq]=Efektet vizuale të Cinnamon. Comment[sr]=Управљање видним дејствима површи Цимета. Comment[sr@ijekavian]=Управљање видним дејствима површи Цимета. Comment[sr@ijekavianlatin]=Управљање видним дејствима површи Цимета. Comment[sr@latin]=Upravljanje vizuelnim efektima Cinnamona. Comment[sv]=Styr Cinnamons visuella effekter. Comment[tg]=Идоракунии таъсирҳои визуалии Cinnamon Comment[th]=ควบคุมเอฟเฟกต์การแสดงผล Cinnamon Comment[tr]=Cinnamon görsel efektlerini yönetin. Comment[uk]=Керування наочними ефектами Cinnamon. Comment[ur]=سنامون کے نمائشی تاثرات کو کنٹرول کریں Comment[uz]=Cinnamon vizual effektlarini boshqarish. Comment[vi]=Điều khiển hiệu ứng trực quan Cinnamon. Comment[zh_CN]=控制 Cinnamon 显示特效。 Comment[zh_HK]=控制 Cinnamon 視覺效果。 Comment[zh_TW]=管理 Cinnamon 視覺效果。 Keywords=effects;window; Keywords[ar]=تأثيرات، نافذة; Keywords[ast]=efeutos;ventana; Keywords[be]=эфекты;акно; Keywords[bg]=ефекти;прозорец; Keywords[br]=efedoù;prenestr; Keywords[ca]=efectes;finestra; Keywords[ca@valencia]=efectes;finestra; Keywords[cs]=efekty;okno; Keywords[cy]=effeithiau;ffenestr; Keywords[da]=effekter;vindue; Keywords[de]=Effekte;Fenster; Keywords[el]=εφέ;παράθυρο; Keywords[eo]=efektoj;fenestro; Keywords[es]=efectos;ventana; Keywords[es_AR]=efectos;ventana; Keywords[et]=efektid;aken; Keywords[eu]=efektuak;leihoa; Keywords[fa]=جلوه‌ها، پنجره; Keywords[fi]=tehosteet;ikkuna; Keywords[fr]=effets;fenêtre; Keywords[fr_CA]=effets;fenêtre; Keywords[he]=תוצאים;חלון; Keywords[hi]=प्रभाव;खिड़की; Keywords[hr]=efekti;prozor; Keywords[hu]=effektusok;díszes;ablak;díszítés; Keywords[ia]=effectos;fenestra; Keywords[id]=efek;jendela; Keywords[is]=brellur;gluggi; Keywords[it]=effetti;finestra; Keywords[ja]=effects;window;エフェクト;視覚効果;ウィンドウ; Keywords[kab]=isemda;asfaylu; Keywords[ko]=효과;창; Keywords[lo]=ເອັບເຟັກ;ໜ້າຕ່າງ; Keywords[lt]=efektai;langas; Keywords[lv]=efekti;logs; Keywords[nb]=effekter;vindu; Keywords[nl]=effecten;venster; Keywords[nn]=effektar;vindauge; Keywords[oc]=efièch;efèit;efièit;efèct;efècte;fenèstra; Keywords[pl]=efekty;okno; Keywords[pt]=efeitos;janela; Keywords[pt_BR]=efeitos;janela; Keywords[ro]=efecte;fereastră; Keywords[ru]=эффекты;окно; Keywords[rue]=ефекты;оболок; Keywords[sk]=efekty;okna; Keywords[sl]=učinki;okno; Keywords[sq]=efekte;efekte; Keywords[sr]=дејства;ефекти;прозор; Keywords[sr@ijekavian]=дејства;ефекти;прозор; Keywords[sr@ijekavianlatin]=дејства;ефекти;прозор; Keywords[sr@latin]=дејства;ефекти;прозор; Keywords[sv]=effekter;fönster; Keywords[tr]=efektler;pencere; Keywords[uk]=ефекти;вікно; Keywords[uz]=effektlar;oyna; Keywords[vi]=hiệu ứng;cửa sổ; Keywords[zh_CN]=特效,窗口; Keywords[zh_TW]=效果;視窗; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-extensions.desktop0000664000175000017500000002154015167446463027236 0ustar fabiofabio[Desktop Entry] Icon=cs-extensions Exec=cinnamon-settings extensions Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Extensions Name[af]=Uitbreidings Name[am]=ተጨማሪዎች Name[ar]=الملحقات Name[ast]=Estensiones Name[ay]=Jithitatayawinaka Name[az]=Uzantılar Name[be]=Пашырэнні Name[bg]=Разширения Name[br]=Askouezhioù Name[bs]=Proširenja Name[cs]=Rozšíření Name[cy]=Estyniadau Name[da]=Udvidelser Name[de]=Erweiterungen Name[el]=Επεκτάσεις Name[eo]=Etendaĵoj Name[es]=Extensiones Name[es_AR]=Extensiones Name[et]=Laiendid Name[eu]=Hedapenak Name[fa]=افزونه‌ها Name[fi]=Laajennukset Name[fil]=Mga Extension Name[ga]=Iarmhíreanna Name[gd]=Leudachain Name[gl]=Extensións Name[he]=הרחבות Name[hi]=एक्‍सटेंशन Name[hr]=Proširenja Name[hu]=Bővítmények Name[ia]=Extensiones Name[id]=Ekstensi Name[ie]=Extensiones Name[is]=Viðbætur Name[it]=Estensioni Name[ja]=拡張機能 Name[ka]=გაფართოებები Name[kab]=Isiɣzifen Name[ko]=확장 프로그램 Name[ku]=Pêvek Name[la]=Appendices Name[lo]=ສ່ວນຂະຫຍາຍ Name[lt]=Plėtiniai Name[lv]=Papildinājumi Name[ms]=Sambungan Name[nb]=Utvidelser Name[nds]=Erweiterungen Name[nl]=Extensies Name[nn]=Utvidingar Name[pa]=ਐਕਸਟੈਂਸ਼ਨਾਂ Name[pl]=Rozszerzenia Name[pt]=Extensões Name[pt_BR]=Extensões Name[ro]=Extensii Name[ru]=Расширения Name[rue]=Росшыріня Name[sc]=Estensiones Name[sk]=Rozšírenia Name[sl]=Razširitve Name[sq]=Prapashtesat Name[sr]=Проширења Name[sr@ijekavian]=Проширења Name[sr@ijekavianlatin]=Проширења Name[sr@latin]=Ekstenzije Name[sv]=Tillägg Name[ta]=நீட்சிகள் Name[tg]=Пасвандҳо Name[th]=ส่วนขยาย Name[tr]=Eklentiler Name[uk]=Розширення Name[ur]=ایکس ٹینشنز Name[uz]=Kengaytmalar Name[vi]=Phần mở rộng Name[zh_CN]=扩展模块 Name[zh_HK]=擴充套件 Name[zh_TW]=擴充套件 Comment=Manage your Cinnamon extensions Comment[af]=Bestuur u Cinnamon-uitbreidings Comment[am]=የ ሲናሞን ተጨማሪዎች አስተዳዳሪ Comment[ar]=إدارة ملحقات سينامُن Comment[ast]=Alministra les tos estensiones Cinnamon Comment[ay]=Cinnamon ukan jithitatayawinak irpaña Comment[az]=Öz "Cinnamon" uzantılarınızı yönəldin Comment[be]=Кiраванне пашырэннямi Cinnamon Comment[bg]=Управление на Вашите разширения за Cinnamon Comment[br]=Merañ askouezhioù Cinnamon Comment[bs]=Upravljajte vašim Cinnamon proširenjima Comment[ca]=Gestioneu les vostres extensions de Cinnamon Comment[ca@valencia]=Gestioneu les vostres extensions de Cinnamon Comment[cs]=Správa rozšíření pro prostředí Cinnamon Comment[cy]=Rheoli eich estyniadau Cinnamon Comment[da]=Administrér dine Cinnamon-udvidelser Comment[de]=Cinnamon-Erweiterungen verwalten Comment[el]=Διαχειρίσου τις επεκτάσεις του Cinnamon Comment[eo]=Administri viajn Cinnamon-etendaĵojn Comment[es]=Gestionar las extensiones de Cinnamon Comment[es_AR]=Gestionar las extensiones de Cinnamon Comment[et]=Sinu Cinnamoni laiendite haldamine Comment[eu]=Kudeatu zure Cinnamon hedapenak Comment[fa]=افزونه‌های Cinnamon را مدیریت کنید Comment[fi]=Hallitse Cinnamon laajennuksia Comment[fil]=I-manage ang Cinnamon extensions Comment[fr]=Gérer vos extensions Cinnamon Comment[fr_CA]=Gérer vos extensions Cinnamon Comment[gd]=Stiùirich na leudachain Cinnamon agad Comment[gl]=Administra os engadidos de Cinnamon Comment[he]=ניהול הרחבות סינמון Comment[hi]=सिनेमन एक्सटेंशन प्रबंधन Comment[hr]=Upravljajte svojim Cinnamon proširenjima Comment[hu]=Cinnamon bővítmények kezelése Comment[ia]=Administrar tu extensiones de Cinnamon Comment[id]=Kelola ekstensi Cinnamon Anda Comment[is]=Sýsla með stillingar fyrir Cinnamon viðbætur Comment[it]=Gestisci le estensioni di Cinnamon Comment[ja]=Cinnamon の拡張機能を管理します Comment[kab]=Sefrek izsiɣzaf n Cinnamon Comment[ko]=시나몬 확장 프로그램을 관리합니다 Comment[lo]=ຈັດການສ່ວນຂະຫຍາຍ Cinnamon ຂອງເຈົ້າ Comment[lt]=Tvarkyti savo Cinnamon plėtinius Comment[lv]=Pārvaldīt Cinnamon papildinājumus Comment[ms]=Mengurus lanjutan Cinnamon Comment[nb]=Håndter dine Cinnamon-utvidelser Comment[nds]=Cinnamon Erweiterungen bearbeiten Comment[nl]=Uw Cinnamon-extensies beheren Comment[nn]=Handsam utvidingar i Cinnamon Comment[oc]=Gerir vòstras extensions de Cinnamon Comment[pl]=Zarządzaj swoimi rozszerzeniami Cinnamon Comment[pt]=Gerir extensões Cinnamon Comment[pt_BR]=Gerenciar suas extensões do Cinnamon Comment[ro]=Gestionează extensiile tale Cinnamon Comment[ru]=Управление расширениями Cinnamon Comment[rue]=Справованя росшырінями Cinnamon Comment[sc]=Manìgia sas estensiones Cinnamon tuas Comment[sk]=Spravuje vaše rozšírenia prostredia Cinnamon Comment[sl]=Upravljajte z razširitvami Cinnamona Comment[sq]=Menaxhoni prapashtesat e Cinnamon Comment[sr]=Управљање проширењима Цимета Comment[sr@ijekavian]=Управљање проширењима Цимета Comment[sr@ijekavianlatin]=Управљање проширењима Цимета Comment[sr@latin]=Upravljajte ekstenzijama Cinnamona Comment[sv]=Hantera dina Cinnamon-tillägg Comment[tg]=Идоракунии пасвандҳои Cinnamon Comment[th]=จัดการส่วนขยาย Cinnamon ของคุณ Comment[tr]=Cinnamon eklentilerini yönet Comment[uk]=Керування розширеннями Cinnamon Comment[ur]=اپنے سنامون کی ایکسٹینشن کا انتظام کریں Comment[uz]=Sinnamon kengaytmalarini boshqarish Comment[vi]=Quản lý Phần mở rộng Cinnamon Comment[zh_CN]=管理您的 Cinnamon 扩展模块 Comment[zh_HK]=管理你的 Cinnamon 擴充套件 Comment[zh_TW]=管理您的 Cinnamon 擴充套件 Keywords=extension;addon; Keywords[am]=ተጨማሪ መጨመሪያ; Keywords[ar]=الملحق، الإضافة; Keywords[ast]=estensión;addon; Keywords[ay]=jithitatayawi;yapawi; Keywords[az]=uzantılar;artırma; Keywords[be]=пашырэнне;дадатак; Keywords[bg]=разширение;добавка; Keywords[br]=askouezh;enlugell; Keywords[bs]=proširenje;dodatak; Keywords[ca]=extensió;complement; Keywords[ca@valencia]=extensió;complement; Keywords[cs]=rozšíření;přídavek; Keywords[cy]=estyniad;ychwanegyn; Keywords[da]=udvidelse;tilføjelse; Keywords[de]=Erweiterung;Zusatz;extension;addon; Keywords[el]=επέκταση;πρόσθετο; Keywords[en_GB]=extension;add-on; Keywords[eo]=etendaĵo;aldonaĵo; Keywords[es]=extensión;complemento; Keywords[es_AR]=extensión;complemento; Keywords[et]=laiendus;lisa; Keywords[eu]=hedapena;gehigarria; Keywords[fa]=افزودنی، افزونه; Keywords[fi]=laajennus;liitännäinen; Keywords[fr]=extension;greffon; Keywords[fr_CA]=extension;greffon; Keywords[ga]=iarmhír;forlíontán; Keywords[gd]=leudachan;tuilleadain;extension;addon; Keywords[gl]=extensión;engadido; Keywords[he]=הרחבות;תוספים; Keywords[hi]=एक्सटेंशन;साधन; Keywords[hr]=proširenje;dodatak; Keywords[hu]=kiterjesztés;bővítmény; Keywords[id]=ekstensi;tambahan; Keywords[is]=viðbót;hjálparforrit; Keywords[it]=estensione;aggiunta; Keywords[ja]=extension;addon;拡張機能;アドオン; Keywords[kab]=asiɣzef; Keywords[ko]=확장 프로그램;추가 기능; Keywords[lo]=ສ່ວນຂະຫຍາຍ;addon; Keywords[lt]=plėtinys;papildinys; Keywords[lv]=paplašinājums;pievienojums; Keywords[ms]=sambungan;tambahan; Keywords[nb]=Utvidelse;tillegg; Keywords[nds]=Erweiterung;Add-On; Keywords[nl]=extensie;toevoeging; Keywords[nn]=utviding;tillegg; Keywords[oc]=exension;suplement; Keywords[pl]=rozszerzenie;dodatek; Keywords[pt]=extensão;addon; Keywords[pt_BR]=extensão;complemento; Keywords[ro]=extensie;supliment; Keywords[ru]=расширение;дополнение; Keywords[rue]=росшыріня;прилога; Keywords[sk]=rozšírenie;doplnok; Keywords[sl]=razširitev;dodatek; Keywords[sq]=prapashtesa;shtesë; Keywords[sr]=проширење;додатак; Keywords[sr@ijekavian]=проширење;додатак; Keywords[sr@ijekavianlatin]=проширење;додатак; Keywords[sr@latin]=ekstenzija;dodatak; Keywords[sv]=utökning;tillägg; Keywords[ta]=நீட்சி; Keywords[tg]=пасванд;барномаи иловагӣ; Keywords[th]=ส่วนขยาย;ส่วนเสริม; Keywords[tr]=eklenti; Keywords[uk]=розширення;додаток; Keywords[ur]=ایکسٹینشن، ایڈ آن; Keywords[uz]=kengaytma;qo‘shimcha; Keywords[vi]=phần mở rộng;gắn thêm; Keywords[zh_CN]=扩展模块;附加组件; Keywords[zh_HK]=擴充套件;附加元件; Keywords[zh_TW]=擴充套件;附加套件; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-fonts.desktop0000664000175000017500000002407515167446463026176 0ustar fabiofabio[Desktop Entry] Icon=cs-fonts Exec=cinnamon-settings fonts Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Font Selection Name[af]=Kies lettertipe Name[am]=የ ፊደል ምርጫዎች Name[ar]=تحديد الخط Name[ast]=Esbilla de fonte Name[ay]=Qillqa kastanakan ajlliwi Name[az]=Yazı biçiminin Seçimi Name[be]=Выбар шрыфта Name[bg]=Избор на шрифт Name[br]=Diuzad nodrezhoù Name[bs]=Izbor fonta Name[ca]=Selecció de la lletra Name[ca@valencia]=Selecció de la lletra Name[cs]=Výběr písma Name[cy]=Dewis Ffont Name[da]=Valg af skrifttype Name[de]=Schriftauswahl Name[el]=Επιλογή Γραμματοσειράς Name[eo]=Tiparelekto Name[es]=Selección de las tipografías Name[es_AR]=Selección de las tipografías Name[et]=Kirjatüübi valik Name[eu]=Letra-tipoen hautapena Name[fa]=انتخاب فونت Name[fi]=Fontit Name[fil]=Pumili ng Font Name[fr]=Choix des polices Name[fr_CA]=Choix des polices Name[gd]=Taghadh a' chrutha-chlò Name[gl]=Selección de tipos de letra Name[he]=בחירת גופן Name[hi]=मुद्रलिपि चयन Name[hr]=Odabir slova Name[hu]=Betűkészlet kiválasztása Name[ia]=Selection del typo de litteras Name[id]=Pilihan Fonta Name[ie]=Selection de fonde Name[is]=Velja letur Name[it]=Selezione carattere Name[ja]=フォントの選択 Name[ka]=ფონტის არჩევა Name[kab]=Tafrayt n tsefsit Name[ko]=글꼴 선택 Name[ku]=Hilbijartina Curetîpan Name[la]=Selectio Typi Name[lo]=ການເລືອກຟອນ Name[lt]=Šriftų pasirinkimas Name[lv]=Fontu izvēle Name[mo]=Селектаря карактерелор Name[ms]=Pemilihan Font Name[nb]=Skriftvalg Name[nds]=Schriftart auswählen Name[nl]=Lettertypeselectie Name[nn]=Skriftval Name[oc]=Selector de polissas Name[pl]=Wybór czcionki Name[pt]=Tipos de letra Name[pt_BR]=Seleção de fonte Name[ro]=Selecție fonturi Name[ru]=Выбор шрифтов Name[rue]=Убераня шріфтув Name[sc]=Seletzione caràteres Name[sk]=Výber písma Name[sl]=Izbira pisave Name[sq]=Zgjedhja e shkronjave Name[sr]=Избор слова Name[sr@ijekavian]=Избор слова Name[sr@ijekavianlatin]=Избор слова Name[sr@latin]=Izbor fontova Name[sv]=Typsnittsval Name[ta]=எழுத்துரு தேர்வு Name[th]=การเลือกแบบอักษร Name[tr]=Yazıtipi Seçimi Name[uk]=Вибір шрифту Name[ur]=فونٹ انتخاب Name[uz]=SHriftlarni tanlash Name[vi]=Chọn Kiểu chữ Name[zh_CN]=选择字体 Name[zh_HK]=字型選擇 Name[zh_TW]=字型選擇 Comment=Configure system fonts Comment[af]=Instellings vir stelsel-lettertipe Comment[am]=የ ስርአቱን ፊደል ማሰናጃ Comment[ar]=تكوين خطوط النظام Comment[ast]=Configura les fontes del sistema Comment[ay]=Sistema ukan qillqa kastanak mayjachaña Comment[az]=Qurmaca yazı biçimlərini qur Comment[be]=Наладзіць сістэмныя шрыфты Comment[bg]=Конфигуриране на системни шрифтове Comment[br]=Kefluniañ nodrezhoù ar reizhiad Comment[bs]=Konfigurišite sistemke fontove Comment[ca]=Configureu les lletres del sistema Comment[ca@valencia]=Configureu les lletres del sistema Comment[cs]=Nastavení systémových písem Comment[cy]=Ffurfweddu ffontiau'r system Comment[da]=Konfigurér systemskrifttyper Comment[de]=Systemschriften konfigurieren Comment[el]=Ρύθμιση γραμματοσειράς συστήματος Comment[eo]=Agordi sistemtiparojn Comment[es]=Configurar las tipografías del sistema Comment[es_AR]=Configurar las tipografías del sistema Comment[et]=Süsteemsete kirjatüüpide sätted Comment[eu]=Konfiguratu sistemaren letra-tipoak Comment[fa]=پیکربندی فونت‌های سیستم Comment[fi]=Hallitse fontteja Comment[fil]=I-configure ang system fonts Comment[fr]=Configurer les polices du système Comment[fr_CA]=Configurer les polices du système Comment[gd]=Rèitich cruthan-clò an t-siostaim Comment[gl]=Configura os tipos de letra do sistema Comment[he]=תיצור גופני מערכת Comment[hi]=सिस्टम मुद्रलिपि विन्यास Comment[hr]=Prilagodite slova sustava Comment[hu]=Rendszer betűtípusok beállítása Comment[ia]=Configura le typos de characteres de systema Comment[id]=Pengaturan fonta sistem Comment[is]=Stilla kerfisletur Comment[it]=Configura il carattere di sistema Comment[ja]=システムフォントの設定 Comment[kab]=Seɣwer tisefsa n unagraw Comment[ko]=시스템 글꼴 설정 Comment[la]=Typum systematis ordina Comment[lo]=ປັບແຕ່ງຟອນຂອງລະບົບ Comment[lt]=Konfigūruoti sistemos šriftus Comment[lv]=Konfigurēt sistēmas fontus Comment[ms]=Konfigur sistem Font Comment[nb]=Konfigurer systemskrifter Comment[nds]=Systemschriftarten konfigurieren Comment[nl]=Systeemlettertypen instellen Comment[nn]=Set opp systemskrifter Comment[oc]=Configurar las polissas de caractèrs del sistèma Comment[pl]=Konfiguracja czcionek systemu Comment[pt]=Configurar tipo de letra Comment[pt_BR]=Configurar fontes do sistema Comment[ro]=Configurează fonturile sistemului Comment[ru]=Настроить системные шрифты Comment[rue]=Наладити сістемні шріфты Comment[sc]=Cunfigura caràteres de sistema Comment[sk]=Nastaviť systémové písma Comment[sl]=Nastavljajte sistemske pisave Comment[sq]=Konfiguro shkronjat e sistemit Comment[sr]=Подешавање слова система Comment[sr@ijekavian]=Подешавање слова система Comment[sr@ijekavianlatin]=Подешавање слова система Comment[sr@latin]=Postavke sistemskih fontova Comment[sv]=Konfigurera systemets typsnitt Comment[tg]=Танзимоти шрифтҳои низомвӣ Comment[th]=กำหนดแบบอักษรของระบบ Comment[tr]=Sistem yazı tiplerini yapılandır Comment[uk]=Налаштування системних шрифтів Comment[ur]=نظام کے فونٹ کو تشکیل دیں Comment[uz]=Tizim shriftlarini sozlash Comment[vi]=Cấu hình kiểu chữ hệ thống Comment[zh_CN]=配置系统字体 Comment[zh_HK]=設定系統字型組態 Comment[zh_TW]=設定系統字型組態 Keywords=font;size;small;large; Keywords[af]=lettertipe;grootte;klein;groot; Keywords[am]=የ ፊደል መጠን: ትንሽ: ትልቅ; Keywords[ar]=الخط، الحجم، صغير، كبير; Keywords[ast]=fonte;tamañu;pequeñu;grande;lletra;lletres;fontes; Keywords[ay]=qillqa kasta;ukch'a;jisk'a;jach'a; Keywords[az]=yazı biçimi;kiçik;geniş; Keywords[be]=шрыфт;памер;маленькі;вялікі; Keywords[bg]=шрифт;размер;малък;голям; Keywords[br]=nodrezh;ment;bihan;bras; Keywords[bs]=font;veličina;malo;veliko; Keywords[ca]=lletra;mida;petita;gran; Keywords[ca@valencia]=lletra;mida;petita;gran; Keywords[cs]=písmo;font;velikost;malé;velké; Keywords[cy]=ffont;maint;bach;mawr; Keywords[da]=skrifttype;størrelse;lille;stor; Keywords[de]=Schriftart;Font;Größe;Klein;Groß; Keywords[el]=γραμματοσειρά;μέγεθος;μικρά;μεγάλα; Keywords[eo]=tiparo;grando;malgranda;granda; Keywords[es]=tipografía;tamaño;pequeño;grande; Keywords[es_AR]=tipografía;tamaño;pequeño;grande; Keywords[et]=font;suurus;väike;suur; Keywords[eu]=letra-tipoa;tamaina;txikia;handia; Keywords[fa]=فونت، اندازه، کوچک، بزرگ; Keywords[fi]=fontti;koko;pieni;iso; Keywords[fil]=font;laki;maliit;malaki; Keywords[fr]=police;taille;petite;grande; Keywords[fr_CA]=police;taille;petite;grande; Keywords[ga]=clófhoireann;méid;beag;mór; Keywords[gd]=cruth-clò;meud;beag;mòr;font;size;small;large; Keywords[gl]=tipo de letra;tamaño;pequena;grande; Keywords[he]=גופן;גודל;קטן;גדול; Keywords[hi]=मुद्रलिपि;आकार;लघु;विशाल; Keywords[hr]=slovo;veličina;malo;veliko; Keywords[hu]=betűtípus;méret;kicsi;nagy; Keywords[ia]=typo de characteres;dimension;parve;grande; Keywords[id]=fonta;ukuran;kecil;besar; Keywords[is]=letur;stærð;lítið;stórt; Keywords[it]=carattere;dimensione;piccolo;grande; Keywords[ja]=font;size;small;large;フォント;サイズ;大きさ;小さい;大きい; Keywords[kab]=tasefsit;tiddi;tamecṭuḥt;tahrawnant; Keywords[ko]=글꼴;크기;작게;크게; Keywords[lo]=ຟອນ;ຂະໜາດ;ນ້ອຍ;ໃຫຍ່; Keywords[lt]=šriftas;dydis;didelis;mažas; Keywords[lv]=fonts;izmērs;mazi;lieli; Keywords[ms]=fon;saiz;kecil;besar; Keywords[nb]=skrifttype;størrelse;liten;stor; Keywords[nds]=Schriftart;Größe;klein;groß; Keywords[nl]=lettertype;grootte;klein;groot; Keywords[nn]=skrift;storleik;liten;stor; Keywords[oc]=polissa;talha;pichona;granda; Keywords[pl]=czcionka;wielkość;mała;duża; Keywords[pt]=letra;tamanho;grande;pequena; Keywords[pt_BR]=fonte;tamanho;pequena;grande; Keywords[ro]=font;dimensiune;mic;mare; Keywords[ru]=шрифт;размер;маленький;большой; Keywords[rue]=шріфт;розмір;малый;великый; Keywords[sc]=caràtere;mannària;minore;mannu; Keywords[sk]=písmo;veľkosť;malé;veľké; Keywords[sl]=pisava;velikost;majhna;velika; Keywords[sq]=shkronjat;madhësia;i vogël;i madh; Keywords[sr]=писмо;слова;фонт;величина;мало;велико; Keywords[sr@ijekavian]=писмо;слова;фонт;величина;мало;велико; Keywords[sr@ijekavianlatin]=писмо;слова;фонт;величина;мало;велико; Keywords[sr@latin]=font;veličina;mali;veliki; Keywords[sv]=typsnitt;storlek;små;stort; Keywords[ta]=எழுத்துரு;அளவு;சிறிய;பெரிய; Keywords[tg]=шрифт;андоза;хурд;калон; Keywords[th]=แบบอักษร;ขนาด;เล็ก;ใหญ่; Keywords[tr]=font;boyut;küçük;büyük; Keywords[uk]=шрифт;розмір;маленький;великий; Keywords[ur]=فونٹ، سائز، چھوٹا، بڑا; Keywords[uz]=shrift;o‘lcham;kichkina;katta; Keywords[vi]=phông;cỡ;nhỏ;to; Keywords[zh_CN]=font;size;small;large;字体;字号;大小;放大;缩小; Keywords[zh_HK]=font;size;small;large;字型;大小;小;大; Keywords[zh_TW]=字型;尺寸;小;大; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-general.desktop0000664000175000017500000001712415167446463026457 0ustar fabiofabio[Desktop Entry] Icon=cs-general Exec=cinnamon-settings general Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=General Name[af]=Algemeen Name[am]=ባጠቃላይ Name[ar]=عام Name[ast]=Xeneral Name[ay]=Taqpachataki Name[az]=Toplam Name[be]=Агульныя Name[bg]=Общи Name[br]=Hollek Name[bs]=Opšte Name[cs]=Obecné Name[cy]=Cyffredinol Name[da]=Generelt Name[de]=Allgemein Name[el]=Γενικές Ρυθμίσεις Name[eo]=Ĝenerala Name[et]=Üldine Name[eu]=Orokorra Name[fa]=عمومی Name[fi]=Yleinen Name[fr]=Général Name[fr_CA]=Général Name[ga]=Ginearálta Name[gd]=Coitcheann Name[gl]=Xeral Name[he]=כללי Name[hi]=सामान्य Name[hr]=Općenito Name[hu]=Általános Name[id]=Umum Name[is]=Almennt Name[it]=Generali Name[ja]=一般 Name[ka]=მთავარი Name[kab]=Amatu Name[ko]=일반 Name[ku]=Giştî Name[la]=Generalia Name[lo]=ທົ່ວໄປ Name[lt]=Bendra Name[lv]=Vispārīgi Name[mo]=Ӂенерале Name[ms]=Am Name[nb]=Generelt Name[nds]=Allgemein Name[nl]=Algemeen Name[nn]=Generelt Name[om]=Waliigala Name[pa]=ਸਧਾਰਨ Name[pl]=Ogólne Name[pt]=Geral Name[pt_BR]=Geral Name[ru]=Общие Name[rue]=Чоловый Name[sc]=Generale Name[sk]=Všeobecné Name[sl]=Splošno Name[sq]=Të përgjithshme Name[sr]=Опште Name[sr@ijekavian]=Опште Name[sr@ijekavianlatin]=Опште Name[sr@latin]=Opšte Name[sv]=Allmänt Name[ta]=பொது Name[tg]=Умумӣ Name[th]=ทั่วไป Name[tr]=Genel Name[uk]=Загальні Name[ur]=عمومی Name[uz]=Umumiy Name[vi]=Tổng quát Name[zgh]=ⴰⵎⴰⵜⴰⵢ Name[zh_CN]=常规 Name[zh_HK]=一般 Name[zh_TW]=一般 Comment=Miscellaneous Cinnamon preferences Comment[af]=Diverse Cinnamon-voorkeure Comment[am]=የተለያዩ የ ሲናሞን ምርጫዎች Comment[ar]=تفضيلات سينامُن المتنوعة Comment[ast]=Axustes variaos de Cinnamon Comment[ay]=Cinnamon ukan yaqha ajlliñanaka Comment[az]=Qarışıq "Cinnamon" üstünlükləri Comment[be]=Розныя налады Cinnamon Comment[bg]=Други настройки на Cinnamon Comment[bs]=Razne Cinnamon postavke Comment[ca]=Preferències diverses de Cinnamon Comment[ca@valencia]=Preferències diverses de Cinnamon Comment[cs]=Ostatní nastavení prostředí Cinnamon Comment[cy]=Dewisiadau amrywiol Cinnamon Comment[da]=Diverse Cinnamon-indstillinger Comment[de]=Verschiedene Cinnamon-Einstellungen Comment[el]=Διάφορες προτιμήσεις του Cinnamon Comment[eo]=Diversaj Cinnamon-agordoj Comment[es]=Preferencias diversas de Cinnamon Comment[es_AR]=Preferencias diversas de Cinnamon Comment[et]=Mitmesugused Cinnamoni eelistused Comment[eu]=Askotariko Cinnamon hobespenak Comment[fa]=ترجیحات متفرقه Cinnamon Comment[fi]=Sekalaisia Cinnamon asetuksia Comment[fr]=Préférences diverses de Cinnamon Comment[fr_CA]=Préférences diverses de Cinnamon Comment[gd]=Measgachadh de roghainnean Cinnamon Comment[gl]=Preferencias variadas para Cinnamon Comment[he]=העדפות סינמון שונות Comment[hi]=विविध सिनेमन सेटिंग्स Comment[hr]=Ostale Cinnamon osobitosti Comment[hu]=Egyéb Cinnamon beállítások Comment[ia]=Preferentias miscellanee de Cinnamon Comment[id]=Macam-macam preferensi Cinnamon Comment[ie]=Diversi parametres de Cinnamon Comment[is]=Ýmsar stillingar fyrir Cinnamon Comment[it]=Preferenze varie di Cinnamon Comment[ja]=その他の Cinnamon 環境設定 Comment[kab]=Ixtiriyen yemgarasen n Cinnamon Comment[ko]=그밖의 시나몬설정 Comment[lo]=ການຕັ້ງຄ່າຕ່າງໆຂອງ Cinnamon Comment[lt]=Kitos Cinnamon nuostatos Comment[lv]=Dažādi Cinnamon iestatījumi Comment[ms]=Pilihan Cinnamon pelbagai Comment[nb]=Diverse innstillinger for Cinnamon Comment[nds]=Sonstige Cinnamon-Einstellungen Comment[nl]=Verschillende Cinnamonvoorkeuren Comment[nn]=Ymse innstillingar for Cinnamon Comment[oc]=Preferéncias divèrsas de Cinnamon Comment[pl]=Różne preferencje Cinnamon Comment[pt]=Outras preferências Cinnamon Comment[pt_BR]=Preferências diversas do Cinnamon Comment[ro]=Alte preferințe Cinnamon Comment[ru]=Различные настройки Cinnamon Comment[rue]=Иншакі штімованя Cinnamon Comment[sk]=Rôzne predvoľby prostredia Cinnamon Comment[sl]=Razne možnosti Cinnamona Comment[sq]=Parapëlqime të përziera të Cinnamon Comment[sr]=Разне поставке Цимета Comment[sr@ijekavian]=Разне поставке Цимета Comment[sr@ijekavianlatin]=Разне поставке Цимета Comment[sr@latin]=Razne lične preferencije Cinnamona Comment[sv]=Diverse inställningar för Cinnamon Comment[tg]=Хусусиятҳои гуногун дар Cinnamon Comment[th]=การปรับแต่งเบ็ดเตล็ด Cinnamon Comment[tr]=Muhtelif Cinnamon seçenekleri Comment[uk]=Різні параметри Cinnamon Comment[ur]=متفرق، سنامون کی ترجیحات Comment[uz]=Sinnamonning turli xildagi parametrlari Comment[vi]=Tuỳ chọn Cinnamon khác Comment[zh_CN]=其他Cinnamon偏好设置 Comment[zh_HK]=Cinnamon 雜項喜好設定 Comment[zh_TW]=其他 Cinnamon 偏好設定 Keywords=logging;click; Keywords[am]=በ መግባት ላይ: ይጫኑ; Keywords[ar]=تسجيل الدخول، النقر; Keywords[ast]=loguear;clic; Keywords[ay]=qillqantasina;klik; Keywords[az]=giriş;tık; Keywords[be]=уваход;націсканне; Keywords[bg]=вписване;клик; Keywords[ca]=registrant;clic; Keywords[ca@valencia]=registrant;clic; Keywords[cs]=přihlašování;klik; Keywords[cy]=mewngofnodi;clic; Keywords[da]=logning;klik; Keywords[de]=Protokollierung;Klick; Keywords[el]=καταγραφή;κλικ; Keywords[eo]=protokolado;klaki; Keywords[es]=registrando;clic; Keywords[es_AR]=registrando;clic; Keywords[et]=logimine;klõps; Keywords[eu]=saioa-hastea;klik; Keywords[fa]=گزارش‌برداری، کلیک; Keywords[fi]=loki;klikkaaminen; Keywords[fil]=Nirerehistro;klik; Keywords[fr]=journalisation;clic; Keywords[fr_CA]=journalisation;clic; Keywords[gd]=logging;click;logadh;briog; Keywords[gl]=acceso;premer; Keywords[he]=רישום;הקשה; Keywords[hi]=लॉग फाइल;क्लिक; Keywords[hr]=prijava;klik; Keywords[hu]=naplózás;kattintás; Keywords[ia]=connexion;clic; Keywords[id]=logging;klik; Keywords[is]=annáll;smella; Keywords[ja]=logging;click;ログ;クリック; Keywords[kab]=anekcum;senned; Keywords[ko]=로그 기록하기;클릭; Keywords[lo]=ການບັນທຶກ;ການຄລິກ; Keywords[lt]=registravimas;spustelėjimas; Keywords[lv]=žurnalēšana;klikšķis; Keywords[ms]=mengelog;klik; Keywords[nb]=logging;klikk; Keywords[nds]=Protokollieren;Klicken; Keywords[nl]=logboek bijhouden;klik; Keywords[nn]=logging;klikk; Keywords[oc]=jornalizacion;clic; Keywords[pl]=logowanie;klik; Keywords[pt]=registo;clique; Keywords[pt_BR]=registrando;clique; Keywords[ro]=jurnalizare;clic; Keywords[ru]=вход в систему;клик; Keywords[rue]=вход у сістему;клопканя; Keywords[sk]=prihlasovanie;kliknutie; Keywords[sl]=beleženje;klik; Keywords[sq]=regjistrimi;kliko; Keywords[sr]=пријава;клик; Keywords[sr@ijekavian]=пријава;клик; Keywords[sr@ijekavianlatin]=пријава;клик; Keywords[sr@latin]=evidentiranje;klik; Keywords[sv]=loggning;klick; Keywords[th]=บันทึก;คลิก; Keywords[tr]=günlük kaydı;tıkla; Keywords[uk]=увійти;натисніть; Keywords[ur]=لاگنگ، کلک; Keywords[uz]=jurnalga yozish;sichqon tugmasini bosish; Keywords[vi]=ghi nhật trình;nhấp; Keywords[zh_CN]=日志记录,点击; Keywords[zh_HK]=記錄;點選; Keywords[zh_TW]=記錄;點擊; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-gestures.desktop0000664000175000017500000001535015167446463026702 0ustar fabiofabio[Desktop Entry] Icon=cs-gestures Exec=cinnamon-settings gestures Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Gestures Name[ar]=الإيماءات Name[ast]=Xestos Name[be]=Жэсты Name[bg]=Жестове Name[br]=Jestroù Name[ca]=Gestos Name[ca@valencia]=Gestos Name[cs]=Gesta Name[cy]=Ystumiau Name[da]=Bevægelser Name[de]=Gesten Name[el]=Xειρονομίες Name[eo]=Gestoj Name[es]=Gestos Name[es_AR]=Gestos Name[et]=Žestid Name[eu]=Keinuak Name[fa]=حرکاتِ‌دست Name[fi]=Eleet Name[fr]=Gestes Name[fr_CA]=Gestes Name[he]=מחוות Name[hi]=जेस्चर Name[hr]=Geste Name[hu]=Gesztusvezerlés Name[ia]=Gestos Name[id]=Gestur Name[is]=Bendingar Name[it]=Gesture Name[ja]=ジェスチャー Name[ka]=ჟესტები Name[ko]=제스처 Name[lo]=ທ່າທາງ Name[lt]=Gestai Name[lv]=Žesti Name[nb]=Bevegelser Name[nl]=Gebaren Name[nn]=Rørsler Name[oc]=Gèstes Name[pl]=Gesty Name[pt]=Gestos Name[pt_BR]=Gestos Name[ro]=Gesturi Name[ru]=Жесты Name[rue]=Кывнутя Name[sk]=Gestá Name[sl]=Kretnje Name[sq]=Gjestet Name[sr]=Покрети Name[sr@ijekavian]=Покрети Name[sr@ijekavianlatin]=Покрети Name[sr@latin]=Покрети Name[sv]=Gester Name[tr]=Hareketler Name[uk]=Жести Name[uz]=Imo-ishoralar Name[vi]=Cử chỉ Name[zh_CN]=手势 Name[zh_TW]=手勢 Comment=Manage touch gestures Comment[ar]=إدارة إيماءات اللمس Comment[ast]=Xestionar xestos Comment[be]=Кіраваць жэстамі Comment[bg]=Управление на жестовете на докосване Comment[ca]=Gestiona els gestos tàctils Comment[ca@valencia]=Gestiona els gestos tàctils Comment[cs]=Správa dotykových gest Comment[cy]=Rheoli ystumiau cyffwrdd Comment[da]=Håndtér berøringsbevægelser Comment[de]=Berührungsgesten verwalten Comment[el]=Διαχειριστείτε τις χειρονομίες αφής Comment[eo]=Administri tuŝgestojn Comment[es]=Gestionar los gestos táctiles Comment[es_AR]=Gestionar los gestos táctiles Comment[et]=Puutesüst. haldamine Comment[eu]=Kudeatu ukipen-keinuak Comment[fa]=مدیریت حرکاتِ‌دست لمسی Comment[fi]=Hallitse kosketuseleitä Comment[fil]=I-manage ang touch gestures Comment[fr]=Gérer les gestes tactiles Comment[fr_CA]=Gérer les gestes tactiles Comment[he]=ניהול מחוות מגע Comment[hi]=टच जेस्चर को प्रबंधित करें Comment[hr]=Upravljate dodirom Comment[hu]=Érintési gesztusvezerlés kezelése Comment[ia]=Gerer gestos tactile Comment[id]=Kelola gerakan sentuh Comment[is]=Sýsla með snertibendingar Comment[it]=Gestisci le gesture Comment[ja]=タッチジェスチャーを管理 Comment[ko]=터치 제스처 설정 Comment[lo]=ຈັດການທ່າທາງການສຳຜັດ Comment[lv]=Pārvaldīt skārienžestus Comment[nb]=Administrer berøringsbevegelser Comment[nl]=Aanraakgebaren beheren Comment[nn]=Handsama berøringsrørsler Comment[oc]=Gerir los gèstes tactils Comment[pl]=Zarządzaj gestami dotykowymi Comment[pt]=Gerir gestos de toque Comment[pt_BR]=Gerenciar gestos de toque Comment[ro]=Gestionează gesturile de atingere Comment[ru]=Управление сенсорными жестами Comment[rue]=Справованя сенсорными жестами Comment[sk]=Spravujte dotykové gestá Comment[sl]=Upravljaj kretnje dotika Comment[sq]=Menaxho gjestet e prekjes Comment[sr]=Управљајте покретима додира Comment[sr@ijekavian]=Управљајте покретима додира Comment[sr@ijekavianlatin]=Управљајте покретима додира Comment[sr@latin]=Управљајте покретима додира Comment[sv]=Hantera gester Comment[tr]=Dokunma hareketlerini yönet Comment[uk]=Керування жестами Comment[uz]=Sensorli imo-ishoralarni boshqarish Comment[vi]=Quản lý cử chỉ chạm Comment[zh_CN]=管理触摸手势 Comment[zh_TW]=管理觸控手勢 Keywords=gesture;swipe;pinch;touch; Keywords[ar]=إيماء، سحب، تضييق، لمس; Keywords[ast]=xestu;deslliciar;plizcu;toque; Keywords[be]=жэст;свайп;прагортка;пракрутка;дотык; Keywords[bg]=жест;плъзгане;pinch;допир; Keywords[ca]=gest;lliscar;pessigar;tocar; Keywords[ca@valencia]=Gest;esgolar;pessigar;tocar; Keywords[cs]=gesto;přejetí prstem;stisknutí;dotyk; Keywords[cy]=ystumio;llusgo;pinsio;cyffwrdd; Keywords[da]=bevægelse;swipe;stryg;pinch;knib; Keywords[de]=gesture;swipe;pinch;touch;Geste;Wischen;Aufziehen;Berühren; Keywords[el]=χειρονομία;σάρωση;τσίμπημα;άγγιγμα; Keywords[eo]=gesto;ŝovumi;pinĉi;tuŝi; Keywords[es]=gesto;arrastrar;pellizcar;tocar; Keywords[es_AR]=gesto;arrastrar;pellizcar;tocar; Keywords[et]=žest;pühkimine;pigistamine;puudutamine; Keywords[eu]=keinu egin;irristatu;atximurkatu;ukitu; Keywords[fa]=حرکتِ دست، حرکت جاروبی،نیشگون ، لمس; Keywords[fi]=gesture;swipe;pinch;touch;eleet;pyyhkäisy;nipistä;kosketus; Keywords[fr]=geste;balayer;pincer;toucher; Keywords[fr_CA]=geste;balayer;pincer;toucher; Keywords[he]=מחווה;החלקה;צביטה;מגע; Keywords[hi]=इशारा;ज़ोर;चुटकी;स्पर्श; Keywords[hr]=gesta;povuci;štipati;dodir; Keywords[hu]=gesztus;mozdulat;csúsztatás;csillentés;érintés;gesture;swipe;pinch;touch; Keywords[ia]=gesto;glissar;pinciar;tactile; Keywords[id]=gerakan;geser;cubit;sentuh; Keywords[is]=bending;stroka;klípa;snerta; Keywords[it]=gesture;scorrimento;pizzicare;tocco; Keywords[ja]=gesture;swipe;pinch;touch;ジェスチャー;スワイプ;ピンチ;タッチ; Keywords[ko]=제스처;스와이프;핀치;터치; Keywords[lo]=ທ່າທາງ;ປັດ;ຈີບ;ສຳຜັດ; Keywords[lv]=žests;vilkšana;savilkšana;pieskāriens; Keywords[nb]=gest;sveip;klyp;berør; Keywords[nl]=gebaar;vegen;knijpen;aanraken; Keywords[nn]=rørsle;sveip;knip;berøring; Keywords[oc]=gèst;lisar;pinçar;pecigar;peçugar;tocar; Keywords[pl]=gest;przeciągnięcie;uszczypnięcie;dotknięcie; Keywords[pt]=gesto;deslizar;apertar;toque; Keywords[pt_BR]=gesto;deslize;pinça;toque; Keywords[ro]=gest;glisare;ciupire;atingere; Keywords[ru]=жест;смахивание;сжатие;касание; Keywords[rue]=кывнутя;змахованя;стиск;докыв; Keywords[sk]=gesto;potiahnutie;stisnutie;dotyk; Keywords[sl]=kretnja;gesta;poteza;dotik;pritisk;podrs; Keywords[sq]=gjest;rrëshqitje;shtrëngim;prekje; Keywords[sv]=gest;svep;nyp;beröring; Keywords[tr]=dokunma;hareket;kaydır;çimdik; Keywords[uk]=жест;свайп;щипок;дотик; Keywords[uz]=imo-ishora;surish;chimchilash;teginish; Keywords[vi]=cử chỉ;vuốt;chụm;chạm; Keywords[zh_CN]=手势、滑动、捏合、触摸; Keywords[zh_TW]=手勢;單指滑動;多指滑動;點觸; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-hotcorner.desktop0000664000175000017500000002606515167446463027051 0ustar fabiofabio[Desktop Entry] Icon=cs-overview Exec=cinnamon-settings hotcorner Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Hot Corners Name[am]=ጠርዞች Name[ar]=الزوايا الساخنة Name[ast]=Hotcorners Name[ay]=Naktata k'uchunaka Name[az]=Qaynar Künclər Name[be]=Гарачыя куты Name[bg]=Активни ъгли Name[bs]=Uglovi ekrana Name[ca]=Cantonades actives Name[ca@valencia]=Cantonades actives Name[cs]=Aktivní rohy Name[cy]=Corneli Poeth Name[da]=Aktive hjørner Name[de]=Aktive Ecken Name[el]=Ενεργές γωνίες Name[eo]=Aktivaj anguloj Name[es]=Esquinas activas Name[es_AR]=Esquinas activas Name[et]=Abistavad nurgad Name[eu]=Izkina beroak Name[fa]=میانبرهای گوشه صفحه Name[fi]=Kulmat Name[fr]=Coins intelligents Name[fr_CA]=Coins intelligents Name[ga]=Cúinní teo Name[gd]=Oiseanan teth Name[gl]=Cantos activos Name[he]=פינות חמות Name[hi]=कार्य कोण Name[hr]=Kutovi zaslona Name[hu]=Érzékeny sarkok Name[ia]=Angulos calide Name[id]=Pojok Interaktif Name[is]=Virk skjáhorn Name[it]=Angoli attivi Name[ja]=ホットコーナー Name[ka]=ცხელი კუთხეები Name[kab]=Tiɣemmar timegza Name[ko]=핫 코너 Name[lt]=Karštieji kampai Name[lv]=Aktīvie stūri Name[ms]=Bucu Panas Name[nb]=Aktive hjørner Name[nds]=Schnellzugriffsecken Name[nl]=Actieve hoeken Name[nn]=Hjørnefunksjonar Name[oc]=Caires intelligents Name[pl]=Aktywne narożniki Name[pt]=Locais de ativação Name[pt_BR]=Atalhos nos cantos Name[ro]=Colțuri sensibile Name[ru]=Горячие углы Name[rue]=Острі куты Name[sc]=Chirros ativos Name[sk]=Aktívne rohy Name[sl]=Vroči koti Name[sq]=Këndet aktivë Name[sr]=Вруће ивице Name[sr@ijekavian]=Вруће ивице Name[sr@ijekavianlatin]=Вруће ивице Name[sr@latin]=Vrući kutci Name[sv]=Aktiva hörn Name[tg]=Кунҷҳои тез Name[th]=ฮอตคอร์เนอร์ Name[tr]=Etkin Köşeler Name[uk]=Гарячі кути Name[ur]=ہاٹ کونے Name[uz]=Uyg‘oq Burchaklar Name[vi]=Góc nóng Name[zh_CN]=热区 Name[zh_TW]=熱角 Comment=Manage hotcorner settings Comment[am]=የ ትኩስ ጠርዞች ማሰናጃ አስተዳዳሪ Comment[ar]=إداره إعدادات الزاوية الساخنة Comment[ast]=Axustes de hotcorner Comment[ay]=Naktat k'uchunakan mayjachaw irpaña Comment[az]=Qaynar-künclər quruluşlarını yönəlt Comment[be]=Налады гарачых кутоў Comment[bg]=Управление на настройките на активните ъгли Comment[bs]=Upravljaj postavkama uglova ekrana Comment[ca]=Gestioneu els ajusts de les cantonades actives Comment[ca@valencia]=Gestioneu els ajusts de les cantonades actives Comment[cs]=Nastavení aktivních rohů Comment[cy]=Rheoli osodiadau y gornel boeth Comment[da]=Administrér indstillinger for aktive hjørner Comment[de]=Einstellungen der aktiven Ecken verwalten Comment[el]=Ρυθμίστε τις ενεργές γωνίες Comment[eo]=Administri agordojn de aktivaj anguloj Comment[es]=Gestionar la configuración de las esquinas activas Comment[es_AR]=Gestionar la configuración de las esquinas activas Comment[et]=Abistavate nurkade sätted Comment[eu]=Kudeatu izkina beroen ezarpenak Comment[fa]=مدیریت تنظیماتِ میانبرِ گوشهِ صفحه Comment[fi]=Muuta toimintonurkkien asetuksia Comment[fil]=I-manage ang hotcorner settings Comment[fr]=Gérer les paramètres des coins intelligents Comment[fr_CA]=Gérer les paramètres des coins intelligents Comment[gd]=Stiùirich roghainnean a' hotcorner Comment[gl]=Administra os axustes dos recantos activos Comment[he]=ניהול הגדרות פינות-חמות Comment[hi]=कार्य कोण सेटिंग्स प्रबंधन Comment[hr]=Upravljajte postavkama kutova zaslona Comment[hu]=Érzékeny sarok beállítása Comment[ia]=Administra le configurationes de angulo calide Comment[id]=Atur Pengaturan hotcorner Comment[is]=Sýsla með stillingar fyrir virk skjáhorn Comment[it]=Gestisci impostazioni degli angoli attivi Comment[ja]=ホットコーナーの設定を管理 Comment[kab]=Sefrek iɣewwaren n tɣemmar timegza Comment[ko]=핫코너 설정 관리하기 Comment[lo]=ຈັດການການຕັ້ງຄ່າ hotcorner Comment[lt]=Tvarkyti karštųjų kampų nustatymus Comment[lv]=Pērvaldīt aktīvo stūru iestatījumus Comment[ms]=Mengurus tetapan hotcorner Comment[nb]=Håndter aktive hjørner-innstillinger Comment[nds]=Schnellzugriffsecken-Einstellungen bearbeiten Comment[nl]=Instellingen voor actieve hoeken beheren Comment[nn]=Handsama innstillingar for hjørnefunksjonar Comment[oc]=Gerissètz los paramètres dels caires intelligents Comment[pl]=Zarządzaj ustawieniami aktywnego narożnika Comment[pt]=Gerir definições dos locais de ativação Comment[pt_BR]=Gerenciar as configurações dos atalhos nos cantos Comment[ro]=Gestionează setările colțurilor sensibile Comment[ru]=Управление настройками горячих углов Comment[rue]=Справованя штімованями острых кутув Comment[sc]=Manìgia cunfiguratzione de sos chirros ativos Comment[sk]=Spravuje nastavenia aktívnych rohov Comment[sl]=Upravljajte z nastavitvami hitrih kotov Comment[sq]=Menaxhoni parametrat e këndeve aktivë Comment[sr]=Управљање подешавањима врућих ивица Comment[sr@ijekavian]=Управљање подешавањима врућих ивица Comment[sr@ijekavianlatin]=Управљање подешавањима врућих ивица Comment[sr@latin]=Upravljanje podešavanjima vrućih kutaka Comment[sv]=Hantera inställningar för aktiva hörn Comment[tg]=Идоракунии танзимоти кунҷи тезкор Comment[th]=จัดการการตั้งค่ามุมร้อน Comment[tr]=Etkin köşe ayarlarını yönet Comment[uk]=Керування налаштуваннями гарячих кутів Comment[ur]=ہاٹ کونے کی ترتیبات کا انتظام Comment[uz]=Uyg‘ongan holatdagi burchaklar (hotcorner, goryachie uglы) ni boshqarish Comment[vi]=Quản lý cài đặt Góc nóng Comment[zh_CN]=热角设置 Comment[zh_HK]=管理 hotcorner 設定 Comment[zh_TW]=管理熱角設定 Keywords=hotcorner;overview;scale;expo; Keywords[am]=ጠርዞች: ባጠቃላይ: መጠን: expo; Keywords[ar]=الزاوية الساخنة، نظرة عامة، التحجيم، العرض; Keywords[ast]=hotcorner;vista xeneral;escala;expo; Keywords[ay]=naktata k'uchu;taqpach uñjawi;jisk'a/jach'aptawi;uñachawi;esquina activa;vista general;escala;exposición; Keywords[az]=qaynar-künc;ön baxış;ölçək;ekspo; Keywords[be]=гарачы кут;агляд;маштабаванне;экспазіцыя; Keywords[bg]=Активен ъгъл;преглед;мащаб;експозиция; Keywords[bs]=ugao ekrana;pregled;promjena veličine;prikaz radnih prostora; Keywords[ca]=cantonada activa;vista general;canvi d'escala;exposició; Keywords[ca@valencia]=cantonada activa;vista general;canvi d'escala;exposició; Keywords[cs]=aktivní roh;přehled;měřítko;přepínání aplikací; Keywords[cy]=cornel poeth;trosolwg;graddfa;dangos; Keywords[da]=aktiv hjørne;oversigt;skalér;vis arbejdsområder; Keywords[de]=Aktive Ecke;Übersicht;Skalierung;Alle Fenster anzeigen; Keywords[el]=ενεργή γωνία;επισκόπηση;κλίμακα;expo; Keywords[eo]=aktiva angulo;superrigardo;skalo;ekspo; Keywords[es]=esquina activa;vista general;escala;exposición; Keywords[es_AR]=esquina activa;vista general;escala;exposición; Keywords[et]=kuum nurk;ülevaade;skaala;näitus; Keywords[eu]=izkina beroa;ikuspegi orokorra;eskala;expo; Keywords[fa]=نمای کلی، میانبرِ گوشهِ صفحه، مقیاس، expo; Keywords[fi]=kulma;yleiskuva;levitysnäkymä;työtila; Keywords[fr]=coins intelligents;vue d’ensemble;échelle;expo; Keywords[fr_CA]=coins intelligents;vue d’ensemble;échelle;expo; Keywords[ga]=cúinne te;osamharc;scála;expo; Keywords[gd]=oisean teth;foir-shealladh;sgèile;hotcorner;overview;scale;expo; Keywords[gl]=canto activo;vista xeral;escala;exposición; Keywords[he]=פינות חמות;סקירה;סלום;אקספו; Keywords[hi]=कार्य कोण;अवलोकन;अनुमाप;एक्सपो; Keywords[hr]=kut zaslona;pregled;promjena veličine;prikaz radnih prostora; Keywords[hu]=érzékeny sarkok;áttekintés;áttekintő;közszemle; Keywords[ia]=angulo calide;vista general;scala;exposition; Keywords[id]=pojok interaktif;overview;skala;ekspo; Keywords[is]=virk horn;hotcorner;yfirlit;scale;expo; Keywords[it]=hotcorner;panoramica;scale;expo; Keywords[ja]=hotcorner;overview;scale;expo;ホットコーナー;操作;スケール;エキスポ;エクスポ; Keywords[kab]=tiɣemmar timegza;imeẓri amatu;asellum;expo; Keywords[ko]=핫코너;모든 창 보기;스케일;작업 공간 보기; Keywords[lo]=hotcorner;ພາບລວມ;ປັບຂະໜາດ;expo; Keywords[lt]=karštas kampas;peržiūra;dydžio keitimas;atvaizdavimas; Keywords[lv]=karstais stūris;pārskats;mērogs;expo; Keywords[ms]=bucu panas;selayang pandang;skala;ekspo; Keywords[nb]=aktivt hjørne;oversikt;skalering;expo; Keywords[nds]=Hotcornor;Übersicht;Skalierung;EXPO; Keywords[nl]=actieve hoek;overzicht;schalen;expo; Keywords[nn]=hjørnefunksjon;oversikt;skalering;expo; Keywords[oc]=caires intelligents;vista d’ensemble;escala;expo; Keywords[pl]=aktywny narożnik;przegląd;skala;ekspozycja; Keywords[pt]=local;resumo;escala;expo; Keywords[pt_BR]=atalho de canto;visão geral;escala;modo expo; Keywords[ro]=colț sensibil;prezentare generală;scală;expo; Keywords[ru]=горячий угол;обзор;масштабирование;экспозиция; Keywords[rue]=острый кут;озираня;маштабованя;експозіція; Keywords[sk]=aktívny roh;prehľad;mierka;expo; Keywords[sl]=vroči kot;pregled;umeri;razstava; Keywords[sq]=qoshe e nxehtë;përmbledhje;shkallë;ekspozitë; Keywords[sr]=вруће ивице;преглед;распростирање;размеравање; Keywords[sr@ijekavian]=вруће ивице;преглед;распростирање;размеравање; Keywords[sr@ijekavianlatin]=вруће ивице;преглед;распростирање;размеравање; Keywords[sr@latin]=vrući kutak;pregled;uvećavanje;pregled radnih prostora; Keywords[sv]=aktiva hörn;översikt;skala;exponering; Keywords[tg]=кунҷи тезкор;пешнамоиш;миқёсбандӣ;намоиш; Keywords[th]=มุมที่น่าสนใจ;ภาพรวม;สัดส่วน;แสดง; Keywords[tr]=Etkin köşe;genel bakış;ölçeklendirme;sergi; Keywords[uk]=гарячий кут;огляд;масштабування;експозиція; Keywords[ur]=ہاٹ کونے، جائزہ، سکیل، ایکسپو; Keywords[uz]=uyg‘oq burchaklar;avvaldan ko‘rish;masshtab;ekpo; Keywords[vi]=góc nóng;toàn cảnh;định tỷ lệ;expo; Keywords[zh_CN]=hotcorner;overview;scale;expo;热区;概览;缩放;展览;全局; Keywords[zh_HK]=hotcorner;概觀;比例縮放;expo; Keywords[zh_TW]=熱角;總覽;視窗管理 (Scale);工作區管理 (Expo); cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-info.desktop0000664000175000017500000002717315167446463026002 0ustar fabiofabio[Desktop Entry] Icon=cs-details Exec=cinnamon-settings info Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=System Info Name[af]=Stelselinligting Name[am]=የ ስርአት መረጃ Name[ar]=معلومات النظام Name[ast]=Información del sistema Name[ay]=Sisteman yatiyawi Name[az]=Qurmaca Bilgisi Name[be]=Сістэмная інфармацыя Name[bg]=Информация за системата Name[br]=Titouroù ar reizhiad Name[bs]=Informacije o sistemu Name[ca]=Informació del sistema Name[ca@valencia]=Informació del sistema Name[cs]=Informace o systému Name[cy]=Manylion y system Name[da]=Systemoplysninger Name[de]=Systeminformation Name[el]=Πληροφορίες συστήματος Name[eo]=Sisteminformoj Name[es]=Información del sistema Name[es_AR]=Información del sistema Name[et]=Süsteemi info Name[eu]=Sistemaren informazioa Name[fa]=اطلاعات سیستم Name[fi]=Tietokoneen tiedot Name[fr]=Renseignements sur le système Name[fr_CA]=Renseignements sur le système Name[ga]=Faisnéis Córais Name[gd]=Fiosrachadh mun t-siostam Name[gl]=Información do sistema Name[he]=מידע על המערכת Name[hi]=सिस्टम जानकारी Name[hr]=Informacije sustava Name[hu]=Rendszerinformációk Name[ia]=Informationes de systema Name[id]=Informasi Sistem Name[is]=Kerfisupplýsingar Name[it]=Informazioni di sistema Name[ja]=システム情報 Name[ka]=სისტემის ინფორმაცია Name[kab]=Talɣut ɣef unagraw Name[ko]=시스템 정보 Name[ku]=Agahiyên pergalî Name[la]=Informationes de Systemate Name[lo]=ຂໍ້ມູນລະບົບ Name[lt]=Sistemos informacija Name[lv]=Sistēmas informācija Name[mo]=Информацие деспре систем Name[ms]=Maklumat Sistem Name[nb]=Systeminformasjon Name[nds]=Systeminformationen Name[nl]=Systeeminformatie Name[nn]=Systeminformasjon Name[oc]=Informacions sul sistèma Name[om]=Odeeffanoo sirnaa Name[pa]=ਸਿਸਟਮ ਜਾਣਕਾਰੀ Name[pl]=Informacje o systemie Name[pt]=Informações do sistema Name[pt_BR]=Informações do Sistema Name[ro]=Informații sistem Name[ru]=О системе Name[rue]=За сістему Name[sc]=Info de sistema Name[sk]=Systémové informácie Name[sl]=Sistemski podatki Name[sq]=Informacione mbi sistemin Name[sr]=Подаци о систему Name[sr@ijekavian]=Подаци о систему Name[sr@ijekavianlatin]=Подаци о систему Name[sr@latin]=Podaci o sistemu Name[sv]=Systeminformation Name[ta]=கணினி தகவல் Name[tg]=Иттилооти низом Name[th]=ข้อมูลระบบ Name[tr]=Sistem Bilgisi Name[uk]=Інформація про систему Name[ur]=سسٹم معلومات Name[uz]=Tizim haqida ma'lumot Name[vi]=Thông tin Hệ thống Name[zh_CN]=系统信息 Name[zh_HK]=系統資訊 Name[zh_TW]=系統資訊 Comment=Display system information Comment[af]=Wys stelselinligting Comment[am]=የ ስርአቱን መረጃ ማሳያ Comment[ar]=عرض معلومات النظام Comment[ast]=Datos del sirvidor de gráficos de pantalla Comment[ay]=Sisteman yatiyawi uñachayaña Comment[az]=Qurmaca bilgisini göstər Comment[be]=Паказаць звесткі аб сістэме Comment[bg]=Показване на данни за системата Comment[br]=Diskouez titouroù ar reizhiad Comment[bs]=Prikaži informacije o sistemu Comment[ca]=Mostra la informació del sistema Comment[ca@valencia]=Mostra la informació del sistema Comment[cs]=Zobrazit informace o systému Comment[cy]=Dangos manylion y system Comment[da]=Vis systeminformation Comment[de]=Systeminformationen anzeigen Comment[el]=Προβολή πληροφοριών για τον υπολογιστή Comment[eo]=Montri sisteminformojn Comment[es]=Mostrar información del sistema Comment[es_AR]=Mostrar información del sistema Comment[et]=Süsteemi teabe näitamine Comment[eu]=Bistaratu sistemaren informazioa Comment[fa]=نمایش اطلاعات سیستم Comment[fi]=Näytä tietokoneen tiedot Comment[fil]=Ipakita ang system information Comment[fr]=Afficher les renseignements du système Comment[fr_CA]=Afficher les renseignements du système Comment[gd]=Seall fiosrachadh mun t-siostam Comment[gl]=Amosar a información do sistema Comment[he]=הצגת מידע מערכת Comment[hi]=सिस्टम जानकारी दिखाएँ Comment[hr]=Prikaži informacije sustava Comment[hu]=Rendszerinformációk megjelenítése Comment[ia]=Monstra le informationes de systema Comment[id]=Tampilkan informasi sistem Comment[is]=Birta upplýsingar um kerfið Comment[it]=Visualizza le informazioni di sistema Comment[ja]=システム情報を表示 Comment[kab]=Sken talɣut ɣef unagraw Comment[ko]=시스템 정보 표시 Comment[la]=Informationes systematis ostende Comment[lo]=ສະແດງຂໍ້ມູນກ່ຽວກັບລະບົບ Comment[lt]=Rodyti sistemos informaciją Comment[lv]=Attēlot sistēmas informāciju Comment[ms]=Papar maklumat sistem Comment[nb]=Vis systeminformasjon Comment[nds]=Systeminformationen anzeigen Comment[nl]=Systeeminformatie weergeven Comment[nn]=Vis systeminformasjon Comment[oc]=Afichar las informacions del sistèma Comment[pl]=Wyświetlaj informacje systemowe Comment[pt]=Mostrar informação do sistema Comment[pt_BR]=Exibir informações do sistema Comment[ro]=Arată informații despre sistem Comment[ru]=Отображать информацию о системе Comment[rue]=Указовати сістемну інфо Comment[sc]=Mustra informatziones de sistema Comment[sk]=Zobraziť systémové informácie Comment[sl]=Prikaži podrobnosti sistema Comment[sq]=Shfaq informacione mbi sistemin Comment[sr]=Прикажи податке о систему Comment[sr@ijekavian]=Прикажи податке о систему Comment[sr@ijekavianlatin]=Прикажи податке о систему Comment[sr@latin]=Prikaži podatke o sistemu Comment[sv]=Visa systeminformation Comment[tg]=Намоиш додани иттилооти низом Comment[th]=แสดงข้อมูลระบบ Comment[tr]=Sistem bilgisini göster Comment[uk]=Показати системну інформацію Comment[ur]=سسٹم معلومات دکھائیں Comment[uz]=Tizim haqidagi ma'lumotlarni ko‘rsatish Comment[vi]=Hiển thị thông tin hệ thống Comment[zh_CN]=显示系统信息 Comment[zh_HK]=顯示系統資訊 Comment[zh_TW]=顯示系統資訊 Keywords=system;information;details;graphic;sound;kernel;version;about; Keywords[ar]=نظام، معلومات، تفاصيل، رسوميات، صوت، kernel، إصدار، حول; Keywords[ast]=sistema;información;detalles;gráficos;soníu;kernel;versión;tocante a; Keywords[be]=сістэма;інфармацыя;падрабязнасці;графіка;гук;ядро;версія;даведка; Keywords[bg]=система;информация;детайли;графика;звук;ядро;версия;относно; Keywords[ca]=sistema;informació;detalls;gràfic;so;nucli;versió;quant; Keywords[ca@valencia]=sistema;informació;detalls;gràfic;so;nucli;versió;quant; Keywords[cs]=systém;informace;detaily;grafika;zvuk;jádro;verze;o aplikaci; Keywords[cy]=system;gwybodaeth;manylion;graffigau;sain;cnewyllyn;fersiwn;ynghylch; Keywords[da]=system;information;detaljer;grafik;lyd;kerne;version;om; Keywords[de]=system;information;details;graphic;sound;kernel;version;about;System;Informationen;Details;Grafik;Klang;Ton;Kernel;Version;über; Keywords[el]=σύστημα;πληροφορίες;λεπτομέρειες;γραφικό;ήχος;πυρήνας;έκδοση;σχετικά με; Keywords[eo]=sistemo;informo;detaloj;grafiko;sono;kerno;versio;pri; Keywords[es]=sistema;información;detalles;gráfico;sonido;núcleo;versión;acerca de; Keywords[es_AR]=sistema;información;detalles;gráfico;sonido;núcleo;versión;acerca de; Keywords[et]=süsteem;informatsioon;info;üksikasjad;detailid;graafika;heli;kõlarid;kernel;versioon;info;lähemalt; Keywords[eu]=sistema;informazioa;xehetasunak;grafikoak;soinua;nukleoa;bertsioa;honi buruz; Keywords[fa]=سیستم، اطلاعات، جزئیات، گرافیک، صدا، کرنل، نسخه، درباره; Keywords[fi]=järjestelmä;tietoa;kernel;grafiikka;audio;versio;tietoa; Keywords[fr]=système;renseignements;information;détails;graphique;son;noyau;version;à propos; Keywords[fr_CA]=système;renseignements;information;détails;graphique;son;noyau;version;à propos; Keywords[he]=system;information;details;graphic;sound;kernel;version;about;מערכת;מידע;פרטים;חוזי;שמע;ליבה;גרסה;על אודות; Keywords[hi]=प्रणाली;सूचना;विवरण;ग्राफिक;ध्वनि;कर्नेल;संस्करण;के बारे में; Keywords[hr]=sistem;informacija;detalji;grafika;zvuk;kernel;verzija;o; Keywords[hu]=system;information;details;graphic;sound;kernel;version;about;rendszer;információ;részletek;grafika;grafikus;hang;zene;zaj;verzió;névjegy;programról;rendszermag; Keywords[ia]=systema;informationes;detalios;graphicos;sonos;nucleo;version;a proposito; Keywords[id]=sistem;informasi;rincian;grafis;suara;kernel;versi;perihal; Keywords[is]=kerfi;upplýsingar;nánar;myndmerki;hljóð;kjarni;útgáfa;um hugbúnað; Keywords[it]=sistema;informazioni;dettagli;grafica;suono;kernel;versione;info; Keywords[ja]=system;information;details;graphic;sound;kernel;version;about;システム;情報;詳細;グラフィック;サウンド;音;カーネル;バージョン; Keywords[lo]=ລະບົບ;ຂໍ້ມູນ;ລາຍລະອຽດ;ກຣາບຟິກ;ສຽງ;ເຄີເນລ;ເວີຊັນ;ກ່ຽວກັບ; Keywords[lv]=sistēma;informācija;detaļas;grafika;skaņa;kodols;versija;par; Keywords[nb]=system;informasjon;detaljer;grafikk;lyd;kjerne;versjon;om; Keywords[nl]=systeem;informatie;details;grafisch;geluid;systeemkern;versie;info; Keywords[nn]=system;informasjon;detaljar;grafikk;lyd;kjerne;versjon;om; Keywords[oc]=sistèma;entresenhas;informacions;detalhs;grafic;son;nuclèu;nucli version;a prepaus; Keywords[pl]=system;informacje;szczegóły;grafika;dźwięk;jądro;wersja;o systemie; Keywords[pt]=sistema;informação;detalhes;gráfica;som;kernel;versão;acerca;sobre; Keywords[pt_BR]=sistema;informação;detalhes;gráfico;som;kernel;versão;sobre; Keywords[ro]=sistem;informații;detalii;informatii;grafică;grafica;sunet;kernel;nucleu;versiune;despre; Keywords[ru]=система;информация;сведения;графика;звук;ядро;версия;о; Keywords[sk]=systém;informácie;detaily;grafika;zvuk;jadro;verzia;o; Keywords[sl]=sistem;informacije;podatki;podrobnosti;grafika;zvok;jedro;različica;grafična;kartica; Keywords[sq]=sistem;informacion;detaje;grafik;tingull;bërthamë;version;rreth; Keywords[sr]=систем;подаци;инфо;појединости;графика;звук;кернел;издање;опис; Keywords[sr@ijekavian]=систем;подаци;инфо;појединости;графика;звук;кернел;издање;опис; Keywords[sr@ijekavianlatin]=систем;подаци;инфо;појединости;графика;звук;кернел;издање;опис; Keywords[sr@latin]=систем;подаци;инфо;појединости;графика;звук;кернел;издање;опис; Keywords[sv]=system;information;detaljer;grafik;ljud;kärna;version;om; Keywords[tr]=sistem;bilgi;ayrıntılar;grafik;ses;çekirdek;sürüm;hakkında; Keywords[vi]=hệ thống;thông tin;chi tiết;đồ họa;âm thanh;hạt nhân;phiên bản;thông tin; Keywords[zh_CN]=系统, 信息, 细节, 图形, 声音, 内核, 版本, 关于; Keywords[zh_TW]=系統;資訊;細節;繪圖;聲音;核心;版本;關於; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-keyboard.desktop0000664000175000017500000002755415167446463026652 0ustar fabiofabio[Desktop Entry] Icon=cs-keyboard Exec=cinnamon-settings keyboard Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Keyboard Name[af]=Sleutelbord Name[am]=የፊደል ገበታ Name[ar]=لوحة المفاتيح Name[ast]=Tecláu Name[ay]=Tiklaru (teclado) Name[az]=Düyməlik Name[be]=Клавіятура Name[bg]=Клавиатура Name[bn]=কিবোর্ড Name[br]=Touchennaoueg Name[bs]=Tastatura Name[ca]=Teclat Name[ca@valencia]=Teclat Name[crh]=Klavye Name[cs]=Klávesnice Name[csb]=Klawiatura Name[cy]=Bysellfwrdd Name[da]=Tastatur Name[de]=Tastatur Name[el]=Πληκτρολόγιο Name[eo]=Klavaro Name[es]=Teclado Name[es_AR]=Teclado Name[et]=Klaviatuur Name[eu]=Teklatua Name[fa]=صفحه‌کلید Name[fi]=Näppäimistö Name[fo]=Knappaborð Name[fr]=Clavier Name[fr_CA]=Clavier Name[fy]=Toetseboerd Name[ga]=Méarchlár Name[gd]=Meur-chlàr Name[gl]=Teclado Name[he]=מקלדת Name[hi]=कीबोर्ड Name[hr]=Tipkovnica Name[hsb]=Tastatura Name[hu]=Billentyűzet Name[hy]=Ստեղնաշար Name[ia]=Claviero Name[ie]=Tastatura Name[is]=Lyklaborð Name[it]=Tastiera Name[ja]=キーボード Name[jv]=Kibot Name[ka]=კლავიატურა Name[kab]=Anasiw Name[kk]=Пернетақта Name[km]=ក្ដារចុច Name[kn]=ಕೀಲಿಮಣೆ Name[ko]=키보드 Name[ku]=Klavye Name[la]=Claviatura Name[li]=Toetsebord Name[lo]=ແປ້ນພີມ Name[lt]=Klaviatūra Name[lv]=Tastatūra Name[ml]=കീബോര്‍ഡ് Name[mr]=कळफलक Name[ms]=Papan Kekunci Name[nap]=Tastiera Name[nb]=Tastatur Name[nds]=Tastatur Name[ne]=कीबोर्ड Name[nl]=Toetsenbord Name[nn]=Tastatur Name[oc]=Clavièr Name[om]=Gabatee furtuu Name[pa]=ਕੀਬੋਰਡ Name[pl]=Klawiatura Name[pt]=Teclado Name[pt_BR]=Teclado Name[ro]=Tastatură Name[ru]=Клавиатура Name[rue]=Клавїатура Name[sc]=Tastiera Name[si]=යතුරුපුවරුව Name[sk]=Klávesnica Name[sl]=Tipkovnica Name[so]=Kiiboorka Name[sq]=Tastiera Name[sr]=Тастатура Name[sr@ijekavian]=Тастатура Name[sr@ijekavianlatin]=Тастатура Name[sr@latin]=Tastatura Name[sv]=Tangentbord Name[szl]=Tastatura Name[ta]=விசைப்பலகை Name[te]=కీబోర్డు Name[tg]=Ҳарфкалид Name[th]=แป้นพิมพ์ Name[tl]=Tiklado Name[tpi]=Kibot Name[tr]=Klavye Name[ts]=Khibodo Name[tt]=Төймәсар Name[uk]=Клавіатура Name[ur]=کی بورڈ Name[uz]=Klaviatura Name[vi]=Bàn phím Name[zgh]=ⵜⴰⵏⴰⵙⵜ Name[zh_CN]=键盘 Name[zh_HK]=鍵盤 Name[zh_TW]=鍵盤 Comment=Manage keyboard settings and shortcuts Comment[am]=የፊደል ገበታ ማሰናጃዎች እና የ አቋራጭ ቁልፍ አስተዳዳሪ Comment[ar]=إدارة إعدادات لوحة المفاتيح والاختصارات Comment[ast]=Xestionar axustes ya atayos de tecláu Comment[ay]=Tiklat ukhamaraki jank'a tiklanakat mayjachawi irpaña Comment[az]=Düyməlik quruluşlarını ya da qısayolları yönəlt Comment[be]=Кіраванне наладамі клавіятуры і гарачымі клавішамі Comment[bg]=Управление на клавишните настройки и преки пътища Comment[bs]=Upravljaj postavkama tastature i prečica Comment[ca]=Gestioneu els ajusts del teclat i les dreceres Comment[ca@valencia]=Gestioneu els ajusts del teclat i les dreceres Comment[cs]=Nastavení klávesnice a klávesových zkratek Comment[cy]=Rheoli gosodiadau a llwybrau byr bysellfwrdd Comment[da]=Administrér tastaturindstillinger og genveje Comment[de]=Tastatureinstellungen und Tastenkombinationen verwalten Comment[el]=Διαχείριση ρυθμίσεων πληκτρολογίου και πλήκτρων συντόμευσης Comment[eo]=Administri klavaran agordon kaj fulmoklavojn Comment[es]=Gestionar la configuración del teclado y los atajos Comment[es_AR]=Gestionar la configuración del teclado y los atajos Comment[et]=Halda klaviatuuri seadeid ja otseteid Comment[eu]=Kudeatu teklatuaren ezarpen eta laster-teklak Comment[fa]=مدیریت تنظیمات و میانبر های صفحه‌کلید Comment[fi]=Muuta näppäimistön asetuksia ja pikanäppäimiä Comment[fil]=I-manage ang keyboard settings at shortcuts Comment[fr]=Gérer les paramètres et les raccourcis du clavier Comment[fr_CA]=Gérer les paramètres et les raccourcis du clavier Comment[gd]=Stiùirich roghainnean is ath-ghoiridean a' mheur-chlàir Comment[gl]=Administra os atallos e axustes do teclado Comment[he]=ניהול הגדרות מקלדת וקיצורי דרך Comment[hi]=कुंजीपटल सेटिंग्स व शॉर्टकट प्रबंधन Comment[hr]=Upravljajte postavkama i prečacima tipkovnice Comment[hu]=Billentyűzet beállítások és billentyűparancsok kezelése Comment[ia]=Administrar le configurationes de claviero e le vias breve Comment[id]=Kelola pengaturan papan tik dan pintasan Comment[is]=Sýsla með stillingar lyklaborðs og flýtilykla Comment[it]=Gestisci impostazioni e scorciatoie da tastiera Comment[ja]=キーボードの設定とショートカットを管理 Comment[kab]=Sefrek iɣewwaren n unasiw d iberdan igezmen Comment[ko]=키보드 설정과 단축키 관리 Comment[lo]=ຈັດການການຕັ້ງຄ່າແປ້ນພິມ ແລະ ທາງລັດ Comment[lt]=Tvarkyti klaviatūros nustatymus ir sparčiuosius klavišus Comment[lv]=Pārvaldīt tastatūras iestatījumus un saīsnes Comment[ms]=Mengurus tetapan papan kekunci dan pintasan Comment[nb]=Håndter tastaturinnstillinger og hurtigtaster Comment[nds]=Tastatureinstellungen und Verknüpfungen verwalten Comment[nl]=Toetsenbordinstellingen en sneltoetsen beheren Comment[nn]=Handter tastaturinnstillingar og snarvegar Comment[oc]=Gerir los paramètres del clavièr e los acorchis Comment[pl]=Zarządzaj ustawieniami klawiatury i skrótami Comment[pt]=Gerir definições de teclado e atalhos Comment[pt_BR]=Gerenciar as configurações de teclado e atalhos Comment[ro]=Gestionează setările tastaturii și scurtăturile Comment[ru]=Управление настройками клавиатуры и горячими клавишами Comment[rue]=Справованя штімованями клавешници вадь комбінацію клопок Comment[sc]=Manìgia cunfiguratzione de tecladu e incurtzaduras Comment[sk]=Spravuje nastavenia klávesnice a klávesových skratiek Comment[sl]=Upravljajte z nastavitvami in bližnjicami tipkovnice Comment[sq]=Menaxho cilësimet dhe shkurtoret e tastierës Comment[sr]=Управљање поставкама тастатуре и пречицама Comment[sr@ijekavian]=Управљање поставкама тастатуре и пречицама Comment[sr@ijekavianlatin]=Управљање поставкама тастатуре и пречицама Comment[sr@latin]=Upravljanje podešavanjima tastature i prečicama Comment[sv]=Hantera tangentbordsinställningar och genvägar Comment[tg]=Идоракунии миёнбурҳо ва танзимоти ҳарфкалид Comment[th]=จัดการการตั้งค่าแป้นพิมพ์และแป้นลัด Comment[tr]=Klavye ayarlarını ve kısayollarını yönet Comment[uk]=Керування параметрами роботи клавіатури та клавіатурними скороченнями Comment[ur]=کیبورڈ کی ترتیبات اور شارٹ کٹ Comment[uz]=Klaviatura parametrlarini va tez usullarni (shortcuts) boshqarish Comment[vi]=Quản lý cài đặt bàn phím và phím tắt Comment[zh_CN]=键盘和快捷键设置 Comment[zh_HK]=管理鍵盤設定與快速鍵 Comment[zh_TW]=管理鍵盤設定與快捷鍵組合 Keywords=keyboard;shortcut;hotkey; Keywords[am]=የፊደል ገበታ : አቋራጭ : ትኩስ ቁልፍ; Keywords[ar]=لوحة المفاتيح، الاختصار، المفتاح الساخن; Keywords[ast]=tecláu;accesu direutu;atayu; Keywords[ay]=tikladu;jank'a tikla;teclado;atajo;tecla de acceso rápido;atajo; Keywords[az]=düyməlik;qısayol;isti düymə; Keywords[be]=клавіятура;ярлык;гарачыя клавішы; Keywords[bg]=клавиатура;кратки пътища;бързи клавиши; Keywords[bs]=tastatura;prečica;tipka prečice; Keywords[ca]=teclat;drecera;tecla directa; Keywords[ca@valencia]=teclat;drecera;tecla d'accés ràpid; Keywords[cs]=klávesnice;zkratka;hotkey; Keywords[cy]=bysellfwrdd;llwybr byr;bysell boeth; Keywords[da]=tastatur;genvej;genvejstast; Keywords[de]=Tastatur;Tastenkombination;Schnelltaste;Tastenkürzel;shortcut;hotkey; Keywords[el]=πληκτρολόγιο;συντομεύσεις;συντόμευση; Keywords[eo]=klavaro;fulmoklavo;rapidklavo; Keywords[es]=teclado;atajo;tecla de acceso rápido; Keywords[es_AR]=teclado;atajo;tecla de acceso rápido; Keywords[et]=klaviatuur;otsetee;kiirklahv; Keywords[eu]=teklatua;lasterbidea;laster-tekla; Keywords[fa]=صفحه‌کلید، میانبر، کلید میانبر; Keywords[fi]=näppäimistö;pikanäppäin;toimintonappi; Keywords[fr]=clavier;raccourci;touche rapide; Keywords[fr_CA]=clavier;raccourci;touche rapide; Keywords[ga]=méarchlár;aicearra;eochair aicearra; Keywords[gd]=meur-chlàr;ath-ghoirid;keyboard;shortcut;hotkey; Keywords[gl]=teclado;atallo;acceso rápido; Keywords[he]=מקלדת;קיצורי-דרך;מקשים-חמים; Keywords[hi]=कुंजीपटल;शॉर्टकट; Keywords[hr]=tipkovnica;prečac;tipka prečaca; Keywords[hu]=billentyűzet;gyorsbillentyű;gombok; Keywords[ia]=claviero;via-breve;clave calide; Keywords[id]=papan tik;shortcut;hotkey; Keywords[is]=lyklaborð;flýtilykill;flýtihnappur;stytting;lyklasamsetning; Keywords[it]=tastiera;scorciatoia;hotkey; Keywords[ja]=keyboard;shortcut;hotkey;キーボード;ショートカット;ホットキー; Keywords[kab]=anasiw;abrid igezmen;abrid iigezmen n unasiw; Keywords[ko]=키보드;단축키;핫 키; Keywords[lo]=ແປ້ນພິມ;ທາງລັດ;hotkey; Keywords[lt]=klaviatūra;nuoroda;karštasis klavišas;spartieji klavišai;susiejimas; Keywords[lv]=tastatūra;īsceļš;karstais taustiņš; Keywords[ms]=papan kekunci;pintasan;kekunci panas; Keywords[nb]=tastatur;snarvei;hurtigtast; Keywords[nds]=Tastatur;Verknüpfung;Hotkey; Keywords[nl]=toetsenbord;sneltoets;actieve toets; Keywords[nn]=tastatur;snarveg;hurtigtast; Keywords[oc]=clavièr;acorchi;tòca rapida; Keywords[om]=Gabateefurtuu;qaxxaamura;ariingaa; Keywords[pl]=klawiatura;skrót;skrót klawiszowy; Keywords[pt]=teclado;atalho;acelerador; Keywords[pt_BR]=teclado;atalho;tecla de atalho; Keywords[ro]=tastatură;scurtătură;tastă rapidă; Keywords[ru]=клавиатура;ярлык;горячие клавиши; Keywords[rue]=клавешниця;комбінація;злука клопок; Keywords[sc]=tecladu;incurtzadura;teclas de issèberu lestru; Keywords[sk]=klávesnica;skratky;horúce klávesy;klávesová skratka; Keywords[sl]=tipkovnica;bližnjica;hitra tipka; Keywords[sq]=tastierë;shkurtore;buton i shpejtë; Keywords[sr]=тастатура;пречица; Keywords[sr@ijekavian]=тастатура;пречица; Keywords[sr@ijekavianlatin]=тастатура;пречица; Keywords[sr@latin]=tastatura;prečica;prečica; Keywords[sv]=tangentbord;genväg;hotkey; Keywords[ta]=விசைப்பலகை;குறுக்குவழி;குறுக்குவிசை; Keywords[tg]=ҳарфкалид;миёнбур;тугмаи тезкор; Keywords[th]=แป้นพิมพ์;ทางลัด;ฮอตคีย์; Keywords[tr]=klavye;kısayol;kısayol tuşu; Keywords[uk]=клавіатура;лейба;гарячі клавіші; Keywords[ur]=کیبورڈ، شارٹ کٹ، ہاٹ کی; Keywords[uz]=klaviatura;tez usullar (shortcuts);uyg‘oq tugunlar (hotkeys); Keywords[vi]=bàn phím;phím tắt;phím nóng; Keywords[zh_CN]=keyboard;shortcut;hotkey;键盘;快捷键;热键; Keywords[zh_HK]=鍵盤;快速鍵;hotkey; Keywords[zh_TW]=鍵盤;快捷鍵組合;熱鍵; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-mouse.desktop0000664000175000017500000003065515167446463026176 0ustar fabiofabio[Desktop Entry] Icon=cs-mouse Exec=cinnamon-settings mouse Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Mouse and Touchpad Name[am]=አይጥ እና ተችፓድ Name[ar]=الفأرة ولوحة اللمس Name[ast]=Mur y touchpad Name[ay]=Achakumpi wikuchiri pampampi Name[az]=Siçan ilə Toxunuş-qolu Name[be]=Мыш i сэнсарная пляцоўка Name[bg]=Мишка и сензорен панел Name[bs]=Miš i površina osjetljiva na dodir Name[ca]=Ratolí i ratolí tàctil Name[ca@valencia]=Ratolí i ratolí tàctil Name[cs]=Myš a touchpad Name[cy]=Llygoden a Phad Cyffwrdd Name[da]=Mus og touchpad Name[de]=Maus und Touchpad Name[el]=Ποντίκι και Επιφάνεια Αφής Name[eo]=Muso kaj tuŝplato Name[es]=Ratón y panel táctil Name[es_AR]=Ratón y panel táctil Name[et]=Hiir ja puuteplaat Name[eu]=Sagua eta ukipen-teklatua Name[fa]=ماوس و پَد لمسی Name[fi]=Hiiri ja kosketuslevy Name[fil]=Mouse at Touchpad Name[fr]=Souris et pavé tactile Name[fr_CA]=Souris et pavé tactile Name[ga]=Luch agus Ceap Tadhaill Name[gd]=An luchag is am pada-suathaidh Name[gl]=Rato e área táctil Name[he]=עכבר ומשטח־מגע Name[hi]=माउस व टचपैड Name[hr]=Miš i touchpad Name[hu]=Egér és érintőtábla Name[ia]=Mus e pannello tactile Name[id]=Tetikus dan Touchpad Name[ie]=Mus e panel tactil Name[is]=Mús og snertiplatti Name[it]=Mouse e touchpad Name[ja]=マウスとタッチパッド Name[ka]=თაგუნა და თაჩპედი Name[kab]=Taɣerdayt d telwiḥt tawallsant Name[ko]=마우스와 터치패드 Name[la]=Mus et Tabula Tactilis Name[lo]=ເມົ້າ ແລະ ທັດແພດ Name[lt]=Pelė ir jutiklinis kilimėlis Name[lv]=Pele un skārienpaliktnis Name[ms]=Tetikus dan Pad Sentuh Name[nb]=Mus og styreplate Name[nds]=Maus und Touchpad Name[nl]=Muis en touchpad Name[nn]=Mus og styreplate Name[oc]=Mirga e pavat tactil Name[om]=Hantuutee fi touchpad Name[pa]=ਮਾਊਸ ਤੇ ਟੱਚਪੈਚ Name[pl]=Mysz i panel dotykowy Name[pt]=Rato e painel de toque Name[pt_BR]=Mouse e Touchpad Name[ro]=Maus și zonă tactilă Name[ru]=Мышь и сенсорная панель Name[rue]=Мыш тай тачпад Name[sc]=Sòrighe e sòrighe tàtile Name[sk]=Myš a touchpad Name[sl]=Miška in sledilna ploščica Name[sq]=Mausi dhe Touchpad Name[sr]=Миш и додирна плочица Name[sr@ijekavian]=Миш и додирна плочица Name[sr@ijekavianlatin]=Миш и додирна плочица Name[sr@latin]=Miš i tačped Name[sv]=Mus och pekplatta Name[ta]=சொடுக்கி மற்றும் தொடுதிட்டு Name[tg]=Муш ва панели ламсӣ Name[th]=เมาส์และทัชแพด Name[tr]=Fare ve Dokunmatik Panel Name[uk]=Миша та сенсорна панель Name[ur]=ماؤس اور ٹچ پیڈ Name[uz]=Sichqoncha va Tachpad Name[vi]=Chuột và Bàn chạm chuột Name[zh_CN]=鼠标和触摸板 Name[zh_HK]=滑鼠和觸控板 Name[zh_TW]=滑鼠與觸控板 Comment=Control mouse and touchpad settings Comment[am]=የ አይጥ እና የ ተችፓድ ማሰናጃ መቆጣጠሪያ Comment[ar]=إعدادات لوحة اللمس والتحكم في الفأرة Comment[ast]=Axustes del touchpad ya del mur Comment[ay]=Achakumpita wikuchañatak pampampit mayjachawi Comment[az]=Siçan ilə toxunuş-qolu quruluşlarını yönəlt Comment[be]=Налады мышы і сэнсарнай пляцоўкі Comment[bg]=Контрол на мишката и настройки на тъчпада Comment[bs]=Kontrole miša i površina osjetljiva na dodir Comment[ca]=Ajusts de ratolí i ratolí tàctil Comment[ca@valencia]=Ajusts de ratolí i ratolí tàctil Comment[cs]=Nastavení myši a touchpadu Comment[cy]=Gosodiadau rheoli llygoden a phad cyffwrdd Comment[da]=Kontrollér muse- og touchpadindstillinger Comment[de]=Maus- und Touchpad-Einstellungen verwalten Comment[el]=Ρυθμίστε το ποντίκι και την επιφάνεια αφής Comment[eo]=Regi agordojn de muso kaj tuŝplato Comment[es]=Configuración del ratón y del panel táctil Comment[es_AR]=Configuración del ratón y del panel táctil Comment[et]=Juhtige hiire ja puuteplaadi seadeid Comment[eu]=Kontrolatu sagua eta ukipen-teklatuaren ezarpenak Comment[fa]=کنترل تنظیمات ماوس و پَد لمسی Comment[fi]=Muuta hiiren ja kosketuslevyn asetuksia Comment[fil]=Kontrolin ang mouse at touchpad settings Comment[fr]=Paramètres de la souris et du pavé tactile Comment[fr_CA]=Paramètres de la souris et du pavé tactile Comment[gd]=Stiùirich roghainnean na luchaige 's a' phada-shuathaidh Comment[gl]=Controla os axustes do rato e da área táctil Comment[he]=הגדרות שליטה בעכבר ובמשטח־מגע Comment[hi]=माउस व टचपैड सेटिंग्स नियंत्रण Comment[hr]=Upravljajte mišem i touchpad postavkama Comment[hu]=Egér és érintőtábla beállítások Comment[ia]=Controla le configurationes del mus e del pannello tactile Comment[id]=Kendalikan pengaturan tetikus dan touchpad Comment[is]=Sýsla með stillingar músa og snertiplatta Comment[it]=Impostazioni mouse e touchpad Comment[ja]=マウスとタッチパッド操作の設定 Comment[kab]=Senqed iɣewwaren n tɣerdayt d telwiḥt tawallsant Comment[ko]=마우스와 터치패드 설정 Comment[lo]=ຄວບຄຸມການຕັ້ງຄ່າເມົ້າ ແລະ ທັດແພດ Comment[lt]=Valdyti pelės ir jutiklinio kilimėlio nustatymus Comment[lv]=Vadīt peles un skārienpalikņa iestatījumus Comment[ms]=Tetapan kawalan tetikus dan pad sesentuh Comment[nb]=Håndter mus- og styreplateinnstillinger Comment[nds]=Maus und Touchpad-Einstellungen bearbeiten Comment[nl]=Muis- en touchpadinstellingen beheren Comment[nn]=Kontroller innstillingar for mus og styreplate Comment[oc]=Contrarotlatz los paramètres de la mirga e del pavat tactil Comment[pl]=Kontroluj ustawienia myszki i panelu dotykowego Comment[pt]=Controlar definições do rato e do painel de toque Comment[pt_BR]=Controlar as configurações de mouse e touchpad Comment[ro]=Control configurări maus și zonă tactilă Comment[ru]=Настройка мыши и сенсорной панели Comment[rue]=Рядованя штімовань мыши тай тачпада Comment[sc]=Controlla sa cunfiguratzione de su sòrighe e de su sòrighe tàtile Comment[sk]=Ovláda nastavenia myši a touchpadu Comment[sl]=Upravljajte z nastavitvami miške in drsne ploščice Comment[sq]=Kontrolloni cilësimet e mausit dhe touchpad-it Comment[sr]=Управљање поставкама миша и додирне плочице Comment[sr@ijekavian]=Управљање поставкама миша и додирне плочице Comment[sr@ijekavianlatin]=Управљање поставкама миша и додирне плочице Comment[sr@latin]=Upravljanje podešavanjima miša i tačpeda Comment[sv]=Hantera inställningar för mus och pekplatta Comment[tg]=Идоракунии танзимоти муш ва панели ламсӣ Comment[th]=ควบคุมการตั้งค่าเมาส์และทัชแพด Comment[tr]=Fare ve dokunmatik panel ayarlarını kontrol et Comment[uk]=Керування налаштуваннями миші та сенсорної панелі Comment[ur]=ماؤس اور ٹچ پیڈ کی ترتیبات معین کریں Comment[uz]=Sichqoncha va tachpad parametrlarini nazorat qilish Comment[vi]=Kiểm soát cài đặt chuột và bàn di chuột Comment[zh_CN]=鼠标/触摸板设置 Comment[zh_HK]=控制滑鼠和觸控板設定 Comment[zh_TW]=管理滑鼠與觸控板設定 Keywords=mouse;touchpad;synaptic;double-click; Keywords[am]=አይጥ ተችፓድ ሲናፕቲክ ሁለት ጊዜ-መጫኛ; Keywords[ar]=الفأرة، لوحة اللمس، التشابك، النقر المزدوج; Keywords[ast]=mur;touchpad;synaptic;doble clic; Keywords[ay]=achaku;wikuchañatak pampa;synaptic;pä klik;ratón;panel táctil;doble clic; Keywords[az]=siçan;toxunuş-qolu;sinaptik;iki-tık; Keywords[be]=мыш;сэнсарная пляцоўка;synaptic;тачпад; Keywords[bg]=мишка;сензорен панел;synaptic;двоен клик; Keywords[bs]=miš;površina osjetljiva na dodir;synaptic;dvostruki klik; Keywords[ca]=ratolí;ratolí tàctil;synaptic;doble clic; Keywords[ca@valencia]=ratolí;ratolí tàctil;synaptic;doble clic; Keywords[cs]=myš;touchpad;synaptic;dvojklik; Keywords[cy]=llygoden;pad cyffwrdd;synaptig;clic dwbl; Keywords[da]=mus;touchpad;synaptic;dobbeltklik; Keywords[de]=Maus;Touchpad;Synaptic;Doppelklick; Keywords[el]=ποντίκι;επιφάνεια αφής;synaptic;διπλό κλικ; Keywords[eo]=muso;tuŝplato;synaptic;duoble alklaki; Keywords[es]=ratón;panel táctil;doble clic; Keywords[es_AR]=ratón;panel táctil;doble clic; Keywords[et]=hiir;puuteplaat;synaptic;topeltklõps; Keywords[eu]=sagua;ukipen-teklatua;synaptic;klik bikoitza; Keywords[fa]=ماوس، پدِ لمسی، synaptic، کلیک-دوتایی; Keywords[fi]=hiiri;kosketuslevy;synaptic;tuplaklikkaus; Keywords[fr]=souris;pavé tactile;synaptic;double clic; Keywords[fr_CA]=souris;pavé tactile;synaptic;double clic; Keywords[ga]=luch;ceap tadhaill;sionapsach;déchliceáil; Keywords[gd]=luchag;pada-suathaidh;synaptic;briogadh dùbailte;mouse;touchpad;double-click; Keywords[gl]=rato;área táctil;synaptic;dobre clic; Keywords[he]=עכבר;משטח־מגע;סינאפטיק;הקשה כפולה; Keywords[hi]=माउस;टचपैड;सिनेप्टिक;द्वि-क्लिक; Keywords[hr]=miš;touchpad;synaptic;dvostruki-klik; Keywords[hu]=mouse;touchpad;synaptic;double-click;egér;érintőtábla;synaptic;dupla kattintás; Keywords[ia]=mus;pannello tactile;synaptic;clic duple; Keywords[id]=tetikus;touchpad;sinaptik;klik ganda; Keywords[is]=mús;bendill;snertiplatti;synaptic;tvísmella; Keywords[it]=mouse;touchpad;synaptic;doppio clic; Keywords[ja]=mouse;touchpad;synaptic;double-click;マウス;タッチパッド;ダブルクリック; Keywords[kab]=taɣerdayt;talwiḥt;synaṭic;anqab uslig; Keywords[ko]=마우스;터치패드;시냅틱;더블 클릭; Keywords[lo]=ເມົ້າ;ທັດແພດ;synaptic;ຄລິກສອງຄັ້ງ; Keywords[lt]=pelė;synaptic;dvigubas paspaudimas; Keywords[lv]=pele;skārienpaliktnis;sinaptiskais;dubultklikšķis; Keywords[ms]=tetikus;pad sentuh;synaptic;dwi-klik; Keywords[nb]=mus;styreplate;synaptic;dobbel-klikk; Keywords[nds]=Maus;Touchpad;Synaptic;Doppelklick; Keywords[nl]=muis;touchpad;aanraakveld;dubbelklik; Keywords[nn]=mus;styreplate;synaptic;dobbeltklikk; Keywords[oc]=mirga;pavat tactil;sinaptic;doble clic; Keywords[pl]=mysz;panel dotykowy;synaptic;podwójne kliknięcie; Keywords[pt]=rato;painel de toque;synaptic;dois cliques; Keywords[pt_BR]=mouse;touchpad;synaptic;clique duplo; Keywords[ro]=maus;zonă tactilă;synaptic;clic dublu; Keywords[ru]=мышь;сенсорная панель;synaptic;двойное нажатие; Keywords[rue]=мыш;тачпад;synaptic;двойноє клопканя; Keywords[sc]=sòrighe;sòrighe tàtile;synaptic;clic dòpiu; Keywords[sk]=myš;touchpad;synaptic;dvojklik; Keywords[sl]=miška;sledilna ploščica;synaptic;dvojni klik; Keywords[sq]=maus;touchpad;synaptic;klikim i dyfishtë; Keywords[sr]=миш;додирна плочица;синаптик;двоклик; Keywords[sr@ijekavian]=миш;додирна плочица;синаптик;двоклик; Keywords[sr@ijekavianlatin]=миш;додирна плочица;синаптик;двоклик; Keywords[sr@latin]=miš;tačped;sinaptički;dvoklik; Keywords[sv]=mus;pekplatta;synaptic;dubbelklick; Keywords[ta]=சுட்டி;தொடுமேடை;சினாப்டிக்;இரட்டைச் சொடுக்கு; Keywords[tg]=муш;панели ламсӣ;synaptic;зеркунии дубора; Keywords[th]=เมาส์;ทัชแพด;ไซนัปติก;คลิกสองครั้ง; Keywords[tr]=fare;dokunmatik panel;synaptic;çift-tıklama; Keywords[uk]=миша;сенсорна панель;synaptic;подвійне натискання; Keywords[ur]=ماؤس، ٹچ پیڈ، سائنپٹک، دوہرا-کلک، ڈبل کلک; Keywords[uz]=sichqoncha;tachpad;sinaptik;qo‘shaloq-bosish; Keywords[vi]=chuột;bàn chạm chuột;synaptic;nhấp đúp; Keywords[zh_CN]=mouse;touchpad;synaptic;double-click;鼠标;触摸板;新思;双击; Keywords[zh_HK]=滑鼠;觸控板;synaptic;連按兩下; Keywords[zh_TW]=滑鼠;觸控板;synaptic;雙擊; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-nightlight.desktop0000664000175000017500000002172415167446463027204 0ustar fabiofabio[Desktop Entry] Icon=cs-nightlight Exec=cinnamon-settings nightlight Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Night Light Name[ar]=الإضاءة الليلية Name[be]=Начное святло Name[bg]=Нощно осветление Name[ca]=Llum nocturna Name[ca@valencia]=Llum nocturna Name[cs]=Noční osvětlení Name[cy]=Golau Nos Name[da]=Nattelys Name[de]=Nachtmodus Name[el]=Νυχτερινός φωτισμός Name[eo]=Noktlumo Name[es]=Luz nocturna Name[es_AR]=Luz nocturna Name[et]=Öövalgustus Name[eu]=Gaueko argia Name[fa]=نور شب Name[fi]=Yövalo Name[fr]=Mode nuit Name[fr_CA]=Mode nuit Name[he]=תאורת לילה Name[hi]=रात्रि प्रकाश Name[hr]=Noćno svjetlo Name[hu]=Éjszakai fény Name[ia]=Luce nocturne Name[id]=Cahaya Malam Name[is]=Næturlýsing Name[it]=Luce notturna Name[ja]=夜間モード Name[ka]=ღამის სინათლე Name[ko]=야간 모드 Name[lo]=ໄຟກາງຄືນ Name[lv]=Nakts gaisma Name[nb]=Nattlys Name[nl]=Nachtlicht Name[nn]=Nattlys Name[oc]=Lum nuechenc Name[pl]=Nocne światło Name[pt]=Luz noturna Name[pt_BR]=Luz noturna Name[ro]=Lumină nocturnă Name[ru]=Ночной свет Name[sk]=Nočné svetlo Name[sl]=Nočna osvetlitev Name[sq]=Drita e natës Name[sr]=Ноћно светло Name[sr@ijekavian]=Ноћно светло Name[sr@ijekavianlatin]=Ноћно светло Name[sr@latin]=Ноћно светло Name[sv]=Nattbelysning Name[tr]=Gece Işığı Name[uk]=Нічне світло Name[vi]=Ánh sáng đêm Name[zh_CN]=夜灯 Name[zh_TW]=夜光模式 Comment=Reduce exposure to blue light Comment[ar]=قلل التعرض ألى الضوء الأزرق Comment[be]=Зменшыць уздзеянне сіняга святла Comment[bg]=Намали излагането на синя светлина Comment[ca]=Redueix l'exposició a la llum blava Comment[ca@valencia]=Redueix l'exposició a la llum blava Comment[cs]=Snížení expozice modrého světla Comment[cy]=Lleihau amlygiad i olau glas Comment[da]=Reducér eksponering til blåt lys Comment[de]=Die Belichtung mit blauem Licht verringern Comment[el]=Μείωση έκθεσης σε μπλε φως Comment[eo]=Redukti eksponado al blua lumo Comment[es]=Reducir la exposición a la luz azul Comment[es_AR]=Reducir la exposición a la luz azul Comment[et]=Vähenda kokkupuudet sinise valgusega Comment[eu]=Murriztu argi urdinarekiko esposizioa Comment[fa]=کاهش تابش نور آبی Comment[fi]=Vähennä siniselle valolle altistumista Comment[fil]=Bawasan ang exposure sa blue light Comment[fr]=Réduire l’exposition à la lumière bleue Comment[fr_CA]=Réduire l’exposition à la lumière bleue Comment[he]=צמצום חשיפה לאור כחול Comment[hi]=ब्लू लाइट का प्रभाव कम करें Comment[hr]=Smanji ekspoziciju na plavo svjetlo Comment[hu]=Csökkentse a kék fénynek való kitettséget Comment[ia]=Reducer exposition al luce bluau Comment[id]=Kurangi paparan ke cahaya biru Comment[is]=Minnka útsetningu fyrir bláu ljósi Comment[it]=Riduci l'esposizione alla luce blu Comment[ja]=ブルーライトの照射量を軽減します Comment[ko]=블루 라이트 노출 저감 Comment[lo]=ຫຼຸດການໄດ້ຮັບແສງສີຟ້າ Comment[lv]=Samazināt zilās gaismas iedarbību Comment[nb]=Reduser eksponering for blått lys Comment[nl]=Blootstelling aan blauw licht verminderen Comment[nn]=Reduser eksponering for blått lys Comment[oc]=Reduire l’exposicion al lum blau Comment[pl]=Ogranicz ekspozycję na światło niebieskie Comment[pt]=Reduzir a exposição à luz azul Comment[pt_BR]=Reduzir exposição a luz azul Comment[ro]=Reduce expunerea la lumina albastră Comment[ru]=Сократить воздействие синего света Comment[sk]=Zníženie ožarovania modrým svetlom Comment[sl]=Zmanjšaj izpostavljenost modri svetlobi Comment[sq]=Zvogëloni ekspozimin ndaj dritës blu Comment[sr]=Умањи изложеност на плаво светло Comment[sr@ijekavian]=Умањи изложеност на плаво светло Comment[sr@ijekavianlatin]=Умањи изложеност на плаво светло Comment[sr@latin]=Умањи изложеност на плаво светло Comment[sv]=Minska exponeringen för blått ljus Comment[tr]=Mavi ışığa maruz kalmayı azaltır Comment[uk]=Зменшити вплив синього світла Comment[vi]=Giảm tiếp xúc ánh sáng xanh Comment[zh_CN]=减少蓝光 Comment[zh_TW]=減低曝露在藍光下 Keywords=redshift;color;blue;light;filter;temperature; Keywords[ar]=redshift، لون، أزرق، فاتح، مرشح، حرارة; Keywords[be]=redshift;колер;сіні;блакітны;святло;фільтр;тэмпература; Keywords[bg]=redshift;цвят;синя;светлина;филтър;температура; Keywords[ca]=desplaçament al vermell;color;blau;llum;filtre;temperatura; Keywords[ca@valencia]=desplaçament al vermell;color;blau;llum;filtre;temperatura; Keywords[cs]=červený posuv;barva;modrá;světlo;filtr;teplota; Keywords[cy]=redshift;lliw;glas;golau;hidlydd;tymheredd; Keywords[da]=rødforskydning;farve;blå;lys;filter temperature; Keywords[de]=Rotverschiebung;Farbe;Blau;Licht;Filter;Temperatur;redshift;color;blue;light;filter;temperature; Keywords[el]=ερυθρή μετατόπιση;χρώμα;μπλε;φως;φίλτρο;θερμοκρασία; Keywords[en_GB]=redshift;colour;blue;light;filter;temperature; Keywords[eo]=ruĝenŝoviĝo;koloro;blua;lumo;filtrilo;temperaturo; Keywords[es]=corrimiento al rojo;color;azul;luz;filtro;temperatura; Keywords[es_AR]=corrimiento al rojo;color;azul;luz;filtro;temperatura; Keywords[et]=Kohanda värvitemperatuuri; Keywords[eu]=redshift;kolorea;urdina;argia;iragazkia;tenperatura; Keywords[fa]=ردشیفت، رنگ، آبی، نور، فیلتر، دما; Keywords[fi]=redshift;color;blue;light;filter;temperature;väri;sini;valo;suodatin;värilämpö; Keywords[fil]=redshift;color;blue;light;filter;temperatura; Keywords[fr]=redshift;décalage vers le rouge;couleur;bleu;lumière;filtre;température; Keywords[fr_CA]=redshift;décalage vers le rouge;couleur;bleu;lumière;filtre;température; Keywords[he]=טמפרטורה;מסנן;אור;כחול;צבע;רד־שיפט;redshift;color;blue;light;filter;temperature; Keywords[hi]=रेडशिफ्ट;रंग;नीला;प्रकाश;फ़िल्टर;तापमान; Keywords[hr]=redshift;boja;plavo;svjetlost;filter;temperatura; Keywords[hu]=szín;kék;fény;szűrő;hőmérséklet;redshift;color;blue;light;filter;temperature; Keywords[ia]=displaciamento-rubie;color;blau;clar;filtro;temperatura; Keywords[is]=rauðvik;litur;blátt;ljós;sía;lithitastig; Keywords[it]=redshift;colore;blu;chiaro;filtro;temperatura; Keywords[ja]=redshift;color;blue;light;filter;temperature;色;ブルー;青;ライト;光;フィルター;温度; Keywords[ko]=레드시프트;색;블루;라이트;필터;온도; Keywords[lo]=redshift;ສີ;ຟ້າ;ແສງ;ໂຕກອງ;ອຸນຫະພູມ; Keywords[lv]=sarkanā nobīde;krāsa;zils;gaisma;filtrs;temperatūra; Keywords[nb]=rødforskyvning;farge;blå;lys;filter;temperatur; Keywords[nl]=redshift;kleur;blauw;licht;filter;temperatuur; Keywords[nn]=raudskift;farge;blå;lys;filter;temperatur; Keywords[oc]=redshift;color;blau;lum;filtre;temperatura; Keywords[pl]=przesunięcie ku czerwieni;kolor;niebieski;światło;filtr;temperatura; Keywords[pt]=redshift;cor;azul;luz;filtro;temperatura; Keywords[pt_BR]=desvio para o vermelho;cor;azul;luz;filtro;temperatura; Keywords[ro]=redshift;culoare;albastru;lumină;filtru;temperatoră; Keywords[ru]=красное смещение;цвет;синий;свет;фильтр;температура; Keywords[sk]=redshift;farba;modrá;modré;svetlo;osvetlenie;filter;teplota; Keywords[sl]=zamik rdeče;barva;modra;svetloba;filter;temperatura; Keywords[sq]=zhvendosje e kuqe;ngjyrë;blu;dritë;filtër;temperaturë; Keywords[sr]=црвени помак;боја;плава;светлост;филтер;температура;redshift;color;blue;light;filter;temperature; Keywords[sr@ijekavian]=црвени помак;боја;плава;светлост;филтер;температура;redshift;color;blue;light;filter;temperature; Keywords[sr@ijekavianlatin]=црвени помак;боја;плава;светлост;филтер;температура;redshift;color;blue;light;filter;temperature; Keywords[sr@latin]=црвени помак;боја;плава;светлост;филтер;температура;redshift;color;blue;light;filter;temperature; Keywords[sv]=rödförskjutning;färg;blå;ljus;filter;temperatur; Keywords[tr]=redshift;renk;mavi;ışık;filtre;sıcaklık; Keywords[uk]=червоне зміщення;колір;синій;світло;фільтр;температура; Keywords[vi]=redshift;màu;ánh sáng xanh;bộ lọc;nhiệt độ; Keywords[zh_CN]=红移,颜色,蓝,光线,过滤,温度; Keywords[zh_TW]=紅移、顏色、藍、光線、過濾、温度; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-notifications.desktop0000664000175000017500000001730715167446463027716 0ustar fabiofabio[Desktop Entry] Icon=cs-notifications Exec=cinnamon-settings notifications Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Notifications Name[af]=Kennisgewings Name[am]=ማስታወቂያዎች Name[ar]=الإشعارات Name[ast]=Notificaciones Name[ay]=Yatiyawinaka Name[az]=Bildirişlər Name[be]=Апавяшчэнні Name[bg]=Известявания Name[bn]=বিজ্ঞপ্তি Name[br]=Kemennoù Name[bs]=Obavještenja Name[ca]=Notificacions Name[ca@valencia]=Notificacions Name[crh]=bildirimler Name[cs]=Oznámení Name[cy]=Hysbysiadau Name[da]=Underretninger Name[de]=Meldungen Name[el]=Ειδοποιήσεις Name[eo]=Atentigoj Name[es]=Notificaciones Name[es_AR]=Notificaciones Name[et]=Teavitused Name[eu]=Jakinarazpenak Name[fa]=اعلان‌ها Name[fi]=Ilmoitukset Name[fil]=Mga Abiso Name[fy]=Notifikaasjes Name[ga]=Fógraí Name[gd]=Brathan Name[gl]=Notificacións Name[he]=הודעות Name[hi]=अधिसूचनाएँ Name[hr]=Obavijesti Name[hsb]=Zdźělenki Name[hu]=Értesítések Name[hy]=Ծանուցումներ Name[ia]=Notificationes Name[id]=Pemberitahuan Name[ie]=Notificationes Name[is]=Tilkynningar Name[it]=Notifiche Name[ja]=通知 Name[ka]=გაფრთხილებები Name[kab]=Tilɣa Name[kk]=Мәлімдемелер Name[km]=ការ​ជូនដំណឹង​ Name[ko]=알림 Name[ku]=Hişyarî Name[la]=Nuntiationes Name[lo]=ການແຈ້ງເຕືອນ Name[lt]=Pranešimai Name[lv]=Paziņojumi Name[ml]=അറിയിപ്പുകൾ Name[mr]=सूचना Name[ms]=Pemberitahuan Name[nap]=Avviso Name[nb]=Varslinger Name[nds]=Benachrichtigungen Name[ne]=सूचना Name[nl]=Meldingen Name[nn]=Varslar Name[oc]=Notificacions Name[pa]=ਸੂਚਨਾਵਾਂ Name[pl]=Powiadomienia Name[pt]=Notificações Name[pt_BR]=Notificações Name[ro]=Notificări Name[ru]=Уведомления Name[rue]=Уповісткы Name[sc]=Notìficas Name[sk]=Oznámenia Name[sl]=Obvestila Name[sq]=Njoftimet Name[sr]=Обавештења Name[sr@ijekavian]=Обавештења Name[sr@ijekavianlatin]=Обавештења Name[sr@latin]=Obaveštenja Name[sv]=Aviseringar Name[sw]=Taarifa Name[ta]=அறிவிப்புகள் Name[te]=గమనింపులు Name[tg]=Огоҳиҳо Name[th]=การแจ้งเตือน Name[tl]=Mga Abiso Name[tr]=Bildirimler Name[tt]=Хәбәр итү Name[uk]=Сповіщення Name[ur]=اطلاعات Name[uz]=Bildirishnomalar Name[vi]=Thông báo Name[xh]=Izaziso Name[zgh]=ⵜⵉⵏⵖⵎⵉⵙⵉⵏ Name[zh_CN]=通知 Name[zh_HK]=通知 Name[zh_TW]=通知 Comment=Notification preferences Comment[am]=የ ማስታወቂያ ምርጫዎች Comment[ar]=تفضيلات الإخطار Comment[ast]=Preferencies de les notificaciones Comment[ay]=Yatiyawinakan ajlliñanaka Comment[az]=Bildiriş üstünlükləri Comment[be]=Налады апавяшчэнняў Comment[bg]=Настройки за известия Comment[bn]=বিজ্ঞপ্তি বিষয়ে পছন্দ Comment[br]=Gwellvezioù ar c'hemennoù Comment[ca]=Preferències de notificació Comment[ca@valencia]=Preferències de notificació Comment[cs]=Předvolby oznamování Comment[cy]=Dewisiadau hysbysu Comment[da]=Præferencer for underretninger Comment[de]=Benachrichtigungseinstellungen Comment[el]=Προτιμήσεις ειδοποιήσεων Comment[eo]=Sciigaj agordoj Comment[es]=Preferencias de las notificaciones Comment[es_AR]=Preferencias de las notificaciones Comment[et]=Teavitamise eelistused Comment[eu]=Jakinerazpenen hobespenak Comment[fa]=ترجیحات اعلان Comment[fi]=Ilmoitusten asetukset Comment[fr]=Préférences de notification Comment[fr_CA]=Préférences de notification Comment[gd]=Roghainnean nam brathan Comment[gl]=Preferencias da notificación Comment[he]=העדפות הודעות Comment[hi]=अधिसूचना सेटिंग्स Comment[hr]=Osobitosti obavijesti Comment[hu]=Értesítések beállításai Comment[ia]=Preferentias de notification Comment[id]=Preferensi pemberitahuan Comment[ie]=Preferenties de notificationes Comment[is]=Valkostir kerfistilkynninga Comment[it]=Preferenze di notifica Comment[ja]=通知の設定 Comment[kab]=Tisezmal usmenyif Comment[ko]=알림 설정 Comment[lo]=ການຕັ້ງຄ່າການແຈ້ງເຕືອນ Comment[lt]=Pranešimų nuostatos Comment[lv]=Paziņojumu iestatījumi Comment[ms]=Tetapan notifikasi Comment[nb]=Varslingsinnstillinger Comment[nds]=Benachrichtigungseinstellungen Comment[nl]=Meldingsvoorkeuren Comment[nn]=Varslingsval Comment[oc]=Preferéncias de las notificacions Comment[pl]=Preferencje powiadamiania Comment[pt]=Preferências de notificação Comment[pt_BR]=Preferências de notificação Comment[ro]=Preferințe notificări Comment[ru]=Настройки уведомлений Comment[rue]=Конфіґурація увідоменя Comment[sc]=Preferèntzias de notìficas Comment[sk]=Predvoľby oznámení Comment[sl]=Možnosti obvestil Comment[sq]=Parapëlqimet e njoftimeve Comment[sr]=Поставке обавештења Comment[sr@ijekavian]=Поставке обавештења Comment[sr@ijekavianlatin]=Поставке обавештења Comment[sr@latin]=Preferencije za obaveštenja Comment[sv]=Aviseringsinställningar Comment[th]=ตั้งค่าการแจ้งเตือน Comment[tr]=Bildirim tercihleri Comment[uk]=Налаштування сповіщень Comment[ur]=اطلاعیہ ترجیحات Comment[uz]=Eslatmalar parametrlari Comment[vi]=Tùy thích thông báo Comment[zh_CN]=通知设置 Comment[zh_HK]=通知喜好設定 Comment[zh_TW]=通知偏好設定 Keywords=notifications; Keywords[af]=notifikasies; Keywords[am]=ማስታወቂያዎች; Keywords[ar]=الإخطارات; Keywords[ast]=notificaciones; Keywords[ay]=yatiyawinaka; Keywords[az]=bildirişlər; Keywords[be]=апавяшчэнні;паведамленні; Keywords[bg]=известия; Keywords[bn]=বিজ্ঞপ্তিসমূহ; Keywords[br]=kemennoù; Keywords[ca]=notificacions; Keywords[ca@valencia]=notificacions; Keywords[cs]=oznámení; Keywords[cy]=hysbysiadau; Keywords[da]=underretninger; Keywords[de]=Benachrichtigungen; Keywords[el]=ειδοποιήσεις; Keywords[eo]=sciigoj; Keywords[es]=notificaciones; Keywords[es_AR]=notificaciones; Keywords[et]=teavitused; Keywords[eu]=jakinarazpenak; Keywords[fa]=اعلان ها; Keywords[fi]=ilmoitukset; Keywords[gd]=brathan; Keywords[gl]=notificacións; Keywords[he]=הודעות; Keywords[hi]=अधिसूचनाएँ; Keywords[hr]=obavijesti; Keywords[hu]=értesítések; Keywords[ia]=notificationes; Keywords[id]=pemberitahuan; Keywords[ie]=notificationes; Keywords[is]=tilkynningar; Keywords[it]=notifiche; Keywords[ja]=notifications;通知; Keywords[kab]=tisezmal; Keywords[ko]=알림; Keywords[lo]=ການແຈ້ງເຕືອນ; Keywords[lt]=pranešimai; Keywords[lv]=paziņojumi; Keywords[ms]=notifikasi; Keywords[nb]=varslinger; Keywords[nds]=Benachrichtigungen; Keywords[nl]=meldingen; Keywords[nn]=varslingar; Keywords[oc]=notificacions; Keywords[pl]=powiadomienia; Keywords[pt]=notificações; Keywords[pt_BR]=notificações; Keywords[ro]=notificări; Keywords[ru]=уведомления; Keywords[rue]=увідоменя; Keywords[sc]=notìficas; Keywords[sk]=oznámenia; Keywords[sl]=obvestila; Keywords[sq]=njoftime; Keywords[sr]=обавештења; Keywords[sr@ijekavian]=обавештења; Keywords[sr@ijekavianlatin]=обавештења; Keywords[sr@latin]=obaveštenja; Keywords[sv]=aviseringar; Keywords[th]=การแจ้งเตือน; Keywords[tr]=bildirimler; Keywords[uk]=сповіщення; Keywords[ur]=اطلاعات; Keywords[uz]=eslatmalar; Keywords[vi]=thông báo; Keywords[zh_CN]=通知; Keywords[zh_HK]=通知; Keywords[zh_TW]=通知; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-panel.desktop0000664000175000017500000003066615167446463026147 0ustar fabiofabio[Desktop Entry] Icon=cs-panel Exec=cinnamon-settings panel Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Panel Name[af]=Paneel Name[am]=ክፍል Name[ar]=الشريط Name[ay]=Wak'a Name[be]=Панэль Name[bg]=Панел Name[bn]=প্যানেল Name[br]=Penel Name[ca]=Tauler Name[ca@valencia]=Tauler Name[de]=Leiste Name[el]=Γραμμή εργασιών Name[eo]=Panelo Name[et]=Paneel Name[eu]=Panela Name[fa]=پنل Name[fi]=Paneeli Name[fr]=Panneau Name[fr_CA]=Panneau Name[ga]=Painéal Name[gd]=Panail Name[he]=לוח Name[hi]=पट्टिका Name[ia]=Quadro Name[is]=Skjástika Name[it]=Pannello Name[ja]=パネル Name[ka]=ზოლი Name[kab]=Tafelwit n yiri, tattayt, ukessar, ufella, ɣumm, tiddi, amrussu Name[km]=បន្ទះ Name[ko]=패널 Name[la]=Tabula Name[li]=Paneel Name[lo]=ແຜງ Name[lt]=Skydelis Name[lv]=Panelis Name[ml]=പാളി Name[mo]=Паноу Name[mr]=पटल Name[nb]=Oppgavelinje Name[nds]=Leiste Name[ne]=प्यानल Name[nl]=Werkbalk Name[oc]=Tablèu de bòrd Name[om]=Moggaargii Name[pa]=ਪੈਨਲ Name[pt]=Painel Name[pt_BR]=Painel Name[ro]=Panou Name[ru]=Панель Name[rue]=Панел Name[sc]=Pannellu Name[si]=පැනලය Name[sl]=Pult Name[so]=Baanelka Name[sq]=Paneli Name[sr]=Панел Name[sr@ijekavian]=Панел Name[sr@ijekavianlatin]=Панел Name[ta]=பலகை Name[te]=ప్యానల్ Name[tg]=Лавҳа Name[th]=แผง Name[ts]=Phenele Name[uk]=Панель Name[ur]=پینل Name[vi]=Bảng Panel Name[zh_CN]=面板 Name[zh_HK]=面板 Name[zh_TW]=面板 Comment=Manage Cinnamon panel settings Comment[am]=የሲናሞን ክፍል ማሰናጃዎች አስተዳዳሪ Comment[ar]=إدارة إعدادات شريط سينامُن Comment[ast]=Axustes de l'alministrador del panel Cinnamon Comment[ay]=Cinnamon wak'a ukan mayjachawi irpaña Comment[az]="Cinnamon" panel quruluşlarını yönəlt Comment[be]=Кіраванне наладамі панэляў Cinnamon Comment[bg]=Управление на панела на Cinnamon Comment[br]=Merañ arventennoù ar penelioù Cinnamon Comment[bs]=Upravljanje Cinnamon ploča Comment[ca]=Gestioneu els ajusts del tauler de Cinnamon Comment[ca@valencia]=Gestioneu els ajusts del tauler de Cinnamon Comment[cs]=Správa nastavení panelu prostředí Cinnamon Comment[cy]=Rheoli gosodiadau panel Cinnamon Comment[da]=Administrér Cinnamon-panelindstillinger Comment[de]=Cinnamons Leisteneinstellungen verwalten Comment[el]=Διαχείριση ρυθμίσεων γραμμής εργασιών Cinnamon Comment[eo]=Administri agordojn de Cinnamon-panelo Comment[es]=Gestionar la configuración del panel de Cinnamon Comment[es_AR]=Gestionar la configuración del panel de Cinnamon Comment[et]=Cinnamoni paneeli sätete haldamine Comment[eu]=Kudeatu Cinnamon panel-ezarpenak Comment[fa]=مدیریت تنظیمات پنل Cinnamon Comment[fi]=Muokkaa Cinnamonin paneelin asetuksia Comment[fil]=I-manage ang Cinnamon panel settings Comment[fr]=Gérer les paramètres des panneaux de Cinnamon Comment[fr_CA]=Gérer les paramètres des panneaux de Cinnamon Comment[gd]=Stiùirich na roghainnean panail aig Cinnamon Comment[gl]=Administra os axustes do panel de Cinnamon Comment[he]=ניהול הגדרות לוח סינמון Comment[hi]=सिनेमन पैनल सेटिंग्स प्रबंधन Comment[hr]=Upravljajte postavkama Cinnamon panela Comment[hu]=Cinnamon Panel beállítások Comment[ia]=Gere le configurationes del pannello de Cinnamon Comment[id]=Kelola pengaturan panel Cinnamon Comment[is]=Sýsla með stillingar Cinnamon skjástika Comment[it]=Gestisci impostazioni del pannello Cinnamon Comment[ja]=Cinnamon パネルの設定を管理 Comment[kab]=Sefrek iɣewwaren n tfelwit n yiri n Cinnamon Comment[ko]=시나몬 패널설정 관리 Comment[lo]=ຈັດການການຕັ້ງຄ່າແຜງຂອງ Cinnamon Comment[lt]=Tvarkyti Cinnamon skydelio nustatymus Comment[lv]=Pārvaldīt Cinnamon paneļa iestatījumus Comment[ms]=Mengurus tetapan panel Cinnamon Comment[nb]=Håndter innstillinger for oppgavelinjen i Cinnamon Comment[nds]=Cinnamon Panel-Einstellungen verwalten Comment[nl]=Werkbalkinstellingen van Cinnamon beheren Comment[nn]=Handter innstillingar for Cinnamon‑panel Comment[oc]=Gerir los paramètres del tablèu de bòrd de Cinnamon Comment[pl]=Zarządzaj ustawieniami panelu Cinnamon Comment[pt]=Gerir definições do painel Cinnamon Comment[pt_BR]=Gerenciar as configurações do painel do Cinnamon Comment[ro]=Gestionează setările panoului Cinnamon Comment[ru]=Управление настройками панели Cinnamon Comment[rue]=Справованя штімованями панели Cinnamon Comment[sc]=Manìgia cunfiguratziones de sos pannellos de Cinnamon Comment[sk]=Spravuje nastavenia panelov prostredia Cinnamon Comment[sl]=Upravljajte nastavitve pultov Cinnamona Comment[sq]=Menaxhoni parametrat e panelit të Cinnamon Comment[sr]=Управљајте поставкама панела Цимета Comment[sr@ijekavian]=Управљајте поставкама панела Цимета Comment[sr@ijekavianlatin]=Управљајте поставкама панела Цимета Comment[sr@latin]=Upravljaj podešavanjima Cinnamonovog panela Comment[sv]=Hantera Cinnamons panelinställningar Comment[tg]=Идоракунии танзимоти лавҳаи Cinnamon Comment[th]=จัดการการตั้งค่าแผง Cinnamon Comment[tr]=Cinnamon panel ayarlarını yönet Comment[uk]=Керування налаштуваннями панелі Cinnamon Comment[ur]=سنامون پینل کی ترتیبات کا انتظام کریں Comment[uz]=Sinnamonda panel parametrlarini boshqarish Comment[vi]=Quản lý cài đặt bảng Panel Cinnamon Comment[zh_CN]=管理Cinnamon面板设置 Comment[zh_HK]=管理 Cinnamon 面板設定 Comment[zh_TW]=管理 Cinnamon 面板設定 Keywords=panel;height;bottom;top;autohide;size;layout; Keywords[am]=ክፍል: እርዝመት: ከ ታች: ከ ላይ: በራሱ መደበቂያ: መጠን: እቅድ; Keywords[ar]=الشريط، الارتفاع، أسفل، أعلى، إخفاء تلقائي، الحجم، التخطيط; Keywords[ast]=panel;altor;parte d'abaxu;parte d'enriba;auto-anubir;tamañu;aspeutu; Keywords[ay]=wak'a;tansa;aynacha;alaya;justupak imaña;ukch'a;kunjams uskuta;panel;altura;inferior;superior;autoocultar;tamaño;distribución; Keywords[az]=panel;hündürlük;aşağı;yuxarı;öz-gizləmə;ölçü;düzən; Keywords[be]=панэль;вышыня;ніжняя;верхняя;хаваць;памер;макет;размяшчэнне;значкі; Keywords[bg]=панел;височина;долу;горе;скриване;подредба; Keywords[ca]=tauler;alçada;inferior;superior;ocultació automàtica;mida;disposició; Keywords[ca@valencia]=tauler;alçada;inferior;superior;ocultació automàtica;mida;disposició; Keywords[cs]=panel;výška;spodní;horní;automatické skrývání;výška;rozvržení; Keywords[cy]=panel;uchder;isaf;brig;awtoguddio;maint;cynllun; Keywords[da]=panel;højde;bund;top;skjul automatisk;størrelse;layout; Keywords[de]=Leiste;Paneel;Höhe;Unten;Oben;automatisch;ausblenden;verbergen;verstecken;Größe;Ansicht;Anordnung;Layout; Keywords[el]=Γραμμή εργαλείων;ύψος;κάτω;πάνω;αυτόματη απόκρυψη;μέγεθος;διάταξη; Keywords[eo]=panelo;alto;malsupra;supra;aŭtomate kaŝi;grando;aranĝo; Keywords[es]=panel;altura;inferior;superior;autoocultar;tamaño;distribución; Keywords[es_AR]=panel;altura;inferior;superior;autoocultar;tamaño;distribución; Keywords[et]=paneel;kõrgus;all;üleval;automaatpeitmine;suurus;paigutus; Keywords[eu]=panela;altuera;behea;goia;ezkutatu automatikoki;tamaina;diseinua; Keywords[fa]=پنل، ارتفاع، پایین، بالا، مخفی‌کردن‌خودکار، اندازه، چیدمان; Keywords[fi]=paneeli;korkeus;pohja;yläosa;automaattinen piilotus;koko;asettelu; Keywords[fil]=panel;tangkad;ibaba;itaas;autohide;laki;layout; Keywords[fr]=panneau;hauteur;bas;haut;cacher automatiquement;taille;disposition; Keywords[fr_CA]=panneau;hauteur;bas;haut;cacher automatiquement;taille;disposition; Keywords[gd]=panel;height;bottom;top;autohide;size;layout;panail;àirde;bonn;barr;falach;meud;co-dhealbhachd; Keywords[gl]=panel;altura;inferior;superior;autoagochar;tamaño;disposición; Keywords[he]=לוח;גובה;תחתית;עליון;הסתרה אוטומטית;גודל;מתווה;panel;height;bottom;top;autohide;size;layout; Keywords[hi]=पैनल;ऊँचाई;निचला;शीर्ष;स्वतः अदृश्य;आकार;अभिन्यास; Keywords[hr]=panel;visina;dno;vrh;automatsko sakrivanje;veličina;raspored; Keywords[hu]=panel;magasság;lent;fent;automatikus elrejtés;méret;hagyományos;elrendezés; Keywords[ia]=pannello;altessa;pede;summitate;auto occultar;dimension;disposition; Keywords[id]=panel;tinggi;bawah;atas;sembunyikan otomatis;ukuran;tata letak; Keywords[is]=spjald;stika;hæð;neðst;efst;sjálfvirk felun;stærð;hefðbundið;framsetning;útlit; Keywords[it]=pannello;altezza;fondo;cima;nascondi automaticamente;dimensione;disposizione; Keywords[ja]=panel;height;bottom;top;autohide;size;layout;パネル;高さ;下;上;自動的に隠す;サイズ;大きさ;レイアウト; Keywords[kab]=tafelwit n yiri;tattayt;ukessar;ufella;ɣumm;tiddi;amrussu; Keywords[ko]=패널;높이;아래;위;자동 숨김;크기;배치; Keywords[lo]=ແຜງ;ຄວາມສູງ;ລຸ່ມ;ເທິງ;ເຊື່ອງອັດຕະໂນມັດ;ຂະໜາດ;ໂຄງຮ່າງ; Keywords[lt]=skydelis;aukštis;apačia;viršus;automatiškai slėpti;dydis;išdėstymas; Keywords[lv]=panelis;augstums;apakša;augša;automātiski paslēpt;izmērs;izkārtojums; Keywords[ms]=panel;tinggi;bawah;atas;auto sembunyi;saiz;susun atur; Keywords[nb]=oppgavelinje;høyde;bunn;topp;skjul automatisk;størrelse;utforming; Keywords[nds]=Fenster;Höhe;Unten;Oben;automatisch ausblenden;Größe;Layout; Keywords[nl]=werkbalk;hoogte;onderaan;bovenaan;automatisch verbergen;grootte;indeling; Keywords[nn]=panel;høgd;botn;topp;autogøyme;storleik;oppsett; Keywords[oc]=panèl;nautor;bas;naut;amagar automaticament;talha;disposicion;agençament; Keywords[pl]=panel;wysokość;przycisk;góra;automatyczne ukrywanie;rozmiar;układ; Keywords[pt]=painel;altura;baixo;cima;ocultar;tamanho;disposição; Keywords[pt_BR]=painel;altura;fundo;superior;auto-ocultar;tamanho;leiaute; Keywords[ro]=panou;înălțime;jos;sus;ascundere automată;dimensiune;aranjament; Keywords[ru]=панель;высота;внизу;вверху;автоскрытие;размер;слой; Keywords[rue]=панел;высота;долув;горув;автопрятаня;розмір;пасмо; Keywords[sc]=pannellu;artària;bàsciu;artu;cuadu automàticu;mannària;dispositzione; Keywords[sk]=panel;výška;spodok;vrch;automatické skrývanie;veľkosť;rozloženie; Keywords[sl]=podokno;pult;panel;višina;spodaj;zgoraj;samodejno skrij;velikost;postavitev; Keywords[sq]=paneli;lartësia;poshtë;lart;vetë-fshih;përmasat;faqosja; Keywords[sr]=панел;висина;доле;горе;аутоматско скривање;величина;распоред; Keywords[sr@ijekavian]=панел;висина;доле;горе;аутоматско скривање;величина;распоред; Keywords[sr@ijekavianlatin]=панел;висина;доле;горе;аутоматско скривање;величина;распоред; Keywords[sr@latin]=panel;visina;dole;gora;automatsko sakrivanje;veličina;raspored; Keywords[sv]=panel;höjd;nederkant;överkant;dölj automatiskt;storlek;layout; Keywords[th]=พาเนล;ความสูง;ข้างล่าง;ข้างบน;ซ่อนอัตโนมัติ;ขนาด;แผนผัง; Keywords[tr]=panel;yükseklik;alt;üst;otomatik;gizle;boyut;düzen; Keywords[uk]=панель;висота;знизу;вгорі;самочинне приховування;розмір;розташування; Keywords[ur]=پینل، اونچائی، نیچے، اوپر، چھپائیں، سائز، حجم، خاکہ; Keywords[uz]=panel;balandlik;past;yuqori;avto-berkitish;o‘lcham;joylashuv sxemasi; Keywords[vi]=bảng panel;chiều cao;đáy;đỉnh;tự động ẩn;kích thước;bố trí; Keywords[zh_CN]=面板,高度,底部,顶部,自动隐藏,大小,布局; Keywords[zh_HK]=面板;高度;底部;頂部;自動隱藏;大小;佈局; Keywords[zh_TW]=面板;高度;底端;頂端;自動隱藏;尺寸;配置; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-power.desktop0000664000175000017500000003474215167446463026203 0ustar fabiofabio[Desktop Entry] Icon=cs-power Exec=cinnamon-settings power Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Power Management Name[af]=Kragbestuur Name[am]=የሐይል አስተዳዳሪ Name[ar]=إدارة الطاقة Name[ast]=Alministración d'enerxía Name[ay]=Ch'aman (energía) irpawi Name[az]=Güc Yönətməni Name[be]=Кіраванне сілкаваннем Name[bg]=Управление на захранването Name[br]=Ardoadur an tredan Name[bs]=Upravljanje napajanjem Name[ca]=Gestió de l'energia Name[ca@valencia]=Gestió de l'energia Name[cs]=Správa napájení Name[cy]=Rheoli Pŵer Name[da]=Strømstyring Name[de]=Energieverwaltung Name[el]=Διαχείριση Ενέργειας Name[eo]=Energia administrado Name[es]=Gestión de energía Name[es_AR]=Gestión de energía Name[et]=Toitehaldus Name[eu]=Energia-kudeaketa Name[fa]=مدیریت انرژی Name[fi]=Virransäästö Name[fr]=Gestion de l’alimentation Name[fr_CA]=Gestion de l’alimentation Name[ga]=Bainisteoireacht Cumhachta Name[gd]=Stiùireadh na cumhachd Name[gl]=Xestión da enerxía Name[he]=ניהול צריכת חשמל Name[hi]=ऊर्जा प्रबंधन Name[hr]=Upravljanje energijom Name[hu]=Energiakezelő Name[ia]=Gestion del energia Name[id]=Manajemen Daya Name[is]=Gangstýring Name[it]=Gestione dell'alimentazione Name[ja]=電源管理 Name[ka]=ენერგიის მართვა Name[kab]=Asefrek n tfasa Name[ko]=전력 관리 Name[ku]=Gerînendeyê hêzê Name[la]=Administratio alimoniae Name[lo]=ການຈັດການພະລັງງານ Name[lt]=Energijos valdymas Name[lv]=Barošanas pārvaldība Name[ms]=Pengurusan Kuasa Name[nb]=Strømstyring Name[nds]=Energieverwaltung Name[nl]=Energiebeheer Name[nn]=Straumstyring Name[oc]=Gestion de l'alimentacion Name[pa]=ਪਾਵਰ ਪਰਬੰਧ Name[pl]=Zarządzanie energią Name[pt]=Gestão de energia Name[pt_BR]=Gerenciamento de Energia Name[ro]=Administrare consum Name[ru]=Управление питанием Name[rue]=Справованя живеня Name[sc]=Manìgiu energia Name[sk]=Správa napájania Name[sl]=Upravljanje porabe energije Name[sq]=Menaxhimi i energjisë Name[sr]=Управљање напајањем Name[sr@ijekavian]=Управљање напајањем Name[sr@ijekavianlatin]=Управљање напајањем Name[sr@latin]=Upravljanje energijom Name[sv]=Strömhantering Name[ta]=மின்சக்தி மேலாண்மை Name[tg]=Идоракунии барқ Name[th]=การจัดการพลังงาน Name[tr]=Güç Yönetimi Name[uk]=Керування живленням Name[ur]=توانائی کا انتظام Name[uz]=Quvvatni boshqarish Name[vi]=Quản lý Nguồn điện Name[zh_CN]=电源管理 Name[zh_HK]=電源管理 Name[zh_TW]=電源管理 Comment=Manage power settings Comment[af]=Bestuur krag instellings Comment[am]=የ ሐይል ማሰናጃዎች አስተዳዳሪ Comment[ar]=إدارة إعدادات الطاقة Comment[ast]=Axustes del alministrador d'enerxía Comment[ay]=Ch'ama (energía) mayjachawi irpaña Comment[az]=Güc quruluşlarını yönəlt Comment[be]=Налады сілкавання Comment[bg]=Управление на настройките на захранването Comment[br]=Merañ arventennoù an tredan Comment[bs]=Upravljaj podešavanjem napajanja Comment[ca]=Gestioneu els ajusts de l'energia Comment[ca@valencia]=Gestioneu els ajusts de l'energia Comment[cs]=Správa nastavení napájení Comment[cy]=Rheoli'r gosodiadau pŵer Comment[da]=Administrér strømstyring Comment[de]=Energieeinstellungen verwalten Comment[el]=Διαχείριση ρυθμίσεων ενέργειας Comment[eo]=Administri kurentajn agordojn Comment[es]=Gestionar la configuración de la energía Comment[es_AR]=Gestionar la configuración de la energía Comment[et]=Toiteseadete haldamine Comment[eu]=Kudeatu energia-ezarpenak Comment[fa]=مدیریت تنظیمات انرژی Comment[fi]=Muuta virranhallinnan asetuksia Comment[fil]=I-manage ang power settings Comment[fr]=Gérer les paramètres d’alimentation Comment[fr_CA]=Gérer les paramètres d’alimentation Comment[gd]=Stiùirich roghainnean na cumhachd Comment[gl]=Administra os axustes de enerxía Comment[he]=ניהול הגדרות צריכת חשמל Comment[hi]=ऊर्जा सेटिंग्स प्रबंधन Comment[hr]=Upravljajte postavkama energije Comment[hu]=Energiabeállítások kezelése Comment[ia]=Gere le configurationes del energia Comment[id]=Kelola pengaturan daya Comment[is]=Sýsla með orkusparnaðarstillingar Comment[it]=Gestisci impostazioni alimentazione Comment[ja]=電源の設定を管理 Comment[ka]=კვების პარამეტრების მართვა Comment[kab]=Sefrek iɣewwaren n wučči Comment[ko]=전력 설정 관리 Comment[la]=Configuratio alimoniae Comment[lo]=ຈັດການການຕັ້ງຄ່າພະລັງງານ Comment[lt]=Tvarkyti energijos nustatymus Comment[lv]=Pārvaldīt barošanas iestatījumus Comment[ms]=Mengurus tetapan kuasa Comment[nb]=Håndter strømsstyring Comment[nds]=Energieeinstellungen verwalten Comment[nl]=Energie-instellingen beheren Comment[nn]=Handter strauminnstillingar Comment[oc]=Gerir las opcions d’alimentacion Comment[pl]=Zarządzaj ustawieniami zasilania Comment[pt]=Gerir definições de energia Comment[pt_BR]=Gerenciar as configurações de energia Comment[ro]=Gestionează setările consumului Comment[ru]=Управление параметрами питания Comment[rue]=Справованя штімованями живеня Comment[sc]=Manìgia cunfiguratziones de s'energia Comment[sk]=Spravuje nastavenia napájania Comment[sl]=Upravljajte z nastavitvami porabe energije Comment[sq]=Menaxhoni parametrat e furnizimit të energjisë Comment[sr]=Управљање поставкама напајања Comment[sr@ijekavian]=Управљање поставкама напајања Comment[sr@ijekavianlatin]=Управљање поставкама напајања Comment[sr@latin]=Upravljanje podešavanjima napajanja Comment[sv]=Hantera ströminställningar Comment[tg]=Идоракунии танзимоти барқ Comment[th]=จัดการการตั้งค่าพลังงาน Comment[tr]=Güç ayarlarını yönet Comment[uk]=Керування налаштуваннями живлення Comment[ur]=توانائی کی ترتیبات کا انتظام Comment[uz]=Quvvat parametrlarini boshqarish Comment[vi]=Quản lý cài đặt nguồn điện Comment[zh_CN]=电源管理 Comment[zh_HK]=管理電源設定 Comment[zh_TW]=管理電源設定 Keywords=power;suspend;hibernate;laptop;desktop;brightness;screensaver; Keywords[am]=ሐይል፡ ማገጃ፡ ማስተኛ፡ ላፕቶፕ፡ ዴስክቶፕ፡ ብሩህንርት፡ መመልከቻውን ማዳኛ; Keywords[ar]=الطاقة، تعليق، إسبات، لاب توب، سطح المكتب، السطوع، شاشة التوقف; Keywords[ast]=enerxía;suspensión;ivernación;ivernar;suspender;portátil;escritoriu;rellumu;curiapantalles;pantalla; Keywords[ay]=ch'ama;suyt'ayaña;juyphi pachana ikiyaña;laptop;iskrituryu;llijti;pantall qhispiyiri;energía;suspender;hibernar;portátil;escritorio;brillo;salvapantallas; Keywords[az]=güc;gözlət;yuxuya get;dizüstü;iş qoyacağı;parlaqlıq;göstərici-qoruyan; Keywords[be]=электрасілкаванне;чакаючы рэжым;спячы рэжым;ноўтбук;настольны;яркасць;застаўка;батарэя; Keywords[bg]=захранване;приспиване;хиберниране;лаптоп;десктоп;яркост;предпазител на екрана; Keywords[bs]=napajanje;suspenduj;hiberniraj;laptop;desktop;svjetlost;čuvar ekrana; Keywords[ca]=energia;suspendre;hibernar;portàtil;escriptori;brillantor;estalvi de pantalla; Keywords[ca@valencia]=energia;suspendre;hibernar;portàtil;escriptori;brillantor;estalvi de pantalla; Keywords[cs]=energie;uspat;hibernovat;laptop;desktop;jas;spořič; Keywords[cy]=pŵer;oedi;cysgu;gliniadur;bwrdd gwaith;disgleirdeb;arbedwr sgrin; Keywords[da]=strøm;hvile;dvale;bærbar;stationær;lysstyrke;pauseskærm; Keywords[de]=power;suspend;hibernate;laptop;desktop;brightness;screensaver;Energie;Bereitschaft;Ruhezustand;Schreibtisch;Helligkeit;Bildschirmschoner; Keywords[el]=ενέργεια;αναστολή;αδρανοποίηση;φορητός υπολογιστής;σταθερός υπολογιστής;φωτεινότητα;προφύλαξη οθόνης; Keywords[eo]=kurento;prokrasti;pasivumigi;tekokomputilo;labortablo;brileco;ekrankurteno; Keywords[es]=energía;suspender;hibernar;portátil;escritorio;brillo;salvapantallas; Keywords[es_AR]=energía;suspender;hibernar;portátil;escritorio;brillo;salvapantallas; Keywords[et]=toide;peatamine;talveunerežiim;sülearvuti;töölaud;heledus;ekraanisäästja; Keywords[eu]=energia;eseki;hibernatu;eramangarria;mahaigainekoa;distira;pantaila-babeslea; Keywords[fa]=انرژی، تعلیق، خواب‌زمستانی، لپ‌تاپ، میزکار، روشنایی، محافظ صفحه‌نمایش; Keywords[fi]=virta;valmiustila;lepotila;kannettava;pöytätietokone;näytönsäästäjä; Keywords[fil]=power;suspend;hibernate;laptop;desktop;liwanag;screensaver; Keywords[fr]=alimentation;mise en veille;mise en veille prolongée;hibernation;ordinateur portable;ordinateur de bureau;luminosité;économiseur d’écran; Keywords[fr_CA]=alimentation;mise en veille;mise en veille prolongée;hibernation;ordinateur portable;ordinateur de bureau;luminosité;économiseur d’écran; Keywords[gd]=power;suspend;hibernate;laptop;desktop;brightness;screensaver;cumhachd;dàil;cuir 'na dhàil;geamhraich;geamhrachadh;soilleireachd;sàbhalaiche-sgrìn; Keywords[gl]=enerxia;suspender;hibernar;portátil;escritorio;brillo;protector de pantalla; Keywords[he]=צריכת חשמל;השעיה;שנת־חורף;מחשב נייד;בהירות;שומר־מרקע; Keywords[hi]=ऊर्जा;स्थगित;सुप्त;लैपटॉप;डेस्कटॉप;आभा;स्क्रीनसेवर; Keywords[hr]=uključi;suspendiraj;hiberniraj;prijenosno računalo;radna površina;osvjetljenje;čuvar zaslona; Keywords[hu]=energia;táp;felfüggesztés;hibernálás;laptop;asztali gép;fényerő;képernyővédő; Keywords[ia]=energia;stato de suspension;hibernar;portabile;scriptorio;brillantia;salvaschermo; Keywords[id]=power;suspensi;hibernasi;laptop;desktop;brightness;screensaver; Keywords[is]=orka;afl;svæfa;bið;fartölva;rafhlaða;skjáborð;birta;skjáhvíla; Keywords[it]=alimentazione;sospensione;ibernazione;laptop;desktop;luminosità;salvaschermo; Keywords[ja]=power;suspend;hibernate;laptop;desktop;brightness;screensaver;電源;サスペンド;スリープ;ハイバネート;休止状態;ラップトップ;ノート;デスクトップ;輝度;明るさ;スクリーンセーバー; Keywords[kab]=tafasa;asewḥel;asgen;aselkim aziraz;aselkim n tnarit;tafat;amsekles n ugdil; Keywords[ko]=전원;대기;잠자기;랩톱;데스크톱;밝기;화면보호기; Keywords[lo]=ພະລັງງານ;suspend;hibernate;ແລັບທັອບ;ເດັສທັອບ;ຄວາມສະຫວ່າງ;ພາບພັກໜ້າຈໍ; Keywords[lt]=maitinimas;energija;pristabdyti;užmigdyti;darbalaukis;ryškumas;ekrano užsklanda;nešiojamasis kompiuteris; Keywords[lv]=barošanas;apturēt;hibernēt;klēpjdators;darbvirsmas;spilgtums;ekrānsaudzētājs; Keywords[ms]=Kuasa;gantung;hibernasi;komputer riba;desktop;kecerahan;penjimat skrin; Keywords[nb]=strøm;hvilemodus;dvalemodus;bærbar;skrivebord;lysstyrke;skjermsparer; Keywords[nds]=Power;Bereitschaft;Ruhezustand;Laptop;Desktop;Helligkeit;Bildschirmschoner; Keywords[nl]=energie;pauzestand;slaapstand;laptop;bureaucomputer;helderheid;schermbeveiliging; Keywords[nn]=straum;kvilemodus;dvalemodus;berbar;skrivebord;lysstyrke;skjermsparar; Keywords[oc]=alimentacion;mesa en velha;mesa en velha perlongada;ivernacion;ordenador portable;ordenador de buèu;luminositat;estalviador d’ecran; Keywords[pl]=zasilanie;uśpienie;hibernacja;laptop;pulpit;jasność;wygaszacz ekranu; Keywords[pt]=energia;suspender;hibernar;portátil;computador de secretária;brilho;protetor de ecrã; Keywords[pt_BR]=energia;suspender;hibernar;laptop;área de trabalho;brilho;protetor de tela; Keywords[ro]=energie;suspendare;hibernare;laptop;desktop;luminozitate;protector de ecran; Keywords[ru]=питание;ожидание;сон;ноутбук;пк;яркость;заставка; Keywords[rue]=живеня;чеканя;сон;ноутбук;компютор;світлость;застайка; Keywords[sk]=za/vypnúť;uspať;hibernovať;notebook;plocha;jas;šetrič obrazovky; Keywords[sl]=energija;pripravljenost;mirovanje;prenosnik;namizje;svetlost;ohranjevalnik zaslona; Keywords[sq]=energji;pezullim;letargji;laptop;desktop;shkëlqim;ruajtës ekrani; Keywords[sr]=искључи;замрзни;обустави;преносни рачунар;рачунар;осветљење;чувар екрана; Keywords[sr@ijekavian]=искључи;замрзни;обустави;преносни рачунар;рачунар;осветљење;чувар екрана; Keywords[sr@ijekavianlatin]=искључи;замрзни;обустави;преносни рачунар;рачунар;осветљење;чувар екрана; Keywords[sr@latin]=napajanje energijom;suspendovanje;hibernacija;laptop;desktop;osvetljenje;čuvar ekrana; Keywords[sv]=ström;vänteläge;viloläge;bärbar dator;bordsdator;ljusstyrka;skärmsläckare; Keywords[tg]=барқ;таваққуф;гибернатсия;лэптоп;мизи корӣ;дурахшонӣ;пардаи экран; Keywords[th]=พลังงาน;พักเครื่อง;จำศีล;แล็ปท็อป;พื้นโต๊ะ;ความสว่าง;โปรแกรมรักษาหน้าจอ; Keywords[tr]=güç;bekleme;uyku;dizüstü;masaüstü;parlaklık;ekran koruyucu; Keywords[uk]=живлення;призупинення;гібернація;ноутбук;робочий стіл;яскравість;зберігач екрану; Keywords[uz]=quvvat;toʻxtatib turish;kutish rejimi;noutbuk;ish stoli;yorqinlik;ekran saqlovchi; Keywords[vi]=nguồn điện;tạm ngưng;ngủ đông;laptop;máy bàn;độ sáng;bảo vệ màn hình; Keywords[zh_CN]=电源,待机,休眠,笔记本,台式机,亮度,屏保; Keywords[zh_HK]=電源;暫停;休眠;筆記型電腦;桌上型電腦;亮度;熒幕保護程式; Keywords[zh_TW]=電源;暫停;休眠;筆記型電腦;桌上型電腦;亮度;螢幕保護程式; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-privacy.desktop0000664000175000017500000002345515167446463026523 0ustar fabiofabio[Desktop Entry] Icon=cs-privacy Exec=cinnamon-settings privacy Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Privacy Name[am]=የ ግል Name[ar]=الخصوصية Name[ast]=Privacidá Name[ay]=Jan yaqhipar churaña Name[az]=Gizlilik Name[be]=Прыватнасць Name[bg]=Поверителност Name[br]=Prevezded Name[ca]=Privadesa Name[ca@valencia]=Privadesa Name[cs]=Soukromí Name[cy]=Preifatwydd Name[da]=Privatliv Name[de]=Datenschutz Name[el]=Ιδιωτικότητα Name[eo]=Privateco Name[es]=Privacidad Name[es_AR]=Privacidad Name[et]=Privaatsus Name[eu]=Pribatutasuna Name[fa]=حریم‌خصوصی Name[fi]=Tietosuoja Name[fr]=Protection des renseignements personnels Name[fr_CA]=Protection des renseignements personnels Name[gd]=Prìobhaideachd Name[gl]=Intimidade Name[he]=פרטיות Name[hi]=निजता Name[hr]=Privatnost Name[hu]=Magánszféra Name[ia]=Confidentialitate Name[id]=Privasi Name[ie]=Privatie Name[is]=Friðhelgi Name[ja]=個人情報 Name[ka]=პირადი ინფორმაცია Name[kab]=Tusligt Name[ko]=프라이버시 Name[ku]=Veşarî Name[la]=Privata Name[lo]=ຄວາມເປັນສ່ວນຕົວ Name[lt]=Privatumas Name[lv]=Privātums Name[ms]=Privasi Name[nb]=Personvern Name[nds]=Privatssphäre Name[nl]=Privéleven Name[nn]=Personvern Name[oc]=Vida privada Name[pl]=Prywatność Name[pt]=Privacidade Name[pt_BR]=Privacidade Name[ro]=Confidențialitate Name[ru]=Конфиденциальность Name[rue]=Конфіденціалность Name[sc]=Riservadesa Name[sk]=Súkromie Name[sl]=Zasebnost Name[sq]=Privatësia Name[sr]=Приватност Name[sr@ijekavian]=Приватност Name[sr@ijekavianlatin]=Приватност Name[sr@latin]=Privatnost Name[sv]=Sekretess Name[th]=ความเป็นส่วนตัว Name[tr]=Gizlilik Name[uk]=Конфіденційність Name[ur]=پرائیویسی Name[uz]=Mahfiylik Name[vi]=Riêng tư Name[zh_CN]=隐私 Name[zh_HK]=私隱 Name[zh_TW]=隱私 Comment=Cinnamon privacy settings Comment[am]=ሲናሞን የ ግል ማሰናጃ Comment[ar]=إعدادات خصوصية سنامُن Comment[ast]=Axustes de privacidá Cinnamon Comment[ay]=Kunjams yaqhipar yatiyawi jan churataspa Cinnamonan Comment[az]="Cinnamon" gizlilik quruluşları Comment[be]=Налады прыватнасці ў Cinnamon Comment[bg]=Настройки за поверителност на Cinnamon Comment[ca]=Ajusts de privadesa de Cinnamon Comment[ca@valencia]=Ajusts de privadesa de Cinnamon Comment[cs]=Nastavení soukromí v prostředí Cinnamon Comment[cy]=Gosodiadau preifatrwydd Cinnamon Comment[da]=Cinnamon-privatlivsindstillinger Comment[de]=Cinnamon-Datenschutzeinstellungen Comment[el]=Ρυθμίσεις ιδιωτικότητας του Cinnamon Comment[eo]=Privatecaj agordoj de Cinnamon Comment[es]=Configuración de la privacidad de Cinnamon Comment[es_AR]=Configuración de la privacidad de Cinnamon Comment[et]=Cinnamoni privaatsussätted Comment[eu]=Cinnamon pribatutasunaren ezarpenak Comment[fa]=تنظیمات حریم‌خصوصی Cinnamon Comment[fi]=Cinnamonin tietosuojan asetukset Comment[fr]=Paramètres Cinnamon de protection des renseignements personnels Comment[fr_CA]=Paramètres Cinnamon de protection des renseignements personnels Comment[gd]=Roghainnean prìobhaideachd Cinnamon Comment[gl]=Opciones de intimidade de Cinnamon Comment[he]=הגדרות פרטיות סינמון Comment[hi]=सिनेमन निजता सेटिंग्स Comment[hr]=Cinnamon postavke privatnosti Comment[hu]=Cinnamon magánszféra beállítások Comment[ia]=Configuration de confidentialitate de Cinnamon Comment[id]=Pengaturan privasi Cinnamon Comment[ie]=Parametres de privatie de Cinnamon Comment[is]=Gagnaleyndarstillingar Cinnamon Comment[it]=Impostazioni privacy di Cinnamon Comment[ja]=Cinnamon 個人情報の設定 Comment[kab]=Iɣewwaren usligen Cinnamon Comment[ko]=시나몬 프라이버시 설정 Comment[lo]=ການຕັ້ງຄ່າຄວາມເປັນສ່ວນຕົວຂອງ Cinnamon Comment[lt]=Cinnamon privatumo nustatymai Comment[lv]=Cinnamon privātuma iestatījumi Comment[ms]=Tetapan privasi Cinnamon Comment[nb]=Personverninnstillinger for Cinnamon Comment[nds]=Cinnamon Privatsphäre Einstellungen Comment[nl]=Instellingen van Cinnamon inzake privéleven Comment[nn]=Personverninnstillingar for Cinnamon Comment[oc]=Paramètres de confidencialitat de Cinnamon Comment[pl]=Ustawienia prywatności Cinnamon Comment[pt]=Definições de privacidade Cinnamon Comment[pt_BR]=Configurações de privacidade do Cinnamon Comment[ro]=Setări confidențialitate Cinnamon Comment[ru]=Настройки конфиденциальности Cinnamon Comment[rue]=Штімованя конфіденціалности Cinnamon Comment[sc]=Cunfiguratziones de riservadesa de Cinnamon Comment[sk]=Nastavenia súkromia Cinnamon Comment[sl]=Nastavitve zasebnosti Cinnamona Comment[sq]=Parametrat e privatësisë të Cinnamon Comment[sr]=Поставке приватности Цимета Comment[sr@ijekavian]=Поставке приватности Цимета Comment[sr@ijekavianlatin]=Поставке приватности Цимета Comment[sr@latin]=Postavke privatnosti Cinnamona Comment[sv]=Cinnamon integritetsinställningar Comment[th]=การตั้งค่าความเป็นส่วนตัวของ Cinnamon Comment[tr]=Cinnamon gizlilik ayarları Comment[uk]=Параметри конфіденційности Cinnamon Comment[ur]=سنامون پرائیویسی کی ترتیبات Comment[uz]=Sinnamonning mahfiylik parametrlari Comment[vi]=Cài đặt riêng tư Cinnamon Comment[zh_CN]=Cinnamon隐私设置 Comment[zh_HK]=Cinnamon 私隱設定 Comment[zh_TW]=Cinnamon 隱私設定 Keywords=privacy;recent;gtk;private; Keywords[am]=የ ግል: የ ቅርብ ጊዜ: gtk: የ ግል; Keywords[ar]=الخصوصية، الاخيرة، gtk، الشخصي; Keywords[ast]=privacidá;apocayá;gtk;priváu; Keywords[ay]=jan yaqhipar churaña;jichhaki;gtk;jani yaqha jaqina;privacidad;reciente;privado; Keywords[az]=gizlilik;sonuncu;gtk;özəl; Keywords[be]=прыватнасць;нядаўнія;gtk;асабістыя; Keywords[bg]=лично;текущо;gtk;частно; Keywords[ca]=privadesa;recent;gtk;privat; Keywords[ca@valencia]=privadesa;recent;gtk;privat; Keywords[cs]=soukromí;nedávné;gtk;soukromé; Keywords[cy]=preifatrwydd;diweddar;gtk;preifat; Keywords[da]=privatliv;seneste;gtk;privat; Keywords[de]=Datenschutz;Privatsphäre;Vertraulichkeit;Geheimhaltung;kürzlich;letzte;neueste;jüngste; Keywords[el]=ιδιωτικότητα;πρόσφατο;gtk;ιδιωτικό; Keywords[eo]=privateco;antaŭ nelonge;gtk;privata; Keywords[es]=privacidad;reciente;gtk;privado; Keywords[es_AR]=privacidad;reciente;gtk;privado; Keywords[et]=privaatsus;gtk; Keywords[eu]=pribatutasuna;azkenak;gtk;pribatua; Keywords[fa]=حریم‌خصوصی، اخیر، gtk، خصوصی; Keywords[fi]=yksityisyys;viimeiset;gtk;tietosuoja; Keywords[fr]=confidentialité;protection des renseignements personnels;récent;gtk;privé; Keywords[fr_CA]=confidentialité;protection des renseignements personnels;récent;gtk;privé; Keywords[gd]=privacy;recent;gtk;private;prìobhaideahcd;o chionn goirid;prìobhaideach; Keywords[gl]=intimidade;recente;gtk;privado; Keywords[he]=פרטיות;לאחרונה;gtk;פרטי; Keywords[hi]=निजता;हालिया;जीटीके;निजी; Keywords[hr]=privatnost;nedavno;gtk;privatno; Keywords[hu]=magánszféra;legutóbbi;gtk;magán; Keywords[ia]=confidentialitate;recente;gtk;private; Keywords[id]=privasi;baru-baru ini;gtk;pribadi; Keywords[is]=friðhelgi;persónulegt;einka;gagnaleynd;gtk; Keywords[it]=privacy;recenti;gtk;privato; Keywords[ja]=privacy;recent;gtk;private;プライバシー;個人情報;最近使ったファイル;プライベート; Keywords[kab]=tabadnit;melmi kan;gtk;uslig; Keywords[ko]=프라이버시;최근;gtk;비공개; Keywords[lo]=ຄວາມເປັນສ່ວນຕົວ;ຫຼ້າສຸດ;gtk;ສ່ວນຕົວ; Keywords[lt]=privatumas;paskiausi;gtk;privatu; Keywords[lv]=privātums;nesen;gtk;privāts; Keywords[ms]=Privasi;baru-baru ini;gtk;peribadi; Keywords[nb]=personvern;nylig;gtk;privat; Keywords[nds]=Datenschutz;kürzlich erfolgt;gtk;Privat; Keywords[nl]=privéleven;onlangs;gtk;privé; Keywords[nn]=personvern;nyleg;gtk;privat; Keywords[oc]=confidencialitat;proteccion de las donadas personalas;recent;gtk;privat; Keywords[pl]=prywatność;ostatnie;gtk;prywatny; Keywords[pt]=privacidade;recentes;gtk;privado; Keywords[pt_BR]=privacidade;recente;gtk;privado; Keywords[ro]=confidențialitate;recent;gtk;confidențial; Keywords[ru]=конфиденциальность;недавние;gtk;приватность; Keywords[rue]=конфіденціалность;недавні;gtk;пріватность; Keywords[sc]=riservadesa;reghente;gtk;privadu; Keywords[sk]=súkromie;nedávno otvorené;gtk;súkromné; Keywords[sl]=zasebnost;nedavno;gtk;zasebno; Keywords[sq]=privatësia;të fundit;gtk;privat; Keywords[sr]=приватност;скорашње;гтк;мир; Keywords[sr@ijekavian]=приватност;скорашње;гтк;мир; Keywords[sr@ijekavianlatin]=приватност;скорашње;гтк;мир; Keywords[sr@latin]=privatnost;skorašnje;gtk;privatno; Keywords[sv]=integritet;senaste;gtk;privat; Keywords[th]=ความเป็นส่วนบุคคล;ล่าสุด;gtk;ส่วนบุคคล; Keywords[tr]=gizlilik;son dosyalar;gtk;özel; Keywords[uk]=конфіденційність;останні;GTK;приватне; Keywords[ur]=پرائیوسی، حالیہ، جی ٹی کے، پرائیویٹ، نجی; Keywords[uz]=mahfiylik;yaqindagi;gtk;mahfiy; Keywords[vi]=riêng tư;gần đây;gtk;riêng tư; Keywords[zh_CN]=隐私,最近,gtk,个人; Keywords[zh_HK]=私隱;最近;GTK;私人; Keywords[zh_TW]=隱私;最近;GTK;私人; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-screensaver.desktop0000664000175000017500000002536215167446463027365 0ustar fabiofabio[Desktop Entry] Icon=cs-screensaver Exec=cinnamon-settings screensaver Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Screensaver Name[am]=መመልከቻ ማዳኛ Name[ar]=شاشة التوقف Name[ast]=Curiapantalles Name[ay]=Pantall qhispiyiri Name[az]=Göstərici-qoruyan Name[be]=Застаўка Name[bg]=Предпазител на екрана Name[br]=Damanter skramm Name[ca]=Estalvi de pantalla Name[ca@valencia]=Estalvi de pantalla Name[cs]=Šetřič obrazovky Name[cy]=Arbedwr sgrin Name[da]=Pauseskærm Name[de]=Bildschirmschoner Name[el]=Προφύλαξη οθόνης Name[eo]=Ekrankurteno Name[es]=Salvapantallas Name[es_AR]=Salvapantallas Name[et]=Ekraanisäästja Name[eu]=Pantaila-babeslea Name[fa]=محافظ صفحه Name[fi]=Näytönsäästäjä Name[fr]=Économiseur d’écran Name[fr_CA]=Économiseur d’écran Name[gd]=Sàbhalaiche-sgrìn Name[gl]=Protector de pantalla Name[he]=שומר־מרקע Name[hi]=स्क्रीनसेवर Name[hr]=Čuvar zaslona Name[hu]=Képernyővédő Name[ia]=Salvaschermo Name[id]=Pengaman Layar Name[ie]=Garda-ecran Name[is]=Skjáhvíla Name[it]=Salvaschermo Name[ja]=スクリーンセーバー Name[ka]=ეკრანის დამცველი Name[kab]=Agdil n usuḍes Name[ko]=화면 보호기 Name[ku]=Parêzvana ekranê Name[la]=Servator scrinii Name[lo]=ພາບພັກໜ້າຈໍ Name[lt]=Ekrano užsklanda Name[lv]=Ekrānsaudzētājs Name[mo]=Облоане Name[ms]=Penjimat Skrin Name[nb]=Skjermsparer Name[nds]=Bildschirmschoner Name[nl]=Schermbeveiliging Name[nn]=Skjermsparar Name[oc]=Estalviador d'ecran Name[pl]=Wygaszacz ekranu Name[pt]=Proteção de ecrã Name[pt_BR]=Proteção de Tela Name[ro]=Protector ecran Name[ru]=Экранная заставка Name[rue]=Застайка Name[sc]=Sarva-ischermu Name[sk]=Šetrič obrazovky Name[sl]=Ohranjevalnik zaslona Name[sq]=Ruajtës ekrani Name[sr]=Чувар екрана Name[sr@ijekavian]=Чувар екрана Name[sr@ijekavianlatin]=Чувар екрана Name[sr@latin]=Čuvar ekrana Name[sv]=Skärmsläckare Name[th]=โปรแกรมรักษาหน้าจอ Name[tr]=Ekran koruyucu Name[uk]=Зберігач екрану Name[ur]=سکرین سیور Name[uz]=Ekran saqlovchi Name[vi]=Trình bảo vệ màn hình Name[zh_CN]=屏幕保护程序 Name[zh_HK]=熒幕保護程式 Name[zh_TW]=螢幕保護程式 Comment=Manage screen lock settings Comment[am]=የመመልከቻ መቆለፊያ ማሰናጃ አስተዳዳሪ Comment[ar]=إدارة إعدادات قفل الشاشة Comment[ast]=Axustes del bloquéu de pantalla Comment[ay]=Pantall llawintaw mayjachaña Comment[az]=Göstərici açarı quruluşlarını yönəlt Comment[be]=Кіраваць блакiраваннем экрана і застаўкай Comment[bg]=Управление на настройките за заключване на екрана Comment[bs]=Upravljaj postavkama zaključavanja ekrana Comment[ca]=Gestioneu els ajusts del bloqueig de pantalla Comment[ca@valencia]=Gestioneu els ajusts del bloqueig de pantalla Comment[cs]=Nastavení zamykání obrazovky Comment[cy]=Rheoli gosodiadau cloi'r sgrin Comment[da]=Administrér skærmlåsindstillinger Comment[de]=Einstellungen der Bildschirmsperre verwalten Comment[el]=Διαχείριση ρυθμίσεων κλειδώματος οθόνης Comment[eo]=Administri agordojn pri ekranŝlosado Comment[es]=Configurar el bloqueo de la pantalla Comment[es_AR]=Configurar el bloqueo de la pantalla Comment[et]=Ekraaniluku seadete haldamine Comment[eu]=Kudeatu pantaila blokeatzearen ezarpenak Comment[fa]=مدیریت تنظیمات قفل صفحه Comment[fi]=Muokkaa näytön lukituksen asetuksia Comment[fil]=I-manage ang screen lock settings Comment[fr]=Gérer les paramètres de verrouillage de l’écran Comment[fr_CA]=Gérer les paramètres de verrouillage de l’écran Comment[gd]=Stiùirich roghainnean glasaidh na sgrìn Comment[gl]=Administra os axustes do bloqueo de pantalla Comment[he]=ניהול הגדרות נעילת מסך Comment[hi]=लॉक स्क्रीन सेटिंग्स प्रबंधन Comment[hr]=Upravljajte postavkama zaključavanja zaslona Comment[hu]=Képernyőzárolás beállítások kezelése Comment[ia]=Gere le configurationes de bloco de schermo Comment[id]=Mengatur setelan kunci layar Comment[is]=Sýsla með stillingar skjálæsingar Comment[it]=Gestisci impostazioni di blocco dello schermo Comment[ja]=画面ロックの設定を管理 Comment[kab]=Sefrek iɣewwaṛen n usewḥel n ugdil Comment[ko]=화면 잠금 설정 Comment[lo]=ຈັດການການຕັ້ງຄ່າການລັອກໜ້າຈໍ Comment[lt]=Tvarkyti ekrano užrakto nustatymus Comment[lv]=Pārvaldīt ekrāna bloķēšanas iestatījumus Comment[ms]=Mengurus tetapan kunci skrin Comment[nb]=Håndter innstillinger for skjermlås Comment[nds]=Bildschirmsperren-Einstellungen bearbeiten Comment[nl]=Instellingen voor schermvergrendeling beheren Comment[nn]=Handter skjermlåsinnstillingar Comment[oc]=Gerir los paramètres de verrolhatge d'ecran Comment[pl]=Zarządzaj ustawieniami blokady ekranu Comment[pt]=Gerir definições de bloqueio de ecrã Comment[pt_BR]=Gerenciar configurações de bloqueio de tela Comment[ro]=Gestionează setările blocării ecranului Comment[ru]=Настройка блокировки экрана Comment[rue]=Справовати штімованя блокованя екрана Comment[sc]=Manìgia cunfiguratziones de blocu de s'ischermu Comment[sk]=Spravuje nastavenia uzamykania obrazovky Comment[sl]=Upravljajte z nastavitvami zaklepa zaslona Comment[sq]=Menaxhoni parametrat e bllokimit të ekranit Comment[sr]=Управљање поставкама закључавања екрана Comment[sr@ijekavian]=Управљање поставкама закључавања екрана Comment[sr@ijekavianlatin]=Управљање поставкама закључавања екрана Comment[sr@latin]=Upravljanje podešavanjima zaključavanja ekrana Comment[sv]=Hantera skärmlåsinställningar Comment[tg]=Идоракунии танзимоти қулфи экран Comment[th]=จัดการการตั้งค่าการล็อกหน้าจอ Comment[tr]=Ekran kilidi seçeneklerini yönet Comment[uk]=Керування налаштуваннями блокування екрану Comment[ur]=سکرین قفل کی ترتیبات کا انتظام Comment[uz]=Ekranni qulflash parametrlarini boshqarish Comment[vi]=Quản lý cài đặt khóa màn hình Comment[zh_CN]=管理锁屏设置 Comment[zh_HK]=管理熒幕鎖定設定 Comment[zh_TW]=管理螢幕鎖定設定 Keywords=screensaver;lock;away;message; Keywords[am]=መመልከቻ ማዳኛ: መቆለፊያ: የለሁም: መልእክት:; Keywords[ar]=حافظة الشاشة، القفل، بعيدًا، رسالة; Keywords[ast]=curiapantalles;bloquiar;ausente;mensax; Keywords[ay]=pantall qhispiyiri;llawintaña;anqankiwa;yatiyawi; Keywords[be]=застаўка;блакіраванне;lock;паведамленне; Keywords[bg]=предпазител;заключване;отдалечен;съобщение; Keywords[ca]=estalvi de pantalla;bloqueig;absent;missatge; Keywords[ca@valencia]=Salvapantalla;bloqueig;absent;missatge; Keywords[cs]=šetřič obrazovky;zámek;pryč;zpráva; Keywords[cy]=arbedwr sgrin;clo;i ffwrdd;neges; Keywords[da]=pauseskærm;lås;fraværende;besked;meddelelse; Keywords[de]=Bildschirmschoner;Schoner;Bildschirmsperre;Sperre;Abwesenheitsnachricht;Nachricht; Keywords[el]=32/5000 προφύλαξη οθόνης;κλείδωμα;μακριά;μήνυμα; Keywords[eo]=ekrankurteno;ŝlosi;for;mesaĝo; Keywords[es]=salvapantallas;bloquear;ausencia;mensaje; Keywords[es_AR]=salvapantallas;bloquear;ausencia;mensaje; Keywords[et]=ekraanisäästja;lukk;eemal;sõnum; Keywords[eu]=pantaila babeslea;blokeatu;kanpoan;mezua; Keywords[fa]=محافظ صفحه، قفل، دور، پیام; Keywords[fi]=näytönsäästäjä;lukitse;poissa;viesti; Keywords[fil]=screensaver;lock;away;mensahe; Keywords[fr]=économiseur d’écran;verrouiller;absent;message; Keywords[fr_CA]=économiseur d’écran;verrouiller;absent;message; Keywords[he]=שומר־מרקע;נעילה;'יצאתי';מסר; Keywords[hi]=स्क्रीनसेवर;लॉक;अनुपस्थिति;संदेश; Keywords[hr]=čuvar zaslona;zaključaj;odsutan;poruka; Keywords[hu]=képernyővédő;lezárás;jelszó;nincs a gépnél;távol;üzenet;screensaver;lock;away;message; Keywords[ia]=salvaschermo;blocar;foras;message; Keywords[id]=screensaver;kunci;pergi;pesan; Keywords[is]=skjáhvíla;læsing;fjarvera;skilaboð; Keywords[it]=salvaschermo;blocco;away;messaggio; Keywords[ja]=screensaver;lock;away;message;スクリーンセーバー;ロック;退席;離席;メッセージ;伝言; Keywords[kab]=aḥerraz n ugalis;sewḥel;yebɛed;izen; Keywords[ko]=화면 보호기;잠금;자리 비움;메시지; Keywords[lo]=ພາບພັກໜ້າຈໍ;ລັອກ;ບໍ່ຢູ່;ຂໍ້ຄວາມ; Keywords[lt]=ekrano užsklanda;užraktas;žinutė;pranešimas;pasišalinimo;pasišalinęs; Keywords[lv]=ekrānsaudzētājs;bloķēt;prom;ziņa; Keywords[nb]=skjermsparer;lås;borte;melding; Keywords[nl]=schermbeveiliging;vergrendelen;weg;boodschap; Keywords[nn]=skjermsparar;lås;fråvær;melding; Keywords[oc]=estalviador d’ecran;verrolhatge;abséncia;messatge;estalviaire; Keywords[pl]=wygaszacz ekranu;blokada;zaraz wracam;wiadomość; Keywords[pt]=protetor de ecrã;bloqueio;ausente;mensagem; Keywords[pt_BR]=protetor de tela;bloquear;ausente;mensagem; Keywords[ro]=screensaver;blocare;plecat;mesaj; Keywords[ru]=хранитель экрана;блокировка;бездействие;сообщение; Keywords[rue]=застайка;блокованя;бездїя;уповістка; Keywords[sk]=šetrič obrazovky;zámok;uzamknúť;preč;odísť;neprítomnosť;správa; Keywords[sl]=ohranjevalnik zaslona;zakleni;stran;sporočilo; Keywords[sq]=ruajtës ekrani;kyç;larg;mesazh; Keywords[sr]=чувар екрана;закључај;одсутан;порука; Keywords[sr@ijekavian]=чувар екрана;закључај;одсутан;порука; Keywords[sr@ijekavianlatin]=чувар екрана;закључај;одсутан;порука; Keywords[sr@latin]=čuvar ekrana;zaključaj;odsutan;poruka; Keywords[sv]=skärmsläckare;lås;borta;meddelande; Keywords[tr]=ekran koruyucu;kilit;dışarıda;mesaj; Keywords[uk]=зберігач екрану;блокування;бездіяльність;повідомлення; Keywords[uz]=ekran saqlovchi;qulflash;uzoqda;xabar; Keywords[vi]=tắt màn hình;khóa màn hình;không gần màn hình;tin nhắn; Keywords[zh_CN]=屏保,锁定,离开,消息; Keywords[zh_HK]=螢幕保護程式;鎖定;暫離;訊息; Keywords[zh_TW]=螢幕保護程式;鎖定;暫離;訊息; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-sound.desktop0000664000175000017500000002401615167446463026170 0ustar fabiofabio[Desktop Entry] Icon=cs-sound Exec=cinnamon-settings sound Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Sound Name[am]=ድምጽ Name[ar]=الصوت Name[ast]=Soníu Name[ay]=Kirkiwi Name[az]=Səs Name[be]=Гук Name[bg]=Звук Name[br]=Son Name[bs]=Zvuk Name[ca]=Àudio Name[ca@valencia]=Àudio Name[cs]=Zvuk Name[cy]=Sain Name[da]=Lyd Name[de]=Klang Name[el]=Ήχος Name[eo]=Sono Name[es]=Sonido Name[es_AR]=Sonido Name[et]=Heli Name[eu]=Soinua Name[fa]=صدا Name[fi]=Ääni Name[fil]=Tunog Name[fr]=Son Name[fr_CA]=Son Name[fy]=Lûd Name[ga]=Fuaim Name[gd]=Fuaim Name[gl]=Son Name[he]=שמע Name[hi]=ध्वनि Name[hr]=Zvuk Name[hu]=Hang Name[hy]=Ձայն Name[ia]=Sono Name[id]=Suara Name[ie]=Son Name[is]=Hljóð Name[it]=Audio Name[ja]=サウンド Name[ka]=ხმები Name[kab]=Imesli Name[kk]=Дыбыс Name[ko]=소리 Name[ku]=Deng Name[la]=Sonus Name[lo]=ສຽງ Name[lt]=Garsas Name[lv]=Skaņa Name[ms]=Bunyi Name[nb]=Lyd Name[nds]=Klang Name[nl]=Geluid Name[nn]=Lyd Name[oc]=Son Name[pa]=ਆਵਾਜ਼ Name[pl]=Dźwięk Name[pt]=Som Name[pt_BR]=Som Name[ro]=Sunet Name[ru]=Звук Name[rue]=Звук Name[sc]=Sonu Name[sk]=Zvuk Name[sl]=Zvok Name[sq]=Zëri Name[sr]=Звук Name[sr@ijekavian]=Звук Name[sr@ijekavianlatin]=Звук Name[sr@latin]=Zvuk Name[sv]=Ljud Name[ta]=ஒலி Name[tg]=Садо Name[th]=เสียง Name[tr]=Ses Name[uk]=Звук Name[ur]=آواز Name[uz]=Ovoz Name[vi]=Âm thanh Name[zh_CN]=声音 Name[zh_HK]=聲音 Name[zh_TW]=音效 Comment=Manage sound settings Comment[am]=የ ድምፅ ማሰናጃ አስተዳዳሪ Comment[ar]=إدارة إعدادات الصوت Comment[ast]=Prebar axustes de soníu Comment[ay]=Kirkiw mayjachaw irpaña Comment[az]=Səs quruluşlarını yönəlt Comment[be]=Кіраванне наладамі гуку Comment[bg]=Управление настройките на звука Comment[br]=Merañ arventennoù ar son Comment[ca]=Gestioneu els ajusts del so Comment[ca@valencia]=Gestioneu els ajusts del so Comment[cs]=Spravovat nastavení zvuku Comment[cy]=Rheoli'r gosodiadau sain Comment[da]=Håndtér lydindstillinger Comment[de]=Klangeinstellungen verwalten Comment[el]=Διαχείριση ρυθμίσεων ήχου Comment[eo]=Administri sonagordojn Comment[es]=Gestionar la configuración del sonido Comment[es_AR]=Gestionar la configuración del sonido Comment[et]=Heliseadistused Comment[eu]=Kudeatu soinuaren ezarpenak Comment[fa]=مدیریت تنظیمات صدا Comment[fi]=Hallitse ääniasetuksia Comment[fil]=I-manage ang sound settings Comment[fr]=Gérer les paramètres du son Comment[fr_CA]=Gérer les paramètres du son Comment[he]=ניהול הגדרות שמע Comment[hi]=ध्वनि सेटिंग्स प्रबंधन Comment[hr]=Upravljanje postvkama zvuka Comment[hu]=Hangbeállítások Comment[ia]=Gerer le configurationes del sono Comment[id]=Mengelola pengaturan suara Comment[is]=Sýsla með hljóðstillingar Comment[it]=Regolare le configurazioni del suono Comment[ja]=サウンドの設定を管理 Comment[kab]=Sefrek iɣewwaren n imesli Comment[ko]=소리 설정 관리 Comment[la]=Configuratio soni cura Comment[lo]=ຈັດການການຕັ້ງຄ່າສຽງ Comment[lt]=Tvarkyti garso nustatymus Comment[lv]=Pārvaldīt skaņas iestatījumus Comment[nb]=Administrer lydinnstillinger Comment[nl]=Geluidinstellingen beheren Comment[nn]=Handter lydinnstillingar Comment[oc]=Gerir los paramètres del son Comment[pl]=Zarządzaj ustawieniami dźwięku Comment[pt]=Gerir definições de som Comment[pt_BR]=Gerenciar configuração de áudio Comment[ro]=Gestionează setările de sunet Comment[ru]=Управление настройками звука Comment[rue]=Справованя штімованями звука Comment[sc]=Manìgia cunfiguratziones de sonu Comment[sk]=Spravuje nastavenia zvuku Comment[sl]=Upravljaj nastavitve zvoka Comment[sq]=Menaxho cilësimet e zërit Comment[sr]=Управљајте подешавањима звука Comment[sr@ijekavian]=Управљајте подешавањима звука Comment[sr@ijekavianlatin]=Управљајте подешавањима звука Comment[sr@latin]=Upravljanje podešavanjima zvuka Comment[sv]=Hantera ljudinställningar Comment[th]=จัดการการตั้งค่าเสียง Comment[tr]=Ses ayarlarını yönet Comment[uk]=Керування налаштуваннями звуку Comment[ur]=آواز کی ترتیبات انتظام Comment[uz]=Tovush parametrlarini boshqarish Comment[vi]=Quản lý cài đặt âm thanh Comment[zh_CN]=管理声音设置 Comment[zh_HK]=管理聲音設定 Comment[zh_TW]=管理音效設定 Keywords=sound;media;music;speakers;audio;microphone;headphone; Keywords[ar]=صوت;وسائل العرض;الموسيقى;مكبرات الصوت;سمعي;مايكروفون; Keywords[ast]=soníu;mediu;música;altavoces;audiu;micrófonu;cascos; Keywords[ay]=kirkiwi;medios;kirkiña;jach'at arst'ayiri;ist'awi;mikruphunu;ist'añataki;sonido;música;altavoces;audio;micrófono;auriculares; Keywords[be]=гук;медыя;музыка;дынамікі;аўдыя;мікрафон;навушнікі; Keywords[bg]=звук;медия;музика;говорители;аудио;микрофон;слушалка; Keywords[ca]=so;mitjans;música;altaveus;àudio;micròfon;auriculars; Keywords[ca@valencia]=so;mitjans;música;altaveus;àudio;micròfon;auriculars; Keywords[cs]=zvuk;média;hudba;reproduktory;zvuk;mikrofon;sluchátka; Keywords[cy]=sain;cyfryngau;cerddoriaeth;seinyddion;sain;meicroffon;clustffon; Keywords[da]=lyd;medier;musik;højtalere;audio;mikrofon;hovedtelefon; Keywords[de]=Ton;Medien;Musik;Lautsprecher;Audio;Mikrofon;Kopfhörer; Keywords[el]=Ήχος;μέσα;μουσική;ηχεία;ήχος;μικρόφωνο;ακουστικό; Keywords[eo]=sono;aŭdovidaĵoj;muziko;laŭtparoliloj;aŭdaĵoj;mikrofono;kapaŭskultiloj; Keywords[es]=sonido;medios;música;altavoces;audio;micrófono;auriculares; Keywords[es_AR]=sonido;medios;música;altavoces;audio;micrófono;auriculares; Keywords[et]=heli;meedia;muusika;kõlarid;heli;mikrofon;kõrvaklapid; Keywords[eu]=soinua;multimedia;musika;bozgorailuak;audioa;mikrofonoa;entzugailuak; Keywords[fa]=صدا، رسانه، موسیقی، بلندگو، صدا، میکروفون، هدفون; Keywords[fi]=ääni;media;musiikki;kaiuttimet;audio;mikrofoni;kuulokkeet; Keywords[fil]=tunog;media;musika;speakers;audio;microphone;headphone; Keywords[fr]=son;médias;musique;haut-parleurs;audio;microphone;casque;casque d’écoute; Keywords[fr_CA]=son;médias;musique;haut-parleurs;audio;microphone;casque;casque d’écoute; Keywords[he]=צליל;קול;מדיה;מוזיקה;רמקולים;שמע;מיקרופון;אוזניות; Keywords[hi]=ध्वनि;मीडिया;संगीत;स्पीकर;ऑडियो;माइक्रोफोन;हेडफोन; Keywords[hr]=zvuk;medij;glazba;zvučnici;zvuk;mikrofon;slušalice; Keywords[hu]=sound;media;music;speakers;audio;microphone;headphone;hang;média;zene;hangszórók;mikrofon; Keywords[ia]=sono;medios;musica;altoparlatores;audio;microphono;bonetto auricular; Keywords[id]=suara;media;musik;speaker;audio;mikrofon;headphone; Keywords[is]=hljóð;margmiðlun;tónlist;hátalarar;hljóðkerfi;hljóðnemi;heyrnartól; Keywords[it]=suoni;media;musica;altoparlanti;audio;microfono;cuffie; Keywords[ja]=sound;media;music;speakers;audio;microphone;headphone;サウンド;音;メディア;ミュージック;音楽;スピーカー;オーディオ;マイク;ヘッドホン;イヤホン; Keywords[kab]=imesli;amidya;aẓawan;imsmeɣren n yimesli;imikṛufunen;tisefladin; Keywords[ko]=소리;미디어;음악;스피커;오디오;이어폰;헤드폰; Keywords[lo]=ສຽງ;ສື່;ເພງ;ລຳໂພງ;ອໍດິໂອ;ໄມໂຄຣໂຟນ;ຫູຟັງ; Keywords[lt]=garsas;medija;įvairalypė terpė;ivairialype terpe;muzika;garsiakalbiai;kolonėlės;koloneles;mikrofonas;audio;ausinės;ausines; Keywords[lv]=skaņa;multivide;mūzika;skaļruņi;audio;mikrofons;austiņas; Keywords[nb]=lyd;media;musikk;høyttalere;lyd;mikrofon;hodetelefoner; Keywords[nl]=geluid;media;muziek;luidsprekers;audio;microfoon;koptelefoon; Keywords[nn]=lyd;media;musikk;høgtalarar;lyd;mikrofon;hovudtelefonar; Keywords[oc]=son;mèdias;musica;nautparlaires;àudio;microfòn;escotador;casc; Keywords[pl]=dźwięk;multimedia;muzyka;głośniki;audio;mikrofon;słuchawki; Keywords[pt]=som;média;música;altifalantes;áudio;microfone;auscultadores; Keywords[pt_BR]=som;mídia;música;alto-falantes;áudio;microfone;fone de ouvido; Keywords[ro]=sunet;media;muzică;boxe;audio;microfon;căști; Keywords[ru]=звук;медиа;музыка;динамики;аудио;микрофон;наушники; Keywords[rue]=звук;медіа;музика;дінамікы;аудіо;мікрофон;наушникы; Keywords[sk]=zvuk;médiá;hudba;reproduktory;audio;mikrofón;slúchadlá;náhlavná;súprava; Keywords[sl]=zvok;medij;glasba;zvočniki;audio;mikrofon;slušalka; Keywords[sq]=tingull;media;muzikë;altoparlantë;audio;mikrofon;kufje; Keywords[sr]=звук;медија;музика;звучници;аудио;микрофон;слушице; Keywords[sr@ijekavian]=звук;медија;музика;звучници;аудио;микрофон;слушице; Keywords[sr@ijekavianlatin]=звук;медија;музика;звучници;аудио;микрофон;слушице; Keywords[sr@latin]=zvuk;mediji;muzika;zvučnici;audio;mikrofon;slušalice; Keywords[sv]=ljud;media;musik;högtalare;ljud;mikrofon;hörlurar; Keywords[tr]=ses;ortam;müzik;hoparlör;çalma;mikrofon;kulaklık; Keywords[uk]=звук;медія;музика;динаміки;авдіо;мікрофон;слухальця; Keywords[uz]=ovoz;media;musiqa;dinamiklar;audio;mikrofon;eshitish vositasi; Keywords[vi]=tiếng;media;nhạc;loa;audio;micro;tai nghe; Keywords[zh_CN]=声音,媒体,音乐,扬声器,音频,麦克风,耳机; Keywords[zh_HK]=聲音,媒體,音樂,揚聲器,音頻,麥克風,耳機; Keywords[zh_TW]=聲音、媒體、音樂、揚聲器、音訊、麥克風和耳機; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-startup.desktop0000664000175000017500000003233215167446463026542 0ustar fabiofabio[Desktop Entry] Icon=cs-startup-programs Exec=cinnamon-settings startup Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Startup Applications Name[am]=መተግበሪያዎች ማስጀመሪያ Name[ar]=برامج بدء التشغيل Name[ast]=Aplicaciones d'aniciu Name[ay]=Aplikasiyunanak qalltasina Name[az]=Uyğulamaların Başlanması Name[be]=Аўтазапуск праграм Name[bg]=Автоматично стартирани програми Name[bn]=স্টার্টআপ অ্যাপ্লিকেশনসমূহের Name[br]=Arloadoù loc'hañ Name[ca]=Aplicacions a l'inici Name[ca@valencia]=Aplicacions a l'inici Name[cs]=Aplikace spouštěné při přihlášení Name[cy]=Rhaglenni Cychwyn Name[da]=Opstartsprogrammer Name[de]=Startprogramme Name[el]=Προγράμματα εκκίνησης Name[eo]=Aplikaĵoj post startigo Name[es]=Aplicaciones al inicio Name[es_AR]=Aplicaciones al inicio Name[et]=Käivitatavad rakendused Name[eu]=Abioko aplikazioak Name[fa]=برنامه های هنگامِ-شروع Name[fi]=Käynnistyvät ohjelmat Name[fr]=Applications lancées au démarrage Name[fr_CA]=Applications lancées au démarrage Name[fy]=Opstart Applikaasjes Name[gd]=Aplacaidean tòiseachaidh Name[gl]=Aplicativos de inicio Name[he]=יישומי אתחול Name[hi]=आरंभिक अनुप्रयोग Name[hr]=Pokrenute aplikacije Name[hu]=Indítópult Name[ia]=Applicationes de initio Name[id]=Aplikasi Permulaan Name[ie]=Applicationes de iniciament Name[is]=Ræsiforrit Name[it]=Applicazioni d'avvio Name[ja]=自動開始させるアプリ Name[ka]=გაშვებისას ჩასატვირთი აპლიკაციები Name[kab]=Isnasen n usekker Name[ko]=시작 애플리케이션 Name[ku]=Bernameyên Destpêkê Name[lo]=ໂປຣແກຣມເລີ່ມລະບົບ Name[lt]=Paleisties programos Name[lv]=Starta programmas Name[ms]=Aplikasi Permulaan Name[nb]=Oppstartsprogrammer Name[nds]=Systemstartprogramme Name[nl]=Opstarttoepassingen Name[nn]=Oppstartsprogram Name[oc]=Aplicacions a l'aviada Name[pl]=Programy startowe Name[pt]=Aplicações de arranque Name[pt_BR]=Aplicativos da Inicialização Name[ro]=Aplicații lansate la pornire Name[ru]=Автозагрузка Name[rue]=Автозапуск Name[sc]=Aplicatziones de aviada Name[sk]=Aplikácie po spustení Name[sl]=Začetni programi Name[sq]=Programet në nisje Name[sr]=Почетни програми Name[sr@ijekavian]=Почетни програми Name[sr@ijekavianlatin]=Почетни програми Name[sr@latin]=Početne aplikacije Name[sv]=Uppstartsprogram Name[th]=โปรแกรมเริ่มวาระ Name[tr]=Başlangıç Uygulamaları Name[uk]=Автозапуск програм Name[ur]=کمپیوڑر آغاز کی ایپلی کیشنز Name[uz]=Avto-yuklanuvchi dasturlar Name[vi]=Ứng dụng Khởi chạy Name[zh_CN]=开机自启动程序 Name[zh_HK]=初始啟動程式 Name[zh_TW]=系統啟動應用程式 Comment=Manage your startup applications Comment[am]=የሚጀምሩ መተግባሪያዎች አስተዳዳሪ Comment[ar]=إدارة تطبيقات بدء التشغيل الخاصة بك Comment[ast]=Xestiona les tos aplicaciones d'aniciu Comment[ay]=Qalltaw aplikasiyunanak irpaña Comment[az]=Başlama uyğulamalarınızı yönəldin Comment[be]=Кіраванне аўтазапускам праграм Comment[bg]=Управление на стартиращите приложения Comment[bn]=আপনার স্টার্টআপ অ্যাপ্লিকেশনসমূহের ব্যবস্থা নিন Comment[ca]=Gestioneu les vostres aplicacions d'inici Comment[ca@valencia]=Gestioneu les vostres aplicacions d'inici Comment[cs]=Spravovat aplikace spouštěné při přihlášení Comment[cy]=Rheoli eich rhaglenni cychwyn Comment[da]=Håndtér dine opstartsprogrammer Comment[de]=Ihre Startprogramme verwalten Comment[el]=Διαχείριση των εφαρμογών εκκίνησης σου Comment[eo]=Administri viajn aplikaĵojn post startigo Comment[es]=Gestionar las aplicaciones al inicio Comment[es_AR]=Gestionar las aplicaciones al inicio Comment[et]=Hallake oma käivitusrakendusi Comment[eu]=Kudeatu zure abioko aplikazioak Comment[fa]=برنامه‌های هنگامِ-شروعِ خود را مدیریت کنید Comment[fi]=Hallinnoi automaattisesti käynnistyviä ohjelmia Comment[fil]=I-manage ang startup apps Comment[fr]=Gérer vos applications lancées au démarrage Comment[fr_CA]=Gérer vos applications lancées au démarrage Comment[gd]=Stiùirich na h-aplacaidean tòiseachaidh agad Comment[gl]=Administrar os seus aplicativos do inicio Comment[he]=ניהול יישומים שיופעלו בעת אתחול Comment[hi]=आरंभिक अनुप्रयोग प्रबंधन Comment[hr]=Upravljajte vašim pokrenutim aplikacijama Comment[hu]=Bejelentkezéskor elindítandó alkalmazások Comment[ia]=Gere tu applicationes de lanceamento initial Comment[id]=Mengelola aplikasi awal mula Comment[is]=Sýsla með forrit virkjuð í ræsingu Comment[it]=Gestisci le tue applicazioni di avvio Comment[ja]=自動開始させるアプリケーションを管理します Comment[kab]=Sefrek isnasen-inek n usekker Comment[ko]=여러분의 시작 애플리케이션을 관리하세요 Comment[lo]=ຈັດການໂປຣແກຣມເລີ່ມລະບົບຂອງທ່ານ Comment[lt]=Valdykite savo paleidžiamas programas Comment[lv]=Pārvaldīt starta programmas Comment[ms]=Urus aplikasi permulaan anda Comment[nb]=Håndter dine oppstartsprogrammer Comment[nds]=Startanwendungen verwalten Comment[nl]=Beheer uw opstarttoepassingen Comment[nn]=Handter oppstartsprogramma dine Comment[oc]=Gerissètz vòstras aplicacions a l'aviada Comment[pl]=Zarządzaj programami startowymi Comment[pt]=Gerir aplicações de arranque automático Comment[pt_BR]=Gerencie seus aplicativos da inicialização Comment[ro]=Gestionează aplicațiile lansate la pornire Comment[ru]=Управление автозапускаемыми приложениями Comment[rue]=Справованя автозапуска придаткув Comment[sc]=Manìgia aplicatziones de aviada Comment[sk]=Spravuje vaše aplikácie po spustení Comment[sl]=Upravljajte aplikacije ob zagonu računalnika Comment[sq]=Menaxhoni programet tuaja të nisjes Comment[sr]=Управљање почетним програмима Comment[sr@ijekavian]=Управљање почетним програмима Comment[sr@ijekavianlatin]=Управљање почетним програмима Comment[sr@latin]=Upravljanje početnim aplikacijama Comment[sv]=Hantera dina uppstartsprogram Comment[th]=จัดการโปรแกรมเริ่มวาระของคุณ Comment[tr]=Başlangıç uygulamalarınızı yönetin Comment[uk]=Керування автоматичним запуском програм Comment[ur]=کمپیوڑر آغاز کی ایپلی کیشنز کا انتطام کریں Comment[uz]=Avto-yuklanuvchi dasturlarni boshqarish Comment[vi]=Quản lý ứng dụng khởi chạy của bạn Comment[zh_CN]=管理启动程序 Comment[zh_HK]=管理你的始動應用程式 Comment[zh_TW]=管理您的系統啟動應用程式 Keywords=startup;programs;boot;init;session;autostart;apps; Keywords[ar]=بدء التشغيل، التطبيقات، الإقلاع، التمهيد، الجلسة، التشغيل الآلي;البرامج; Keywords[ast]=arrinque;programes;boot;init;sesión;autoaniciu;apps; Keywords[ay]=qalltawi;prukramanaka;kumputatur qalltawi;init;mit'a;justupak qalltawi;aplikasiyunanaka;inicio;programas;arranque;inicialización;sesión;autoinicio;aplicaciones; Keywords[be]=запуск;праграмы;загрузка;ініцыяцыя;сесія;аўтазапуск;старт; Keywords[bg]=стартиране;програми;boot;init;сесия;авто старт;приложения; Keywords[ca]=inici;programes;arrencada;inicialització;sessió;autoinici;aplicacions; Keywords[ca@valencia]=inici;programes;arrancada;inicialització;sessió;autoinici;aplicacions; Keywords[cs]=spuštění;programy;zavádění;init;sezení;automatické spouštění;aplikace; Keywords[cy]=cychwyn;rhaglenni;cychwyn;cychwyn;sesiwn;awtomatig;apiau; Keywords[da]=opstart;programmer;boot;init;session;automatisk opstart;apps; Keywords[de]=Start;Programme;Anwendungen;Apps;Initialisierung;Sitzung;Autostart; Keywords[el]=Εκκίνηση;προγράμματα;εκκίνηση;αρχικοποίηση;συνεδρία;αυτόματη έναρξη;εφαρμογές; Keywords[eo]=startigo;programoj;praŝargo;init;seanco;aŭtomate startigi;apoj; Keywords[es]=inicio;programas;arranque;inicialización;sesión;autoinicio;aplicaciones; Keywords[es_AR]=inicio;programas;arranque;inicialización;sesión;autoinicio;aplicaciones; Keywords[et]=käivitamine;programmid;alglaadimine;init;seanss;automaatkäivitus;rakendused; Keywords[eu]=hasiera;programak;abioa;hasieraketa;saioa;abio automatikoa;aplikazioak; Keywords[fa]=شروع، نرم‌افزار ها، راه‌اندازی، init، نشست، شروع خودکار، برنامه ها; Keywords[fi]=käynnistäminen;ohjelmat;käynnistys;init;istunto;automaattinen käynnistys;sovellukset; Keywords[fr]=démarrage;programmes;amorçage;initialisation;session;démarrage automatique;applis; Keywords[fr_CA]=démarrage;programmes;amorçage;initialisation;session;démarrage automatique;applis; Keywords[he]=אתחול;תוכניות;init;שיח;אתחול אוטומטי;יישומונים; Keywords[hi]=आरंभ;प्रोग्राम;बूट;init;सत्र;स्वतः आरंभ;अनुप्रयोग; Keywords[hr]=pokretanje;programi;init;sesija;automatsko pokretanje;aplikacije; Keywords[hu]=indítás;programok;rendszerindítás;folyamat;munkamenet;alkalmazások;automatikus indítás;startup;programs;boot;init;session;autostart;apps; Keywords[ia]=lanceamento initial;programmas;facer le boot de;initiar;session;auto-initio;applicationes; Keywords[id]=awal mula;program;boot;init;sesi;autostart;aplikasi; Keywords[is]=ræsing;forrit;ræsiforrit;init;seta;sjálfræsa;forrit; Keywords[it]=avvio;programmi;boot;init;sessione;avvio automatico;apps; Keywords[ja]=startup;programs;boot;init;session;autostart;apps;スタートアップ;プログラム;ブート;起動;セッション;自動開始;アプリ; Keywords[kab]=asenker;iseγẓanen;boot;init;tiγimit;asenker awurman;isnasen; Keywords[ko]=시작;프로그램;boot;init;세션;자동 시작;앱; Keywords[lo]=ເລີ່ມລະບົບ;ໂປຣແກຣມ;ບູດ;ອິນິດ;ເຊສຊັນ;ເລີ່ມອັດຕະໂນມັດ;ແອັບ; Keywords[lt]=paleidimas;paleistis;programos;init;inicijavimas;seansas;automatinis paleidimas; Keywords[lv]=startēšana;programmas;sāknēšana;inicializēšana;sesija;automātiskā palaišana;lietotnes; Keywords[nb]=oppstart;programmer;oppstart;init;økt;autostart;apper; Keywords[nl]=opstart;programma's;opstarten;init;sessie;automatische start;toepassingen; Keywords[nn]=oppstart;program;oppstart;init;økt;autostart;appar; Keywords[oc]=aviada;aviament;amodament;programas;amorsatge;inicializacion;session;aviada automatica;aplicacions; Keywords[pl]=autouruchamianie;programy;uruchamianie;init;sesja;autostart;aplikacje; Keywords[pt]=arranque;programas;boot;iniciar;sessão;automático;aplicações; Keywords[pt_BR]=início;programas;boot;init;sessão;autoinício;apps; Keywords[ro]=pornire;programe;boot;init;sesiune;autostart;aplicații; Keywords[ru]=запуск;программы;загрузка;инициализация;сессия;автозапуск;приложения; Keywords[rue]=пущаня;проґрамы;обтерьханя;ініціалізація;сесія;автозапуск;придаток; Keywords[sk]=po spustení;spustenie;programy;zavedenie;init;relácia;sedenie;autoštart;aplikácie; Keywords[sl]=zagon;programi;zagon;inicializacija;seja;avtomatski zagon;aplikacije; Keywords[sq]=nisje;programe;nisje;inicializim;seancë;nisje automatike;aplikacione; Keywords[sr]=покретање;програми;подизање;инит;сесија;аутоматско покретање;апликације; Keywords[sr@ijekavian]=покретање;програми;подизање;инит;сесија;аутоматско покретање;апликације; Keywords[sr@ijekavianlatin]=покретање;програми;подизање;инит;сесија;аутоматско покретање;апликације; Keywords[sr@latin]=početno;programi;podizanje;init;sesija;automatsko pokretanje;aplikacije; Keywords[sv]=uppstart;program;boota;init;session;autostart;appar; Keywords[tr]=başlangıç;programlar;açılış;oturum;otomatik başlat;uygulamalar; Keywords[uk]=запуск;програми;завантаження;ініціалізація;сесія;автозапуск;додатки; Keywords[uz]=ishga tushirish;dasturlar;yuklash;boshlash;sessiya;autostart;ilovalar; Keywords[vi]=khởi tạo;chương trình;khởi động;init;session;tự khởi động;ứng dụng; Keywords[zh_CN]=启动,程序,引导,初始化,会话,自动启动,应用程序; Keywords[zh_HK]=系統啟動;程式;開機;init;作業階段;自動啟動;程式; Keywords[zh_TW]=系統啟動;程式;開機;init;作業階段;自動啟動;程式; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-themes.desktop0000664000175000017500000002512515167446463026327 0ustar fabiofabio[Desktop Entry] Icon=cs-themes Exec=cinnamon-settings themes Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Themes Name[af]=Temas Name[am]=ገፅታዎች Name[ar]=الثيمات Name[ast]=Temes Name[ay]=Taqpach uñjawinaka Name[az]=Örtüklər Name[be]=Тэмы Name[bg]=Теми Name[bn]=থীম Name[br]=Temoù Name[bs]=Teme Name[ca]=Temes Name[ca@valencia]=Temes Name[crh]=temalar Name[cs]=Motivy vzhledu Name[csb]=Mòtiwë Name[cy]=Themâu Name[da]=Temaer Name[de]=Themen Name[el]=Θέματα Name[eo]=Etosoj Name[es]=Temas Name[es_AR]=Temas Name[et]=Teemad Name[eu]=Gaiak Name[fa]=قالب‌ها Name[fi]=Teemat Name[fil]=Mga Tema Name[fr]=Thèmes Name[fr_CA]=Thèmes Name[fy]=Tema's Name[ga]=Téamaí Name[gd]=Ùrlaran Name[gl]=Temas Name[he]=ערכות נושא Name[hi]=थीम्स Name[hr]=Teme Name[hu]=Témák Name[hy]=Թեմաներ Name[ia]=Themas Name[id]=Tema Name[ie]=Temas Name[is]=Þemu Name[it]=Temi Name[ja]=テーマ Name[ka]=თემები Name[kab]=Isental Name[kk]=Нақыштар Name[km]=ស្បែក Name[ko]=테마 Name[ku]=Dirb Name[la]=Themata Name[li]=Thema's Name[lo]=ລັກສະນະ Name[lt]=Apipavidalinimai Name[lv]=Motīvi Name[ml]=രംഗവിധാനങ്ങൾ Name[mo]=Теме визуале Name[mr]=थीम्स Name[ms]=Tema Name[nap]=Temi Name[nb]=Temaer Name[nds]=Themen Name[ne]=थेमहरु Name[nl]=Thema's Name[nn]=Drakter Name[oc]=Tèmas Name[om]=Bifoota Name[pa]=ਥੀਮ Name[pl]=Motywy Name[pt]=Temas Name[pt_BR]=Temas Name[ro]=Teme Name[ru]=Темы Name[rue]=Темы Name[sc]=Temas Name[si]=තේමාවන් Name[sk]=Motívy Name[sl]=Teme Name[so]=Siimyadda Name[sq]=Temat Name[sr]=Теме Name[sr@ijekavian]=Теме Name[sr@ijekavianlatin]=Теме Name[sr@latin]=Teme Name[sv]=Teman Name[ta]=தள வடிவங்கள் Name[te]=అలంకారాలు Name[tg]=Мавзӯҳо Name[th]=ชุดตกแต่ง Name[tl]=Mga Tema Name[tr]=Temalar Name[ts]=Nkongomelo Name[tt]=Темы Name[uk]=Теми Name[ur]=تھیمز Name[uz]=Mavzular Name[vi]=Giao diện Name[xh]=Umxholo Name[zh_CN]=主题 Name[zh_HK]=佈景主題 Name[zh_TW]=佈景主題 Comment=Manage themes to change how your desktop looks Comment[am]=የ እርስዎ ዴስክቶፕ ገጽታ ምን እንደሚመስል መቆጣጠሪያ Comment[ar]=إدارة الثيمات لتغيير كيفية ظهور سطح المكتب Comment[ast]=Alministra los temes y camuda l'aspeutu del to escritoriu Comment[ay]=Iskrituryu (escritorio) mayjaptayañatakix, taqpacha uñjaw irpaña Comment[az]=İş qoyacağının görünüşünü dəyişmək üçün örtükləri yönəldin Comment[be]=Кіраваць тэмамі знешняга выгляду працоўнага стала Comment[bg]=Управлявайте темите, за да промените вида на вашия работен плот Comment[br]=Merañ temoù da cheñch neuz ar burev Comment[bs]=Upravljaj temama da promijenite kako vaš desktop izgleda Comment[ca]=Gestioneu els temes per canviar l'aparença del vostre escriptori Comment[ca@valencia]=Gestioneu els temes per canviar l'aparença del vostre escriptori Comment[cs]=Spravovat motivy a změnit tak vzhled pracovního prostředí Comment[cy]=Rheoli themâu er mwyn newid sut olwg sydd ar eich sgrin Comment[da]=Administrér temaer for at ændre, hvordan dit skrivebord ser ud Comment[de]=Themen verwalten, um das Aussehen des Schreibtischs zu verändern Comment[el]=Ρυθμίστε τα θέματα και αλλάξτε την εμφάνιση του υπολογιστή Comment[eo]=Administri etosojn por ŝanĝi la aspekton de via labortablo Comment[es]=Gestionar temas para cambiar el aspecto del escritorio Comment[es_AR]=Gestionar temas para cambiar el aspecto del escritorio Comment[et]=Teemade haldamine töölaua välimuse kohandamiseks Comment[eu]=Kudeatu gaiak zure mahaigainaren itxura aldatzeko Comment[fa]=مدیریت تم ها برای تغییر ظاهر میزکارتان Comment[fi]=Muuta pöydän ulkonäköä teemojen avulla Comment[fil]=I-manage ang themes para palitan ang itsura ng desktop mo Comment[fr]=Gérer les thèmes pour changer l’apparence de votre bureau Comment[fr_CA]=Gérer les thèmes pour changer l’apparence de votre bureau Comment[gd]=Stiùirich ùrlaran gus an coltas a tha air an deasg agad atharrachadh Comment[gl]=Administra os temas do escritorio Comment[he]=ניהול ערכות נושא לשינוי מראה מצג שולחן־העבודה Comment[hi]=डेस्कटॉप स्वरुप हेतु थीम प्रबंधन Comment[hr]=Upravljajte temama za promjenu izgleda vaše radne površine Comment[hu]=Témák kezelése az asztal kinézetének megváltoztatásához Comment[ia]=Gere le themas pro cambiar le apparentia de tu scriptorio Comment[id]=Mengatur tema untuk mengubah tampilan desktop Anda Comment[is]=Sýsla með þemu til að breyta útliti skjáborðsins Comment[it]=Gestisci i temi per cambiare l'aspetto del desktop Comment[ja]=テーマを管理し、デスクトップの外観を変更します Comment[kab]=Sefrek isental iwakken ad tbeddeleḍ timeẓri n tnarit-inek Comment[ko]=테마 관리는 여러분의 컴퓨터를 달라 보이게 할 겁니다 Comment[la]=Themata ad faciem scriptorii mutandam cura Comment[lo]=ຈັດການລັກສະນະເພື່ອປ່ຽນຮູບຮ່າງໜ້າຕາຂອງເດັສທັອບ Comment[lt]=Tvarkykite apipavidalinimus darbalaukio vaizdui pakeisti Comment[lv]=Pārvaldīt motīvus, lai mainītu jūsu darbvirsmas izskatu Comment[ms]=Mengurus tema untuk tukar bagaimana rupa desktop anda Comment[nb]=Tilpass tema for å endre hvordan skrivebordet ser ut Comment[nds]=Themen verwalten, um den Desktop auf Ihre Bedürfnisse einzurichten Comment[nl]=Thema's beheren om te veranderen hoe uw bureaublad eruit ziet Comment[nn]=Handter tema for å endre utsjånaden på skrivebordet Comment[oc]=Gerir los tèmas per cambiar l'aparéncia del burèu Comment[pl]=Zarządzaj motywami, aby zmienić wygląd pulpitu Comment[pt]=Gerir temas para o ambiente de trabalho Comment[pt_BR]=Gerenciar temas para mudar o visual da sua área de trabalho Comment[ro]=Gestionează temele pentru a schimba aspectul desktopului Comment[ru]=Управление темами внешнего вида рабочего стола Comment[rue]=Справованя темами вонкашнього виду роботного стола Comment[sc]=Manìgia temas pro cambiare s'aspetu de s'iscrivania tua Comment[sk]=Spravuje motívy na zmenu vzhľadu prostredia Comment[sl]=Upravljajte s temami za spreminjanje izgleda vašega namizja Comment[sq]=Menaxhoni temat për të ndryshuar si duket desktopi juaj Comment[sr]=Управљајте темама да измените изглед радне површи Comment[sr@ijekavian]=Управљајте темама да измените изглед радне површи Comment[sr@ijekavianlatin]=Управљајте темама да измените изглед радне површи Comment[sr@latin]=Upravljajte temama da biste promenili izgled Vaše radne površine Comment[sv]=Hantera teman för att ändra hur ditt skrivbord ser ut Comment[tg]=Идоракунии мавзӯҳо ва намуди зоҳирии мизи корӣ Comment[th]=จัดการชุดตกแต่งเพื่อเปลี่ยนว่าจะให้พื้นโต๊ะของคุณมีมุมมองอย่างไรบ้าง Comment[tr]=Masaüstü görüntünüzü özelleştirmek için temaları yönetin Comment[uk]=Керуйте темами, щоб змінити вигляд Вашого робочого столу Comment[uz]=Ish stoli koʻrinishini oʻzgartirish uchun mavzularni boshqaring Comment[vi]=Quản lý chủ đề để thay đổi giao diện màn hình chính Comment[zh_CN]=管理主体以改变您桌面的外貌 Comment[zh_HK]=管理佈景主題以變更你的桌面外觀 Comment[zh_TW]=管理佈景主題以變更您的桌面外觀 Keywords=themes;style; Keywords[am]=ገጽታዎች ፡ ዘዴ; Keywords[ar]=الثيمات;الأسلوب; Keywords[ast]=temes;estilu; Keywords[ay]=taqpach uñjawinaka;kasta;temas;estilo; Keywords[az]=örtüklər;biçim; Keywords[be]=тэмы;стыль; Keywords[bg]=тема;стил; Keywords[br]=temoù;stil; Keywords[bs]=teme;stilovi; Keywords[ca]=temes;estil; Keywords[ca@valencia]=temes;estil; Keywords[cs]=motivy;styl; Keywords[cy]=themâu;arddulliau; Keywords[da]=temaer;stil; Keywords[de]=Themen;Thema;themes;Stilarten;Style;Design;Aussehen;Darstellung;Erscheinungsbild;Motiv; Keywords[el]=θέμα;εμφάνιση;στύλ; Keywords[eo]=etosoj;stilo; Keywords[es]=temas;estilo; Keywords[es_AR]=temas;estilo; Keywords[et]=teemad;stiil; Keywords[eu]=gaiak;estiloa; Keywords[fa]=تم ها، سبک; Keywords[fi]=teemat;tyyli; Keywords[fr]=thèmes;style; Keywords[fr_CA]=thèmes;style; Keywords[ga]=téamaí;stíl; Keywords[gd]=tèamaichean;stoidhle; Keywords[gl]=temas;estilo; Keywords[he]=ערכות־נושא;סגנון; Keywords[hi]=थीम;शैली; Keywords[hr]=teme;izgled; Keywords[hu]=témák;stílus; Keywords[ia]=themas;stilo; Keywords[id]=tema;gaya; Keywords[ie]=temas;stil; Keywords[is]=þemu;stíll; Keywords[it]=tema;stile; Keywords[ja]=themes;style;テーマ;スタイル; Keywords[ka]=თემები;სტილი; Keywords[kab]=isental;aɣanib; Keywords[ko]=테마;스타일; Keywords[lo]=ລັກສະນະ;ຮູບແບບ; Keywords[lt]=apipavidalinimai;stilius; Keywords[lv]=motīvi;stils; Keywords[ms]=tema;gaya; Keywords[nb]=temaer;stil; Keywords[nds]=Themen;Stil; Keywords[nl]=thema's;stijl; Keywords[nn]=tema;stil; Keywords[oc]=tèma;estil; Keywords[om]=dhamsawwan;haalata; Keywords[pl]=motywy;style; Keywords[pt]=temas;estilo; Keywords[pt_BR]=temas;estilo; Keywords[ro]=teme;stil; Keywords[ru]=темы;стиль; Keywords[rue]=темы;стіль; Keywords[sc]=temas;istile; Keywords[sk]=motívy;témy;štýl; Keywords[sl]=teme;slog; Keywords[sq]=temat;stili; Keywords[sr]=тема;начин приказа; Keywords[sr@ijekavian]=тема;начин приказа; Keywords[sr@ijekavianlatin]=тема;начин приказа; Keywords[sr@latin]=teme;stilovi; Keywords[sv]=tema;stil; Keywords[ta]=அலங்காரங்கள்;பாணி; Keywords[tg]=мавзӯъ;сабк; Keywords[th]=ชุดตกแต่ง;รูปแบบ; Keywords[tr]=temalar;stiller; Keywords[uk]=теми;стиль; Keywords[ur]=شکل(theme)، انداز (style); Keywords[uz]=mavzular;uslub; Keywords[vi]=chủ đề;kiểu dáng; Keywords[zh_CN]=主题,样式; Keywords[zh_HK]=佈景主題;樣式; Keywords[zh_TW]=佈景主題;樣式; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-thunderbolt.desktop0000664000175000017500000000404015167446463027365 0ustar fabiofabio[Desktop Entry] Icon=cs-thunderbolt Exec=cinnamon-settings thunderbolt Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Thunderbolt Comment=Manage Thunderbolt and USB4 devices Comment[ca]=Gestiona dispositius Thunderbolt i USB4 Comment[ca@valencia]=Gestiona dispositius Thunderbolt i USB4 Comment[da]=Håndtér Thunderbolt- og USB4-enheder Comment[eo]=Mastrumi Ekfulmo kaj USB4-aparatojn Comment[es]=Administrar dispositivos Thunderbolt y USB4 Comment[es_AR]=Administrar dispositivos Thunderbolt y USB4 Comment[fi]=Hallitse Thunderbolt- ja USB4-laitteita Comment[fr]=Gérer Thunderbolt et les périphériques USB4 Comment[fr_CA]=Gérer Thunderbolt et les périphériques USB4 Comment[hu]=Thunderbolt és USB 4 eszközök kezelése Comment[is]=Sýsla með Thunderbolt og USB4-tæki Comment[it]=Gestisci dispositivi Thunderbolt e USB4 Comment[ja]=Thunderbolt と USB4 デバイスを管理 Comment[ko]=썬더볼트 및 USB4 장치 관리 Comment[lv]=Pārvaldīt Thunderbolt un USB4 ierīces Comment[nl]=Thunderbolt- en USB4-apparaten beheren Comment[oc]=Gerir los periferics Thunderbolt e USB4 Comment[pl]=Zarządzanie urządzeniami Thunderbolt i USB4 Keywords=thunderbolt;usb;docking;station;hub;dock; Keywords[ca]=thunderbolt;usb;docking;station;estació;hub;dock; Keywords[ca@valencia]=thunderbolt;usb;docking;station;estació;hub;dock; Keywords[da]=thunderbolt;usb;docking;station;hub;dock;dok; Keywords[eo]=ekfulmo;usb;endokigo;doko;nabo;doko; Keywords[es]=thunderbolt;usb;docking;estación;hub;dock; Keywords[es_AR]=thunderbolt;usb;docking;estación;hub;dock; Keywords[fi]=thunderbolt;usb;liitos;asema;keskitin;telakka; Keywords[hu]=Thunderbolt;USB;dokkolóállomás;HUB;dokkoló; Keywords[ja]=thunderbolt;usb;docking;station;hub;dock;サンダーボルト;ドッキング;ステーション;ハブ;ドック; Keywords[ko]=썬더볼트;usb;도킹;스테이션;허브;독; Keywords[lv]=thunderbolt;usb;dokošana;stacija;centrmezgls;doks; Keywords[oc]=thunderbolt;usb;dock;estacion;hub;dock; Keywords[pl]=thunderbolt;usb;dokowanie;stacja;hub;stacja dokująca; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-universal-access.desktop0000664000175000017500000003313515167446463030311 0ustar fabiofabio[Desktop Entry] Icon=cs-universal-access Exec=cinnamon-settings accessibility Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Accessibility Name[af]=Toeganklikheid Name[am]=በቀላሉ የሚደረስበት Name[ar]=إتاحة Name[ast]=Accesibilidá Name[ay]=Uqaranakatakimpi juykhunakatakimpi Name[az]=Əlçatımlılıq Name[be]=Спецыяльныя магчымасці Name[bg]=Достъпност Name[bn]=বিশেষ সুবিধা Name[br]=Haezadusted Name[bs]=Pristupačnost Name[ca]=Accessibilitat Name[ca@valencia]=Accessibilitat Name[crh]=Erişilebilirlik Name[cs]=Zpřístupnění pro hendikepované Name[csb]=Przistãpnosc Name[cy]=Hygyrchedd Name[da]=Tilgængelighed Name[de]=Barrierefreiheit Name[el]=Προσβασιμότητα Name[eo]=Alirebleco Name[es]=Accesibilidad Name[es_AR]=Accesibilidad Name[et]=Hõlbustused Name[eu]=Erabilerraztasuna Name[fa]=قابلیت دسترسی Name[fi]=Esteettömyys Name[fil]=Pagkarating Name[fr]=Accessibilité Name[fr_CA]=Accessibilité Name[fy]=Tagonklikens Name[ga]=Inrochtaineacht Name[gd]=Ruigsinneachd Name[gl]=Accesibilidade Name[he]=נגישות Name[hi]=अभिगम्यता Name[hr]=Pristupačnost Name[hsb]=Přistupnosć Name[hu]=Akadálymentesítés Name[hy]=Մատչելիություն Name[ia]=Accessibilitate Name[id]=Aksesibilitas Name[ie]=Accessibilitá Name[is]=Auðveldað aðgengi Name[it]=Accessibilità Name[ja]=ユーザー補助 Name[ka]=_დამხმარე საშუალებები Name[kab]=Tuffart Name[kk]=Қол жетерлілік Name[km]=មធ្យោបាយ​ងាយស្រួល Name[kn]=ನಿಲುಕಣೆ (ಆಕ್ಸೆಸಿಬಿಲಿಟಿ) Name[ko]=편리한 기능 Name[ku]=Gehînbarî Name[la]=Pervietas Name[lo]=ການຊ່ວຍການເຂົ້າເຖິງ Name[lt]=Prieinamumas Name[lv]=Pieejamība Name[ml]=ഉപയോഗലഭ്യത Name[mo]=Посибилитэць спечиале Name[mr]=सुलभता Name[ms]=Kebolehcapaian Name[nap]=Accessibilità Name[nb]=Tilgjengelighet Name[nds]=Zugänglichkeit Name[ne]=पहुँचयोग्य Name[nl]=Toegankelijkheid Name[nn]=Tilgjengefunksjonar Name[oc]=Accessibilitat Name[om]=Gahiinsa Name[pa]=ਅਸੈੱਸਬਿਲਟੀ Name[pl]=Ułatwienia dostępu Name[pt]=Acessibilidade Name[pt_BR]=Acessibilidade Name[ro]=Accesibilitate Name[ru]=Специальные возможности Name[rue]=Приступ Name[sc]=Atzessibilidade Name[si]=ප්‍රවේශතාවය Name[sk]=Zjednodušenie ovládania Name[sl]=Dostopnost Name[so]=Sahlidda Name[sq]=Përdorshmëria Name[sr]=Приступачност Name[sr@ijekavian]=Приступачност Name[sr@ijekavianlatin]=Приступачност Name[sr@latin]=Pristupačnost Name[sv]=Tillgänglighet Name[ta]=அணுகல்தன்மை Name[te]=ప్రాప్తత Name[tg]=Қобилияти дастрасӣ Name[th]=สิ่งอำนวยความสะดวก Name[tl]=Pagkarating Name[tr]=Erişilebilirlik Name[ts]=Mfikelelo Name[tt]=Алу Name[uk]=Спеціальні можливості Name[ur]=رسائی Name[uz]=Maxsus imkoniyatlar Name[vi]=Khả năng Truy cập Name[zh_CN]=辅助功能 Name[zh_HK]=無障礙存取 Name[zh_TW]=無障礙 Comment=Configure accessibility features Comment[am]=የሚደረስባቸውን ገጽታዎች ማሰናጃ Comment[ar]=تكوين ميزات سهولة الوصول Comment[ast]=Configurar opciones d'accesibilidá Comment[ay]=Uqaranakatakimpi jukhunakatakimpi mayjachaña Comment[az]=Əlçatımlılıq özəlliklərini qur Comment[be]=Канфігураваць функцыі спецыяльных магчымасцей Comment[bg]=Конфигуриране на функциите за достъпност Comment[ca]=Configureu les funcions d'accessibilitat Comment[ca@valencia]=Configura les funcions d'accessibilitat Comment[cs]=Nastavit funkce pro zpřístupnění hendikepovaným Comment[cy]=Ffurfweddu dewisiadau hygyrchedd Comment[da]=Konfigurér tilgængelighedsfunktioner Comment[de]=Barrierefreiheitsfunktionen konfigurieren Comment[el]=Προσαρμογή λειτουργιών προσβασιμότητας Comment[eo]=Agordi alireblecajn trajtojn Comment[es]=Configurar las funciones de accesibilidad Comment[es_AR]=Configurar las funciones de accesibilidad Comment[et]=Abivahendite seadistamine Comment[eu]=Konfiguratu erabilerraztasun ezaugarriak Comment[fa]=پیکربندی ویژگی‌های دسترسی Comment[fi]=Hallitse esteettömyysasetuksia Comment[fil]=I-configure ang accessibility features Comment[fr]=Configurer les fonctions d’accessibilité Comment[fr_CA]=Configurer les fonctions d’accessibilité Comment[he]=תיצור תכונות נגישות Comment[hi]=अभिगम्यता विन्यस्त करें Comment[hr]=Prilagodi značajke pristupaćnosti Comment[hu]=Akadálymentesítési szolgáltatások beállítása Comment[ia]=Configurar le characteristicas de accessibilitate Comment[id]=Konfigurasi fitur aksesibilitas Comment[is]=Stilla auðveldað aðgengi Comment[it]=Configura le caratteristiche di accessibilità Comment[ja]=ユーザー補助機能を設定します Comment[ka]=წვდომადობის თვისებების მორგება Comment[kab]=Aswalo n tmesɣent n tuffart Comment[ko]=편리한 기능 설정하기 Comment[la]=Pervietatis configurationem modifica Comment[lo]=ກຳຫນົດຄ່າຄຸນສົມບັດການຊ່ວຍເຫຼືອການເຂົ້າເຖິງ Comment[lt]=Konfigūruoti prieinamumo ypatybes Comment[lv]=Konfigurēt pieejamības funkcijas Comment[nap]=Configura 'e funzioni d'accessibilità Comment[nb]=Sett opp tilgjengelighetsfunksjoner Comment[nl]=Toegankelijkheidsfuncties instellen Comment[nn]=Set opp tilgjengefunksjonar Comment[oc]=Configurar las foncionalitats d’accessibilitat Comment[pl]=Konfiguruj funkcje ułatwienia dostępu Comment[pt]=Configurar funções de acessibilidade Comment[pt_BR]=Configurar recursos de acessibilidade Comment[ro]=Configurează caracteristicile de accesibilitate Comment[ru]=Настройка специальных возможностей Comment[rue]=Наладованя шпеціалных возможностюв Comment[sc]=Propiedades de atzessibilidade Comment[sk]=Nastavuje funkcie zjednodušenia ovládania Comment[sl]=Konfiguriraj dostopnostne funkcije Comment[sq]=Konfiguro veçoritë e aksesueshmërisë Comment[sr]=Подесите функције приступачности Comment[sr@ijekavian]=Подесите функције приступачности Comment[sr@ijekavianlatin]=Подесите функције приступачности Comment[sr@latin]=Podesi svojstva pristupačnosti Comment[sv]=Ställ in egenskaperna för tillgänglighet Comment[th]=ตั้งค่าคุณลักษณะการเข้าถึง Comment[tr]=Erişilebilirlik özelliklerini yapılandırın Comment[uk]=Налаштування спеціальних можливостей Comment[ur]=رسائی کے فیچر تشکیل دیں Comment[uz]=Qo‘shimcha imkoniyatlar xossalarini sozlash Comment[vi]=Thiết lập các chức năng truy cập Comment[zh_CN]=配置辅助功能 Comment[zh_HK]=設定無障礙存取功能 Comment[zh_TW]=調整無障礙輔助功能 Keywords=magnifier;talk;access;zoom;keys;contrast; Keywords[am]=ማጉያ : መነጋገሪያ : ፍቃድ : ማሳያ : ቁልፎች : ማነፃፅሪያ; Keywords[ar]=المكبر، التحدث، الوصول، التكبير، المفاتيح، التباين; Keywords[ast]=llente;falar;accesu;zoom;tecles;contraste; Keywords[ay]=jach'aptayir qhispillu;parlaña;mantañ atispawa;jisk'a/jach'aptaña;tiklanaka;juk'amp qhanstata;lupa;hablar;acceso;ampliación;teclas;contraste; Keywords[az]=böyüdücü;danışıq;giriş;böyütmə;çəlişki; Keywords[be]=лупа;казаць;доступ;zoom;ключы;кантраснасць; Keywords[bg]=лупа;говор;достъп;мащаб;клавиши;контраст; Keywords[bs]=povećalo;govor;pristup;zumiranje;kontrast; Keywords[ca]=lupa;veu;accés;zoom;tecles;contrast; Keywords[ca@valencia]=lupa;veu;accés;zoom;tecles;contrast; Keywords[cs]=lupa;mluvení;přístupnost;přiblížení;klávesy;kontrast; Keywords[cy]=chwyddwr;siarad;mynediad;chwyddo;allweddi;cyferbyniad; Keywords[da]=lup;tal;tilgængelighed;forstør;formindsk;taster;kontrast; Keywords[de]=Lupe;sprechen;Zugriff;Zoom;Vergrößern;Tasten;Kontrast; Keywords[el]=μεγεθυντής;συνομιλία;πρόσβαση;μεγέθυνση;πλήκτρα;αντίθεση; Keywords[eo]=pligrandigilo;paroli;atingi;zomo;klavoj;kontrasto; Keywords[es]=lupa;hablar;acceso;ampliación;teclas;contraste; Keywords[es_AR]=lupa;hablar;acceso;ampliación;teclas;contraste; Keywords[et]=luup;rääkimine;juurdepääs;suum;klahvid;kontrast; Keywords[eu]=lupa;hitz egin;sarbidea;zooma;teklak;kontrastea; Keywords[fa]=ذره‌بین، سخن، دسترسی، بزرگ‌نمایی، کلیدها، کنتراست; Keywords[fi]=suurennuslasi;puhe;pääsy;suurennus;näppäimet;kontrasti; Keywords[fr]=loupe;parole;accès;zoom;touches;contraste; Keywords[fr_CA]=loupe;parole;accès;zoom;touches;contraste; Keywords[fy]=fergrutglês;skilje;tagong;fergrutsje;kaaien;kontrast; Keywords[ga]=formhéadaitheoir;caint;rochtain;súmáil;eochracha;codarsnacht; Keywords[gd]=meudaichear;còmhradh;cothrom;sùm;iuchraichean;iomsgaradh;magnifier;talk;access;zoom;keys;contrast; Keywords[gl]=lupa;conversa;acceso;zoom;chaves;contraste; Keywords[he]=מגדלת;דיבור;גישה;מיקוד;מקשים;ניגודיות; Keywords[hi]=आवर्धक;वार्ता;अभिगम;आकार वर्धन;कुंजियाँ;कंट्रास्ट; Keywords[hr]=povećalo;govor;pristup;uvećanje;tipke;kontrast; Keywords[hu]=nagyító;csevegés;hozzáférés;nagyítás;kulcsok;kontraszt; Keywords[ia]=aggranditor;confabular;accesso;zoom;claves;contrasto; Keywords[id]=kaca pembesar;bicara;akses;zum;kunci;kontras; Keywords[is]=skjástækkun;tal;aðgengi;aðdráttur;lyklar;birtuskil; Keywords[it]=lente d'ingrandimento;parlato;accesso;zoom;chiavi;contrasto; Keywords[ja]=magnifier;talk;access;zoom;keys;contrast;拡大鏡;トーク;スピーチ;読み上げ;アクセス;アクセシビリティ;ズーム;拡大表示;キー;コントラスト; Keywords[kab]=tlinint;awal;adduf;zoom;tiqeffalin;tamarit; Keywords[ko]=돋보기;톡;연결;줌;키;대비; Keywords[lo]=magnifier;ເວົ້າ;ເຂົ້າເຖິງ;ຊູມ;keys;contrast; Keywords[lt]=vaizdo didinimas;įgarsinimas;kita prieiga;mygtukai;kontrastas; Keywords[lv]=palielinātājs;runāt;piekļuve;tālummaiņa;atslēgas;kontrasts; Keywords[ms]=pembesar;bual;capaian;zum;kekunci;beza jelas; Keywords[nap]=magnifier;talk;access;zoom;buttoni;contrasto; Keywords[nb]=forstørrelsesglass;snakk;tilgang;forstørr;nøkler;kontrast; Keywords[nds]=Lupe;sprechen;Zugang;Zoom;Tasten;Kontrast; Keywords[nl]=vergrootglas;spraak;toegang;vergrotingsfactor;toetsen;contrast; Keywords[nn]=lupe;tale;tilgang;zoom;tastar;kontrast; Keywords[oc]=lópia;paraula;accès;zoom;agrandiment;tòcas;contraste; Keywords[pa]=ਮੈਗਨੀਫਾਇਰ;ਟਾੱਕ;ਅੱਕਸੈੱਸ;ਜ਼ੂਮ;ਚਾਬੀਆਂ;ਕੋਂਟਰਾਸਟ; Keywords[pl]=lupa;rozmowy;dostęp;powiększenie;klucze;kontrast; Keywords[pt]=amplificador;fala;acesso;ampliação;teclas;contraste; Keywords[pt_BR]=lupa;fala;acesso;zoom;teclas;contraste; Keywords[ro]=lupă;conversație;acces;mărire;taste;contrast; Keywords[ru]=лупа;разговор;доступ;масштабирование;ключи;контрастность; Keywords[rue]=лупа;приказованя;приступ;зум;ключі;контраст; Keywords[sc]=lente de ismanniadura;faeddare;atzessu;zoom;tastos;cuntrastu; Keywords[sk]=lupa;hovorenie;prístup;priblíženie;kľúče;kontrast; Keywords[sl]=povečevalno steklo;govor;dostop;približanje;tipke;kontrast; Keywords[sq]=zmadhues;bisedë;qasje;zmadhim;taste;kontrast; Keywords[sr]=лупа;говор;приступ;увеличавање;дугмад;контраст; Keywords[sr@ijekavian]=лупа;говор;приступ;увеличавање;дугмад;контраст; Keywords[sr@ijekavianlatin]=лупа;говор;приступ;увеличавање;дугмад;контраст; Keywords[sr@latin]=lupa;govor;pristup;zumiranje;tasteri;kontrast; Keywords[sv]=förstorare;tal;åtkomst;zoom;nycklar;kontrast; Keywords[ta]=உருப்பெருக்கி;பேச்சு;அணுகல்;பெரிதாக்குதல்;விசைகள்;வேறுபாடு; Keywords[tg]=бузургнамо;гуфтугӯ;дастрасӣ;танзими андоза;калидҳо;контраст; Keywords[th]=แว่นขยาย;เครื่องอ่านออกเสียงข้อความ;การเข้าถึง;ย่อ/ขยาย;แป้น;ความสว่าง; Keywords[tr]=büyüteç;konuşma;erişim;büyütme;anahtarlar;kontrast; Keywords[uk]=збільшувач;розмова;доступ;масштабування;ключі;контрастність; Keywords[ur]=میگنی فائر، ٹاک(talk)، رسائی، زوم، کلیدیں، تناسب امتزاج(contrast); Keywords[uz]=lupa;suhbat;ruxsat berish;masshtabni o‘zgartirish;kalitlar;kontrast; Keywords[vi]=kính phóng đại;nói chuyện;truy cập;thu phóng;phím;tương phản; Keywords[zh_CN]=magnifier;talk;access;zoom;keys;contrast;放大;语音;访问;辅助;缩放;键;联系人; Keywords[zh_HK]=magnifier;talk;access;zoom;keys;contrast;放大鏡;聊天;存取;縮放;按鍵;對比度; Keywords[zh_TW]=放大鏡;聊天;存取;縮放;按鍵;對比; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-user.desktop0000664000175000017500000003120115167446463026010 0ustar fabiofabio[Desktop Entry] Icon=cs-user Exec=cinnamon-settings user Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Account details Name[am]=የ መግለጫ ዝርዝሮች Name[ar]=تفاصيل الحساب Name[ast]=Detalles de cuenta Name[ay]=Apnaqirin juk'amp yatiyawinaka Name[az]=Oturum ayrıntıları Name[be]=Дэталі ўліковага запісу Name[bg]=Данни за акаунта Name[br]=Munudoù ar gont Name[bs]=Detalji o računu Name[ca]=Detalls del compte Name[ca@valencia]=Detalls del compte Name[cs]=Podrobnosti o účtu Name[cy]=Manylion cyfrif Name[da]=Kontodetaljer Name[de]=Kontodetails Name[el]=Λεπτομέρειες λογαριασμού Name[eo]=Kontodetaloj Name[es]=Detalles de la cuenta Name[es_AR]=Detalles de la cuenta Name[et]=Konto üksikasjad Name[eu]=Kontuaren xehetasunak Name[fa]=جزئیات حساب Name[fi]=Tilin tiedot Name[fr]=Détails du compte Name[fr_CA]=Détails du compte Name[fy]=Akkount details Name[gd]=Mion-fhiosrachadh a' chunntais Name[gl]=Detalles da conta Name[he]=פרטי חשבון Name[hi]=उपयोक्ता विवरण Name[hr]=Pojedinosti računa Name[hu]=Fiók részletek Name[ia]=Detalios del conto Name[id]=Detail akun Name[is]=Nánar um notanda Name[it]=Dettagli dell'account Name[ja]=アカウントの詳細 Name[ka]=ანგარიშის დეტალები Name[kab]=Ifatusen n umiḍan Name[ko]=사용자 정보 Name[lo]=ລາຍລະອຽດບັນຊີ Name[lt]=Paskyros informacija Name[lv]=Konta informācija Name[ms]=Perincian akaun Name[nb]=Kontodetaljer Name[nds]=Konto - Einzelheiten Name[nl]=Accountdetails Name[nn]=Kontodetaljar Name[oc]=Informacions del compte Name[om]=Eenyummeessaa baldhaa Name[pa]=ਅਕਾਊਂਟ ਵੇਰਵਾ Name[pl]=Szczegóły konta Name[pt]=Detalhes da conta Name[pt_BR]=Detalhes da Conta Name[ro]=Detalii cont Name[ru]=Детали учётной записи Name[rue]=Детайлы акаунта Name[sc]=Detàllios de su contu Name[sk]=Podrobnosti o účte Name[sl]=Podrobnosti računa Name[sq]=Detajet e llogarisë Name[sr]=Детаљи о налогу Name[sr@ijekavian]=Детаљи о налогу Name[sr@ijekavianlatin]=Детаљи о налогу Name[sr@latin]=Detalji o nalogu Name[sv]=Kontodetaljer Name[ta]=கணக்கு விவரங்கள் Name[tg]=Тафсилоти ҳисоб Name[th]=รายละเอียดบัญชีผู้ใช้ Name[tr]=Hesap Ayrıntıları Name[uk]=Дані облікового запису Name[ur]=کھاتے کی تفصیلات دکھائیں Name[uz]=Akkaunt tavsilotlari Name[vi]=Chi tiết tài khoản Name[zh_CN]=帐户详情 Name[zh_HK]=帳號詳細資料 Name[zh_TW]=帳號詳細資訊 Comment=Change your user preferences and password Comment[am]=የ እርስዎን የመጠቀሚያ ምርጫዎች እና የመግቢያ ቃል መቀየሪያ Comment[ar]=تغيير تفضيلات المستخدم وكلمة المرور الخاصة بك Comment[ast]=Camuda les tos preferencies d'usuariu ya conseña Comment[ay]=Apnaqirin ajllitanakap ukhamarak jamasat aru mayjaptayaña Comment[az]=Öz işlədən üstünlükləriniz ilə keçid sözünüzü dəyişin Comment[be]=Змяніць налады карыстальніка і пароль Comment[bg]=Променете Вашите потребителски настройки и парола Comment[bs]=Promijeni korisničke postavke i šifru Comment[ca]=Canvieu les preferències i la contrasenya del vostre usuari Comment[ca@valencia]=Canvieu les vostres preferències d'usuari i la vostra contrasenya Comment[cs]=Změnit předvolby pro uživatele a heslo Comment[cy]=Newid eich dewisiadau defnyddiwr a chyfrinair Comment[da]=Ændr dine brugerindstillinger og din adgangskode Comment[de]=Kontoeinstellungen und Passwort ändern Comment[el]=Αλλάξτε τις προτιμήσεις χρήστη σας και τον κωδικό πρόσβασης Comment[eo]=Ŝanĝi viajn uzantajn preferojn kaj pasvorton Comment[es]=Cambiar las preferencias del usuario y su contraseña Comment[es_AR]=Cambiar las preferencias del usuario y su contraseña Comment[et]=Oma kasutajaeelistuste ja parooli muutmine Comment[eu]=Aldatu erabiltzailearen hobespenak eta pasahitza Comment[fa]=ترجیحات کاربر و گذرواژه خود را تغییر دهید Comment[fi]=Muuta käyttäjäasetuksiasi ja salasanaasi Comment[fil]=Palitan ang user preferences at password Comment[fr]=Changer vos préférences d’utilisateur et votre mot de passe Comment[fr_CA]=Changer vos préférences d’utilisateur et votre mot de passe Comment[gd]=Atharraich roghainnean a' chleachdaiche 's am facal-faire agad Comment[gl]=Cambia as preferencias e o contrasinal do usuario Comment[he]=שינוי העדפות משתמש וסיסמה Comment[hi]=उपयोक्ता सेटिंग्स व कूटशब्द बदलें Comment[hr]=Promijenite svoje osobitosti korisnika i lozinke Comment[hu]=Felhasználói beállítások és jelszavak módosítása Comment[ia]=Cambiar tu preferentias de usator e contrasigno Comment[id]=Ubah kata kunci dan preferensi Anda Comment[is]=Breyta notandastillingum þínum og lykilorði Comment[it]=Modifica preferenze utente e password Comment[ja]=個人設定とパスワードを変更します Comment[kab]=Snifel ismenyifen inek n useqdac akked wawal n uɛeddi Comment[ko]=사용자 설정과 비밀번호를 바꿉니다 Comment[lo]=ປ່ຽນການຕັ້ງຄ່າ ແລະ ລະຫັດຜ່ານຜູ້ໃຊ້ຂອງທ່ານ Comment[lt]=Keisti naudotojo nuostatas ir slaptažodį Comment[lv]=Mainiet savus lietotāja iestatījumus un paroli Comment[ms]=Tukar pilihan pengguna dan kata laluan Comment[nb]=Endre dine brukerinnstillinger og passord Comment[nds]=Ändern Sie Ihre Benutzereinstellungen und Passwort Comment[nl]=Verander uw gebruikersvoorkeuren en wachtwoord Comment[nn]=Endra brukarinnstillingar og passordet ditt Comment[oc]=Cambiar vòstras preferéncias utilizaire e vòstre senhal Comment[pl]=Zmień swoje preferencje użytkownika i hasło Comment[pt]=Alterar preferências e palavra-passe do utilizador Comment[pt_BR]=Mudar senha e preferências do usuário Comment[ro]=Schimbați preferințele pentru utilizator și parolă Comment[ru]=Изменить пользовательские настройки и пароль Comment[rue]=Перемінити хосновательські конфіґурації тай паролу Comment[sc]=Càmbia sas preferèntzias de usuàriu e sa paràula crae tuas Comment[sk]=Zmeniť vaše používateľské predvoľby a heslo Comment[sl]=Spremenite uporabniške možnosti in geslo Comment[sq]=Ndrysho parapëlqimet e përdoruesit dhe fjalëkalimin Comment[sr]=Промени поставке вашег налога и лозинку Comment[sr@ijekavian]=Промени поставке вашег налога и лозинку Comment[sr@ijekavianlatin]=Промени поставке вашег налога и лозинку Comment[sr@latin]=Promenite Vaše korisničke preferencije i lozinku Comment[sv]=Ändra dina användarinställnigar och lösenord Comment[tg]=Тағйир додани хусусиятҳо ва пароли корбар Comment[th]=เปลี่ยนการตั้งค่าผู้ใช้ขั้นสูงและรหัสผ่านของคุณ Comment[tr]=Kullanıcı tercihlerini ve parolasını değiştir Comment[uk]=Змінити ваші налаштування користувача та пароль Comment[ur]=اپنی ترجیحات یا پاسورڈ بدلیں Comment[uz]=Parametrlar va parolingizni o‘zgartiring Comment[vi]=Thay đổi tuỳ thích và mật khẩu người dùng của bạn Comment[zh_CN]=修改用户设置和密码 Comment[zh_HK]=變更你的使用者喜好設定與密碼 Comment[zh_TW]=變更您的使用者偏好設定與密碼 Keywords=user;account;information;details;password; Keywords[af]=gebruiker;rekening;informasie;besonderhede;wagwoord; Keywords[am]=ተጠቃሚ: መግለጫ: መረጃ: ዝርዝር: የ መግቢያ ቃል:; Keywords[ar]=المستخدم، الحساب، المعلومات، التفاصيل، كلمة السر; Keywords[ast]=usuariu;cuenta;información;detalles;conseña; Keywords[ay]=apnaqiri;apnaqirin yatiyawi;yatiyawi;juk'amp yatiyawi;jamasat aru;usuario;cuenta;información;detalles;contraseña; Keywords[be]=карыстальнік;уліковы запіс;інфармацыя;падрабязнасці;пароль; Keywords[bg]=потребител;акаунт;информация;детайли;парола; Keywords[br]=arveriad;kont;titouroù;munudoù;ger-tremen; Keywords[ca]=usuari;compte;informació;detalls;contrasenya; Keywords[ca@valencia]=usuari;compte;informació;detalls;contrasenya; Keywords[cs]=uživatel;účet;informace;podrobnosti;heslo; Keywords[cy]=defnyddiwr;cyfrif;gwybodaeth;manylion;cyfrinair; Keywords[da]=bruger;konto;information;detaljer;adgangskode;kodeord;password; Keywords[de]=Benutzer;Konto;Informationen;Details;Passwort;user;account; Keywords[el]=χρήστης;λογαριασμός;πληροφορίες;λεπτομέρειες;συνθηματικό; Keywords[eo]=uzanto;konto;informoj;detaloj;pasvorto; Keywords[es]=usuario;cuenta;información;detalles;contraseña; Keywords[es_AR]=usuario;cuenta;información;detalles;contraseña; Keywords[et]=kasutaja;konto;info;teave;üksikasjad;detailid;parool; Keywords[eu]=erabiltzailea;kontua;informazioa;xehetasunak;pasahitza; Keywords[fa]=کاربر، حساب، اطلاعات، جزئیات، گذرواژه; Keywords[fi]=käyttäjä;tili;tiedot;yksityiskohdat;salasana; Keywords[fil]=user;account;impormasyon;detalye;password; Keywords[fr]=utilisateur;compte;renseignements;information;détails;mot de passe; Keywords[fr_CA]=utilisateur;compte;renseignements;information;détails;mot de passe; Keywords[he]=משתמש;חשבון;מידע;פרטים;סיסמה;ser;account;information;details;password; Keywords[hi]=उपयोक्ता;अकाउंट;जानकारी;विवरण;कूटशब्द; Keywords[hr]=korisnik;račun;informacija;pojedinosti;lozinka; Keywords[hu]=felhasználó;fiók;információ;részletek;jelszó;user;account;information;details;password; Keywords[ia]=usator;conto;informationes;detalios;contrasigno; Keywords[id]=pengguna;akun;informasi;rincian;sandi; Keywords[is]=notandi;aðgangur;reikningur;notandaupplýsingar;nánar;lykilorð; Keywords[it]=utente;account;informazioni;dettagli;password; Keywords[ja]=user;account;information;details;password;ユーザー;アカウント;情報;詳細;パスワード; Keywords[kab]=aseqdac;amiḍan;talɣut;talqayt;awal uffir; Keywords[ko]=사용자;계정;정보;자세한 내용;비밀번호; Keywords[lo]=ຜູ້ໃຊ້;ບັນຊີ;ຂໍ້ມູນ;ລາຍລະອຽດ;ລະຫັດຜ່ານ; Keywords[lt]=naudotojas;paskyra;abonementas;informacija;išsamiau;slaptažodis; Keywords[lv]=lietotājs;konts;informācija;detaļas;parole; Keywords[nb]=bruker;konto;informasjon;detaljer;passord; Keywords[nl]=gebruiker;account;informatie;details;wachtwoord; Keywords[nn]=brukar;konto;informasjon;detaljar;passord; Keywords[oc]=utilizaire;compte;entresenha;informacion;detalh;senhal; Keywords[pl]=użytkownik;konto;informacja;szczegóły;hasło; Keywords[pt]=utilizador;conta;informação;detalhes;palavra-passe; Keywords[pt_BR]=usuário;conta;informação;detalhes;senha; Keywords[ro]=utilizator;cont;informații;detalii;parolă; Keywords[ru]=пользователь;учетная запись;информация;детали;пароль; Keywords[rue]=хосновач;акаунт;інфо;детайлы;парола; Keywords[sk]=používateľ;užívateľ;účet;informácie;informácia;podrobnosti;detaily;heslo; Keywords[sl]=uporabnik;račun;informacija;podrobnosti;geslo; Keywords[sq]=përdorues;llogari;informacion;detaje;fjalëkalim; Keywords[sr]=корисник;налог;информације;детаљи;лозинка; Keywords[sr@ijekavian]=корисник;налог;информације;детаљи;лозинка; Keywords[sr@ijekavianlatin]=корисник;налог;информације;детаљи;лозинка; Keywords[sr@latin]=korisnik;nalog;informacije;detalji;lozinka; Keywords[sv]=användaren;konto;information;detaljer;lösenord; Keywords[tr]=kullanıcı;hesap;bilgi;ayrıntı;parola; Keywords[uk]=користувач;обліківка;інформація;деталі;пароль; Keywords[uz]=foydalanuvchi;hisob;ma'lumot;tafsilotlar;parol; Keywords[vi]=người dùng;tài khoản;thông tin;chi tiết;mật khẩu; Keywords[zh_CN]=用户,帐户,信息,详情,密码; Keywords[zh_HK]=使用者;帳號;資訊;詳細資訊;密碼; Keywords[zh_TW]=使用者;帳號;資訊;詳細資訊;密碼; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-users.desktop0000664000175000017500000002437415167446463026210 0ustar fabiofabio[Desktop Entry] Exec=cinnamon-settings-users Icon=system-users Terminal=false Type=Application Categories=System;Settings; StartupNotify=false OnlyShowIn=X-Cinnamon; Keywords=Preferences;Settings; Name=Users and Groups Name[af]=Gebruikers en Groepe Name[am]=ተጠቃሚዎች እና ቡድኖች Name[ar]=المستخدمين والمجموعات Name[ast]=Usuarios y grupos Name[ay]=Apnaqirinakampi tamanakampi Name[az]=İşlədənlər, Birliklər Name[be]=Карыстальнікі і групы Name[bg]=Потребители и Групи Name[bn]=ব্যবহারকারীগণ এবং দলসমূহ Name[br]=Arveriaded ha strolladoù Name[bs]=Korisnici i grupe Name[ca]=Usuaris i grups Name[ca@valencia]=Usuaris i grups Name[cs]=Uživatelé a skupiny Name[cy]=Defnyddwyr a Grwpiau Name[da]=Brugere og grupper Name[de]=Benutzer und Gruppen Name[el]=Χρήστες και Ομάδες Name[eo]=Uzantoj kaj grupoj Name[es]=Usuarios y grupos Name[es_AR]=Usuarios y Grupos Name[et]=Kasutajad ja grupid Name[eu]=Erabiltzaileak eta taldeak Name[fa]=کاربران و گروه‌ها Name[fi]=Käyttäjät ja ryhmät Name[fil]=Ang mga gumagamit at mga Grupo Name[fr]=Utilisateurs et groupes Name[fr_CA]=Utilisateurs et groupes Name[fy]=Brûkers en Ploechen Name[gd]=Cleachdaichean agus buidhnean Name[gl]=Usuarios e grupos Name[he]=משתמשים וקבוצות Name[hi]=यूजर एवं ग्रुप Name[hr]=Korisnici i grupe Name[hsb]=Wužiwarjo a skupiny Name[hu]=Felhasználók és csoportok Name[hy]=Օգտվողներ և խմբեր Name[ia]=Usatores e gruppos Name[id]=Pengguna dan Grup Name[ie]=Usatores e gruppes Name[is]=Notendur og hópar Name[it]=Utenti e gruppi Name[ja]=ユーザーとグループ Name[ka]=მომხმარებლები და ჯგუფები Name[kab]=Iseqdacen d igrawen Name[kk]=Пайдаланушылар мен Топтар Name[km]=អ្នក​ប្រើ និង​ក្រុម Name[ko]=사용자와 그룹 Name[ku]=Bikarhêner û Kom Name[la]=Utentes atque Circuli Name[li]=Gebroekers en groepe Name[lo]=ຜູ້ໃຊ້ແລະກຸ່ມ Name[lt]=Naudotojai ir grupės Name[lv]=Lietotāji un grupas Name[mk]=Корисници и групи Name[mr]=वापरकर्ते व गट Name[ms]=Pengguna dan Kumpulan Name[nap]=Utenti e Grupp Name[nb]=Brukere og grupper Name[nds]=Benutzer und Gruppen Name[ne]=प्रयोगकर्ता र समूहहरु Name[nl]=Gebruikers en groepen Name[nn]=Brukara og grupper Name[oc]=Utilizaires e gropes Name[om]=Fayyadamtootaa fi gareewwan Name[pa]=ਯੂਜ਼ਰ ਅਤੇ ਗਰੁੱਪ Name[pl]=Użytkownicy i grupy Name[pt]=Utilizadores e grupos Name[pt_BR]=Usuários e Grupos Name[ro]=Utilizatori și grupuri Name[ru]=Пользователи и группы Name[rue]=Хосновачі тай ґрупы Name[sc]=Impitadores e grupos Name[si]=භාවිතා කරන්නන් සහ සමුහ Name[sk]=Používatelia a skupiny Name[sl]=Uporabniki in skupine Name[sq]=Përdoruesit dhe Grupet Name[sr]=Корисници и групе Name[sr@ijekavian]=Корисници и групе Name[sr@ijekavianlatin]=Корисници и групе Name[sr@latin]=Korisnici i grupe Name[sv]=Användare och grupper Name[ta]=பயனர்கள் மற்றும் குழுக்கள் Name[te]=వినియోగదారులు మరియు సమూహాలు Name[tg]=Корбарон ва гурӯҳҳо Name[th]=ผู้ใช้และกลุ่ม Name[tl]=Mga Gumagamit at Pangkat Name[tr]=Kullanıcılar ve Gruplar Name[ug]=ئىشلەتكۈچىلەر ۋە گۇرۇپپىلار Name[uk]=Користувачі та групи Name[ur]=صارفین اور گروہ Name[uz]=Foydalanuvchilar va guruhlar Name[vi]=Người dùng và Nhóm Name[zgh]=ⵉⵏⵙⵙⵎⵔⴰⵙ ⴷ ⵜⵔⵓⴱⴱⴰ Name[zh_CN]=用户和用户组 Name[zh_HK]=使用者與羣組 Name[zh_TW]=使用者與群組 Comment=Add or remove users and groups Comment[af]=Voeg of verwyder gebruikers en groepe Comment[am]=ተጠቃሚዎች እና ቡድኖች መጨመሪያ ወይንም ማስወገጃ Comment[ar]=أضِف أو أزِل المستخدمين والمجموعات Comment[ast]=Amiesta o desanicia usuarios y grupos Comment[ay]=Apnaqirinaka ukhamaraki tamanaka yapaña jan ukax chhaqtayaña Comment[az]=İşlədənləri, birlikləri artır ya da sil Comment[be]=Дадаць або выдаліць карыстальнікаў і групы Comment[bg]=Добавяне или премахване на потребители и групи Comment[bn]=ব্যবহারকারী এবং দল যোজন-বিয়োজন করুন Comment[br]=Ouzhpennañ pe zilemel arveriaded ha strolladoù Comment[bs]=Dodajte ili uklonite korisnike i grupe Comment[ca]=Afegiu o suprimiu usuaris i grups Comment[ca@valencia]=Afegiu o suprimiu usuaris i grups Comment[cs]=Přidat nebo odstranit uživatele a skupiny Comment[cy]=Ychwanegu neu dynnu defnyddwyr a grwpiau Comment[da]=Tilføj eller fjern brugere og grupper Comment[de]=Benutzer und Gruppen hinzufügen oder entfernen Comment[el]=Προσθήκη ή αφαίρεση χρηστών και ομάδων Comment[eo]=Aldoni aŭ forigi uzantojn kaj grupojn Comment[es]=Añadir o eliminar usuarios y grupos Comment[es_AR]=Agregar o quitar usuarios y grupos Comment[et]=Lisa või eemalda kasutajaid ja gruppe Comment[eu]=Gehitu edo ezabatu erabiltzaileak eta taldeak Comment[fa]=اضافه یا حذف کردن کاربران و گروه‌ها Comment[fi]=Lisää tai poista käyttäjiä ja ryhmiä Comment[fil]=Magdagdag o mag-alis ng mga user at mga pangkat Comment[fo]=Legg afturat ella tak burtur brúkarr og bólkar Comment[fr]=Ajouter ou supprimer des utilisateurs et des groupes Comment[fr_CA]=Ajouter ou supprimer des utilisateurs et des groupes Comment[fy]=Brûkers en ploechen taheakje of ferwiderje Comment[gd]=Cuir ris no thoir air falbh cleachdaichean is buidhnean Comment[gl]=Engada ou retire usuarios e grupos Comment[he]=הוספת או הסרת משתמשים וקבוצות Comment[hi]=यूजर एवं ग्रुप जोड़े अथवा हटायें Comment[hr]=Dodaj ili ukloni korisnike i grupe Comment[hsb]=Wužiwarjow a skupiny dodać abo wumazać Comment[hu]=Felhasználók és csoportok hozzáadása vagy eltávolítása Comment[hy]=Ավելացնել կամ ջնջել օգտվողներ և խմբեր Comment[ia]=Adder o remover usatores e gruppos Comment[id]=Tambahkan atau hapus pengguna dan grup Comment[is]=Bæta við eða fjarlægja notendur og hópa Comment[it]=Aggiunge o rimuove utenti e gruppi Comment[ja]=ユーザーおよびグループの追加と削除 Comment[ka]=მომხმარებლების და ჯგუფების დამატება ან ამოშლა Comment[kab]=Rnu neɣ kkes iseqdacen akked igrawen Comment[ko]=사용자와 그룹 추가 또는 제거 Comment[ku]=Bikarhêner û koman lê zêde bike an jî jê bibe Comment[la]=Utentes circulosque adde aut remove Comment[li]=Gebroekers en groepe toevoege of verwijdere Comment[lo]=ຕື່ມຫຼືລຶບຜູ້ໃຊ້ແລະກູ່ມ Comment[lt]=Pridėti ar šalinti naudotojus bei grupes Comment[lv]=Pievienot vai dzēst lietotājus un grupas Comment[mr]=वापरकर्ते व गट जोडा किंवा काढून टाका Comment[ms]=Tambah atau buang pengguna dan kumpulan Comment[nap]=Miett ati utenti e grupp Comment[nb]=Legg til eller fjern brukere og grupper Comment[nds]=Benutzer oder Gruppen hinzufügen bzw. löschen Comment[ne]=प्रयोगकर्ता र समुहहरुलाई जोड्नुस् वा हटाउनुहोस् Comment[nl]=Gebruikers en groepen toevoegen of verwijderen Comment[nn]=Legg til eller fjern brukara og grupper Comment[oc]=Apondre o suprimir d'utilizaires o de gropes Comment[om]=fayyadamtootaa fi gareewwan dabaluu fi haquu Comment[pa]=ਯੂਜ਼ਰ ਤੇ ਗਰੁੱਪ ਸ਼ਾਮਲ ਕਰੋ ਜਾਂ ਹਟਾਓ Comment[pl]=Dodawanie lub usuwanie użytkowników i grup Comment[pt]=Adicionar e remover utilizadores e grupos Comment[pt_BR]=Adicionar ou remover usuários e grupos Comment[ro]=Adăugă sau elimină utilizatori și grupuri Comment[ru]=Добавить или удалить пользователей и группы Comment[rue]=Придати вадь удалити хосновачув вадь ґрупы Comment[sc]=Agiunghe o boga impitadores e grupos Comment[si]=පරිශීලකයන් සහ සමුහ එක් කිරීම හෝ ඉවත් කිරීම Comment[sk]=Pridanie alebo odstránenie používateľov a skupín Comment[sl]=Dodajte ali odstranite uporabnike in skupine Comment[sq]=Shto ose hiq përdorues dhe grupe Comment[sr]=Додајте или уклоните кориснике и групе Comment[sr@ijekavian]=Додајте или уклоните кориснике и групе Comment[sr@ijekavianlatin]=Додајте или уклоните кориснике и групе Comment[sr@latin]=Dodaj ili ukloni korisnike i grupe Comment[sv]=Lägg till eller ta bort användare och grupper Comment[ta]=பயனர் மற்றும் குழுக்களை சேர் அல்லது நீக்கு Comment[te]=వినియోగదారులను మరియు సమూహాలను జతచేయుము లేదా తీసివేయుము Comment[tg]=Илова ё тоза кардани корбарон ва гурӯҳҳо Comment[th]=เพิ่มหรือลบผู้ใช้และกลุ่ม Comment[tl]=Magdagdag o magbawas ng mga user at pangkat Comment[tr]=Kullanıcı ve grup ekle ya da sil Comment[ug]=ئىشلەتكۈچى ۋە گۇرۇپپا قوش ياكى ئۆچۈر Comment[uk]=Додавання або вилучення записів користувачів і груп Comment[ur]=صارفین اور گروہ شامل کریں یا مٹائیں Comment[uz]=Foydalanuvchilar va guruhlarni qo‘shish yoki olib tashlash Comment[vi]=Thêm hay loại bỏ người dùng và nhóm Comment[zgh]=ⵔⵏⵓ ⵏⵖ ⵙⵉⵜⵜⵢ ⵉⵏⵙⵙⵎⵔⴰⵙ ⴷ ⵜⵔⵓⴱⴱⴰ Comment[zh_CN]=添加或删除用户和组 Comment[zh_HK]=新增或移除使用者與羣組 Comment[zh_TW]=加入或移除使用者與群組 cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-windows.desktop0000664000175000017500000001730715167446463026537 0ustar fabiofabio[Desktop Entry] Icon=cs-windows Exec=cinnamon-settings windows Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Windows Name[af]=Vensters Name[am]=መስኮቶች Name[ar]=النوافذ Name[ast]=Ventanes Name[ay]=Wintananaka Name[az]=Pəncərələr Name[be]=Вокны Name[bg]=Прозорци Name[br]=Prinistri Name[bs]=Prozori Name[ca]=Finestres Name[ca@valencia]=Finestres Name[cs]=Okna Name[cy]=Ffenestri Name[da]=Vinduer Name[de]=Fenster Name[el]=Παράθυρα Name[eo]=Fenestroj Name[es]=Ventanas Name[es_AR]=Ventanas Name[et]=Aknad Name[eu]=Leihoak Name[fa]=پنجره ها Name[fi]=Ikkunat Name[fr]=Fenêtres Name[fr_CA]=Fenêtres Name[ga]=Fuinneoga Name[gd]=Uinneagan Name[gl]=Xanelas Name[he]=חלונות Name[hi]=विंडो Name[hr]=Prozori Name[hu]=Ablakok Name[ia]=Fenestras Name[id]=Jendela Name[ie]=Fenestres Name[is]=Gluggar Name[it]=Finestre Name[ja]=ウィンドウ Name[kab]=Isfuyla Name[ko]=창 Name[ku]=Pencere(Windows) Name[la]=Fenestrae Name[lo]=ໜ້າຕ່າງ Name[lt]=Langai Name[lv]=Logi Name[mo]=Ферестре Name[ms]=Tetingkap Name[nb]=Vinduer Name[nds]=Fenster Name[nl]=Vensters Name[nn]=Vindauge Name[oc]=Fenèstras Name[om]=Foddaalee Name[pa]=ਵਿੰਡੋਜ਼ Name[pl]=Okna Name[pt]=Janelas Name[pt_BR]=Janelas Name[ro]=Ferestre Name[ru]=Окна Name[rue]=Оболока Name[sc]=Bentanas Name[sk]=Okná Name[sl]=Okna Name[sq]=Dritaret Name[sr]=Прозори Name[sr@ijekavian]=Прозори Name[sr@ijekavianlatin]=Прозори Name[sr@latin]=Prozori Name[sv]=Fönster Name[ta]=சாளரங்கள் Name[th]=หน้าต่าง Name[tr]=Pencereler Name[uk]=Вікна Name[ur]=ونڈوز Name[vi]=Cửa sổ Name[zh_CN]=窗口 Name[zh_HK]=視窗 Name[zh_TW]=視窗 Comment=Manage window preferences Comment[am]=የመስኮት ምርጫዎች አስተዳዳሪ Comment[ar]=إدارة تفضيلات النافذة Comment[ast]=Xestionar axustes de ventana Comment[ay]=Wintananakan ajllitanakap irpaña Comment[az]=Pəncərə üstünlüklərini yönəlt Comment[be]=Кіраванне наладамі вокнаў Comment[bg]=Управление настройките на прозорците Comment[br]=Merañ arventennoù ar prenestr Comment[bs]=Upravljaj postavkama prozora Comment[ca]=Gestioneu les preferències de les finestres Comment[ca@valencia]=Gestioneu les preferències de les finestres Comment[cs]=Změnit nastavení chování oken Comment[cy]=Rheoli dewisiadau ffenestr Comment[da]=Administrér vinduesindstillinger Comment[de]=Fenstereinstellungen verwalten Comment[el]=Ρυθμίστε τις επιλογές παραθύρων Comment[eo]=Administri fenestrajn agordojn Comment[es]=Gestionar las preferencias de las ventanas Comment[es_AR]=Gestionar las preferencias de las ventanas Comment[et]=Akna eelistuste haldamine Comment[eu]=Kudeatu leiho-hobespenak Comment[fa]=مدیریت ترجیحات پنجره Comment[fi]=Muokkaa ikkunoiden asetuksia Comment[fil]=I-manage ang window preferences Comment[fr]=Gérer les préférences des fenêtres Comment[fr_CA]=Gérer les préférences des fenêtres Comment[gd]=Stiùirich roghainnean nan uinneagan Comment[gl]=Administra as preferencias da xanela Comment[he]=ניהול העדפות חלון Comment[hi]=विंडो सेटिंग्स प्रबंधन Comment[hr]=Upravljajte osobitostima prozora Comment[hu]=Ablak beállítások kezelése Comment[ia]=Gerer le preferentias de fenestra Comment[id]=Mengelola preferensi jendela Comment[is]=Sýsla með kjörstillingar glugga Comment[it]=Gestisci preferenze finesta Comment[ja]=ウィンドウの設定を管理 Comment[kab]=Sefrek ismenyifen n usfaylu Comment[ko]=창 설정을 관리합니다 Comment[la]=Praepositiones fenestrae cura Comment[lo]=ຈັດການການຕັ້ງຄ່າໜ້າຕ່າງ Comment[lt]=Tvarkyti lango nuostatas Comment[lv]=Pārvaldīt logu iestatījumus Comment[ms]=Mengurus pilihan tetingkap Comment[nb]=Håndter vindusinnstillinger Comment[nds]=Fenster-Einstellungen bearbeiten Comment[nl]=Venstervoorkeuren beheren Comment[nn]=Handter vindaugsinnstillingar Comment[oc]=Gerir las preferéncias de las fenèstras Comment[pl]=Zarządzaj preferencjami okien Comment[pt]=Gerir preferências de janelas Comment[pt_BR]=Gerenciar preferências de janelas Comment[ro]=Gestionează preferințele ferestrelor Comment[ru]=Управление настройками окон Comment[rue]=Справованя конфіґураціями оболокув Comment[sc]=Manìgia sas preferèntzias de bentanas Comment[sk]=Spravuje predvoľby okien Comment[sl]=Upravljajte z možnostmi oken Comment[sq]=Menaxhoni parapëlqimet e dritares Comment[sr]=Управљање поставкама прозора Comment[sr@ijekavian]=Управљање поставкама прозора Comment[sr@ijekavianlatin]=Управљање поставкама прозора Comment[sr@latin]=Upravljanje preferencijama za prozore Comment[sv]=Hantera fönsterinställningar Comment[tg]=Идоракунии хусусиятҳои равзана Comment[th]=จัดการค่าปรับแต่งหน้าต่าง Comment[tr]=Pencere tercihlerini yönet Comment[uk]=Керувати параметрами вікон Comment[ur]=ونڈو کی ترجیحات Comment[uz]=Oyna parametrlarini boshqarish Comment[vi]=Quản lý tuỳ thích cửa sổ Comment[zh_CN]=管理窗口样式 Comment[zh_HK]=管理視窗喜好設定 Comment[zh_TW]=管理視窗偏好設定 Keywords=windows;titlebar;edge;switcher;window list;attention;focus;tile;tiling;snap;snapping; Keywords[ca]=finestres;barra de títol;vora;commutador;llista de finestres;atenció;focus;mosaic;organització; Keywords[ca@valencia]=finestres;barra de títol;vora;commutador;llista de finestres;atenció;focus;mosaic;organització; Keywords[da]=vinduer;titellinje;kant;skifter;vinduesliste;opmærksomhed;fokus;flise;fliselægning;side om side;ret ind; Keywords[de]=windows;titlebar;edge;switcher;window list;attention;focus;tile;snap;Fenster;Titelleiste;Rand;Umschalter;Fensterliste;Aufmerksamkeit;Fokus;Kachel;Andocken;Anheften; Keywords[eo]=fenestroj;titola breto;rando;ŝanĝilo;fenestrolisto;atento;fokuso;kaheligi;kaheligo;kapti;kaptado; Keywords[es]=ventanas;barra de título;borde;conmutador;lista de ventanas;atención;foco;mosaico;organización;ajuste;encaje;acople; Keywords[es_AR]=ventanas;barra de título;borde;conmutador;lista de ventanas;atención;foco;mosaico;organización;ajuste;encaje;acople; Keywords[fi]=ikkunat;otsikkopalkki;reuna;vaihtaja;luettelo;huomio;tarkennus;laatta;laatoitus;painallus;napsautus; Keywords[fr]=fenêtres;barre de titre;bord;sélecteur;liste des fenêtres;attention;focus;juxtaposition;ancrage; Keywords[fr_CA]=fenêtres;barre de titre;bord;sélecteur;liste des fenêtres;attention;focus;juxtaposition;ancrage; Keywords[it]=finestre;barra del titolo;bordi;selettore;elenco finestre;attenzione;focus;tile;tiling;snap;snapping; Keywords[ja]=windows;titlebar;edge;switcher;window list;attention;focus;tile;tiling;snap;snapping;ウィンドウ;タイトルバー;エッジ;縁;端;スイッチャー;切り替え;ウィンドウリスト;注意;フォーカス;タイル;タイル配置;スナップ;スナップ操作; Keywords[ko]=창;제목 줄;엣지;전환기;창 목록;주의;초점;타일;타일링;스냅;스내핑; Keywords[lv]=logi;virsrakstjosla;mala;pārslēdzējs;logu saraksts;uzmanība;fokuss;flīze;flīzēšana;piespraušana; Keywords[nl]=vensters;titelbalk;rand;wisselaar;vensterlijst;aandacht;scherpstelling;tegel;tegelen;snap;snapping; Keywords[oc]=fenèstras;barra de títol;bòrd;cambiador;commutador;lista de fenèstras;atencion;fòcus;mosaïc;organizacion; Keywords[pl]=okna;pasek tytułu;krawędź;przełącznik;lista okien;uwaga;fokus;kafelki;kafelkowanie;przyciągnij;przyciąganie; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings-workspaces.desktop0000664000175000017500000002655715167446463027235 0ustar fabiofabio[Desktop Entry] Icon=cs-workspaces Exec=cinnamon-settings workspaces Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Workspaces Name[af]=Werkspasies Name[am]=የ ስራ ቦታዎች Name[ar]=مساحات العمل Name[ast]=Estayes de trabayu Name[ay]=Kawkhanakanti irnaqasi Name[az]=İş Sahələri Name[be]=Працоўныя прасторы Name[bg]=Работни места Name[br]=Tachennoù-labour Name[bs]=Radne površine Name[ca]=Espais de treball Name[ca@valencia]=Espais de treball Name[cs]=Pracovní plochy Name[cy]=Mannau Gwaith Name[da]=Arbejdsområder Name[de]=Arbeitsflächen Name[el]=Χώροι Εργασίας Name[eo]=Laborspacoj Name[es]=Áreas de trabajo Name[es_AR]=Áreas de trabajo Name[et]=Tööalad Name[eu]=Laneko areak Name[fa]=فضاهای کاری Name[fi]=Työtilat Name[fr]=Espaces de travail Name[fr_CA]=Espaces de travail Name[ga]=Spásanna Oibre Name[gd]=Rumannan-obrach Name[gl]=Espazos de traballo Name[he]=מרחבי עבודה Name[hi]=कार्यस्थल Name[hr]=Radni prostori Name[hu]=Munkaterületek Name[ia]=Spatios de labor Name[id]=Area kerja Name[ie]=Labor-spacies Name[is]=Vinnusvæði Name[it]=Aree di lavoro Name[ja]=ワークスペース Name[ka]=სამუშაო სივრცეები Name[kab]=Tallunin n umahil Name[ko]=작업 공간 Name[ku]=Kargeh Name[la]=Areae Laboris Name[lo]=ພື້ນທີ່ເຮັດວຽກ Name[lt]=Darbo sritys Name[lv]=Darbvietas Name[mo]=Медий де лукру Name[ms]=Ruang Kerja Name[nb]=Arbeidsområder Name[nds]=Arbeitsflächen Name[nl]=Werkbladen Name[nn]=Arbeidsområde Name[oc]=Espacis de trabalh Name[om]=Iddoowwan hojii Name[pa]=ਵਰਕਸਪੇਸਾਂ Name[pl]=Obszary robocze Name[pt]=Áreas de trabalho Name[pt_BR]=Espaços de Trabalho Name[ro]=Birouri Name[ru]=Рабочие области Name[rue]=Роботні Name[sc]=Àreas de traballu Name[sk]=Pracovné priestory Name[sl]=Delovni prostor Name[sq]=Hapësirat e punës Name[sr]=Радни простори Name[sr@ijekavian]=Радни простори Name[sr@ijekavianlatin]=Радни простори Name[sr@latin]=Radni prostori Name[sv]=Arbetsytor Name[ta]=பணியிடங்கள் Name[tg]=Фазоҳои корӣ Name[th]=พื้นที่ทำงาน Name[tr]=Çalışma Alanları Name[uk]=Робочі простори Name[ur]=ورک سپیسز Name[uz]=Ish joylari Name[vi]=Vùng làm việc Name[zh_CN]=工作区 Name[zh_HK]=工作區 Name[zh_TW]=工作區 Comment=Manage workspace preferences Comment[am]=የ ስራ ቦታ ምርጫዎች አስተዳዳሪ Comment[ar]=إدارة تفضيلات مساحة العمل Comment[ast]=Xestionar axustes del espaciu de trabayu Comment[ay]=Kawkhanti irnaqasi ajlliñanak irpaña Comment[az]=İş sahəsi seçimlərini idarə et Comment[be]=Кіраваць наладамі працоўных прастор Comment[bg]=Управление на настройките за работни плотове Comment[br]=Merañ gwellvezioù an holl dachennoù-labour Comment[bs]=Upravljaj postavkama radne površine Comment[ca]=Gestioneu les preferències dels espais de treball Comment[ca@valencia]=Gestioneu les preferències dels espais de treball Comment[cs]=Spravovat nastavení pracovních ploch Comment[cy]=Rheoli dewisiadau mannau gwaith Comment[da]=Administrér arbejdsområdeindstillinger Comment[de]=Arbeitsflächeneinstellungen verwalten Comment[el]=Ρυθμίστε τους χώρους εργασίας Comment[eo]=Administri laborspacajn agordojn Comment[es]=Gestionar las preferencias de las áreas de trabajo Comment[es_AR]=Gestionar las preferencias de las áreas de trabajo Comment[et]=Tööala eelistuste haldamine Comment[eu]=Kudeatu laneko areen hobespenak Comment[fa]=مدیریت ترجیحات فضای کاری Comment[fi]=Hallitse työtilojen asetuksia Comment[fil]=I-manage ang workspace preferences Comment[fr]=Gérer les préférences des espaces de travail Comment[fr_CA]=Gérer les préférences des espaces de travail Comment[gd]=Stiùirich roghainnean nan rumannan-obrach Comment[gl]=Administra as preferencias do espazo de traballo Comment[he]=ניהול העדפות מרחבי עבודה Comment[hi]=कार्यस्थल सेटिंग्स प्रबंधन Comment[hr]=Upravljajte osobitostima radnog prostora Comment[hu]=Munkaterület beállítások kezelése Comment[ia]=Gerer le preferentias del spatio de labor Comment[id]=Kelola preferensi ruang kerja Comment[is]=Sýsla með kjörstillingar vinnusvæða Comment[it]=Gestisci le preferenze delle aree di lavoro Comment[ja]=ワークスペースの設定を管理 Comment[kab]=Sefrek ismenyifen n tallunt n umahil Comment[ko]=작업 공간 설정 관리 Comment[la]=Praepositiones arearum laboris cura Comment[lo]=ຈັດການການຕັ້ງຄ່າພື້ນທີ່ເຮັດວຽກ Comment[lt]=Tvarkyti darbo srities nuostatas Comment[lv]=Pārvaldīt darbvietas preferences Comment[ms]=Mengurus pilihan ruang kerja Comment[nb]=Håndter innstillinger for arbeidsområdene Comment[nds]=Arbeitsflächeneinstellungen verwalten Comment[nl]=Werkbladvoorkeuren beheren Comment[nn]=Handter arbeidsområdeinnstillingar Comment[oc]=Gerir las preferéncias de l'espaci de trabalh Comment[pl]=Zarządzaj preferencjami obszarów roboczych Comment[pt]=Gerir preferências da área de trabalho Comment[pt_BR]=Gerenciar preferências de espaço de trabalho Comment[ro]=Gestionează preferințele biroului Comment[ru]=Настройки рабочих областей Comment[rue]=Справованя конфіґурації роботні Comment[sc]=Manìgia preferèntzias de s'àrea de traballu Comment[sk]=Spravuje predvoľby pracovných priestorov Comment[sl]=Upravljanje z možnostmi delovnih površin Comment[sq]=Menaxho parapëlqimet e hapësirave të punës Comment[sr]=Управљање поставкама радног простора Comment[sr@ijekavian]=Управљање поставкама радног простора Comment[sr@ijekavianlatin]=Управљање поставкама радног простора Comment[sr@latin]=Upravljanje preferencijama radnog prostora Comment[sv]=Hantera inställningar för arbetsyta Comment[tg]=Идоракунии хусусиятҳои фазои корӣ Comment[th]=จัดการค่าปรับแต่งพื้นที่ทำงาน Comment[tr]=Çalışma alanı seçeneklerini yönet Comment[uk]=Керувати параметрами робочого простору Comment[ur]=ورک سپیس کی ترجیحات Comment[uz]=Ish joyi parametrlarini boshqarish Comment[vi]=Quản lý tuỳ thích vùng làm việc Comment[zh_CN]=工作区设置 Comment[zh_HK]=管理工作區喜好設定 Comment[zh_TW]=管理工作區偏好設定 Keywords=workspace;osd;expo;monitor; Keywords[am]=የ ስራ ቦታ: osd;expo;መመልከቻ; Keywords[ar]=مساحة العمل، العرض على الشاشة، Expo، شاشة العرض; Keywords[ast]=espaciu de trabayu;osd;expo;pantalla; Keywords[ay]=kawkhanti irnaqasi;pantallan uñjaskis;uñachawi;munitura (monitor); Keywords[az]=İş sahəsi;osd;ekspo;monitor; Keywords[be]=працоўная прастора;экспазіцыя;манітор; Keywords[bg]=работно място;osd;експозиция;монитор; Keywords[bs]=radna površina;osd;expo;monitor; Keywords[ca]=espai de treball;osd;expo;monitor; Keywords[ca@valencia]=espai de treball;osd;expo;monitor; Keywords[cs]=pracovní plocha;osd;přehled;monitor; Keywords[cy]=man gwaith;osd;expo;monitor; Keywords[da]=arbejdsområde;osd;vis arbejdsområder;skærm; Keywords[de]=Arbeitsfläche;OSD;Bildschirmanzeige;Schreibtischübersicht;Arbeitsflächenübersicht;Expo;Monitor; Keywords[el]=χώρος εργασίας;osd;expo;οθόνη; Keywords[eo]=laborspaco;montri laborspacan nomon;ekspo;ekrano; Keywords[es]=área de trabajo;visualización en pantalla;exposición;monitor; Keywords[es_AR]=área de trabajo;visualización en pantalla;exposición;monitor; Keywords[et]=tööala;osd;expo;kuvar; Keywords[eu]=laneko area;osd;expo;monitorea; Keywords[fa]=فضای کاری، osd، expo، نمایشگر; Keywords[fi]=työtila;osd;esittelynäkymä;näyttö; Keywords[fr]=espace de travail;osd;affichage à l’écran;expo;moniteur;écran; Keywords[fr_CA]=espace de travail;osd;affichage à l’écran;expo;moniteur;écran; Keywords[ga]=spás oibre;osd;expo;monatóir; Keywords[gd]=rum-obrach;osd;expo;sealladair;workspace;monatair; Keywords[gl]=espazo de traballo;osd;exposición;monitor; Keywords[he]=מרחב עבודה;osd;אקספו;צג; Keywords[hi]=कार्यस्थल;ऑनस्क्रीन डिस्प्ले;एक्सपो;मॉनिटर; Keywords[hr]=radni prostor;osd;prikaz radnih prostora;zaslon računala; Keywords[hu]=munkaterület;képernyőkijelzés;osd;közszemle;képernyő; Keywords[ia]=spatio de labor;osd;expo;monitor; Keywords[id]=ruang kerja;osd;expo;monitor; Keywords[is]=vinnusvæði;stjórntexti;expo;skjár; Keywords[it]=area di lavoro;osd;expo;monitor; Keywords[ja]=workspace;osd;expo;monitor;ワークスペース;画面表示;エキスポ;エクスポ;モニター; Keywords[kab]=tallunt n umahil;osd;expo;agdil; Keywords[ko]=작업 공간;osd;작업 공간 보기;살펴보기; Keywords[lo]=ພື້ນທີ່ເຮັດວຽກ;osd;expo;ຈໍ; Keywords[lv]=darbvieta;OSD;expo;monitors; Keywords[ms]=ruang kerja;osd;expo;monitor; Keywords[nb]=arbeidsområde;osd;expo;skjerm; Keywords[nds]=Arbeitsbereich;OSD;Expo;Monitor; Keywords[nl]=werkblad;osd;expo;beeldscherm; Keywords[nn]=arbeidsområde;osd;expo;skjerm; Keywords[oc]=espaci de trabalh;osd;afichatge a l’ecran;expo;monitor;ecran; Keywords[om]=iddoo hojii;osd;***;torgii; Keywords[pl]=Obszar roboczy;OSD;expo;monitor; Keywords[pt]=área de trabalho;osd;expo;monitor; Keywords[pt_BR]=espaço de trabalho;notificações na tela;modo expo;monitor; Keywords[ro]=birou;osd;expo;monitor; Keywords[ru]=рабочая область;экранная индикация;expo;монитор; Keywords[rue]=роботня;osd;expo;монітор; Keywords[sc]=àrea de traballu;osd;expo;ischermu; Keywords[sk]=pracovný priestor;osd;expo;monitor; Keywords[sl]=delovni prostor;osd;razstava;monitor; Keywords[sq]=hapësirë ​​pune;osd;ekspozitë;monitor; Keywords[sr]=радни простор;простирање;осд;екран; Keywords[sr@ijekavian]=радни простор;простирање;осд;екран; Keywords[sr@ijekavianlatin]=радни простор;простирање;осд;екран; Keywords[sr@latin]=radni prostor;prikaz na ekranu (OSD);pregled radnih prostora;monitor; Keywords[sv]=arbetsyta;OSD;exponering;monitor; Keywords[ta]=பணியிடம்;மேல் திரை காட்சி;கண்காட்சி;திரையகம்; Keywords[tg]=фазои корӣ;osd;намоиш;монитор; Keywords[th]=พื้นที่ทำงาน;osd;expo;หน้าจอ; Keywords[tr]=çalışma alanı;osd;sergi;ekran; Keywords[uk]=робочий простір;екранне сповіщення;експозиція;монітор; Keywords[ur]=ورک سپیس، آن-سکرین ڈسپلے، OSD، ایکسپو، expo، مانیٹر; Keywords[uz]=ish joyi;osd;ekspo;monitor; Keywords[vi]=vùng làm việc;osd;expo;màn hình; Keywords[zh_CN]=workspace;osd;expo;monitor;工作区;屏幕显示;显示器;展现; Keywords[zh_HK]=工作區;OSD;expo;顯示器; Keywords[zh_TW]=工作區;螢幕顯示 (OSD);工作區管理 (Expo);顯示器; cinnamon-6.6.8/files/usr/share/applications/cinnamon-settings.desktop0000664000175000017500000001667515167446463025056 0ustar fabiofabio[Desktop Entry] Exec=env WEBKIT_DISABLE_COMPOSITING_MODE=1 cinnamon-settings Icon=preferences-desktop Terminal=false Type=Application Categories=Settings; StartupNotify=false OnlyShowIn=X-Cinnamon; Keywords=Preferences;Settings; Name=System Settings Name[af]=Stelsel instellings Name[am]=ስርአት ማሰናጃ Name[ar]=إعدادات النظام Name[ast]=Axustes del sistema Name[ay]=Sistema ukat mayjachawi Name[az]=Qurmaca Quruluşları Name[be]=Сістэмныя налады Name[bg]=Системни настройки Name[bn]=সিস্টেমের সেটিং Name[br]=Arventennoù ar reizhiad Name[bs]=Sistemske postavke Name[ca]=Ajusts del sistema Name[ca@valencia]=Ajusts del sistema Name[cs]=Nastavení systému Name[cy]=Gosodiadau'r System Name[da]=Systemindstillinger Name[de]=Systemeinstellungen Name[el]=Ρυθμίσεις Συστήματος Name[eo]=Sistemaj agordoj Name[es]=Configuración del sistema Name[es_AR]=Configuración del sistema Name[et]=Süsteemi seaded Name[eu]=Sistemaren ezarpenak Name[fa]=تنظیمات سیستم Name[fi]=Asetukset Name[fil]=Mga Setting ng System Name[fr]=Paramètres du système Name[fr_CA]=Paramètres du système Name[fy]=Systeem ynstellingen Name[ga]=Socruithe Córais Name[gd]=Roghainnean an t-siostaim Name[gl]=Axustes do sistema Name[he]=הגדרות מערכת Name[hi]=सिस्टम सेटिंग्स Name[hr]=Postavke sustava Name[hsb]=Nastajenja systema Name[hu]=Rendszerbeállítások Name[hy]=Համակարգի կարգավորումները Name[ia]=Configurationes del systema Name[id]=Pengaturan Sistem Name[ie]=Parametres del sistema Name[is]=Kerfisstillingar Name[it]=Impostazioni di sistema Name[ja]=システムの設定 Name[jv]=seting sistem Name[ka]=სისტემის პარამეტრები Name[kab]=Iɣewwaṛen n unagraw Name[kk]=Жүйе баптаулары Name[km]=ការ​កំណត់​ប្រព័ន្ធ Name[kn]=ವ್ಯವಸ್ಥೆಯ ಸಂಯೋಜನೆಗಳು Name[ko]=시스템 설정 Name[ku]=Mîhengên pergalê Name[la]=Configuratio Systematis Name[li]=Systeeminsjtellinge Name[lo]=ການຕັ້ງຄ່າລະບົບ Name[lt]=Sistemos nustatymai Name[lv]=Sistēmas iestatījumi Name[mai]=सिस्टम सेटिंग Name[mk]=Подесувања во системот Name[mr]=सिस्टम सेटिंग्स् Name[ms]=Tetapan Sistem Name[my]=စနစ် ကနောက်ခံ Name[nap]=Settaggi d''o Sistema Name[nb]=Systeminnstillinger Name[nds]=Systemeinstellungen Name[ne]=प्रणाली सेटिङ Name[nl]=Systeeminstellingen Name[nn]=Systeminnstillingar Name[oc]=Paramètres del sistèma Name[om]=Qindaainoota sirnaa Name[pa]=ਸਿਸਟਮ ਸੈਟਿੰਗ Name[pl]=Ustawienia systemowe Name[pt]=Definições do sistema Name[pt_BR]=Configurações do sistema Name[ro]=Setări sistem Name[ru]=Параметры системы Name[rue]=Сістемні штімованя Name[sc]=Cunfiguratziones de sistema Name[si]=පද්ධති සැකසුම් Name[sk]=Systémové nastavenia Name[sl]=Sistemske nastavitve Name[sq]=Parametrat e sistemit Name[sr]=Поставке система Name[sr@ijekavian]=Поставке система Name[sr@ijekavianlatin]=Поставке система Name[sr@latin]=Sistemska podešavanja Name[sv]=Systeminställningar Name[ta]=கணினி அமைப்புகள் Name[te]=సిస్టమ్ అమర్పులు Name[tg]=Танзимоти низом Name[th]=ค่าตั้งระบบ Name[tl]=Mga Settings ukol sa Sistema Name[tr]=Sistem Ayarları Name[ug]=سىستېما تەڭشىكى Name[uk]=Системні налаштування Name[ur]=سسٹم کی ترتیبات Name[uz]=Tizim sozlamalari Name[vi]=Cài đặt Hệ thống Name[zgh]=ⵜⵉⵙⵖⴰⵍ ⵏ ⵓⵏⴳⵔⴰⵡ Name[zh_CN]=系统设置 Name[zh_HK]=系統設定 Name[zh_TW]=系統設定 Comment=Control Center Comment[af]=Kontrole sentrum Comment[am]=መቆጣጠሪያ ማእከል Comment[ar]=مركز التحكم Comment[ast]=Centru de control Comment[ay]=Iñasir taypi Comment[az]=Yönətmə Ortası Comment[be]=Цэнтр кіравання Comment[bg]=Контролен център Comment[bn]=নিয়ন্ত্রণ কেন্দ্র Comment[br]=Kreizenn reoliñ Comment[bs]=Upravljački centar Comment[ca]=Centre de control Comment[ca@valencia]=Centre de control Comment[cs]=Ovládací panely Comment[cy]=Canolfan Rheoli Comment[da]=Kontrolcenter Comment[de]=Steuerzentrale Comment[el]=Κέντρο Ελέγχου Comment[en_CA]=Control Centre Comment[en_GB]=Control Centre Comment[eo]=Stircentro Comment[es]=Centro de control Comment[es_AR]=Centro de control Comment[et]=Juhtimiskeskus Comment[eu]=Kontrolgunea Comment[fa]=مرکز کنترل Comment[fi]=Ohjauskeskus Comment[fil]=Kontrol Senter Comment[fo]=Stýris-miðdepil Comment[fr]=Centre de contrôle Comment[fr_CA]=Centre de contrôle Comment[fy]=Behear Sintrum Comment[ga]=Lárionad Rialaithe Comment[gd]=An t-ionad smachd Comment[gl]=Centro de control Comment[he]=מרכז הבקרה Comment[hi]=कन्ट्रोल सेन्टर Comment[hr]=Upravljačko središte Comment[hsb]=Rjadowanišćo Comment[hu]=Vezérlőpult Comment[hy]=Կառավարման կենտրոն Comment[ia]=Pannello de controlo Comment[id]=Pusat Kendali Comment[ie]=Centre de control Comment[is]=Stjórnborð Comment[it]=Centro di controllo Comment[ja]=コントロールセンター Comment[jv]=Pusate ngengatur Comment[ka]=მართვის ცენტრი Comment[kab]=Amas n wenzaḍ Comment[kk]=Басқару орталығы Comment[km]=មជ្ឈមណ្ឌល​បញ្ជា Comment[ko]=제어판 Comment[ku]=Navenda Kontrolê Comment[la]=Centrum Regiminis Comment[li]=Configurasiesjerm Comment[lo]=ສູນຄວບຄຸມ Comment[lt]=Valdymo centras Comment[lv]=Vadības centrs Comment[mr]=नियंत्रण केंद्र Comment[ms]=Pusat Kawalan Comment[my]=ထိန်းချုပ်ရေး စင်တာ Comment[nap]=Centro 'e cuntroll' Comment[nb]=Kontrollsenter Comment[nds]=Kontrollzentrum Comment[ne]=नियन्त्रण केन्द्र Comment[nl]=Configuratiecentrum Comment[nn]=Kontrollsenter Comment[oc]=Centre de contraròtle Comment[om]=Wiirtuu to'annaa Comment[pa]=ਕੰਟਰੋਲ ਸੈਂਟਰ Comment[pl]=Centrum sterowania Comment[pt]=Centro de controlo Comment[pt_BR]=Centro de Controle Comment[ro]=Centru de control Comment[ru]=Центр управления Comment[rue]=Центер контрола Comment[sc]=Tzentru de controllu Comment[si]=පාලන මධ්‍යස්ථානය Comment[sk]=Centrum ovládania Comment[sl]=Nadzorno središče Comment[sq]=Qendra e kontrollit Comment[sr]=Управљачки центар Comment[sr@ijekavian]=Управљачки центар Comment[sr@ijekavianlatin]=Управљачки центар Comment[sr@latin]=Kontrolni centar Comment[sv]=Hantera inställningar Comment[ta]=கட்டுப்பாட்டு மையம் Comment[te]=నియంత్రణా కేంద్రం Comment[tg]=Маркази идоракунӣ Comment[th]=ศูนย์ควบคุม Comment[tl]=Sentro ng Kontrol Comment[tr]=Cinnamon Denetim Merkezi Comment[ug]=باشقۇرۇش مەركىزى Comment[uk]=Центр керування Comment[ur]=کنڑول مرکز Comment[uz]=Nazorat markazi Comment[vi]=Trung tâm Điều khiển Comment[zh_CN]=控制中心 Comment[zh_HK]=控制中心 Comment[zh_TW]=控制中心 cinnamon-6.6.8/files/usr/share/cinnamon/0000775000175000017500000000000015167446463017120 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/0000775000175000017500000000000015167446463020570 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/a11y@cinnamon.org/0000775000175000017500000000000015167446463023754 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js0000664000175000017500000002432015167446463025600 0ustar fabiofabioconst PopupMenu = imports.ui.popupMenu; const Gio = imports.gi.Gio; const Lang = imports.lang; const Applet = imports.ui.applet; const Main = imports.ui.main; const Gdk = imports.gi.Gdk; const GLib = imports.gi.GLib; const A11Y_KEYBOARD_SCHEMA = 'org.cinnamon.desktop.a11y.keyboard'; const A11Y_MOUSE_SCHEMA = 'org.cinnamon.desktop.a11y.mouse'; const KEY_STICKY_KEYS_ENABLED = 'stickykeys-enable'; const KEY_BOUNCE_KEYS_ENABLED = 'bouncekeys-enable'; const KEY_SLOW_KEYS_ENABLED = 'slowkeys-enable'; const KEY_MOUSE_KEYS_ENABLED = 'mousekeys-enable'; const KEY_SEC_CLICK_ENABLED = 'secondary-click-enabled'; const KEY_DWELL_CLICK_ENABLED = 'dwell-click-enabled'; const APPLICATIONS_SCHEMA = 'org.cinnamon.desktop.a11y.applications'; const DPI_FACTOR_LARGE = 1.25; const DESKTOP_INTERFACE_SCHEMA = 'org.cinnamon.desktop.interface'; const KEY_GTK_THEME = 'gtk-theme'; const KEY_ICON_THEME = 'icon-theme'; const KEY_TEXT_SCALING_FACTOR = 'text-scaling-factor'; const WM_PREFERENCES_SCHEMA = 'org.cinnamon.desktop.wm.preferences'; const KEY_WM_THEME = 'theme'; const HIGH_CONTRAST_THEME = 'HighContrast'; const Keymap = Gdk.Keymap.get_default(); class CinnamonA11YApplet extends Applet.TextIconApplet { constructor(metadata, orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.setAllowedLayout(Applet.AllowedLayout.BOTH); try { this.metadata = metadata; Main.systrayManager.registerTrayIconReplacement("a11y", metadata.uuid); this.set_applet_icon_symbolic_name("xsi-accessibility"); this.set_applet_tooltip(_("Accessibility")); this.menuManager = new PopupMenu.PopupMenuManager(this); this.menu = new Applet.AppletPopupMenu(this, orientation); this.menuManager.addMenu(this.menu); let highContrast = this._buildHCItem(); this.menu.addMenuItem(highContrast); let magnifier = this._buildItem(_("Zoom"), APPLICATIONS_SCHEMA, 'screen-magnifier-enabled'); this.menu.addMenuItem(magnifier); let textZoom = this._buildFontItem(); this.menu.addMenuItem(textZoom); if (GLib.file_test("/usr/bin/orca", GLib.FileTest.EXISTS)) { let screenReader = this._buildItem(_("Screen Reader"), APPLICATIONS_SCHEMA, 'screen-reader-enabled'); this.menu.addMenuItem(screenReader); } let screenKeyboard = this._buildItem(_("Screen Keyboard"), APPLICATIONS_SCHEMA, 'screen-keyboard-enabled'); this.menu.addMenuItem(screenKeyboard); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); let stickyKeys = this._buildItem(_("Sticky Keys"), A11Y_KEYBOARD_SCHEMA, KEY_STICKY_KEYS_ENABLED); this.menu.addMenuItem(stickyKeys); let slowKeys = this._buildItem(_("Slow Keys"), A11Y_KEYBOARD_SCHEMA, KEY_SLOW_KEYS_ENABLED); this.menu.addMenuItem(slowKeys); let bounceKeys = this._buildItem(_("Bounce Keys"), A11Y_KEYBOARD_SCHEMA, KEY_BOUNCE_KEYS_ENABLED); this.menu.addMenuItem(bounceKeys); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); let mouseKeys = this._buildItem(_("Mouse Keys"), A11Y_KEYBOARD_SCHEMA, KEY_MOUSE_KEYS_ENABLED); this.menu.addMenuItem(mouseKeys); let simClick = this._buildItem(_("Simulated secondary click"), A11Y_MOUSE_SCHEMA, KEY_SEC_CLICK_ENABLED); this.menu.addMenuItem(simClick); let hoverClick = this._buildItem(_("Hover click"), A11Y_MOUSE_SCHEMA, KEY_DWELL_CLICK_ENABLED); this.menu.addMenuItem(hoverClick); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addSettingsAction(_("Universal Access Settings"), 'universal-access'); this.a11y_settings = new Gio.Settings({ schema_id: A11Y_KEYBOARD_SCHEMA }); this._keyboardStateChangedId = Keymap.connect('state-changed', Lang.bind(this, this._handleStateChange)); this.set_show_label_in_vertical_panels(false); this.hide_applet_label(true); } catch (e) { global.logError(e); } } _handleStateChange(actor, event) { if (this.a11y_settings.get_boolean(KEY_STICKY_KEYS_ENABLED)) { let state = Keymap.get_modifier_state(); let modifiers = []; if (state & Gdk.ModifierType.LOCK_MASK) modifiers.push('Lock'); if (state & Gdk.ModifierType.CONTROL_MASK) modifiers.push('Ctrl'); if (state & Gdk.ModifierType.MOD4_MASK) modifiers.push('Super'); if (state & Gdk.ModifierType.SUPER_MASK) modifiers.push('Super'); if (state & Gdk.ModifierType.META_MASK) modifiers.push('Meta'); if (state & Gdk.ModifierType.ALT_MASK) modifiers.push('Alt'); if (state & Gdk.ModifierType.MOD5_MASK) modifiers.push('Alt Gr'); if (state & Gdk.ModifierType.SHIFT_MASK) modifiers.push('Shift'); if (state & Gdk.ModifierType.MOD1_MASK) modifiers.push('Alt'); if (state & Gdk.ModifierType.MOD2_MASK) modifiers.push('Mod2'); if (state & Gdk.ModifierType.MOD3_MASK) modifiers.push('Mod3'); let keystring = modifiers.join('+'); this.set_applet_label(keystring); this.set_applet_tooltip(keystring); this._applet_tooltip.show(); } else { this.reset_tooltip(); } } on_applet_clicked(event) { this.menu.toggle(); } reset_tooltip () { this.set_applet_tooltip(_("Accessibility")); this._applet_tooltip.hide(); } _buildItemExtended(string, initial_value, writable, on_set) { let widget = new PopupMenu.PopupSwitchMenuItem(string, initial_value); if (!writable) widget.actor.reactive = false; else widget.connect('toggled', function(item) { on_set(item.state); }); return widget; } _buildItem(string, schema, key) { let settings = new Gio.Settings({ schema_id: schema }); let widget = this._buildItemExtended(string, settings.get_boolean(key), settings.is_writable(key), function(enabled) { return settings.set_boolean(key, enabled); }); settings.connect('changed::'+key, function() { widget.setToggleState(settings.get_boolean(key)); }); return widget; } _buildHCItem() { let settings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA }); let settingsWM = new Gio.Settings({ schema_id: WM_PREFERENCES_SCHEMA }); let gtkTheme = settings.get_string(KEY_GTK_THEME); let iconTheme = settings.get_string(KEY_ICON_THEME); let wmTheme = settingsWM.get_string(KEY_WM_THEME); let hasHC = (gtkTheme == HIGH_CONTRAST_THEME); let highContrast = this._buildItemExtended( _("High Contrast"), hasHC, settings.is_writable(KEY_GTK_THEME) && settings.is_writable(KEY_ICON_THEME) && settingsWM.is_writable(KEY_WM_THEME), function (enabled) { if (enabled) { settings.set_string(KEY_GTK_THEME, HIGH_CONTRAST_THEME); settings.set_string(KEY_ICON_THEME, HIGH_CONTRAST_THEME); settingsWM.set_string(KEY_WM_THEME, HIGH_CONTRAST_THEME); } else if(!hasHC) { settings.set_string(KEY_GTK_THEME, gtkTheme); settings.set_string(KEY_ICON_THEME, iconTheme); settingsWM.set_string(KEY_WM_THEME, wmTheme); } else { settings.reset(KEY_GTK_THEME); settings.reset(KEY_ICON_THEME); settingsWM.reset(KEY_WM_THEME); } }); settings.connect('changed::' + KEY_GTK_THEME, function() { let value = settings.get_string(KEY_GTK_THEME); if (value == HIGH_CONTRAST_THEME) { highContrast.setToggleState(true); } else { highContrast.setToggleState(false); gtkTheme = value; } }); settings.connect('changed::' + KEY_ICON_THEME, function() { let value = settings.get_string(KEY_ICON_THEME); if (value != HIGH_CONTRAST_THEME) iconTheme = value; }); settingsWM.connect('changed::' + KEY_WM_THEME, function() { let value = settingsWM.get_string(KEY_WM_THEME); if (value != HIGH_CONTRAST_THEME) wmTheme = value; }); return highContrast; } _buildFontItem() { let settings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA }); let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR); let initial_setting = (factor > 1.0); let widget = this._buildItemExtended(_("Large Text"), initial_setting, settings.is_writable(KEY_TEXT_SCALING_FACTOR), function (enabled) { if (enabled) settings.set_double(KEY_TEXT_SCALING_FACTOR, DPI_FACTOR_LARGE); else settings.reset(KEY_TEXT_SCALING_FACTOR); }); settings.connect('changed::' + KEY_TEXT_SCALING_FACTOR, function() { let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR); let active = (factor > 1.0); widget.setToggleState(active); }); return widget; } on_applet_removed_from_panel() { Main.systrayManager.unregisterTrayIconReplacement(this.metadata.uuid); } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonA11YApplet(metadata, orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/a11y@cinnamon.org/metadata.json0000664000175000017500000000024715167446463026432 0ustar fabiofabio{ "uuid": "a11y@cinnamon.org", "name": "Accessibility", "description": "Accessibility applet", "icon": "preferences-desktop-accessibility", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/calendar@cinnamon.org/0000775000175000017500000000000015167446463024752 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/calendar@cinnamon.org/applet.js0000664000175000017500000003212415167446463026577 0ustar fabiofabioconst Applet = imports.ui.applet; const Gio = imports.gi.Gio; const GLib = imports.gi.GLib; const Lang = imports.lang; const Clutter = imports.gi.Clutter; const St = imports.gi.St; const Util = imports.misc.util; const PopupMenu = imports.ui.popupMenu; const UPowerGlib = imports.gi.UPowerGlib; const Settings = imports.ui.settings; const Calendar = require('./calendar'); const EventView = require('./eventView'); const CinnamonDesktop = imports.gi.CinnamonDesktop; const Main = imports.ui.main; const Separator = imports.ui.separator; const DAY_FORMAT = CinnamonDesktop.WallClock.lctime_format("cinnamon", "%A"); const DATE_FORMAT_SHORT = CinnamonDesktop.WallClock.lctime_format("cinnamon", _("%B %-e, %Y")); const DATE_FORMAT_FULL = CinnamonDesktop.WallClock.lctime_format("cinnamon", _("%A, %B %-e, %Y")); class CinnamonCalendarApplet extends Applet.TextApplet { constructor(orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.setAllowedLayout(Applet.AllowedLayout.BOTH); try { this.menuManager = new PopupMenu.PopupMenuManager(this); this.orientation = orientation; this._initContextMenu(); this.menu.setCustomStyleClass('calendar-background'); this.settings = new Settings.AppletSettings(this, "calendar@cinnamon.org", this.instance_id); this.desktop_settings = new Gio.Settings({ schema_id: "org.cinnamon.desktop.interface" }); this.clock = new CinnamonDesktop.WallClock(); this.clock_notify_id = 0; // Events this.events_manager = new EventView.EventsManager(this.settings, this.desktop_settings); this.events_manager.connect("events-manager-ready", this._events_manager_ready.bind(this)); this.events_manager.connect("has-calendars-changed", this._has_calendars_changed.bind(this)); let box = new St.BoxLayout( { style_class: 'calendar-main-box', vertical: false } ); this.menu.addActor(box); this.event_list = this.events_manager.get_event_list(); this.event_list.connect("launched-calendar", Lang.bind(this.menu, this.menu.toggle)); // hack to allow event list scrollbar to be dragged. this.event_list.connect("start-pass-events", Lang.bind(this.menu, () => { this.menu.passEvents = true; })); this.event_list.connect("stop-pass-events", Lang.bind(this.menu, () => { this.menu.passEvents = false; })); box.add_actor(this.event_list.actor); let calbox = new St.BoxLayout( { vertical: true } ); this.go_home_button = new St.BoxLayout( { style_class: "calendar-today-home-button", x_align: Clutter.ActorAlign.CENTER, reactive: true, vertical: true } ); this.go_home_button.connect("enter-event", Lang.bind(this, (actor, event) => { actor.add_style_pseudo_class("hover"); })); this.go_home_button.connect("leave-event", Lang.bind(this, (actor, event) => { actor.remove_style_pseudo_class("hover"); })); this.go_home_button.connect("button-press-event", Lang.bind(this, (actor, event) => { if (event.get_button() == Clutter.BUTTON_PRIMARY) { return Clutter.EVENT_STOP; } })); this.go_home_button.connect("button-release-event", Lang.bind(this, (actor, event) => { if (event.get_button() == Clutter.BUTTON_PRIMARY) { // button immediately becomes non-reactive, so leave-event will never fire. actor.remove_style_pseudo_class("hover"); this._resetCalendar(); return Clutter.EVENT_STOP; } })); calbox.add_actor(this.go_home_button); // Calendar this._day = new St.Label( { style_class: "calendar-today-day-label" } ); this.go_home_button.add_actor(this._day); // Date this._date = new St.Label( { style_class: "calendar-today-date-label" } ); this.go_home_button.add_actor(this._date); this._calendar = new Calendar.Calendar(this.settings, this.events_manager); this._calendar.connect("selected-date-changed", Lang.bind(this, this._updateClockAndDate)); calbox.add_actor(this._calendar.actor); box.add_actor(calbox); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); let item = new PopupMenu.PopupMenuItem(_("Date and Time Settings")); item.connect("activate", Lang.bind(this, this._onLaunchSettings)); this.menu.addMenuItem(item); this.settings.bind("show-events", "show_events", this._onSettingsChanged); this.settings.bind("use-custom-format", "use_custom_format", this._onSettingsChanged); this.settings.bind("custom-format", "custom_format", this._onSettingsChanged); this.settings.bind("custom-tooltip-format", "custom_tooltip_format", this._onSettingsChanged); this.settings.bind("keyOpen", "keyOpen", this._setKeybinding); this._setKeybinding(); /* FIXME: Add gobject properties to the WallClock class to allow easier access from * its clients, and possibly a separate signal to notify of updates to these properties * (though GObject "changed" would be sufficient.) */ this.desktop_settings.connect("changed::clock-use-24h", Lang.bind(this, function (key) { this._onSettingsChanged(); })); this.desktop_settings.connect("changed::clock-show-seconds", Lang.bind(this, function (key) { this._onSettingsChanged(); })); // https://bugzilla.gnome.org/show_bug.cgi?id=655129 this._upClient = new UPowerGlib.Client(); try { this._upClient.connect('notify-resume', Lang.bind(this, this._updateClockAndDate)); } catch (e) { this._upClient.connect('notify::resume', Lang.bind(this, this._updateClockAndDate)); } // Change the format string if the mouse is over the calender to account for the tooltip. this._is_entered = false; this.actor.connect('enter-event', Lang.bind(this, function (menu, event) { this._is_entered = true; this._updateFormatString(); })) this.actor.connect('leave-event', Lang.bind(this, function (menu, event) { this._is_entered = false; this._updateFormatString(); })) } catch (e) { global.logError(e); } } _setKeybinding() { Main.keybindingManager.addXletHotKey(this, "calendar-open", this.keyOpen, Lang.bind(this, this._openMenu)); } _clockNotify(obj, pspec, data) { this._updateClockAndDate(); } on_applet_clicked(event) { this._openMenu(); } _openMenu() { this.menu.toggle(); } _onSettingsChanged() { this._updateFormatString(); this._updateClockAndDate(); this.event_list.actor.visible = this.events_manager.is_active(); this.events_manager.select_date(this._calendar.getSelectedDate(), true); } on_custom_format_button_pressed() { Util.spawnCommandLine("xdg-open https://cinnamon-spices.linuxmint.com/strftime.php"); } _onLaunchSettings() { this.menu.close(); Util.spawnCommandLine("cinnamon-settings calendar"); } _updateFormatString() { let in_vertical_panel = (this.orientation == St.Side.LEFT || this.orientation == St.Side.RIGHT); if (this.use_custom_format) { let custom_format = this.custom_format; /* The frequency that the clock updates is based on the format string. * Thus, when the tooltip is displayed, we join the regular custom format string * with the custom tooltip format. That way, the format string is guaranteed * to contain whatever has the finest resolution between them. */ if (this._is_entered) { custom_format += this.custom_tooltip_format; } if (!this.clock.set_format_string(custom_format)) { global.logError("Calendar applet: bad time format string - check your string."); this.clock.set_format_string("~CLOCK FORMAT ERROR~ %l:%M %p"); } } else if (in_vertical_panel) { let use_24h = this.desktop_settings.get_boolean("clock-use-24h"); let show_seconds = this.desktop_settings.get_boolean("clock-show-seconds"); if (use_24h) { if (show_seconds) { this.clock.set_format_string("%H%n%M%n%S"); } else { this.clock.set_format_string("%H%n%M%"); } } else { if (show_seconds) { this.clock.set_format_string("%l%n%M%n%S"); } else { this.clock.set_format_string("%l%n%M%"); } } } else { this.clock.set_format_string(null); } } _events_manager_ready(em) { this.event_list.actor.visible = this.events_manager.is_active(); this.events_manager.select_date(this._calendar.getSelectedDate(), true); } _has_calendars_changed(em) { this.event_list.actor.visible = this.events_manager.is_active(); } _updateClockAndDate() { let label_string = this.clock.get_clock(); if (!this.use_custom_format) { label_string = label_string.capitalize(); } else if (this._is_entered) { label_string = this.clock.get_clock_for_format(this.custom_format); } this.go_home_button.reactive = !this._calendar.todaySelected(); if (this._calendar.todaySelected()) { this.go_home_button.reactive = false; this.go_home_button.set_style_class_name("calendar-today-home-button"); } else { this.go_home_button.reactive = true; this.go_home_button.set_style_class_name("calendar-today-home-button-enabled"); } this.set_applet_label(label_string); let dateFormattedTooltip = this.clock.get_clock_for_format(DATE_FORMAT_FULL).capitalize(); if (this.use_custom_format) { dateFormattedTooltip = this.clock.get_clock_for_format(this.custom_tooltip_format).capitalize(); if (!dateFormattedTooltip) { global.logError("Calendar applet: bad tooltip time format string - check your string."); dateFormattedTooltip = this.clock.get_clock_for_format("~CLOCK FORMAT ERROR~ %l:%M %p"); } } let dateFormattedShort = this.clock.get_clock_for_format(DATE_FORMAT_SHORT).capitalize(); let dayFormatted = this.clock.get_clock_for_format(DAY_FORMAT).capitalize(); this._day.set_text(dayFormatted); this._date.set_text(dateFormattedShort); this.set_applet_tooltip(dateFormattedTooltip); this.events_manager.select_date(this._calendar.getSelectedDate()); } on_applet_added_to_panel() { this._onSettingsChanged(); if (this.clock_notify_id == 0) { this.clock_notify_id = this.clock.connect("notify::clock", () => this._clockNotify()); } /* Populates the calendar so our menu allocation is correct for animation */ this.events_manager.start_events(); this._resetCalendar(); } on_applet_removed_from_panel() { Main.keybindingManager.removeXletHotKey(this, "calendar-open"); if (this.clock_notify_id > 0) { this.clock.disconnect(this.clock_notify_id); this.clock_notify_id = 0; } } _initContextMenu() { this.menu = new Applet.AppletPopupMenu(this, this.orientation); this.menuManager.addMenu(this.menu); // Whenever the menu is opened, select today this.menu.connect('open-state-changed', Lang.bind(this, function (menu, isOpen) { if (isOpen) { this._resetCalendar(); this.events_manager.select_date(this._calendar.getSelectedDate(), true); } })); } _resetCalendar() { this._calendar.setDate(new Date(), true); } on_orientation_changed(orientation) { this.orientation = orientation; this.menu.setOrientation(orientation); this._onSettingsChanged(); } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonCalendarApplet(orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/calendar@cinnamon.org/calendar.js0000664000175000017500000004614515167446463027073 0ustar fabiofabio// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- const Clutter = imports.gi.Clutter; const Gio = imports.gi.Gio; const GLib = imports.gi.GLib; const Lang = imports.lang; const St = imports.gi.St; const Signals = imports.signals; const Pango = imports.gi.Pango; const Gettext_gtk30 = imports.gettext.domain('gtk30'); const Cinnamon = imports.gi.Cinnamon; const Settings = imports.ui.settings; const Mainloop = imports.mainloop; const MSECS_IN_DAY = 24 * 60 * 60 * 1000; const WEEKDATE_HEADER_WIDTH_DIGITS = 3; const SHOW_WEEKDATE_KEY = 'show-week-numbers'; const FIRST_WEEKDAY_KEY = 'first-day-of-week'; const DESKTOP_SCHEMA = 'org.cinnamon.desktop.interface'; // in org.cinnamon.desktop.interface const CLOCK_FORMAT_KEY = 'clock-format'; function _sameDay(dateA, dateB) { return (dateA.getDate() == dateB.getDate() && dateA.getMonth() == dateB.getMonth() && dateA.getYear() == dateB.getYear()); } function _today(date) { let today = new Date(); return (date.getDate() == today.getDate() && date.getMonth() == today.getMonth() && date.getYear() == today.getYear()); } function _sameYear(dateA, dateB) { return (dateA.getYear() == dateB.getYear()); } /* TODO: maybe needs config - right now we assume that Saturday and * Sunday are non-work days (not true in e.g. Israel, it's Sunday and * Monday there) */ function _isWorkDay(date) { return date.getDay() != 0 && date.getDay() != 6; } function _getBeginningOfDay(date) { let ret = new Date(date.getTime()); ret.setHours(0); ret.setMinutes(0); ret.setSeconds(0); ret.setMilliseconds(0); return ret; } function _getEndOfDay(date) { let ret = new Date(date.getTime()); ret.setHours(23); ret.setMinutes(59); ret.setSeconds(59); ret.setMilliseconds(999); return ret; } function _formatEventTime(event, clockFormat) { let ret; if (event.allDay) { /* Translators: Shown in calendar event list for all day events * Keep it short, best if you can use less then 10 characters */ ret = C_("event list time", "All Day"); } else { switch (clockFormat) { case '24h': /* Translators: Shown in calendar event list, if 24h format */ ret = event.date.toLocaleFormat(C_("event list time", "%H:%M")); break; default: /* explicit fall-through */ case '12h': /* Translators: Shown in calendar event list, if 12h format */ ret = event.date.toLocaleFormat(C_("event list time", "%l:%M %p")); break; } } return ret; } function _getDigitWidth(actor){ let context = actor.get_pango_context(); let themeNode = actor.get_theme_node(); let font = themeNode.get_font(); let metrics = context.get_metrics(font, context.get_language()); let width = metrics.get_approximate_digit_width(); return width; } function _getCalendarDayAbbreviation(dayNumber) { // This returns an array of abbreviated day names, starting with Sunday. // We use 2014/03/02 (months are zero-based in JS) because it was a Sunday let abbreviations = [ new Date(2014, 2, 2).toLocaleFormat('%a'), new Date(2014, 2, 3).toLocaleFormat('%a'), new Date(2014, 2, 4).toLocaleFormat('%a'), new Date(2014, 2, 5).toLocaleFormat('%a'), new Date(2014, 2, 6).toLocaleFormat('%a'), new Date(2014, 2, 7).toLocaleFormat('%a'), new Date(2014, 2, 8).toLocaleFormat('%a') ]; return abbreviations[dayNumber]; } // Abstraction for an appointment/event in a calendar class CalendarEvent { constructor(date, end, summary, allDay) { this.date = date; this.end = end; this.summary = summary; this.allDay = allDay; } } function _datesEqual(a, b) { if (a < b) return false; else if (a > b) return false; return true; } function _dateIntervalsOverlap(a0, a1, b0, b1) { if (a1 <= b0) return false; else if (b1 <= a0) return false; else return true; } class Calendar { constructor(settings, events_manager) { this.events_manager = events_manager; this._weekStart = Cinnamon.util_get_week_start(); this._weekdate = NaN; this._digitWidth = NaN; this.settings = settings; this._update_id = 0; this._set_date_idle_id = 0; this.settings.bindWithObject(this, "show-week-numbers", "show_week_numbers", this._onSettingsChange); this.desktop_settings = new Gio.Settings({ schema_id: DESKTOP_SCHEMA }); this.desktop_settings.connect("changed::" + FIRST_WEEKDAY_KEY, Lang.bind(this, this._onSettingsChange)); this.events_enabled = false; this.events_manager.connect("events-updated", this._events_updated.bind(this)); this.events_manager.connect("events-manager-ready", this._update_events_enabled.bind(this)); this.events_manager.connect("has-calendars-changed", this._update_events_enabled.bind(this)); // Find the ordering for month/year in the calendar heading let var_name = 'calendar:MY'; switch (Gettext_gtk30.gettext(var_name)) { case 'calendar:MY': this._headerMonthFirst = true; break; case 'calendar:YM': this._headerMonthFirst = false; break; default: log('Translation of "calendar:MY" in GTK+ is not correct'); this._headerMonthFirst = true; break; } // Start off with the current date this._selectedDate = new Date(); this.actor = new St.Table({ homogeneous: false, style_class: 'calendar', reactive: true }); this.actor.connect('scroll-event', Lang.bind(this, this._onScroll)); this._buildHeader (); } _events_updated(events_manager) { this._queue_update(); } _cancel_update() { if (this._update_id > 0) { Mainloop.source_remove(this._update_id); this._update_id = 0; } } _queue_update() { this._cancel_update(); this._update_id = Mainloop.idle_add(Lang.bind(this, this._idle_do_update)); } _idle_do_update() { this._update_id = 0; this._update(); return GLib.SOURCE_REMOVE; } _queue_set_date_idle(date) { this.setDate(date, false); this._set_date_idle_id = 0; return GLib.SOURCE_REMOVE; } queue_set_date(date) { if (this._set_date_idle_id > 0) { return; } this._set_date_idle_id = Mainloop.timeout_add(25, this._queue_set_date_idle.bind(this, date)); } _update_events_enabled(em) { this.events_enabled = this.events_manager.is_active(); this._queue_update(); } _onSettingsChange(object, key, old_val, new_val) { if (key == FIRST_WEEKDAY_KEY) this._weekStart = Cinnamon.util_get_week_start(); this._buildHeader(); this._update(false); } // Sets the calendar to show a specific date setDate(date, forceReload) { if (!_sameDay(date, this._selectedDate)) { this._selectedDate = date; this.emit('selected-date-changed', this._selectedDate); this._update(forceReload); } else { if (forceReload) this._update(forceReload); } } getSelectedDate() { return this._selectedDate; } todaySelected() { let today = new Date(); return this._selectedDate.getDate() == today.getDate() && this._selectedDate.getMonth() == today.getMonth() && this._selectedDate.getYear() == today.getYear(); } _buildHeader() { let offsetCols = this.show_week_numbers ? 1 : 0; this.actor.destroy_all_children(); // Top line of the calendar '<| September |> <| 2009 |>' this._topBoxMonth = new St.BoxLayout(); this._topBoxYear = new St.BoxLayout(); if (this._headerMonthFirst) { this.actor.add(this._topBoxMonth, {row: 0, col: 0, col_span: offsetCols + 4}); this.actor.add(this._topBoxYear, {row: 0, col: offsetCols + 4, col_span: 3}); } else { this.actor.add(this._topBoxMonth, {row: 0, col: offsetCols + 3, col_span: 4}); this.actor.add(this._topBoxYear, {row: 0, col: 0, col_span: offsetCols + 3}); } this.actor.connect('style-changed', Lang.bind(this, this._onStyleChange)); let back = new St.Button({ style_class: 'calendar-change-month-back' }); this._topBoxMonth.add(back); back.connect('clicked', Lang.bind(this, this._onPrevMonthButtonClicked)); this._monthLabel = new St.Label({style_class: 'calendar-month-label'}); this._topBoxMonth.add(this._monthLabel, { expand: true, x_fill: false, x_align: St.Align.MIDDLE }); let forward = new St.Button({ style_class: 'calendar-change-month-forward' }); this._topBoxMonth.add(forward); forward.connect('clicked', Lang.bind(this, this._onNextMonthButtonClicked)); back = new St.Button({style_class: 'calendar-change-month-back'}); this._topBoxYear.add(back); back.connect('clicked', Lang.bind(this, this._onPrevYearButtonClicked)); this._yearLabel = new St.Label({style_class: 'calendar-month-label'}); this._topBoxYear.add(this._yearLabel, {expand: true, x_fill: false, x_align: St.Align.MIDDLE}); forward = new St.Button({style_class: 'calendar-change-month-forward'}); this._topBoxYear.add(forward); forward.connect('clicked', Lang.bind(this, this._onNextYearButtonClicked)); // Add weekday labels... // // We need to figure out the abbreviated localized names for the days of the week; // we do this by just getting the next 7 days starting from right now and then putting // them in the right cell in the table. It doesn't matter if we add them in order let iter = new Date(this._selectedDate); iter.setSeconds(0); // Leap second protection. Hah! iter.setHours(12); for (let i = 0; i < 7; i++) { let styleClass = 'calendar-day-base calendar-day-heading'; if (_isWorkDay(iter)) styleClass += ' calendar-work-day'; else styleClass += ' calendar-nonwork-day'; // Could use iter.toLocaleFormat('%a') but that normally gives three characters // and we want, ideally, a single character for e.g. S M T W T F S let customDayAbbrev = _getCalendarDayAbbreviation(iter.getDay()); let label = new St.Label({ style_class: styleClass, text: customDayAbbrev }); this.actor.add(label, { row: 1, col: offsetCols + (7 + iter.getDay() - this._weekStart) % 7, x_fill: false, x_align: St.Align.MIDDLE }); iter.setTime(iter.getTime() + MSECS_IN_DAY); } // All the children after this are days, and get removed when we update the calendar this._firstDayIndex = this.actor.get_n_children(); } _onStyleChange(actor, event) { // width of a digit in pango units this._digitWidth = _getDigitWidth(this.actor) / Pango.SCALE; this._setWeekdateHeaderWidth(); } _setWeekdateHeaderWidth() { if (!isNaN(this._digitWidth) && this.show_week_numbers && this._weekdateHeader) { this._weekdateHeader.set_width (this._digitWidth * WEEKDATE_HEADER_WIDTH_DIGITS); } } _onScroll (actor, event) { switch (event.get_scroll_direction()) { case Clutter.ScrollDirection.UP: case Clutter.ScrollDirection.LEFT: this._onPrevMonthButtonClicked(); break; case Clutter.ScrollDirection.DOWN: case Clutter.ScrollDirection.RIGHT: this._onNextMonthButtonClicked(); break; } } _applyDateBrowseAction(yearChange, monthChange) { let oldDate = this._selectedDate; let newMonth = oldDate.getMonth() + monthChange; if (newMonth> 11) { yearChange = yearChange + 1; newMonth = 0; } else if (newMonth < 0) { yearChange = yearChange - 1; newMonth = 11; } let newYear = oldDate.getFullYear() + yearChange; let newDayOfMonth = oldDate.getDate(); let daysInMonth = 32 - new Date(newYear, newMonth, 32).getDate(); if (newDayOfMonth > daysInMonth) { newDayOfMonth = daysInMonth; } let newDate = new Date(); newDate.setFullYear(newYear, newMonth, newDayOfMonth); this.queue_set_date(newDate); } _onPrevYearButtonClicked() { this._applyDateBrowseAction(-1, 0); } _onNextYearButtonClicked() { this._applyDateBrowseAction(+1, 0); } _onPrevMonthButtonClicked() { this._applyDateBrowseAction(0, -1); } _onNextMonthButtonClicked() { this._applyDateBrowseAction(0, +1); } _update(forceReload) { let now = new Date(); this._monthLabel.text = this._selectedDate.toLocaleFormat('%OB').capitalize(); this._yearLabel.text = this._selectedDate.toLocaleFormat('%Y'); // Remove everything but the topBox and the weekday labels let children = this.actor.get_children(); for (let i = this._firstDayIndex; i < children.length; i++) this.actor.remove_actor(children[i]); // Start at the beginning of the week before the start of the month let beginDate = new Date(this._selectedDate); beginDate.setDate(1); beginDate.setSeconds(0); beginDate.setHours(12); let daysToWeekStart = (7 + beginDate.getDay() - this._weekStart) % 7; beginDate.setTime(beginDate.getTime() - daysToWeekStart * MSECS_IN_DAY); let iter = new Date(beginDate); let row = 2; while (true) { let group = new Cinnamon.Stack(); let button = new St.Button( { label: iter.getDate().toString(), } ); group.add_actor(button); let dot_box = new Cinnamon.GenericContainer( { style_class: "calendar-day-event-dot-box", } ); dot_box.connect('allocate', this._allocate_dot_box.bind(this)); group.add_actor(dot_box); let iterStr = iter.toUTCString(); button.connect('clicked', Lang.bind(this, function(b) { if (!this.events_enabled) { return; } let newlySelectedDate = new Date(iterStr); this.setDate(newlySelectedDate, false); })); let styleClass = 'calendar-day-base calendar-day'; if (_isWorkDay(iter)) styleClass += ' calendar-work-day'; else styleClass += ' calendar-nonwork-day'; // Hack used in lieu of border-collapse - see cinnamon.css if (row == 2) styleClass = 'calendar-day-top ' + styleClass; if (iter.getDay() == this._weekStart) styleClass = 'calendar-day-left ' + styleClass; if (_today(iter)) styleClass += ' calendar-today'; else if (iter.getMonth() != this._selectedDate.getMonth()) styleClass += ' calendar-other-month-day'; else styleClass += ' calendar-not-today'; if (_sameDay(this._selectedDate, iter)) { button.add_style_pseudo_class('selected'); } button.style_class = styleClass; let offsetCols = this.show_week_numbers ? 1 : 0; this.actor.add(group, { row: row, col: offsetCols + (7 + iter.getDay() - this._weekStart) % 7 }); if (this.show_week_numbers && iter.getDay() == 4) { let label = new St.Label({ text: iter.toLocaleFormat('%V'), style_class: 'calendar-day-base calendar-week-number'}); this.actor.add(label, { row: row, col: 0, y_align: St.Align.MIDDLE }); } let color_set = this.events_manager.get_colors_for_date(iter); if (this.events_enabled && color_set !== null) { let node = dot_box.get_theme_node(); let dot_box_width = node.get_width(); let dot_width = dot_box_width / color_set.length; for (let i = 0; i < color_set.length; i++) { let color = color_set[i]; let dot = new St.Bin( { style_class: "calendar-day-event-dot", style: `background-color: ${color};`, x_align: Clutter.ActorAlign.CENTER } ); dot_box.add_actor(dot); } } iter.setTime(iter.getTime() + MSECS_IN_DAY); if (iter.getDay() == this._weekStart) { row++; // We always stop after placing 6 rows, even if month fits in 4 // to prevent issues with jumping controls, see #226 if (row > 7) { break; } } } } _allocate_dot_box (actor, box, flags) { let children = actor.get_children(); if (children.length == 0) { return; } let a_dot = children[0]; let box_width = box.x2 - box.x1; let box_height = box.y2 - box.y1; let [mw, nw] = a_dot.get_preferred_width(-1); let [mh, nh] = a_dot.get_preferred_height(-1); let max_children_per_row = Math.trunc(box_width / nw); let [found, max_rows] = actor.get_theme_node().lookup_double("max-rows", false); if (found) { max_rows = Math.trunc(max_rows); } else { max_rows = 2; } let n_rows = Math.min(max_rows, Math.ceil(children.length / max_children_per_row)); let dots_left = children.length; let i = 0; for (let dot_row = 0; dot_row < n_rows; dot_row++, dots_left -= max_children_per_row) { let dots_this_row = Math.min(dots_left, max_children_per_row); let total_child_width = nw * dots_this_row; let start_x = Math.floor((box_width - total_child_width) / 2); let cbox = new Clutter.ActorBox(); cbox.x1 = start_x; cbox.y1 = dot_row * nh; cbox.x2 = cbox.x1 + nw; cbox.y2 = cbox.y1 + nh; while (i < ((dot_row * max_children_per_row) + dots_this_row)) { children[i].allocate(cbox, flags); cbox.x1 += nw; cbox.x2 += nw; i++; } } } } Signals.addSignalMethods(Calendar.prototype); cinnamon-6.6.8/files/usr/share/cinnamon/applets/calendar@cinnamon.org/eventView.js0000664000175000017500000011012015167446463027257 0ustar fabiofabio// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- const Clutter = imports.gi.Clutter; const Gio = imports.gi.Gio; const GLib = imports.gi.GLib; const Lang = imports.lang; const St = imports.gi.St; const Signals = imports.signals; const Pango = imports.gi.Pango; const Cinnamon = imports.gi.Cinnamon; const Settings = imports.ui.settings; const Atk = imports.gi.Atk; const Gtk = imports.gi.Gtk; const CinnamonDesktop = imports.gi.CinnamonDesktop; const Separator = imports.ui.separator; const Main = imports.ui.main; const Util = imports.misc.util; const Mainloop = imports.mainloop; const Interfaces = imports.misc.interfaces; const STATUS_UNKNOWN = 0; const STATUS_NO_CALENDARS = 1; const STATUS_HAS_CALENDARS = 2; // TODO: this is duplicated from applet.js const DATE_FORMAT_FULL = CinnamonDesktop.WallClock.lctime_format("cinnamon", _("%A, %B %-e, %Y")); const DAY_FORMAT = CinnamonDesktop.WallClock.lctime_format("cinnamon", "%A"); // https://www.w3schools.com/charsets/ref_utf_geometric.asp const ARROW_SEPARATOR = " ► " const EDS_BUS_NAME = "org.gnome.evolution.dataserver.Calendar8" function locale_cap(str) { return str.charAt(0).toLocaleUpperCase() + str.slice(1); } function js_date_to_gdatetime(js_date) { let unix = js_date.getTime() / 1000; // getTime returns ms return GLib.DateTime.new_from_unix_local(unix); } function date_only(gdatetime) { let date = GLib.DateTime.new_local( gdatetime.get_year(), gdatetime.get_month(), gdatetime.get_day_of_month(), 0, 0, 0 ); return date; } function month_year_only(gdatetime) { let month_year_only = GLib.DateTime.new_local( gdatetime.get_year(), gdatetime.get_month(), 1, 0, 0, 0 ); return month_year_only; } function format_timespan(timespan) { let minutes = Math.floor(timespan / GLib.TIME_SPAN_MINUTE); if (minutes < 10) { return ["imminent", _("Starting in a few minutes")]; } if (minutes < 60) { return ["soon", _("Starting in %d minutes").format(minutes)]; } let hours = Math.floor(minutes / 60); if (hours > 6) { let now = GLib.DateTime.new_now_local(); let later = now.add_hours(hours); if (later.get_hour() > 18) { return ["", _("This evening")]; } return ["", _("Starting later today")]; } return ["", ngettext("In %d hour", "In %d hours", hours).format(hours)]; } // GLib.DateTime.equal is broken function dt_equals(dt1, dt2) { return dt1.to_unix() === dt2.to_unix(); } class EventData { constructor(data_var, last_update_timestamp) { const [id, color, summary, all_day, start_time, end_time, mod_time] = data_var.deep_unpack(); this.id = id; this.start = GLib.DateTime.new_from_unix_local(start_time); this.end = GLib.DateTime.new_from_unix_local(end_time); this.all_day = all_day; if (this.all_day) { // An all day event can be from 00:00 to 00:00 the next day, which will end up // causing it to appear for two days. this.end = this.end.add_seconds(-1); } if (this.end.compare(this.start) == -1) { // An all day event can be a single point in time at 00:00. The previous -1s // will cause it to appear all the following days in the current view. this.end = this.start; } this.start_date = date_only(this.start); this.end_date = date_only(this.end); this.multi_day = !dt_equals(this.start_date, this.end_date); if (this.multi_day) { this.span = this.end_date.difference(this.start_date) / GLib.TIME_SPAN_DAY; } else { this.span = 1; } this.summary = summary; this.color = color; // This is the time_t for when event was last modified by e-d-s this.modified = mod_time; // This is the last monotonic time we contacted our server to update our events. This // is used to cull deleted events. this.last_update_timetamp = last_update_timestamp; } starts_on_day(date) { return dt_equals(date_only(date), this.start_date); } ends_on_day(date) { return dt_equals(date_only(date), this.end_date); } started_before_day(date) { return date_only(date).difference(this.start_date) > 0; } ended_before_day(date) { return date_only(date).difference(this.end_date) > 0; } ends_after_day(date) { return date_only(date).difference(this.end_date) < 0; } started_after_day(date) { return date_only(date).difference(this.start_date) < 0; } started_before_and_ends_after(date) { return this.multi_day && this.started_before_day(date) && this.ends_after_day(date); } equal(other_event) { return this.id === other_event.id && this.modified === other_event.modified; } } class EventDataList { constructor(gdate_only) { // Timestamp gets updated any time events are added, removed of modified. The event list // compares this to the timestamp it recorded when it initially loaded the day's events. // is changed. It updates any time the events of this day are added, modified or removed. // This prompts the event list to completely reload the re-sorted event list. // // If the event list is updated and the timestamps haven't changed, only the variable details // of the events are updated - time till start, style changes, etc... this.timestamp = GLib.get_monotonic_time(); this.gdate_only = gdate_only; this.length = 0; this._events = {}; } add_or_update(event_data, last_update_timetamp) { let existing = this._events[event_data.id]; if (existing === undefined) { this.length++; } if (existing !== undefined && event_data.equal(existing)) { existing.last_update_timetamp = last_update_timetamp; existing.color = event_data.color; return false; } this._events[event_data.id] = event_data; this.timestamp = GLib.get_monotonic_time(); return true; } delete(id) { let existing = this._events[id]; if (existing === undefined) { return false; } this.length --; delete this._events[id]; this.timestamp = GLib.get_monotonic_time(); return true; } cull_removed_events(last_update_timetamp) { let to_remove = []; for (let id in this._events) { if (this._events[id].last_update_timetamp < last_update_timetamp) { to_remove.push(id); } } if (to_remove.length === 0) { return false; } to_remove.forEach((id) => { this.delete(id); }); return true; } get_event_list() { let now = GLib.DateTime.new_now_local(); let events_as_array = []; for (let id in this._events) { events_as_array.push(this._events[id]); } // chrono order for non-current day events_as_array.sort((a, b) => { return a.start.to_unix() - b.start.to_unix(); }); if (!dt_equals(date_only(now), this.gdate_only)) { return events_as_array; } // for the current day keep all-day events just above the current or first pending event let all_days = []; let final_list = []; for (let i = 0; i < events_as_array.length; i++) { if (events_as_array[i].all_day) { all_days.push(events_as_array[i]); } } all_days.reverse(); let all_days_inserted = false; for (let i = events_as_array.length - 1; i >= 0; i--) { let event = events_as_array[i]; if (event.all_day && all_days_inserted) { break; } if (event.end.difference(now) < 0 && !all_days_inserted) { for (let j = 0; j < all_days.length ; j++) { final_list.push(all_days[j]); } all_days_inserted = true; } final_list.push(event); } final_list.reverse(); return final_list; } get_colors() { let color_set = []; for (let event of this.get_event_list()) { color_set.push(event.color); } return color_set; } } class EventsManager { constructor(settings, desktop_settings) { this.settings = settings; this.desktop_settings = desktop_settings; this._bus_watch_id this._calendar_server = null; this.current_month_year = null; this.current_selected_date = GLib.DateTime.new_from_unix_local(0); this.last_update_timestamp = 0; this.events_by_date = {}; this._inited = false; this._cached_state = STATUS_UNKNOWN; this._gc_timer_id = 0; this._reload_today_id = 0; this._force_reload_pending = false; this._event_list = null; } start_events() { this._bus_watch_id = Gio.bus_watch_name(Gio.BusType.SESSION, EDS_BUS_NAME, Gio.BusNameWatcherFlags.NONE, this.eds_service_found.bind(this), null); } eds_service_found(connection, name, name_owner) { Gio.bus_unwatch_name(this._bus_watch_id); this._bus_watch_id = 0; if (this._calendar_server == null) { log("calendar@cinnamon.org: Calendar events supported.") Cinnamon.CalendarServerProxy.new_for_bus( Gio.BusType.SESSION, Gio.DBusProxyFlags.DO_NOT_AUTO_START_AT_CONSTRUCTION, "org.cinnamon.CalendarServer", "/org/cinnamon/CalendarServer", null, this._calendar_server_ready.bind(this) ); } } log_dbus_error(e) { global.logError(`calendar@cinnamon.org: Could not check for calendar event support: ${e.toString()}`); } _calendar_server_ready(obj, res) { try { this._calendar_server = Cinnamon.CalendarServerProxy.new_for_bus_finish(res); this._calendar_server.connect( "events-added-or-updated", this._handle_added_or_updated_events.bind(this) ); this._calendar_server.connect( "events-removed", this._handle_removed_events.bind(this) ); this._calendar_server.connect( "client-disappeared", this._handle_client_disappeared.bind(this) ); this._calendar_server.connect( "notify::status", this._handle_status_notify.bind(this) ); this._inited = true; this.emit("events-manager-ready"); } catch (e) { log("could not connect to calendar server process: " + e); return; } } _stop_gc_timer() { if (this._gc_timer_id > 0) { Mainloop.source_remove(this._gc_timer_id); this._gc_timer_id = 0; } } _start_gc_timer() { this._stop_gc_timer(); if (!this.is_active()) { return; } this._gc_timer_id = Mainloop.timeout_add_seconds( 3, Lang.bind(this, this._perform_gc) ); } _perform_gc() { let any_removed = false; for (let date in this.events_by_date) { if (this.events_by_date[date].cull_removed_events(this.last_update_timestamp)) { any_removed = true; } } if (any_removed) { this._event_list.set_events(this.events_by_date[this.current_selected_date.to_unix()] || null); this.emit("events-updated"); } this._gc_timer_id = 0; return GLib.SOURCE_REMOVE; } _handle_added_or_updated_events(server, varray) { let changed = false; let events = varray.unpack(); for (let n = 0; n < events.length; n++) { let data = new EventData(events[n], this.last_update_timestamp); // don't loop endlessly in case of a bugged event let escape = 0; let date_iter = date_only(data.start); do { let hash = date_iter.to_unix(); if (this.events_by_date[hash] === undefined) { this.events_by_date[hash] = new EventDataList(date_iter); } if (this.events_by_date[hash].add_or_update(data, this.last_update_timestamp)) { if (dt_equals(date_iter, this.current_selected_date)) { changed = true; } } if (data.ends_on_day(date_iter) || escape == 50) { break; } escape++; date_iter = date_iter.add_days(1); } while (true); } if (changed) { this._event_list.set_events(this.events_by_date[this.current_selected_date.to_unix()] || null); } this._start_gc_timer(); this.emit("events-updated"); } _handle_removed_events(server, uids_string) { let uids = uids_string.split("::"); for (let hash in this.events_by_date) { let event_data_list = this.events_by_date[hash]; for (let uid of uids) { event_data_list.delete(uid); } } this.queue_reload_today(false); this.emit("events-updated"); } _handle_client_disappeared(server, uid) { // A calendar was removed/disabled. Instead of picking // specific matching events to remove, just rebuild the // entire list. this.events_by_date = {}; this.queue_reload_today(true); } _handle_status_notify(server, pspec) { if (this._calendar_server.status === this._cached_state) { return; } // Never reload when the new status is STATUS_UNKNOWN - this // means the server name-owner disappeared, it doesn't mean // there are no calendars. if (this._calendar_server.status === STATUS_UNKNOWN) { return; } this._cached_state = this._calendar_server.status; this.queue_reload_today(true); this.emit("has-calendars-changed"); } get_event_list() { if (this._event_list !== null) { return this._event_list; } this._event_list = new EventList(this.settings, this.desktop_settings); return this._event_list; } fetch_month_events(month_year, force) { let changed_month = this.current_month_year === null || !dt_equals(month_year, this.current_month_year); if (!changed_month && !force) { return; } this.current_month_year = month_year; if (changed_month) { this.events_by_date = {}; } // get first day of month let day_one = month_year_only(month_year); let week_day = day_one.get_day_of_week(); let week_start = Cinnamon.util_get_week_start(); // back up to the start of the week preceding day 1 let start = day_one.add_days( -(week_day - week_start) ); // The calendar has 42 boxes let end = start.add_days(42).add_seconds(-1); this._calendar_server.call_set_time_range(start.to_unix(), end.to_unix(), force, null, this.call_finished.bind(this)); this.last_update_timestamp = GLib.get_monotonic_time(); } call_finished(server, res) { try { this._calendar_server.call_set_time_range_finish(res); } catch (e) { log(e); } } _cancel_reload_today() { if (this._reload_today_id > 0) { Mainloop.source_remove(this._reload_today_id); this._reload_today_id = 0; } } queue_reload_today(force) { this._cancel_reload_today(); if (force) { this._force_reload_pending = true; } this._reload_today_id = Mainloop.idle_add(Lang.bind(this, this._idle_do_reload_today)); } _idle_do_reload_today() { this._reload_today_id = 0; this.select_date(new Date(), this._force_reload_pending); this._force_reload_pending = false; return GLib.SOURCE_REMOVE; } select_date(date, force) { if (!this.is_active()) { return; } // date is a js Date(). Eventually the calendar side should use // GDateTime, but for now we'll convert it here - it's a bit more // useful for dealing with events. let gdate = js_date_to_gdatetime(date); let gdate_only = date_only(gdate); let month_year = month_year_only(gdate_only); this.fetch_month_events(month_year, force); this._event_list.set_date(gdate_only); let delay_no_events_box = this.current_selected_date === null; if (this.current_selected_date !== null) { let new_month = !dt_equals(month_year_only(this.current_selected_date), month_year_only(gdate_only)); delay_no_events_box = new_month; } this.current_selected_date = gdate_only; let existing_event_list = this.events_by_date[gdate_only.to_unix()]; if (existing_event_list !== undefined) { // log("---------------cache hit"); this._event_list.set_events(existing_event_list, delay_no_events_box); } else { this._event_list.set_events(null, delay_no_events_box); } } get_colors_for_date(js_date) { let gdate = js_date_to_gdatetime(js_date); let gdate_only = date_only(gdate); let event_data_list = this.events_by_date[gdate_only.to_unix()]; return event_data_list !== undefined ? event_data_list.get_colors() : null; } is_active() { return this._inited && this.settings.getValue("show-events") && this._calendar_server !== null && // Not blocking STATUS_UNKNOWN allows our calendar to remain // populated while the server is 'unowned' (sleeping), since // its cached property is set to 0 when its current owner exits. this._calendar_server.status !== STATUS_NO_CALENDARS; } } Signals.addSignalMethods(EventsManager.prototype); class EventList { constructor(settings, desktop_settings) { this.settings = settings; this.selected_date = GLib.DateTime.new_now_local(); this.desktop_settings = desktop_settings; this._no_events_timeout_id = 0; this._scroll_to_idle_id = 0; this._rows = []; this._current_event_data_list_timestamp = 0; this.actor = new St.BoxLayout( { style_class: "calendar-events-main-box", vertical: true, visible: false } ); this.selected_date_label = new St.Label( { style_class: "calendar-events-date-label", reactive: true } ); this.selected_date_label.connect("button-press-event", Lang.bind(this, (actor, event) => { if (event.get_button() == Clutter.BUTTON_PRIMARY) { this.launch_calendar(this.selected_date); return Clutter.EVENT_STOP; } })); this.actor.add_actor(this.selected_date_label); this.no_events_box = new St.BoxLayout( { style_class: "calendar-events-no-events-box", vertical: true, visible: false, x_align: Clutter.ActorAlign.CENTER, y_align: Clutter.ActorAlign.CENTER, y_expand: true } ); this.no_events_button = new St.Button( { style_class: "calendar-events-no-events-button", reactive: GLib.find_program_in_path("gnome-calendar") } ); this.no_events_button.connect('clicked', Lang.bind(this, () => { this.launch_calendar(this.selected_date); })); let button_inner_box = new St.BoxLayout( { vertical: true } ); let no_events_icon = new St.Icon( { style_class: "calendar-events-no-events-icon", icon_name: 'xsi-x-office-calendar', icon_type: St.IconType.SYMBOLIC, icon_size: 48 } ); let no_events_label = new St.Label( { style_class: "calendar-events-no-events-label", text: _("No Events"), y_align: Clutter.ActorAlign.CENTER } ); button_inner_box.add_actor(no_events_icon); button_inner_box.add_actor(no_events_label); this.no_events_button.add_actor(button_inner_box); this.no_events_box.add_actor(this.no_events_button); this.actor.add_actor(this.no_events_box); this.events_box = new St.BoxLayout( { style_class: 'calendar-events-event-container', vertical: true, accessible_role: Atk.Role.LIST } ); this.events_scroll_box = new St.ScrollView( { style_class: 'calendar-events-scrollbox vfade', hscrollbar_policy: St.PolicyType.NEVER, vscrollbar_policy: St.PolicyType.AUTOMATIC, enable_auto_scrolling: true } ); let vscroll = this.events_scroll_box.get_vscroll_bar(); vscroll.connect('scroll-start', Lang.bind(this, () => { this.emit("start-pass-events"); })); vscroll.connect('scroll-stop', Lang.bind(this, () => { this.emit("stop-pass-events"); })); this.events_scroll_box.add_actor(this.events_box); this.actor.add_actor(this.events_scroll_box); } launch_calendar(gdate) { // --date will be broken anywhere but Mint 20.3 and upstream releases > 41.2 // (unless some fixes are backported). Maintainer can patch this to comment // out either line here. // Util.trySpawn(["gnome-calendar"], false); Util.trySpawn(["gnome-calendar", "--date", gdate.format("%x")], false); this.emit("launched-calendar"); } set_date(gdate) { this.selected_date_label.set_text(locale_cap(gdate.format(DATE_FORMAT_FULL))); this.selected_date = gdate; } set_events(event_data_list, delay_no_events_box) { if (this._scroll_to_idle_id > 0) { Mainloop.source_remove(this._scroll_to_idle_id); this._scroll_to_idle_id = 0; } if (event_data_list !== null && event_data_list.timestamp === this._current_event_data_list_timestamp) { this._rows.forEach((row) => { row.update_variations(); }); return; } this.events_box.get_children().forEach((actor) => { actor.destroy(); }); this._rows = []; if (this._no_events_timeout_id > 0) { Mainloop.source_remove(this._no_events_timeout_id); this._no_events_timeout_id = 0; } if (event_data_list === null) { // Show the 'no events' label, but wait a little bit to give the calendar server // to deliver some events if there are any. if (delay_no_events_box) { this._no_events_timeout_id = Mainloop.timeout_add(600, Lang.bind(this, function() { this._no_events_timeout_id = 0; this.no_events_box.show(); return GLib.SOURCE_REMOVE; })); } else { this.no_events_box.show(); } this._current_event_data_list_timestamp = 0; return; } this.no_events_box.hide(); this._current_event_data_list_timestamp = event_data_list.timestamp; let events = event_data_list.get_event_list(); let scroll_to_row = null; let first_row_done = false; for (let event_data of events) { if (first_row_done) { this.events_box.add_actor(new Separator.Separator().actor); } let row = new EventRow( event_data, this.selected_date, { use_24h: this.desktop_settings.get_boolean("clock-use-24h") } ); row.connect("view-event", Lang.bind(this, (row, uuid) => { this.emit("launched-calendar"); Util.trySpawn(["gnome-calendar", "--uuid", uuid], false); })); this.events_box.add_actor(row.actor); first_row_done = true; if (row.is_current_or_next && scroll_to_row === null) { scroll_to_row = row; } this._rows.push(row); } if (scroll_to_row == null) { return; } this._scroll_to_idle_id = Mainloop.idle_add(Lang.bind(this, function(row) { let vscroll = this.events_scroll_box.get_vscroll_bar(); if (row != null) { let mid_position = row.actor.y + (row.actor.height / 2) - (this.events_box.height / 2); vscroll.get_adjustment().set_value(mid_position); } else { vscroll.get_adjustment().set_value(0); } this._scroll_to_idle_id = 0; return GLib.SOURCE_REMOVE; }, scroll_to_row)); } } Signals.addSignalMethods(EventList.prototype); class EventRow { constructor(event, date, params) { this.event = event; this.is_current_or_next = false; this.selected_date = date; this.use_24h = params.use_24h; this.actor = new St.BoxLayout( { style_class: "calendar-event-button", reactive: true } ); this.actor.connect("enter-event", Lang.bind(this, () => { this.actor.add_style_pseudo_class("hover"); })); this.actor.connect("leave-event", Lang.bind(this, () => { this.actor.remove_style_pseudo_class("hover"); })); if (GLib.find_program_in_path("gnome-calendar")) { this.actor.connect("button-press-event", Lang.bind(this, (actor, event) => { if (event.get_button() == Clutter.BUTTON_PRIMARY) { this.emit("view-event", this.event.id); return Clutter.EVENT_STOP; } })); } let color_strip = new St.Bin( { style_class: "calendar-event-color-strip", style: `background-color: ${event.color};` } ); this.actor.add(color_strip); let vbox = new St.BoxLayout( { style_class: "calendar-event-row-content", x_expand: true, vertical: true } ); this.actor.add_actor(vbox); let label_box = new St.BoxLayout( { name: "label-box", x_expand: true } ); vbox.add_actor(label_box); this.event_time = new St.Label( { x_align: Clutter.ActorAlign.START, text: "", style_class: "calendar-event-time-present" } ); label_box.add(this.event_time, { expand: true, x_fill: true }); this.countdown_label = new St.Label( { /// text set below x_align: Clutter.ActorAlign.END, style_class: "calendar-event-countdown", } ); label_box.add(this.countdown_label, { expand: true, x_fill: true }); let event_summary = new St.Label( { text: this.event.summary, y_expand: true, style_class: "calendar-event-summary" } ); event_summary.get_clutter_text().line_wrap = true; event_summary.get_clutter_text().ellipsize = Pango.EllipsizeMode.NEVER; vbox.add(event_summary, { expand: true }); this.update_variations(); } update_variations() { let time_until_start = this.event.start.difference(GLib.DateTime.new_now_local()); let time_until_finish = this.event.end.difference(GLib.DateTime.new_now_local()); let today = date_only(GLib.DateTime.new_now_local()); let selected_is_today = dt_equals(today, this.selected_date); let starts_today = dt_equals(today, this.event.start_date); if (time_until_finish < 0) { this.event_time.set_style_class_name("calendar-event-time-past"); this.countdown_label.set_text(""); } else if (time_until_start > 0) { this.event_time.set_style_class_name("calendar-event-time-future"); if (starts_today) { let [countdown_pclass, text] = format_timespan(time_until_start); this.countdown_label.set_text(text); this.countdown_label.add_style_pseudo_class(countdown_pclass); this.is_current_or_next = !this.event.all_day; } else { this.countdown_label.set_text(""); } } else { this.event_time.set_style_class_name("calendar-event-time-present"); if (this.event.all_day || this.event.multi_day) { this.countdown_label.set_text(""); this.event_time.set_style_pseudo_class("all-day"); } else { this.countdown_label.set_text(_("In progress")); this.countdown_label.set_style_pseudo_class("current"); } this.is_current_or_next = this.event.is_today && !this.event.all_day; } let time_format; if (this.use_24h) { time_format = "%H:%M"; } else { time_format = "%-l:%M %p"; } let final_str = ""; // Simple, single-day events if (this.event.starts_on_day(this.selected_date) && !this.event.multi_day) { if (this.event.all_day) { // an all day event: "All day" final_str += _("All day"); } else { // a timed event: "12:00 pm" final_str += this.event.start.format(time_format); final_str += ARROW_SEPARATOR; final_str += this.event.end.format(time_format); } this.event_time.set_text(final_str); return; } // Past multi-day events (all-day or timed) // "12/04/2011 -> 12/08/2011" if (this.event.multi_day && this.event.ended_before_day(today)) { final_str += this.event.start_date.format("%x"); final_str += ARROW_SEPARATOR; final_str += this.event.end_date.format("%x"); this.event_time.set_text(final_str); return; } if (selected_is_today) { // prefix for current day selected if (this.event.starts_on_day(this.selected_date)) { if (this.event.all_day) { // all day event that starts today: "Today -> ..." final_str += _("Today") } else { // timed: "12:00 pm -> ..." final_str += this.event.start.format(time_format); } } else // event started prior to today if (this.event.started_before_day(this.selected_date)) { // If it started within the last few days, show the day of week: "Wednesday -> ..." if (this.event.started_after_day(this.selected_date.add_days(-4))) { final_str += locale_cap(this.event.start_date.format(DAY_FORMAT)); } else { // otherwise the date: "12/04/2011 ->" final_str += this.event.start_date.format("%x"); } } final_str += ARROW_SEPARATOR; // suffix for current day selected if (this.event.ends_on_day(this.selected_date)) { if (this.event.all_day) { // All-day event started previously, ends today: "-> Today" final_str += _("Today") } else { // Timed event started previously, ends today: "-> 12:00 pm" final_str += this.event.end.format(time_format); } } else if (this.event.ends_after_day(this.selected_date.add_days(4))) { // ends more than a few days after today: "-> 04/15/2011" final_str += this.event.end_date.format("%x"); } else { // ends only a few days after today: "-> Wednesday" final_str += locale_cap(this.event.end_date.format(DAY_FORMAT)); } } else { // Prefix for non-current day selected if (this.event.started_before_day(today)) { if (this.event.started_after_day(today.add_days(-4))) { // started in the last couple of days: "Wednesday -> ..." final_str += locale_cap(this.event.start_date.format(DAY_FORMAT)); } else { // Started on the selected day (but not today): "12:00 pm -> ..." if (this.event.starts_on_day(this.selected_date) && !this.event.all_day) { final_str += this.event.start.format(time_format); } else { // just the date if it's all day or started on an earlier day than selected: "04-16-2011 -> ..." final_str += this.event.start_date.format("%x"); } } } else { // We're viewing some future day, an event that started today: "4:00 pm Today" if (this.event.starts_on_day(today)) { // Just "Today" if it's an all-day event if (!this.event.all_day) { final_str += this.event.start.format(time_format); final_str += " "; } final_str += _("Today"); } else { // Event starts in the next few days: "Wednesday -> ..." if (this.event.started_before_day(today.add_days(4))) { final_str += this.event.start_date.format(DAY_FORMAT); } else { // Any other start date, show that date: "04/16/2011 -> ..." final_str += this.event.start_date.format("%x"); } } } final_str += ARROW_SEPARATOR; if (this.event.ends_on_day(today)) { // Event ends today (but we're viewing some interim day) if (!this.event.all_day) { // not all day: "-> 4:30 pm Today" final_str += this.event.end.format(time_format); final_str += " "; } // all day ends today: "-> Today" final_str += _("Today"); } else if (this.event.ends_on_day(this.selected_date) && !this.event.all_day) { // Ends on the selected date, not all day: "-> 12:00 pm" final_str += this.event.end.format(time_format); } else // Ends more than a few days after today: "-> 4/16/2021" if (this.event.ends_after_day(today.add_days(4))) { final_str += this.event.end_date.format("%x"); } else { // less than a few days after today: "-> Wednesday" final_str += locale_cap(this.event.end_date.format(DAY_FORMAT)); } } this.event_time.set_text(final_str); } } Signals.addSignalMethods(EventRow.prototype); cinnamon-6.6.8/files/usr/share/cinnamon/applets/calendar@cinnamon.org/metadata.json0000664000175000017500000000023315167446463027423 0ustar fabiofabio{ "uuid": "calendar@cinnamon.org", "name": "Calendar", "description": "The Cinnamon calendar applet", "icon": "gnome-calendar", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/calendar@cinnamon.org/settings-schema.json0000664000175000017500000000343315167446463030746 0ustar fabiofabio{ "section1": { "type": "section", "description": "Display" }, "show-events" : { "type" : "switch", "default" : true, "description": "Show calendar events", "tooltip": "Check this to display events in the calendar." }, "show-week-numbers" : { "type" : "switch", "default" : false, "description": "Show week numbers in calendar", "tooltip": "Check this to show week numbers in the calendar." }, "use-custom-format" : { "type" : "switch", "default" : false, "description": "Use a custom date format", "tooltip": "Check this to define a custom format for the date in the calendar applet." }, "custom-format" : { "type" : "entry", "default" : "%A, %B %e, %H:%M", "description" : "Date format", "dependency" : "use-custom-format", "tooltip" : "Set your custom format here." }, "custom-tooltip-format" : { "type" : "entry", "default" : "%A, %B %e, %H:%M", "description" : "Date format for tooltip", "dependency" : "use-custom-format", "tooltip" : "Set your custom tooltip format here." }, "format-button" : { "type" : "button", "description" : "Show information on date format syntax", "dependency" : "use-custom-format", "callback" : "on_custom_format_button_pressed", "tooltip" : "Click this button to know more about the syntax for date formats." }, "section2": { "type": "section", "description": "Keyboard shortcuts" }, "keyOpen": { "type": "keybinding", "description": "Show calendar", "default": "c", "tooltip" : "Set keybinding(s) to show the calendar." } } cinnamon-6.6.8/files/usr/share/cinnamon/applets/cornerbar@cinnamon.org/0000775000175000017500000000000015167446463025156 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/cornerbar@cinnamon.org/applet.js0000664000175000017500000002501015167446463026777 0ustar fabiofabioconst Applet = imports.ui.applet; const GLib = imports.gi.GLib; const St = imports.gi.St; const Meta = imports.gi.Meta; const Lang = imports.lang; const Clutter = imports.gi.Clutter; const Main = imports.ui.main; const Settings = imports.ui.settings; const PopupMenu = imports.ui.popupMenu; const SignalManager = imports.misc.signalManager; const Mainloop = imports.mainloop; const Cinnamon = imports.gi.Cinnamon; const Gio = imports.gi.Gio; const SCROLL_DELAY = 200; const PEEK_TRANSPARENCY_FILTER_TYPES = [ Meta.WindowType.DESKTOP, Meta.WindowType.DOCK, ]; class CinnamonBarApplet extends Applet.Applet { constructor(orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.muffinSettings = new Gio.Settings({ schema_id: 'org.cinnamon.muffin' }); this.settings = new Settings.AppletSettings(this, "cornerbar@cinnamon.org", instance_id); this.settings.bind("peek-at-desktop", "peek_at_desktop"); this.settings.bind("peek-delay", "peek_delay"); this.settings.bind("peek-opacity", "peek_opacity"); this.settings.bind("peek-blur", "peek_blur"); this.settings.bind("click-action", "click_action"); this.settings.bind("shift-click-action", "shift_click_action"); this.settings.bind("middle-click-action", "middle_click_action"); this.settings.bind("shift-middle-click-action", "shift_middle_click_action"); this.settings.bind("scroll-behavior", "scroll_behavior"); this.signals = new SignalManager.SignalManager(null); this.actor.connect('enter-event', Lang.bind(this, this._on_enter)); this.actor.connect('leave-event', Lang.bind(this, this._on_leave)); this.signals.connect(global.stage, 'notify::key-focus', this._on_leave, this); this.actor.connect('scroll-event', Lang.bind(this, this._on_scroll_event)); this._did_peek = false; this._peek_timeout_id = 0; this._last_scroll_time = 0; this._last_scroll_direction = 0; this.actor.style_class = 'applet-cornerbar-box'; this.setAllowedLayout(Applet.AllowedLayout.BOTH); this.settings.connect("settings-changed", () => { this.set_tooltip(); }); this.set_tooltip(); this.on_orientation_changed(orientation); // Context menu let desktop_option = new PopupMenu.PopupMenuItem(_('Show the desktop')); desktop_option.connect('activate', () => this.show_desktop()); this._applet_context_menu.addMenuItem(desktop_option); let desklet_option = new PopupMenu.PopupMenuItem(_('Show the desklets')); desklet_option.connect('activate', () => this.show_desklets()); this._applet_context_menu.addMenuItem(desklet_option); let expo_option = new PopupMenu.PopupMenuItem(_('Show the workspace selector (Expo)')); expo_option.connect('activate', () => this.expo()); this._applet_context_menu.addMenuItem(expo_option); let scale_option = new PopupMenu.PopupMenuItem(_('Show the window selector (Scale)')); scale_option.connect('activate', () => this.scale()); this._applet_context_menu.addMenuItem(scale_option); } set_tooltip() { if (this.click_action == "show_desktop") this.set_applet_tooltip(_("Show the desktop")); else if (this.click_action == "show_desklets") this.set_applet_tooltip(_('Show the desklets')); else if (this.click_action == "show_expo") this.set_applet_tooltip(_('Show the workspace selector (Expo)')); else if (this.click_action == "show_scale") this.set_applet_tooltip(_('Show the window selector (Scale)')); } handleDragOver(source, actor, x, y, time){ if (global.settings.get_boolean("panel-edit-mode")) { return; } this.show_desktop(); } on_panel_height_changed() { this.on_orientation_changed(this.orientation); } on_orientation_changed(neworientation) { this.orientation = neworientation; if (this.orientation == St.Side.TOP || this.orientation == St.Side.BOTTOM) { if (this._line) { this._line.destroy(); } this.actor.remove_style_class_name('vertical'); this._line = new St.BoxLayout({ style_class: 'applet-cornerbar' }); this.actor.add(this._line, { y_align: Clutter.ActorAlign.CENTER, x_align: Clutter.ActorAlign.CENTER, y_fill: true, y_expand: true}); } else { if (this._line) { this._line.destroy(); } this.actor.add_style_class_name('vertical'); this._line = new St.BoxLayout({ style_class: 'applet-cornerbar', reactive: true, track_hover: true }); this._line.add_style_class_name('vertical'); this._line.set_important(true); this.actor.add(this._line, { y_align: Clutter.ActorAlign.CENTER, x_align: Clutter.ActorAlign.CENTER}); } } _on_enter(event) { if (this.peek_at_desktop) { if (this._peek_timeout_id > 0) { Mainloop.source_remove(this._peek_timeout_id); this._peek_timeout_id = 0; } this._peek_timeout_id = Mainloop.timeout_add(this.peek_delay, Lang.bind(this, function() { if (this.actor.hover && !this._applet_context_menu.isOpen && !global.settings.get_boolean("panel-edit-mode")) { let windows = global.get_window_actors(); for (let i = 0; i < windows.length; i++) { let window = windows[i].meta_window; let compositor = windows[i]; if (!PEEK_TRANSPARENCY_FILTER_TYPES.includes(window.get_window_type())) { if (this.peek_blur) { if (!compositor.eff) compositor.eff = new Clutter.BlurEffect(); compositor.add_effect_with_name('peek-blur', compositor.eff); } compositor.ease( { opacity: this.peek_opacity / 100 * 255, duration: 275, mode: Clutter.AnimationMode.EASE_IN_SINE, } ); } } this._did_peek = true; } this._peek_timeout_id = 0; return false; })); } } _on_leave(event) { if (this._did_peek) { this.show_all_windows(200); this._did_peek = false; } if (this._peek_timeout_id > 0) { Mainloop.source_remove(this._peek_timeout_id); this._peek_timeout_id = 0; } } _on_scroll_event(actor,event) { if (this.scroll_behavior == "nothing") { return GLib.SOURCE_CONTINUE; } if (this._peek_timeout_id > 0) { Mainloop.source_remove(this._peek_timeout_id); this._peek_timeout_id = 0; } const edir = event.get_scroll_direction(); if (edir == Clutter.ScrollDirection.SMOOTH) { return GLib.SOURCE_CONTINUE; } const etime = event.get_time(); if (etime > (this._last_scroll_time + SCROLL_DELAY) || edir !== this._last_scroll_direction) { let index = global.screen.get_active_workspace_index(); let workspaceCycle = this.muffinSettings.get_boolean('workspace-cycle') if ((edir == Clutter.ScrollDirection.UP) == (this.scroll_behavior == 'normal')) { index--; if (index < 0) index = workspaceCycle ? global.screen.n_workspaces - 1 : 0; } else { index++; if (index == global.screen.n_workspaces) index = workspaceCycle ? 0 : index - 1; } if (global.screen.get_workspace_by_index(index) != null) { global.screen.get_workspace_by_index(index).activate(global.get_current_time()); } this._last_scroll_direction = edir; this._last_scroll_time = etime; } return GLib.SOURCE_CONTINUE; } show_all_windows(time) { let windows = global.get_window_actors(); for(let i = 0; i < windows.length; i++){ let window = windows[i].meta_window; let compositor = windows[i]; compositor.ease( { opacity: 255, mode: Clutter.AnimationMode.EASE_OUT_SINE, duration: time, } ); if (this.peek_blur && compositor.eff) { compositor.remove_effect(compositor.eff); } } } on_applet_clicked(event) { let modifiers = Cinnamon.get_event_state(event); let shift_pressed = (modifiers & Clutter.ModifierType.SHIFT_MASK); let action = shift_pressed ? this.shift_click_action : this.click_action; this.perform_action(action); } on_applet_middle_clicked(event) { let modifiers = Cinnamon.get_event_state(event); let shift_pressed = (modifiers & Clutter.ModifierType.SHIFT_MASK); let action = shift_pressed ? this.shift_middle_click_action : this.middle_click_action; this.perform_action(action); } perform_action(action) { if (action == "show_desktop") this.show_desktop(); else if (action == "show_desklets") this.show_desklets(); else if (action == "show_expo") this.expo(); else if (action == "show_scale") this.scale(); } show_desktop() { global.workspace_manager.toggle_desktop(global.get_current_time()); this.show_all_windows(0); if (this._peek_timeout_id > 0) { Mainloop.source_remove(this._peek_timeout_id); this._peek_timeout_id = 0; } this._did_peek = false; } show_desklets() { Main.deskletContainer.toggle(); } expo() { if (!Main.expo.animationInProgress) Main.expo.toggle(); } scale() { if (!Main.overview.animationInProgress) Main.overview.toggle(); } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonBarApplet(orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/cornerbar@cinnamon.org/metadata.json0000664000175000017500000000037315167446463027634 0ustar fabiofabio{ "uuid": "cornerbar@cinnamon.org", "name": "Corner bar", "description": "A bar designed to be placed in the corner, used to show the desktop, desklets, the workspace selector or the window selector.", "icon": "cs-applets", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/cornerbar@cinnamon.org/settings-schema.json0000664000175000017500000000575115167446463031157 0ustar fabiofabio{ "head" : { "type" : "header", "description" : "Settings" }, "click-action": { "type": "combobox", "description": "Click action", "default": "show_desktop", "options" : { "Show the desktop": "show_desktop", "Show the desklets": "show_desklets", "Show the workspace selector (Expo)": "show_expo", "Show the window selector (Scale)": "show_scale" } }, "middle-click-action": { "type": "combobox", "description": "Middle click action", "default": "show_desklets", "options" : { "Show the desktop": "show_desktop", "Show the desklets": "show_desklets", "Show the workspace selector (Expo)": "show_expo", "Show the window selector (Scale)": "show_scale" } }, "shift-click-action": { "type": "combobox", "description": "Shift + click action", "default": "show_expo", "options" : { "Show the desktop": "show_desktop", "Show the desklets": "show_desklets", "Show the workspace selector (Expo)": "show_expo", "Show the window selector (Scale)": "show_scale" } }, "shift-middle-click-action": { "type": "combobox", "description": "Shift + middle click action", "default": "show_scale", "options" : { "Show the desktop": "show_desktop", "Show the desklets": "show_desklets", "Show the workspace selector (Expo)": "show_expo", "Show the window selector (Scale)": "show_scale" } }, "scroll-behavior": { "type": "combobox", "default": "nothing", "description": "Scroll wheel behavior", "options": { "Nothing": "nothing", "Switch workspaces": "normal", "Switch workspaces (reversed)": "reversed" } }, "peek-at-desktop" : { "type" : "switch", "default" : false, "description": "Peek at the desktop on hover", "tooltip": "Peek at the desktop when hovering the applet" }, "peek-blur" : { "type" : "switch", "default" : false, "dependency" : "peek-at-desktop", "description" : "Blur effect", "tooltip" : "Blur windows when peeking at the desktop" }, "peek-delay" : { "type": "spinbutton", "default" : 400, "min" : 0, "max" : 1000, "step" : 50, "units" : "milliseconds", "dependency" : "peek-at-desktop", "description": "Hover delay", "tooltip": "Delay before Peek shows desktop" }, "peek-opacity": { "type": "scale", "default" : 5, "units": "%", "digits": 0, "min" : 0, "max" : 100, "step" : 5, "dependency" : "peek-at-desktop", "description" : "Window opacity", "tooltip" : "Change the opacity of windows when peeking at the desktop" } } cinnamon-6.6.8/files/usr/share/cinnamon/applets/expo@cinnamon.org/0000775000175000017500000000000015167446463024154 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/expo@cinnamon.org/applet.js0000664000175000017500000000250015167446463025774 0ustar fabiofabioconst Applet = imports.ui.applet; const Lang = imports.lang; const Main = imports.ui.main; const Settings = imports.ui.settings; class CinnamonExpoApplet extends Applet.IconApplet { constructor(metadata, orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); try { this.set_applet_icon_symbolic_name("cinnamon-expo"); this.set_applet_tooltip(_("Expo")); this._hover_activates = false; this.settings = new Settings.AppletSettings(this, metadata.uuid, this.instance_id); this.settings.bind("activate-on-hover", "_hover_activates"); this.actor.connect('enter-event', Lang.bind(this, this._onEntered)); } catch (e) { global.logError(e); } } on_applet_clicked(event) { if (this._hover_activates) return; this.doAction(); } _onEntered(event) { if (!this._hover_activates || global.settings.get_boolean("panel-edit-mode")) return; this.doAction(); } doAction() { if (!Main.expo.animationInProgress) Main.expo.toggle(); } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonExpoApplet(metadata, orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/expo@cinnamon.org/icons/0000775000175000017500000000000015167446463025267 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/expo@cinnamon.org/icons/cinnamon-expo-symbolic.svg0000664000175000017500000000045015167446463032401 0ustar fabiofabio cinnamon-6.6.8/files/usr/share/cinnamon/applets/expo@cinnamon.org/metadata.json0000664000175000017500000000022515167446463026626 0ustar fabiofabio{ "uuid": "expo@cinnamon.org", "name": "Expo", "description": "Click or hover to activate Expo view", "icon": "cs-workspaces", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/expo@cinnamon.org/settings-schema.json0000664000175000017500000000034215167446463030144 0ustar fabiofabio{ "section1": { "type": "section", "description": "Behavior" }, "activate-on-hover": { "type": "switch", "default" : false, "description" : "Activate expo on hover" } } cinnamon-6.6.8/files/usr/share/cinnamon/applets/favorites@cinnamon.org/0000775000175000017500000000000015167446463025203 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/favorites@cinnamon.org/applet.js0000664000175000017500000001163715167446463027036 0ustar fabiofabioconst Gio = imports.gi.Gio; const GLib = imports.gi.GLib; const Gtk = imports.gi.Gtk; const Clutter = imports.gi.Clutter; const St = imports.gi.St; const PopupMenu = imports.ui.popupMenu; const Applet = imports.ui.applet; const XApp = imports.gi.XApp; const Settings = imports.ui.settings; class FavoriteMenuItem extends PopupMenu.PopupBaseMenuItem { constructor(info, show_full_uri, params) { super(params); this.box = new St.BoxLayout({ style_class: 'popup-combobox-item', style: 'padding: 0px;' }); this.info = info; let icon = St.TextureCache.get_default().load_gicon(null, Gio.content_type_get_icon(info.cached_mimetype), 24); let display_text = null; if (show_full_uri) { let file = Gio.File.new_for_uri(info.uri); if (file.is_native() || file.get_path() != null) { display_text = file.get_path().replace(GLib.get_home_dir(), "~"); } else { display_text = info.uri; } } else { display_text = info.display_name; } this.box.add(icon); let label = new St.Label({ text: display_text, y_align: Clutter.ActorAlign.CENTER }); this.box.add(label); this.addActor(this.box); } }; class CinnamonFavoriteApplet extends Applet.IconApplet { constructor(metadata, orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.set_applet_icon_symbolic_name("xsi-user-favorites-symbolic"); this.set_applet_tooltip(_("Favorites")); this.menuManager = new PopupMenu.PopupMenuManager(this); this.menu = new Applet.AppletPopupMenu(this, orientation); this.menuManager.addMenu(this.menu); this.mainContainer = new St.BoxLayout({ vertical: true }); this.menu.addActor(this.mainContainer); this.favoritesScrollBox = new St.ScrollView({ x_fill: true, y_fill: false, y_align: St.Align.START }); this.favoritesScrollBox.set_auto_scrolling(true); this.mainContainer.add(this.favoritesScrollBox); this.favoritesBox = new St.BoxLayout({ vertical:true }); this.favoritesScrollBox.add_actor(this.favoritesBox); this.favoritesScrollBox.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC); this.favoritesScrollBox.add_style_class_name("vfade"); this.settings = new Settings.AppletSettings(this, metadata.uuid, this.instance_id); this.settings.bind("show-full-uri", "_show_full_uri", this.settings_changed); this.favorites = XApp.Favorites.get_default(); this._favoriteButtons = []; this._refreshFavorites(); this.favorites_id = this.favorites.connect('changed', ()=>this._refreshFavorites()); this.edit_mode_id = global.settings.connect('changed::panel-edit-mode', () => this._on_panel_edit_mode_changed()); } settings_changed() { this._refreshFavorites(); } _on_panel_edit_mode_changed() { let reactive = !global.settings.get_boolean('panel-edit-mode'); this.actor.visible = global.settings.get_boolean('panel-edit-mode') || this.favorites.get_n_favorites() > 0; } on_applet_removed_from_panel() { if (this.favorites_id > 0) { this.favorites.disconnect(this.favorites_id); this.favorites_id = 0; } if (this.edit_mode_id > 0) { global.settings.disconnect(this.edit_mode_id); this.edit_mode_id = 0; } this.favorites = null; } on_applet_clicked(event) { this.menu.toggle(); } _launchFile(a, b, c, uri) { this.favorites.launch(uri) } destroy() { if (this.favorites_id > 0) { this.favorites.disconnect(this.favorites_id); this.favorites_id = 0; } this.favorites = null; this.actor._delegate = null; this.menu.destroy(); this.emit('destroy'); } _refreshFavorites() { // Clean content for (let i = 0; i < this._favoriteButtons.length; i ++) { this._favoriteButtons[i].destroy(); } this._favoriteButtons = []; let infos = this.favorites.get_favorites(null); if (infos.length > 0) { for (let i = 0; i < infos.length; i++) { let info = infos[i]; let button = new FavoriteMenuItem(info, this._show_full_uri); button.connect("activate", (button, event)=> { this.favorites.launch(button.info.uri, event.get_time()); this.menu.toggle(); }) this._favoriteButtons.push(button); this.favoritesBox.add_child(button.actor); } } this._on_panel_edit_mode_changed(); } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonFavoriteApplet(metadata, orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/favorites@cinnamon.org/metadata.json0000664000175000017500000000023715167446463027660 0ustar fabiofabio{ "uuid": "favorites@cinnamon.org", "name": "Favorites", "description": "Access your favorite files", "icon": "xapp-favorites-app", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/favorites@cinnamon.org/settings-schema.json0000664000175000017500000000030415167446463031171 0ustar fabiofabio{ "head" : { "type" : "header", "description" : "Settings" }, "show-full-uri": { "type": "switch", "default" : false, "description" : "Display full paths in the list" } } cinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/0000775000175000017500000000000015167446463027124 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/appGroup.js0000664000175000017500000013553015167446463031266 0ustar fabiofabioconst Cinnamon = imports.gi.Cinnamon; const Meta = imports.gi.Meta; const Clutter = imports.gi.Clutter; const GLib = imports.gi.GLib; const Gtk = imports.gi.Gtk; const St = imports.gi.St; const Main = imports.ui.main; const DND = imports.ui.dnd; const Tooltips = imports.ui.tooltips; const PopupMenu = imports.ui.popupMenu; const Mainloop = imports.mainloop; const {SignalManager} = imports.misc.signalManager; const {unref} = imports.misc.util; const createStore = require('./state'); const {AppMenuButtonRightClickMenu, HoverMenuController, AppThumbnailHoverMenu} = require('./menus'); const { FLASH_INTERVAL, FLASH_MAX_COUNT, MAX_BUTTON_WIDTH, BUTTON_BOX_ANIMATION_TIME, RESERVE_KEYS, TitleDisplay } = require('./constants'); const _reLetterRtl = new RegExp("\\p{Script=Hebrew}|\\p{Script=Arabic}", "u"); const _reLetter = new RegExp("\\p{L}", "u"); const getTextDirection = function(text) { for (const l of text) { if (l.match(_reLetterRtl)) return Clutter.TextDirection.RTL; if (l.match(_reLetter)) return Clutter.TextDirection.LTR; } return Clutter.TextDirection.None; } // returns [x1,x2] so that the area between x1 and x2 is // centered in length const center = function(length, naturalLength) { const maxLength = Math.min(length, naturalLength); const x1 = Math.floor((length - maxLength) / 2); const x2 = x1 + maxLength; return [x1, x2]; }; const getFocusState = function(metaWindow) { if (!metaWindow || metaWindow.minimized) { return false; } if (metaWindow.appears_focused) { return true; } if (global.display.focus_window && metaWindow.is_ancestor_of_transient(global.display.focus_window)) return true; return false; }; class AppGroup { constructor(params) { this.state = params.state; this.workspaceState = params.workspaceState; this.groupState = createStore({ app: params.app, appId: params.appId, appName: params.app.get_name(), appInfo: params.app.get_app_info(), metaWindows: params.metaWindows || [], windowCount: params.metaWindows ? params.metaWindows.length : 0, lastFocused: params.metaWindow || null, isFavoriteApp: !params.metaWindow ? true : params.isFavoriteApp === true, autoStartIndex: this.state.autoStartApps.findIndex( app => app.id === params.appId), willUnmount: false, tooltip: null, // Not to be confused with the vertical thumbnail setting, this is for overriding horizontal // orientation when there are too many thumbnails to fit the monitor without making them tiny. verticalThumbs: false, groupReady: false, thumbnailMenuEntered: false, fileDrag: false, pressed: true }); this.groupState.connect({ isFavoriteApp: () => this.handleFavorite(true), getActor: () => this.actor, launchNewInstance: (...args) => this.launchNewInstance(...args), checkFocusStyle: () => this.checkFocusStyle() }); this.signals = new SignalManager(null); this.appKeyTimeout = 0; this.flashTimer = 0; // TODO: This needs to be in state so it can be updated more reliably. this.labelVisiblePref = this.state.settings.titleDisplay !== TitleDisplay.None && this.state.isHorizontal; this.drawLabel = this.labelVisiblePref; this.progress = 0; this.actor = new Cinnamon.GenericContainer({ name: 'appButton', style_class: 'grouped-window-list-item-box', important: true, reactive: !this.state.panelEditMode, can_focus: true, track_hover: true }); this.actor._delegate = this; this.progressOverlay = new St.Widget({ name: 'progressOverlay', style_class: 'progress', reactive: false, important: true, show_on_set_parent: false }); this.actor.add_child(this.progressOverlay); // Create the app button icon, window count and notification badges, and text label for titleDisplay this.iconBox = new Cinnamon.Slicer({name: 'appMenuIcon'}); this.actor.add_child(this.iconBox); this.setActorAttributes(null, params.metaWindow); this.windowsBadge = new St.BoxLayout({ style_class: 'grouped-window-list-badge', important: true, x_align: St.Align.MIDDLE, y_align: St.Align.MIDDLE, show_on_set_parent: false, }); this.windowsBadgeLabel = new St.Label({ style_class: 'grouped-window-list-number-label', important: true, text: '' }); this.windowsBadgeLabel.clutter_text.ellipsize = false; this.windowsBadge.add(this.windowsBadgeLabel, { x_align: St.Align.START, y_align: St.Align.START, }); this.actor.add_child(this.windowsBadge); this.windowsBadge.set_text_direction(St.TextDirection.LTR); this.notificationsBadge = new St.BoxLayout({ style_class: 'grouped-window-list-notifications-badge', important: true, x_align: St.Align.MIDDLE, y_align: St.Align.MIDDLE, show_on_set_parent: false, }); this.notificationsBadgeLabel = new St.Label({ style_class: 'grouped-window-list-notifications-badge-label', important: true, text: '' }); this.notificationsBadgeLabel.clutter_text.ellipsize = false; this.notificationsBadge.add(this.notificationsBadgeLabel, { x_align: St.Align.START, y_align: St.Align.START, }); this.actor.add_child(this.notificationsBadge); this.notificationsBadge.set_text_direction(St.TextDirection.LTR); this.label = new St.Label({ style_class: 'grouped-window-list-button-label', important: true, text: '', x_align: St.Align.START, show_on_set_parent: this.state.settings.titleDisplay > 1 }); this.actor.add_child(this.label); this.groupState.set({tooltip: new Tooltips.PanelItemTooltip({actor: this.actor}, '', this.state.orientation)}); this._draggable = new DND._Draggable(this.actor); this._draggable.inhibit = !this.state.settings.enableDragging; this.signals.connect(this.actor, 'get-preferred-width', (...args) => this.getPreferredWidth(...args)); this.signals.connect(this.actor, 'get-preferred-height', (...args) => this.getPreferredHeight(...args)); this.signals.connect(this.actor, 'allocate', (...args) => this.allocate(...args)); this.signals.connect(this.actor, 'enter-event', (...args) => this.onEnter(...args)); this.signals.connect(this.actor, 'leave-event', (...args) => this.onLeave(...args)); this.signals.connect(this.actor, 'button-release-event', (...args) => this.onAppButtonRelease(...args)); this.signals.connect(this.actor, 'button-press-event', (...args) => this.onAppButtonPress(...args)); this.signals.connect(this._draggable, 'drag-begin', (...args) => this.onDragBegin(...args)); this.signals.connect(this._draggable, 'drag-cancelled', (...args) => this.onDragCancelled(...args)); this.calcWindowNumber(); this.on_orientation_changed(true); this.handleFavorite(); } initThumbnailMenu() { this.hoverMenuManager = new HoverMenuController(this.actor, this.groupState); this.hoverMenu = new AppThumbnailHoverMenu(this.state, this.groupState); this.hoverMenu.actor.hide(); Main.layoutManager.addChrome(this.hoverMenu.actor, {}); this.hoverMenu.setVerticalSetting(); this.hoverMenu.actor.set_style_class_name(''); this.hoverMenu.box.set_important(true); this.hoverMenu.box.set_style_class_name('grouped-window-list-thumbnail-menu'); this.hoverMenuManager.addMenu(this.hoverMenu); this.signals.connect(this.hoverMenu.actor, 'enter-event', (...args) => this.hoverMenu.onMenuEnter.call(this.hoverMenu, ...args)); this.signals.connect(this.hoverMenu.actor, 'leave-event', (...args) => this.hoverMenu.onMenuLeave.call(this.hoverMenu, ...args)); this.signals.connect(this.hoverMenu.actor, 'key-release-event', (...args) => this.hoverMenu.onKeyRelease.call(this.hoverMenu, ...args)); this.signals.connect(this.hoverMenu.actor, 'scroll-event', (c, e) => this.state.trigger('cycleWindows', e, this.actor._delegate)); this.signals.connect(this.hoverMenu.box, 'key-press-event', (...args) => this.hoverMenu.onKeyPress.call(this.hoverMenu, ...args)); } initRightClickMenu() { const {state, groupState, actor} = this; this.rightClickMenu = new AppMenuButtonRightClickMenu({ state, groupState, actor }, this.state.orientation); this.rightClickMenuManager = new PopupMenu.PopupMenuManager({actor}); this.rightClickMenuManager.addMenu(this.rightClickMenu); } on_orientation_changed(fromInit) { this.actor.set_style_class_name('grouped-window-list-item-box'); if (this.state.orientation === St.Side.TOP) { this.actor.add_style_class_name('top'); } else if (this.state.orientation === St.Side.BOTTOM) { this.actor.add_style_class_name('bottom'); } else if (this.state.orientation === St.Side.LEFT) { this.actor.add_style_class_name('left'); } else if (this.state.orientation === St.Side.RIGHT) { this.actor.add_style_class_name('right'); } if (this.state.appletReady && !fromInit) { this.setActorAttributes(); } if (fromInit) this.groupState.set({groupReady: true}); } setActorAttributes(iconSize, metaWindow) { if (!iconSize) { iconSize = this.state.trigger('getPanelIconSize'); } this.iconSize = iconSize; this.actor.style = null; const panelHeight = this.state.trigger('getPanelHeight'); if (this.state.isHorizontal) { this.actor.height = panelHeight; } this.setIcon(metaWindow); this.setIconPadding(panelHeight); this.setMargin(); } setIconPadding(panelHeight) { this.iconBox.style = 'padding: 0px'; if (!this.state.isHorizontal) return; this.actor.style = 'padding-left: 0px; padding-right: 0px;'; } setMargin() { const appletActor = this.state.appletActor; const direction = this.state.isHorizontal ? 'right' : 'bottom'; const existingStyle = this.actor.style ? this.actor.style : ''; let spacing = parseInt(appletActor.get_theme_node().get_length('spacing')); if (!spacing) { spacing = 6; } this.actor.style = existingStyle + 'margin-' + direction + ':' + spacing + 'px;'; } setIcon(metaWindow) { let icon; if (this.groupState.app) { if (metaWindow && (!this.state.settings.groupApps || this.groupState.app.is_window_backed())) { icon = this.groupState.app.create_icon_texture_for_window(this.iconSize, metaWindow); } else { icon = this.groupState.app.create_icon_texture(this.iconSize); } } else { icon = new St.Icon({ icon_name: 'application-default-icon', icon_type: St.IconType.FULLCOLOR, icon_size: this.iconSize }); } if (icon instanceof St.Icon) { let gicon = icon.get_gicon(); if (gicon?.get_names) { let iconTheme = Gtk.IconTheme.get_default(); let hasAnyIcon = gicon.get_names() .some(name => iconTheme.lookup_icon(name, icon.icon_size, 0)); if (!hasAnyIcon) { icon = new St.Icon({ icon_name: 'application-x-executable', icon_size: this.iconSize, icon_type: St.IconType.FULLCOLOR }); } } } const oldChild = this.iconBox.get_child(); this.iconBox.set_child(icon); if (oldChild) oldChild.destroy(); } setText(text) { if (text && (typeof text === 'string' || text instanceof String) && text.length > 0 && this.label) { this.label.set_text(text); } } getAttention() { if (this._needsAttention) return; this._needsAttention = true; this.flashButton(); } flashButton() { if (!this._needsAttention || !this.actor || this.flashTimer) return; if (!this.groupState.groupReady && this.groupState.isFavoriteApp) return; let counter = 0; const sc = "grouped-window-list-item-demands-attention"; this.flashTimer = Mainloop.timeout_add(FLASH_INTERVAL, () => { if (!this._needsAttention) { this.flashTimer = 0; return GLib.SOURCE_REMOVE; } if (this.actor.has_style_class_name(sc)) { this.actor.add_style_class_name("active"); this.actor.remove_style_class_name(sc); } else { this.actor.remove_style_class_name("active") this.actor.add_style_class_name(sc); } const continueFlashing = (counter++ < FLASH_MAX_COUNT); if (!continueFlashing) { this.flashTimer = 0; } return continueFlashing; }); } getPreferredWidth(actor, forHeight, alloc) { const [iconMinSize, iconNaturalSize] = this.iconBox.get_preferred_width(forHeight); const [labelMinSize, labelNaturalSize] = this.label.get_preferred_width(forHeight); // The label text starts in the center of the icon, so we should allocate the space // needed for the icon plus the space needed for(label - icon/2) alloc.min_size = 1 * global.ui_scale; const {appId} = this.groupState; const allocateForLabel = this.labelVisiblePref || (this.state.settings.titleDisplay == TitleDisplay.Focused && this.workspaceState.lastFocusedApp === appId); if (this.state.orientation === St.Side.TOP || this.state.orientation === St.Side.BOTTOM) { if (allocateForLabel) { const max = this.labelVisiblePref && this.groupState.metaWindows.length > 0 ? labelNaturalSize + iconNaturalSize + 6 : 0; alloc.natural_size = Math.min(iconNaturalSize + Math.max(max, labelNaturalSize), MAX_BUTTON_WIDTH * global.ui_scale); } else { alloc.natural_size = iconNaturalSize + 6 * global.ui_scale; } } else { alloc.natural_size = this.state.trigger('getPanelHeight'); } } getPreferredHeight(actor, forWidth, alloc) { let [iconMinSize, iconNaturalSize] = this.iconBox.get_preferred_height(forWidth); let [labelMinSize, labelNaturalSize] = this.label.get_preferred_height(forWidth); alloc.min_size = Math.min(iconMinSize, labelMinSize); alloc.natural_size = Math.max(iconNaturalSize, labelNaturalSize); } allocate(actor, box, flags) { const allocWidth = box.x2 - box.x1; const allocHeight = box.y2 - box.y1; const childBox = new Clutter.ActorBox(); const windowBadgeBox = new Clutter.ActorBox(); const notifBadgeBox = new Clutter.ActorBox(); const direction = this.actor.get_text_direction(); // Set the icon to be left-justified (or right-justified) and centered vertically const [minWidth, minHeight, naturalWidth, naturalHeight] = this.iconBox.get_preferred_size(); const iconYPadding = Math.floor(Math.max(0, allocHeight - naturalHeight) / 2); this.drawLabel = this.labelVisiblePref && allocWidth >= naturalWidth + 10 * global.ui_scale; childBox.y1 = box.y1 + iconYPadding; childBox.y2 = childBox.y1 + Math.min(naturalHeight, allocHeight); if (this.drawLabel && this.groupState.metaWindows.length > 0) { childBox.x1 = direction === Clutter.TextDirection.LTR ? box.x1 + 6 : Math.max(box.x1, box.x2 - 6 - naturalWidth); childBox.x2 = Math.min(childBox.x1 + naturalWidth, box.x2); } else { const offset = this.state.orientation === St.Side.LEFT ? this.actor.style_length('border-left-width') * 2 : 0; [childBox.x1, childBox.x2] = center(allocWidth + offset, naturalWidth); } this.iconBox.allocate(childBox, flags); // Set windows badge position const windowBadgeOffset = 3 * global.ui_scale; const windowBadgeXCenter = this.iconBox.x + windowBadgeOffset; const windowBadgeYCenter = this.iconBox.y + windowBadgeOffset; const [wLabelMinWidth, wLabelMinHeight, wLabelNaturalWidth, wLabelNaturalHeight] = this.windowsBadgeLabel.get_preferred_size(); const windowBadgesize = Math.max(wLabelNaturalWidth, wLabelNaturalHeight); windowBadgeBox.x1 = Math.max(windowBadgeXCenter - Math.floor(windowBadgesize / 2), 0); windowBadgeBox.x2 = windowBadgeBox.x1 + windowBadgesize; windowBadgeBox.y1 = Math.max(windowBadgeYCenter - Math.floor(windowBadgesize / 2), 0); windowBadgeBox.y2 = windowBadgeBox.y1 + windowBadgesize; const windowLabelPosX = Math.floor((windowBadgesize - wLabelNaturalWidth) / 2); const windowLabelPosY = Math.floor((windowBadgesize - wLabelNaturalHeight) / 2); this.windowsBadgeLabel.set_anchor_point(-windowLabelPosX, -windowLabelPosY); this.windowsBadge.set_size(windowBadgesize, windowBadgesize); this.windowsBadge.allocate(windowBadgeBox, flags); // Set notifications badge position const notifBadgeOffset = 3 * global.ui_scale; const notifBadgeXCenter = this.iconBox.x + this.iconBox.width - notifBadgeOffset; const notifBadgeYCenter = this.iconBox.y + notifBadgeOffset; const [nLabelMinWidth, nLabelMinHeight, nLabelNaturalWidth, nLabelNaturalHeight] = this.notificationsBadgeLabel.get_preferred_size(); const notifBadgesize = Math.max(nLabelNaturalWidth, nLabelNaturalHeight); notifBadgeBox.x2 = Math.min(notifBadgeXCenter + Math.floor(notifBadgesize / 2), box.x2); notifBadgeBox.x1 = notifBadgeBox.x2 - notifBadgesize; notifBadgeBox.y1 = Math.max(notifBadgeYCenter - Math.floor(notifBadgesize / 2), 0); notifBadgeBox.y2 = notifBadgeBox.y1 + notifBadgesize; const notifLabelPosX = Math.floor((notifBadgesize - nLabelNaturalWidth) / 2); const notifLabelPosY = Math.floor((notifBadgesize - nLabelNaturalHeight) / 2); this.notificationsBadgeLabel.set_anchor_point(-notifLabelPosX, -notifLabelPosY); this.notificationsBadge.set_size(notifBadgesize, notifBadgesize); this.notificationsBadge.allocate(notifBadgeBox, flags); // Set label position if (this.drawLabel) { const textDirection = getTextDirection(this.label.get_text()); const labelNaturalHeight = this.label.get_preferred_size()[3]; const labelYPadding = Math.floor(Math.max(0, allocHeight - labelNaturalHeight) / 2); childBox.y1 = box.y1 + labelYPadding; childBox.y2 = childBox.y1 + Math.min(labelNaturalHeight, allocHeight); if (direction === Clutter.TextDirection.LTR) { childBox.x1 = Math.min(this.iconBox.x + this.iconBox.width, box.x2); childBox.x2 = box.x2; } else { childBox.x1 = box.x1; childBox.x2 = this.iconBox.x; } // Set text alignment if (textDirection === St.TextDirection.LTR) this.label.set_style('text-align: left;'); else if (textDirection === St.TextDirection.RTL) this.label.set_style('text-align: right;'); else if (direction === St.TextDirection.LTR) this.label.set_style('text-align: left;'); else this.label.set_style('text-align: right;'); this.label.allocate(childBox, flags); } // Call set_icon_geometry for support of Cinnamon's minimize animation if (this.groupState.metaWindows.length > 0 && this.actor.realized) { const rect = new Meta.Rectangle(); [rect.x, rect.y] = this.actor.get_transformed_position(); [rect.width, rect.height] = this.actor.get_transformed_size(); this.groupState.metaWindows.forEach( metaWindow => { if (metaWindow) { metaWindow.set_icon_geometry(rect); } }); } if (this.progressOverlay.visible) this.allocateProgress(childBox, flags); } showLabel(animate = false) { if (this.labelVisiblePref || !this.label || !this.state.isHorizontal || this.label.is_finalized() || !this.label.realized) { return; } const width = MAX_BUTTON_WIDTH * global.ui_scale; this.labelVisiblePref = true; if (this.label.text == null) { this.label.set_text(''); } if (!animate) { this.label.show(); this.label.width = width; return; } this.label.ease({ width, duration: BUTTON_BOX_ANIMATION_TIME, mode: Clutter.AnimationMode.EASE_OUT_QUAD, onStopped: () => { if (!this.label) return; this.label.show(); } }); return; } hideLabel() { if (!this.label || this.label.is_finalized() || !this.label.realized) return; this.label.set_text(''); this.labelVisiblePref = false; this.label.width = 1; this.label.hide(); } onEnter() { if (this.state.panelEditMode) return false; this.actor.add_style_pseudo_class('hover'); if (!this.hoverMenu) { this.initThumbnailMenu(); } this.hoverMenu.onMenuEnter(); } onLeave() { this.groupState.pressed = false; if (this.state.panelEditMode) return false; if (this.hoverMenu) this.hoverMenu.onMenuLeave(); this.resetHoverStatus(); this.checkFocusStyle(); } checkFocusStyle() { if (this.actor.is_finalized()) return; const focused = this.groupState.metaWindows.some( metaWindow => getFocusState(metaWindow) ); if (focused) { this.actor.add_style_pseudo_class('focus'); } } resetHoverStatus() { if (this.actor.is_finalized()) return; this.actor.remove_style_pseudo_class('hover'); } setActiveStatus(state) { if (state && !this.actor.has_style_pseudo_class('active')) { this.actor.add_style_pseudo_class('active'); } else { this.actor.remove_style_pseudo_class('active'); } } averageProgress() { const {metaWindows} = this.groupState; let total = 0; let count = 0; metaWindows.forEach( metaWindow => { const {progress} = metaWindow; if (progress < 1) return; total += progress; count++; }); return total / count; } allocateProgress(childBox = null, flags = 0) { if (!childBox) childBox = new Clutter.ActorBox(); childBox.y1 = 0; childBox.y2 = this.actor.height; if (St.Widget.get_default_direction() === St.TextDirection.RTL) { childBox.x1 = Math.max(this.actor.width * ((100 - this.progress) / 100.0), 1.0); childBox.x2 = this.actor.width; } else { childBox.x1 = 0; childBox.x2 = Math.max(this.actor.width * (this.progress / 100.0), 1.0); } this.progressOverlay.allocate(childBox, flags); } onProgressChange(metaWindow) { const progress = this.averageProgress(); if (progress !== this.progress) { this.progress = progress; if (this.progress > 0) { if (!this.progressOverlay.visible) this.progressOverlay.show(); this.allocateProgress(); } else { this.progressOverlay.hide(); } } } onFocusChange(hasFocus) { const {appId, metaWindows, lastFocused} = this.groupState; if (hasFocus === undefined) { hasFocus = this.workspaceState.lastFocusedApp === appId; } // If any of the windows associated with our app have focus, // we should set ourselves to active if (hasFocus) { this.workspaceState.trigger('updateFocusState', appId); this.actor.add_style_pseudo_class('focus'); this.actor.remove_style_class_name('grouped-window-list-item-demands-attention'); if (this.hoverMenu) { this.hoverMenu.appThumbnails.forEach( thumbnail => thumbnail.setThumbnailDemandsAttention(false) ); } this._needsAttention = false; } else { this.actor.remove_style_pseudo_class('focus'); } if (metaWindows.length > 0) { this.actor.add_style_pseudo_class('active'); } this.resetHoverStatus(); if (lastFocused) this.handleButtonLabel(lastFocused, hasFocus, true); } onWindowDemandsAttention(metaWindow) { // Prevent apps from indicating attention when they are starting up. if (!this.groupState || !this.groupState.groupReady || this.groupState.willUnmount) { return; } this.groupState.metaWindows.forEach( window => { if (window === metaWindow && !getFocusState(window)) { // Even though this may not be the last focused window, we want it to be // the window that gets focused when a user responds to an alert. this.groupState.set({lastFocused: metaWindow}); this.handleButtonLabel(metaWindow); this.getAttention(); return true; } }); return false; } onDragBegin() { // Keep the drag actor contained within the applet area let [x, y] = this.actor.get_transformed_position(); if (this.state.isHorizontal) { this._draggable._overrideY = Math.round(y); this._draggable._overrideX = null; } else { this._draggable._overrideX = Math.round(x); this._draggable._overrideY = null; } if (this.rightClickMenu) this.rightClickMenu.close(false); if (this.hoverMenu) this.groupState.trigger('hoverMenuClose'); } onDragCancelled() { this.state.trigger('moveLauncher', this); } handleDragOver(source, actor, x, y, time) { if (!this.state.settings.enableDragging || actor.name != "xdnd-proxy-actor" || this.state.panelEditMode) { return DND.DragMotionResult.CONTINUE; } const nWindows = this.groupState.metaWindows.length; if (nWindows > 0 && this.groupState.lastFocused) { if (nWindows === 1) { Main.activateWindow(this.groupState.lastFocused, global.get_current_time()); } else { if (this.groupState.fileDrag) { this.workspaceState.trigger('closeAllHoverMenus'); } // Open the thumbnail menu and activate the window corresponding to the dragged over thumbnail. if (!this.hoverMenu) this.initThumbnailMenu(); this.groupState.set({fileDrag: true}); this.hoverMenu.open(true); } } return DND.DragMotionResult.CONTINUE; } getDragActor() { return this.groupState.app.create_icon_texture(this.state.trigger('getPanelHeight') / global.ui_scale); } // Returns the original actor that should align with the actor // we show as the item is being dragged. getDragActorSource() { return this.actor; } showOrderLabel(number) { this.windowsBadgeLabel.text = (number + 1).toString(); this.windowsBadge.show(); } launchNewInstance(offload=false) { if (offload) { try { this.groupState.app.launch_offloaded(0, [], -1); } catch (e) { logError(e, "Could not launch app with dedicated gpu: "); } } else { this.groupState.app.open_new_window(-1); } this.animate(); } onAppButtonRelease(actor, event) { if (!this.groupState.pressed) { return; } const button = event.get_button(); const nWindows = this.groupState.metaWindows.length; const modifiers = Cinnamon.get_event_state(event); const ctrlPressed = (modifiers & Clutter.ModifierType.CONTROL_MASK); const shiftPressed = (modifiers & Clutter.ModifierType.SHIFT_MASK); const shouldStartInstance = ( (button === 1 && ctrlPressed) || (button === 1 && shiftPressed) || (button === 1 && this.groupState.isFavoriteApp && nWindows === 0 && (this.state.settings.leftClickAction === 2 || nWindows < 1)) || (button === 2 && this.state.settings.middleClickAction === 2) ); const shouldEndInstance = button === 2 && this.state.settings.middleClickAction === 3 && this.groupState.lastFocused && nWindows > 0; if (shouldStartInstance) { this.launchNewInstance(); return; } if (shouldEndInstance) { this.groupState.lastFocused.delete(global.get_current_time()); return; } const handleMinimizeToggle = (win) => { if (this.state.settings.onClickThumbs && nWindows > 1) { if (!this.hoverMenu) this.initThumbnailMenu(); if (this.hoverMenu.isOpen) { this.hoverMenu.close(); } else { this.hoverMenu.open(); } if (this.state.lastOverlayPreview) { this.hoverMenu.appThumbnails[0].destroyOverlayPreview(); this.hoverMenu.close(true); } return; } if (win.appears_focused) { win.minimize(); } else { Main.activateWindow(win, global.get_current_time()); } }; if (button === 1) { if (this.state.settings.leftClickAction === 1) { return; } if (this.state.settings.leftClickAction === 3 && nWindows > 1) { let foundActive = false; for (let i = 0, len = nWindows; i < len; i++) { if ( this.groupState.lastFocused && this.groupState.metaWindows[i] === this.groupState.lastFocused ) { if (this.groupState.metaWindows[i].appears_focused) { this.state.trigger("cycleWindows", null, this.actor._delegate); } else { handleMinimizeToggle(this.groupState.metaWindows[i]); } foundActive = true; break; } } if (!foundActive) { handleMinimizeToggle(this.groupState.metaWindows[0]); } return; } if (this.hoverMenu) this.hoverMenu.shouldOpen = false; if (this.rightClickMenu && this.rightClickMenu.isOpen) { this.rightClickMenu.toggle(); } if (nWindows === 1) { handleMinimizeToggle(this.groupState.metaWindows[0]); } else { let actionTaken = false; for (let i = 0, len = nWindows; i < len; i++) { if (this.groupState.lastFocused && this.groupState.metaWindows[i] === this.groupState.lastFocused) { handleMinimizeToggle(this.groupState.metaWindows[i]); actionTaken = true; break; } } if (!actionTaken) { handleMinimizeToggle(this.groupState.metaWindows[0]); } } } else if (button === 3) { if (!this.rightClickMenu) this.initRightClickMenu(); if (!this.rightClickMenu.isOpen) { this.workspaceState.trigger('closeAllRightClickMenus', () => { this.workspaceState.trigger('closeAllHoverMenus', () => { this.rightClickMenu.toggle(); }); }); } else { this.workspaceState.trigger('closeAllRightClickMenus', this.workspaceState.trigger('closeAllHoverMenus')); } } if (this.hoverMenu) this.hoverMenu.onButtonPress(); } onAppButtonPress(actor, event) { const button = event.get_button(); this.groupState.pressed = true; if (button === 3) return true; return false; } onAppKeyPress() { if (this.groupState.isFavoriteApp && this.groupState.metaWindows.length === 0) { this.launchNewInstance(); } else { if (this.appKeyTimeout) { clearTimeout(this.appKeyTimeout); this.appKeyTimeout = 0; } if (this.groupState.metaWindows.length > 1) { if (!this.hoverMenu) this.initThumbnailMenu(); this.hoverMenu.open(true); } else { this.workspaceState.trigger('closeAllHoverMenus'); } this.windowHandle(); this.appKeyTimeout = setTimeout(() => { if (this.groupState.thumbnailMenuEntered) { clearTimeout(this.appKeyTimeout); this.appKeyTimeout = 0; return; } if (this.hoverMenu) { this.hoverMenu.close(true); } this.appKeyTimeout = 0; }, this.state.settings.showAppsOrderTimeout); } } windowHandle() { if (this.groupState.lastFocused.appears_focused) { if (this.groupState.metaWindows.length > 1) { let nextWindow = null; for (let i = 0, max = this.groupState.metaWindows.length - 1; i < max; i++) { if (this.groupState.metaWindows[i] === this.groupState.lastFocused) { nextWindow = this.groupState.metaWindows[i + 1]; break; } } if (nextWindow === null) { nextWindow = this.groupState.metaWindows[0]; } Main.activateWindow(nextWindow, global.get_current_time()); } else { this.groupState.lastFocused.minimize(); this.actor.remove_style_pseudo_class('focus'); } } else { if (this.groupState.lastFocused.minimized) { this.groupState.lastFocused.unminimize(); } const ws = this.groupState.lastFocused.get_workspace().index(); if (ws !== global.workspace_manager.get_active_workspace_index()) { global.workspace_manager.get_workspace_by_index(ws).activate(global.get_current_time()); } Main.activateWindow(this.groupState.lastFocused, global.get_current_time()); this.actor.add_style_pseudo_class('focus'); } } windowAdded(metaWindow) { const {metaWindows, trigger, set} = this.groupState; const refWindow = metaWindows.indexOf(metaWindow); if (metaWindow) { this.signals.connect(metaWindow, 'notify::title', (...args) => this.onWindowTitleChanged(...args)); this.signals.connect(metaWindow, 'notify::appears-focused', (...args) => this.onFocusWindowChange(...args)); this.signals.connect(metaWindow, 'notify::gtk-application-id', (w) => this.onAppChange(w)); this.signals.connect(metaWindow, 'notify::wm-class', (w) => this.onAppChange(w)); this.signals.connect(metaWindow, 'unmanaged', (w) => this.onAppChange(w)); this.signals.connect(metaWindow, 'notify::icon', (w) => this.setIcon(w)); if (metaWindow.progress !== undefined) { // Check if GWL is starting with pre-existing windows that have progress, // and defer to the next tick in case the actor isn't on the stage yet. if (metaWindow.progress > 0 || this.progress > 0) { setTimeout(() => this.onProgressChange(), 0); } else { this.progress = 0; } this.signals.connect(metaWindow, 'notify::progress', () => this.onProgressChange(metaWindow)); } // Set the initial button label as not all windows will get updated via signals initially. if (this.state.settings.titleDisplay > 1) { this.onWindowTitleChanged(metaWindow); } if (refWindow === -1) { metaWindows.push(metaWindow); if (this.hoverMenu) trigger('addThumbnailToMenu', metaWindow); } // update icon using recent window for cases when the first window of an app doesn't have an icon. e.g: VirtualBox VM this.setIcon(metaWindow) this.calcWindowNumber(); this.updateNotificationsBadge(); this.onFocusChange(); } set({ metaWindows, lastFocused: metaWindow }); this.handleFavorite(); } windowRemoved(metaWorkspace, metaWindow, refWindow, cb) { if (refWindow === -1) return; this.signals.disconnect('notify::title', metaWindow); this.signals.disconnect('notify::appears-focused', metaWindow); this.signals.disconnect('notify::gtk-application-id', metaWindow); this.signals.disconnect('notify::wm-class', metaWindow); this.groupState.metaWindows.splice(refWindow, 1); if (this.progressOverlay.visible) this.onProgressChange(); if (this.groupState.metaWindows.length > 0 && !this.groupState.willUnmount) { this.onWindowTitleChanged(this.groupState.lastFocused); this.groupState.set({ metaWindows: this.groupState.metaWindows, lastFocused: this.groupState.metaWindows[this.groupState.metaWindows.length - 1] }, true); if (this.hoverMenu) this.groupState.trigger('removeThumbnailFromMenu', metaWindow); this.calcWindowNumber(); } else { // This is the last window, so this group needs to be destroyed. We'll call back windowRemoved // in workspace to put the final nail in the coffin. if (typeof cb === 'function') { if (this.hoverMenu && this.groupState.isFavoriteApp) { this.groupState.trigger('removeThumbnailFromMenu', metaWindow); } cb(this.groupState.appId, this.groupState.isFavoriteApp); } } } onAppChange(metaWindow) { if (!this.workspaceState) return; this.workspaceState.trigger('windowRemoved', metaWindow); this.workspaceState.trigger('windowAdded', metaWindow); } onWindowTitleChanged(metaWindow, refresh) { if (this.groupState.willUnmount || !this.state.settings) { return; } const shouldHideLabel = this.state.settings.titleDisplay === TitleDisplay.None || !this.state.isHorizontal; if (shouldHideLabel) { this.setText(''); } if (!refresh && (!metaWindow || !metaWindow.title || (this.groupState.metaWindows.length === 0 && this.groupState.isFavoriteApp) || !this.state.isHorizontal)) { this.hideLabel(); return; } if ((metaWindow.lastTitle && metaWindow.lastTitle === metaWindow.title) && !refresh && shouldHideLabel) { return; } metaWindow.lastTitle = metaWindow.title; if (this.hoverMenu) { const thumbnail = this.hoverMenu.appThumbnails.find( thumbnail => thumbnail.metaWindow === metaWindow ); if (thumbnail) { thumbnail.labelContainer.child.set_text(metaWindow.title); } } this.groupState.set({ appName: this.groupState.app.get_name() }); this.handleButtonLabel(metaWindow); } onFocusWindowChange(metaWindow) { if (this.groupState.metaWindows.length === 0) return; const hasFocus = getFocusState(metaWindow); if (hasFocus && this.groupState.hasOwnProperty('lastFocused')) { this.workspaceState.set({lastFocusedApp: this.groupState.appId}); this.groupState.set({lastFocused: metaWindow}); } this.onFocusChange(hasFocus); if (this.state.settings.sortThumbs && this.hoverMenu) { this.hoverMenu.addThumbnail(metaWindow); } } handleButtonLabel(metaWindow, focus, animate = false) { if (this.state.settings.titleDisplay === TitleDisplay.None) { return; } if (!metaWindow || this.groupState.metaWindows.length === 0) { this.hideLabel(); } else if (this.state.settings.titleDisplay === TitleDisplay.Title) { this.setText(metaWindow.title); this.showLabel(animate); } else if (this.state.settings.titleDisplay === TitleDisplay.App) { if (this.groupState.appName) { this.setText(this.groupState.appName); this.showLabel(animate); } } else if (this.state.settings.titleDisplay === TitleDisplay.Focused) { this.setText(metaWindow.title); if (focus === undefined) focus = getFocusState(metaWindow); if (focus && this.groupState.metaWindows.length > 0) { this.showLabel(animate); // If a skip-taskbar window is focused from this group, do nothing. // Show the last trackable window's label because the application is focused. } else if (global.display.focus_window && this.groupState.appId.indexOf(global.display.focus_window.wm_class.toLowerCase()) === -1) { this.hideLabel(); } } } handleFavorite(changed) { if (this.actor.is_finalized()) return; if (changed) { setTimeout(() => this.workspaceState.trigger('updateAppGroupIndexes', this.groupState.appId), 0); } if (this.groupState.metaWindows.length === 0 && this.state.appletReady) { if (this.hoverMenu) this.hoverMenu.close(); this.onLeave(); return; } this.onWindowTitleChanged(this.groupState.lastFocused); this.onFocusChange(); this.checkFocusStyle(); } calcWindowNumber() { if (this.groupState.willUnmount) return; this.groupState.set({windowCount: this.groupState.metaWindows ? this.groupState.metaWindows.length : 0}); if (this.groupState.windowCount > 1 && this.state.settings.enableWindowCountBadges) { this.windowsBadgeLabel.text = this.groupState.windowCount.toString(); this.windowsBadge.show(); } else { this.windowsBadge.hide(); } } updateNotificationsBadge() { const nCount = Main.notificationDaemon.getNotificationCountForApp(this.groupState.app); if (nCount > 0 && this.state.settings.enableNotificationBadges) { this.notificationsBadgeLabel.text = nCount.toString(); this.notificationsBadge.show(); } else { this.notificationsBadge.hide(); } } handleTitleDisplayChange() { this.groupState.metaWindows.forEach( win => this.onWindowTitleChanged(win, true) ); } animate() { const effect = this.state.settings.launcherAnimationEffect; if (effect === 1) return; else if (effect === 2) { this.iconBox.set_z_rotation_from_gravity(0.0, Clutter.Gravity.CENTER); this.iconBox.ease({ opacity: 70, duration: 200, mode: Clutter.AnimationMode.LINEAR, onStopped: () => { this.iconBox.ease({ opacity: 255, duration: 200, mode: Clutter.AnimationMode.LINEAR, }); } }); } else if (effect === 3) { this.iconBox.set_pivot_point(0.5, 0.5); this.iconBox.ease({ scale_x: 0.8, scale_y: 0.8, duration: 175, mode: Clutter.AnimationMode.EASE_OUT_QUAD, onStopped: () => { this.iconBox.ease({ scale_x: 1.1, scale_y: 1.1, duration: 175, mode: Clutter.AnimationMode.EASE_OUT_QUAD, onStopped: () => { this.iconBox.ease({ scale_x: 1.0, scale_y: 1.0, duration: 50, mode: Clutter.AnimationMode.EASE_OUT_QUAD, }); } }); } }); } } destroy(skipRefCleanup) { this.signals.disconnectAllSignals(); this.groupState.set({willUnmount: true}); if (this.flashTimer > 0) { Mainloop.source_remove(this.flashTimer); this.flashTimer = 0; } if (this.rightClickMenu) { if (this.rightClickMenu.isOpen) { this.rightClickMenu.close(); } this.rightClickMenu.destroy(); } if (this.hoverMenu) { Main.layoutManager.removeChrome(this.hoverMenu.actor); this.hoverMenu.destroy(); } this.workspaceState.trigger('removeChild', this.actor); this.actor.destroy(); if (!skipRefCleanup) { this.groupState.destroy(); unref(this, RESERVE_KEYS); } } } module.exports = AppGroup; cinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/applet.js0000664000175000017500000012410415167446463030751 0ustar fabiofabioconst Clutter = imports.gi.Clutter; const Gio = imports.gi.Gio; const Gtk = imports.gi.Gtk; const GLib = imports.gi.GLib; const Meta = imports.gi.Meta; const St = imports.gi.St; const Gettext = imports.gettext; const Applet = imports.ui.applet; const Cinnamon = imports.gi.Cinnamon; const Main = imports.ui.main; const DND = imports.ui.dnd; const MessageTray = imports.ui.messageTray; const {AppletSettings} = imports.ui.settings; const {SignalManager} = imports.misc.signalManager; const {throttle, unref, trySpawnCommandLine} = imports.misc.util; const createStore = require('./state'); const AppGroup = require('./appGroup'); const Workspace = require('./workspace'); const { RESERVE_KEYS, TitleDisplay, autoStartStrDir } = require('./constants'); class PinnedFavs { constructor(params) { this.params = params; this.reload(); } reload() { const {state, signals, settings} = this.params; const appSystem = state.trigger('getAppSystem'); this._favorites = []; settings.getValue('pinned-apps').forEach( id => { const refFav = this._favorites.findIndex( item => item.id === id); if (refFav === -1) { const app = appSystem.lookup_app(id); this._favorites.push({ id: id, app: app }); } }); } triggerUpdate(appId, isFavoriteApp) { const currentWorkspace = this.params.state.trigger('getCurrentWorkspace'); if (!currentWorkspace) return; const refApp = currentWorkspace.appGroups.findIndex( appGroup => appGroup.groupState.appId === appId); if (refApp === -1) return; // A pinned app with no windows open was unpinned - remove it if (!isFavoriteApp && currentWorkspace.appGroups[refApp] && currentWorkspace.appGroups[refApp].groupState.metaWindows.length === 0) { currentWorkspace.appGroups[refApp].destroy(true); currentWorkspace.appGroups[refApp] = undefined; currentWorkspace.appGroups.splice(refApp, 1); } else { // Otherwise, synchronize its pinned state currentWorkspace.appGroups[refApp].groupState.set({isFavoriteApp}); } } saveFavorites() { const uniqueSet = new Set(); const ids = []; for (let i = 0; i < this._favorites.length; i++) { if (uniqueSet.has(this._favorites[i].id) === false) { ids.push(this._favorites[i].id); uniqueSet.add(this._favorites[i].id); } } this.params.settings.setValue('pinned-apps', ids); } onFavoritesChange() { this.reload(); this.params.state.trigger('refreshAllWorkspaces'); } addFavorite(opts = {appId: null, app: null, pos: -1}) { const appSystem = this.params.state.trigger('getAppSystem'); let oldIndex = -1; if (!opts.app) { opts.app = appSystem.lookup_app(opts.appId); } if (!opts.app) { opts.app = appSystem.lookup_desktop_wmclass(opts.appId); } if (!opts.app) { return false; } const newFavorite = { id: opts.appId, app: opts.app }; const refFavorite = this._favorites.findIndex( favorite => favorite.id === opts.appId); if (refFavorite === -1) { // Iterates the app groups in the order they are added as children, this // ensures we always get the correct favorites order regardless of whether // or not pin on drag is enabled. const currentWorkspace = this.params.state.trigger('getCurrentWorkspace'); const newFavorites = []; let refActorFound = false; currentWorkspace.actor.get_children().forEach( (actor, i) => { const appGroup = currentWorkspace.appGroups.find( appGroup => appGroup.actor === actor ); if (!appGroup) return; const {app, appId, isFavoriteApp} = appGroup.groupState; let isFavorite = isFavoriteApp; if (appId === opts.appId) { refActorFound = true; isFavorite = true; oldIndex = i; } if (isFavorite) newFavorites.push({app, id: appId}); }); if (refActorFound) { this._favorites = newFavorites; } else { // Actor doesn't exist, probably being dragged to GWL from the menu this._favorites.push(newFavorite); } } else { oldIndex = refFavorite; } if (opts.pos > -1) { this.moveFavoriteToPos(opts, oldIndex); return true; } this.saveFavorites(); this.onFavoritesChange(); return true; } moveFavoriteToPos(opts, oldIndex) { if (!oldIndex || !this.params.state.settings.groupApps) { oldIndex = this._favorites.findIndex( favorite => favorite.id === opts.appId); } this._favorites.splice(opts.pos, 0, this._favorites.splice(oldIndex, 1)[0]); this._favorites = this._favorites.filter( favorite => favorite && favorite.app != null ); this.saveFavorites(); } removeFavorite(appId) { const refFav = this._favorites.findIndex( favorite => favorite.id === appId); this.triggerUpdate(appId, false); this._favorites.splice(refFav, 1); this.saveFavorites(); this.onFavoritesChange(); return true; } } class GroupedWindowListApplet extends Applet.Applet { constructor(metadata, orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.tracker = Cinnamon.WindowTracker.get_default(); this.recentManager = Gtk.RecentManager.get_default(); this.workspaces = []; // Initialize the default state. Any values passed through store.set must be declared here // first, or an error will be thrown. this.state = createStore({ uuid: metadata.uuid, orientation, isHorizontal: orientation === St.Side.TOP || orientation === St.Side.BOTTOM, panel_height, instance_id, monitorWatchList: [], autoStartApps: [], currentWs: global.workspace_manager.get_active_workspace_index(), panelEditMode: global.settings.get_boolean('panel-edit-mode'), menuOpen: false, dragging: { posList: null, dragPlaceholder: null, pos: -1, isForeign: null, }, appletActor: null, appletReady: false, willUnmount: false, settings: {}, homeDir: GLib.get_home_dir(), lastOverlayPreview: null, lastCycled: -1, lastTitleDisplay: null, scrollActive: false, thumbnailMenuOpen: false, thumbnailCloseButtonOffset: global.ui_scale > 1 ? -10 : 0, addingWindowToWorkspaces: false, removingWindowFromWorkspaces: false, }); // key-function pairs of actions that can be triggered from the store's callback queue. This allows the // applet to avoid passing down the parent class down the constructor chain and creating circular references. // In addition to manual event emitting, store.js can emit updates on property changes when set through // store.set. Any keys emitted through store.trigger that are not declared here first will throw an error. this.state.connect({ setSettingsValue: (k, v) => this.settings.setValue(k, v), getPanel: () => (this.panel ? this.panel : null), getPanelHeight: () => this._panelHeight, getPanelIconSize: () => this.getPanelIconSize(), getPanelMonitor: () => this.panel ? Main.layoutManager.monitors[this.panel.monitorIndex] : null, getAppSystem: () => Cinnamon.AppSystem.get_default(), getAppFromWindow: (metaWindow) => this.getAppFromWindow(metaWindow), getTracker: () => this.tracker, addWindowToAllWorkspaces: (win, app, isFavoriteApp) => { this.workspaces.forEach( workspace => { workspace.windowAdded(workspace.metaWorkspace, win, app, isFavoriteApp); }); this.state.addingWindowToWorkspaces = false; }, removeWindowFromAllWorkspaces: (win) => { this.workspaces.forEach( workspace => { workspace.windowRemoved(workspace.metaWorkspace, win); }); this.state.removingWindowFromWorkspaces = false; }, removeWindowFromOtherWorkspaces: (win) => { this.workspaces.forEach( workspace => { if (workspace.workspaceState.workspaceIndex === this.state.currentWs) { return; } workspace.windowRemoved(workspace.metaWorkspace, win); }); this.state.removingWindowFromWorkspaces = false; }, refreshCurrentWorkspace: () => this.refreshCurrentWorkspace(), refreshAllWorkspaces: () => this.refreshAllWorkspaces(), getCurrentWorkspace: () => this.getCurrentWorkspace(), moveLauncher: (source) => this.moveLauncher(source), getAutoStartApps: () => this.getAutoStartApps(), getRecentItems: () => Gtk.RecentManager.get_default() .get_items() .sort(function(a, b) { return a.get_modified() - b.get_modified(); }) .reverse(), addFavorite: (obj) => this.pinnedFavorites.addFavorite(obj), removeFavorite: (id) => this.pinnedFavorites.removeFavorite(id), getFavorites: () => this.pinnedFavorites._favorites, cycleWindows: (e, source) => this.handleScroll(e, source), openAbout: () => this.openAbout(), configureApplet: () => this.configureApplet(), removeApplet: (event) => this.confirmRemoveApplet(event) }); this.settings = new AppletSettings(this.state.settings, metadata.uuid, instance_id); this.bindSettings(); // Passing an empty object instead of `this` because its only used by SignalManager to bind the callback, which // we already do here. Otherwise, it creates more circular references. this.signals = new SignalManager(null); this.appSystem = this.state.trigger('getAppSystem'); this.pinnedFavorites = new PinnedFavs({ signals: this.signals, settings: this.settings, state: this.state }); this.actor.set_track_hover(false); // Declare vertical panel compatibility this.setAllowedLayout(Applet.AllowedLayout.BOTH); Gettext.bindtextdomain(metadata.uuid, GLib.get_home_dir() + '/.local/share/locale'); this.actor.set_style_class_name('grouped-window-list-box'); this.state.set({appletActor: this.actor}); this.on_orientation_changed(orientation); this.getAutoStartApps(); this.onSwitchWorkspace = throttle(this.onSwitchWorkspace, 35, false); //Note: causes a 35ms delay in execution this.signals.connect(this.actor, 'scroll-event', (c, e) => this.handleScroll(e)); this.signals.connect(global, 'scale-changed', (...args) => this.onUIScaleChange(...args)); this.signals.connect(global.window_manager, 'switch-workspace', (...args) => this.onSwitchWorkspace(...args)); this.signals.connect(global.workspace_manager, 'workspace-removed', (...args) => this.onWorkspaceRemoved(...args)); this.signals.connect(global.display, 'window-monitor-changed', (...args) => this.onWindowMonitorChanged(...args)); this.signals.connect(Main.panelManager, 'monitors-changed', (...args) => this._onMonitorsChanged(...args)); this.signals.connect(global.display, 'window-skip-taskbar-changed', (...args) => this.onWindowSkipTaskbarChanged(...args)); this.signals.connect(global.display, 'window-marked-urgent', (...args) => this.updateAttentionState(...args)); this.signals.connect(global.display, 'window-demands-attention', (...args) => this.updateAttentionState(...args)); this.signals.connect(global.display, 'window-created', (...args) => this.onWindowCreated(...args)); this.signals.connect(global.settings, 'changed::panel-edit-mode', (...args) => this.on_panel_edit_mode_changed(...args)); this.signals.connect(Main.themeManager, 'theme-set', (...args) => this.refreshCurrentWorkspace(...args)); this.signals.connect(Main.messageTray, 'notify-applet-update', this._onNotificationReceived.bind(this)); } bindSettings() { const settingsProps = [ {key: 'group-apps', value: 'groupApps', cb: this.refreshAllWorkspaces}, {key: 'scroll-behavior', value: 'scrollBehavior', cb: null}, {key: 'left-click-action', value: 'leftClickAction', cb: null}, {key: 'middle-click-action', value: 'middleClickAction', cb: null}, {key: 'show-all-workspaces', value: 'showAllWorkspaces', cb: this.refreshAllWorkspaces}, {key: 'window-display-settings', value: 'windowDisplaySettings', cb: this.reloadAllAppsMonitor}, {key: 'cycleMenusHotkey', value: 'cycleMenusHotkey', cb: this.bindAppKeys}, {key: 'show-apps-order-hotkey', value: 'showAppsOrderHotkey', cb: this.bindAppKeys}, {key: 'show-apps-order-timeout', value: 'showAppsOrderTimeout', cb: null}, {key: 'super-num-hotkeys', value: 'SuperNumHotkeys', cb: this.bindAppKeys}, {key: 'title-display', value: 'titleDisplay', cb: this.updateTitleDisplay}, {key: 'launcher-animation-effect', value: 'launcherAnimationEffect', cb: null}, {key: 'enable-window-count-badges', value: 'enableWindowCountBadges', cb: this.onEnableWindowCountBadgeChange}, {key: 'enable-notification-badges', value: 'enableNotificationBadges', cb: this.onEnableNotificationsChange}, {key: 'enable-app-button-dragging', value: 'enableDragging', cb: this.draggableSettingChanged}, {key: 'thumbnail-scroll-behavior', value: 'thumbnailScrollBehavior', cb: null}, {key: 'show-thumbnails', value: 'showThumbs', cb: this.updateVerticalThumbnailState}, {key: 'animate-thumbnails', value: 'animateThumbs', cb: null}, {key: 'vertical-thumbnails', value: 'verticalThumbs', cb: this.updateVerticalThumbnailState}, {key: 'sort-thumbnails', value: 'sortThumbs', cb: this.updateVerticalThumbnailState}, { key: 'highlight-last-focused-thumbnail', value: 'highlightLastFocusedThumbnail', cb: this.updateVerticalThumbnailState }, {key: 'onclick-thumbnails', value: 'onClickThumbs', cb: null}, {key: 'thumbnail-timeout', value: 'thumbTimeout', cb: null}, {key: 'thumbnail-size', value: 'thumbSize', cb: this.updateThumbnailSize}, {key: 'enable-hover-peek', value: 'enablePeek', cb: null}, {key: 'hover-peek-time-in', value: 'peekTimeIn', cb: null}, {key: 'hover-peek-time-out', value: 'peekTimeOut', cb: null}, {key: 'hover-peek-opacity', value: 'peekOpacity', cb: null}, {key: 'show-recent', value: 'showRecent', cb: null}, {key: 'autostart-menu-item', value: 'autoStart', cb: null}, {key: 'monitor-move-all-windows', value: 'monitorMoveAllWindows', cb: null}, {key: 'pinned-apps', value: 'pinnedApps', cb: null} ]; settingsProps.forEach( setting => { this.settings.bind( setting.key, setting.value, setting.cb ? (...args) => setting.cb.call(this, ...args) : null ); }); this.state.set({lastTitleDisplay: this.state.settings.titleDisplay}); } draggableSettingChanged() { this.workspaces.forEach( workspace => { workspace.appGroups.forEach( appGroup => { appGroup._draggable.inhibit = !this.state.settings.enableDragging; }); }); } on_applet_added_to_panel() { if (this.state.appletReady && this.state.panelEditMode) { return; } this.bindAppKeys(); this.state.set({appletReady: true}); MessageTray.extensionsHandlingNotifications++; } _updateState(initialUpdate) { if (!this.state.appletReady) { return; } this.numberOfMonitors = null; this.updateMonitorWatchlist(); if (initialUpdate) { this.onSwitchWorkspace(); } else { this.refreshCurrentWorkspace(); } } on_applet_instances_changed(instance) { this._updateState(instance?.instance_id === this.instance_id); } _onMonitorsChanged(panelManager) { this._updateState(false); } on_panel_edit_mode_changed() { this.state.set({panelEditMode: !this.state.panelEditMode}); this.workspaces.forEach( workspace => { workspace.appGroups.forEach( appGroup => { if (appGroup.hoverMenu) appGroup.hoverMenu.actor.reactive = !this.state.panelEditMode; if (appGroup.rightClickMenu) { appGroup.rightClickMenu.actor.reactive = !this.state.panelEditMode; } appGroup.actor.reactive = !this.state.panelEditMode; }); }); } on_panel_height_changed() { this.updateActorAttributes(); } on_orientation_changed(orientation) { this.state.set({ orientation: orientation, isHorizontal: orientation === St.Side.TOP || orientation === St.Side.BOTTOM }); if (this.state.isHorizontal) { this.actor.remove_style_class_name('vertical'); } else { this.actor.add_style_class_name('vertical'); this.actor.set_important(true); } } on_applet_removed_from_panel() { this.state.set({willUnmount: true}); this.unbindAppKeys(); this.signals.disconnectAllSignals(); this.workspaces.forEach( workspace => { if (workspace) { workspace.destroy(); } }); this.settings.finalize(); unref(this, RESERVE_KEYS); MessageTray.extensionsHandlingNotifications--; } on_panel_icon_size_changed(iconSize) { this.updateActorAttributes(iconSize); } // Override Applet._onButtonPressEvent due to the applet menu being replicated in AppMenuButtonRightClickMenu. _onButtonPressEvent(actor, event) { if (this.state.panelEditMode) { super._onButtonPressEvent(actor, event); } return false; } onWindowMonitorChanged(display, metaWindow, metaWorkspace) { if (this.state.monitorWatchList.length !== this.numberOfMonitors) { const currentWorkspace = this.getCurrentWorkspace(); if (currentWorkspace !== null) { currentWorkspace.windowRemoved(metaWorkspace, metaWindow); currentWorkspace.windowAdded(metaWorkspace, metaWindow); } } } bindAppKeys() { this.unbindAppKeys(); if (this.state.settings.SuperNumHotkeys) { for (let i = 1; i < 10; i++) { this.bindAppKey(i); this.bindNewAppKey(i); } } Main.keybindingManager.addHotKey('launch-show-apps-order', this.state.settings.showAppsOrderHotkey, () => this.showAppsOrder() ); Main.keybindingManager.addHotKey('launch-cycle-menus', this.state.settings.cycleMenusHotkey, () => this.cycleMenus() ); } unbindAppKeys() { for (let i = 1; i < 10; i++) { Main.keybindingManager.removeHotKey('launch-app-key-' + i); Main.keybindingManager.removeHotKey('launch-new-app-key-' + i); } Main.keybindingManager.removeHotKey('launch-show-apps-order'); Main.keybindingManager.removeHotKey('launch-cycle-menus'); } bindAppKey(i) { Main.keybindingManager.addHotKey('launch-app-key-' + i, '' + i, () => this.onAppKeyPress(i)); } bindNewAppKey(i) { Main.keybindingManager.addHotKey('launch-new-app-key-' + i, '' + i, () => this.onNewAppKeyPress(i) ); } onAppKeyPress(number) { this.getCurrentWorkspace().onAppKeyPress(number); } onNewAppKeyPress(number) { this.getCurrentWorkspace().onNewAppKeyPress(number); } showAppsOrder() { this.getCurrentWorkspace().showAppsOrder(); } cycleMenus() { this.getCurrentWorkspace().cycleMenus(); } reloadAllAppsMonitor(){ this.refreshAllWorkspaces(); this.updateMonitorWatchlist(); } updateMonitorWatchlist() { if (!this.numberOfMonitors) { this.numberOfMonitors = global.display.get_n_monitors(); } const onPrimary = this.panel.monitorIndex === Main.layoutManager.primaryIndex; const instances = Main.AppletManager.getRunningInstancesForUuid(this.state.uuid); let {monitorWatchList} = this.state; // Show all applications from all monitors if (this.state.settings.windowDisplaySettings === 2) { monitorWatchList = Array.from({ length: this.numberOfMonitors }, (_, i) => i); } else { // Original logic if (this.numberOfMonitors === 1) { monitorWatchList = [Main.layoutManager.primaryIndex]; } else if (instances.length > 1 && !onPrimary) { monitorWatchList = [this.panel.monitorIndex]; } else { /* This is an instance on the primary monitor - it will be * responsible for any monitors not covered individually. First * convert the instances list into a list of the monitor indices, * and then add the monitors not present to the monitor watch list * */ monitorWatchList = [this.panel.monitorIndex]; for (let i = 0; i < instances.length; i++) { if (!instances[i]) { continue; } instances[i] = instances[i].panel.monitorIndex; } for (let i = 0; i < this.numberOfMonitors; i++) { if (instances.indexOf(i) === -1) { monitorWatchList.push(i); } } } } this.state.set({ monitorWatchList }); global.log("Monitor Watch List updated: " + JSON.stringify(monitorWatchList)); } refreshCurrentWorkspace() { const currentWorkspace = this.getCurrentWorkspace(); if (currentWorkspace) currentWorkspace.refreshList(); } refreshAllWorkspaces(options = {exceptCurrentOne: false}) { const currentWorkspace = this.getCurrentWorkspace(); this.workspaces.forEach( workspace => { if (options.exceptCurrentOne && currentWorkspace === workspace) return; setTimeout(() => workspace.refreshList(), 0); }); } updateFavorites() { this.pinnedFavorites.reload(); this.refreshAllWorkspaces(); } updateThumbnailSize() { this.workspaces.forEach( workspace => { workspace.appGroups.forEach( appGroup => { if (appGroup.hoverMenu) appGroup.hoverMenu.updateThumbnailSize(); }); }); } updateActorAttributes(iconSize) { this.workspaces.forEach( workspace => { if (!workspace) return; workspace.appGroups.forEach( appGroup => appGroup.setActorAttributes(iconSize) ); }); } onEnableWindowCountBadgeChange() { this.workspaces.forEach( workspace => workspace.calcAllWindowNumbers() ); } updateAttentionState(display, window) { this.workspaces.forEach( workspace => workspace.updateAttentionState(display, window) ); } onWindowCreated(display, window) { this.workspaces.forEach( workspace => workspace.windowAdded(window.get_workspace(), window) ); } updateVerticalThumbnailState() { this.workspaces.forEach( workspace => { workspace.appGroups.forEach( appGroup => { if (appGroup && appGroup.hoverMenu) { appGroup.hoverMenu.setVerticalSetting(); } }); }); } updateTitleDisplay(titleDisplay) { if (titleDisplay === TitleDisplay.None || this.state.lastTitleDisplay === TitleDisplay.None) { this.refreshCurrentWorkspace(); } this.workspaces.forEach( workspace => { workspace.appGroups.forEach( appGroup => { if (titleDisplay === TitleDisplay.Focused) { appGroup.hideLabel(); } appGroup.handleTitleDisplayChange(); }); }); this.state.set({lastTitleDisplay: titleDisplay}); } getAppFromWindow(metaWindow) { const tracker = this.state.trigger('getTracker'); if (!tracker) { return null; } let app = tracker.get_window_app(metaWindow); if (!app) { app = tracker.get_app_from_pid(metaWindow.get_pid()); } if (!app) { app = tracker.get_app_from_pid(metaWindow.get_client_pid()); } return app; } getCurrentWorkspace() { const metaWorkspace = global.workspace_manager.get_workspace_by_index(this.state.currentWs); const currentWorkspace = this.workspaces.find( workspace => workspace.metaWorkspace && workspace.metaWorkspace === metaWorkspace ); if (currentWorkspace) { return currentWorkspace; } else if (typeof this.workspaces[this.state.currentWs] !== 'undefined') { return this.workspaces[this.state.currentWs]; } else if (typeof this.workspaces[0] !== 'undefined') { return this.workspaces[0]; } else { return null; } } getAutoStartApps() { let info, autoStartDir; const getChildren = () => { const children = autoStartDir.enumerate_children( 'standard::name,standard::type,time::modified', Gio.FileQueryInfoFlags.NONE, null ); while ((info = children.next_file(null)) !== null) { if (info.get_file_type() === Gio.FileType.REGULAR) { const name = info.get_name(); const file = Gio.file_new_for_path(autoStartStrDir + '/' + name); this.state.autoStartApps.push({id: name, file: file}); } } this.state.set({autoStartApps: this.state.autoStartApps}); }; autoStartDir = Gio.file_new_for_path(autoStartStrDir); if (autoStartDir.query_exists(null)) { getChildren(); } else { trySpawnCommandLine(`bash -c "mkdir ${autoStartStrDir}"`); setTimeout(() => getChildren(), 2000); } } handleScroll(e, sourceFromAppGroup) { if (e?.get_scroll_direction() == Clutter.ScrollDirection.SMOOTH) return; if( (this.state.settings.thumbnailScrollBehavior) || (this.state.settings.scrollBehavior === 2) || (this.state.settings.leftClickAction === 3 && this.state.settings.scrollBehavior !== 3 && !e && sourceFromAppGroup) || (this.state.settings.leftClickAction !== 3 && this.state.settings.scrollBehavior === 3 && e && !sourceFromAppGroup) || (this.state.settings.leftClickAction === 3 && this.state.settings.scrollBehavior === 3)) { this.state.set({scrollActive: true}); const currentWorkspace = this.getCurrentWorkspace(); let isAppScroll = this.state.settings.scrollBehavior === 2; let direction, source; if (sourceFromAppGroup) { isAppScroll = false; direction = e ? e.get_scroll_direction() : 1; source = sourceFromAppGroup; } else { direction = e.get_scroll_direction(); source = e.get_source()._delegate; } let lastFocusedApp, z, count if (isAppScroll) { lastFocusedApp = currentWorkspace.workspaceState.lastFocusedApp; if (!lastFocusedApp) { lastFocusedApp = currentWorkspace.appGroups[0].groupState.appId } const focusedIndex = currentWorkspace.appGroups.findIndex( appGroup => appGroup.groupState.metaWindows.length > 0 && appGroup.groupState.appId === lastFocusedApp ); z = direction === 0 ? focusedIndex - 1 : focusedIndex + 1; count = currentWorkspace.appGroups.length - 1; } else { if (!source.groupState || source.groupState.metaWindows.length < 1) { return; } const focusedIndex = source.groupState.metaWindows.findIndex( metaWindow => metaWindow === source.groupState.lastFocused ); z = direction === 0 ? focusedIndex - 1 : focusedIndex + 1; count = source.groupState.metaWindows.length - 1; } let limit = count * 2; while ((isAppScroll && (!currentWorkspace.appGroups[z] || !currentWorkspace.appGroups[z].groupState.lastFocused)) || (!isAppScroll && (!source.groupState.metaWindows[z] || source.groupState.metaWindows[z] === source.groupState.lastFocused))) { limit--; if (direction === 0) { z -= 1; } else { z += 1; } if (limit < 0) { if (count === 0) { z = 0; } break; } else if (z < 0) { z = count; } else if (z > count) { z = 0; } } const _window = isAppScroll ? currentWorkspace.appGroups[z].groupState.lastFocused : source.groupState.metaWindows[z]; Main.activateWindow(_window, global.get_current_time()); setTimeout(() => this.state.set({scrollActive: false}, 4000)); } } handleDragOver(source, actor, x, y) { if (!this.state.settings.enableDragging || this.state.panelEditMode) return DND.DragMotionResult.NO_DROP; if(actor.name === 'xdnd-proxy-actor') return DND.DragMotionResult.CONTINUE; const currentWorkspace = this.getCurrentWorkspace(); const rtl_horizontal = this.state.isHorizontal && St.Widget.get_default_direction () === St.TextDirection.RTL; const axis = this.state.isHorizontal ? [x, 'x2'] : [y, 'y2']; if(rtl_horizontal) axis[0] = this.actor.width - axis[0]; // save data on drag start if(this.state.dragging.posList === null){ this.state.dragging.isForeign = !(source instanceof AppGroup); this.state.dragging.posList = []; currentWorkspace.actor.get_children().forEach( child => { let childPos; if(rtl_horizontal) childPos = this.actor.width - child.get_allocation_box()['x1']; else childPos = child.get_allocation_box()[axis[1]]; this.state.dragging.posList.push(childPos); }); } // get current position let pos = 0; while(pos < this.state.dragging.posList.length && axis[0] > this.state.dragging.posList[pos]) pos++; let favLength = 0; for (const appGroup of currentWorkspace.appGroups) { if(appGroup.groupState.isFavoriteApp) favLength++; else break; } // keep pinned and unpinned items separate if((this.state.dragging.isForeign && pos > favLength) || (!this.state.dragging.isForeign && source.groupState.isFavoriteApp && pos >= favLength) || (!this.state.dragging.isForeign && !source.groupState.isFavoriteApp && pos < favLength)) return DND.DragMotionResult.NO_DROP; // handle position change if (pos !== this.state.dragging.pos) { this.state.dragging.pos = pos; if(this.state.dragging.isForeign) { if (this.state.dragging.dragPlaceholder) currentWorkspace.actor.set_child_at_index(this.state.dragging.dragPlaceholder.actor, pos); else { const iconSize = this.getPanelIconSize() * global.ui_scale; this.state.dragging.dragPlaceholder = new DND.GenericDragPlaceholderItem(); this.state.dragging.dragPlaceholder.child.width = iconSize; this.state.dragging.dragPlaceholder.child.height = iconSize; currentWorkspace.actor.insert_child_at_index( this.state.dragging.dragPlaceholder.actor, this.state.dragging.pos ); this.state.dragging.dragPlaceholder.animateIn(); } } else currentWorkspace.actor.set_child_at_index(source.actor, pos); } if(this.state.dragging.isForeign) return DND.DragMotionResult.COPY_DROP; return DND.DragMotionResult.MOVE_DROP; } // TODO: Figure out exactly which properties on this applet constructor the Cinnamon APIs needs for all modes of // DND, so we can kill the _delegate reference. Long term, a PR to Cinnamon should be opened fixing circular // object reference structures for the applet and desklet classes. acceptDrop(source, actor) { if (!this.state.settings.enableDragging || this.state.panelEditMode) return false; // add new launcher if (this.state.dragging.isForeign) { const pos = this.state.dragging.pos; this.clearDragPlaceholder(); this.clearDragParameters(); const appId = source.isDraggableApp ? source.get_app_id() : source.getId(); if (appId) { this.acceptNewLauncher(appId, pos); return true; } return false; } // move existing launcher return this.moveLauncher(source); } clearDragParameters() { this.state.dragging.isForeign = null; this.state.dragging.posList = null; this.state.dragging.pos = -1; } clearDragPlaceholder(animate = false) { if(this.state.dragging.dragPlaceholder) { if(animate) this.state.dragging.dragPlaceholder.animateOutAndDestroy(); else this.state.dragging.dragPlaceholder.actor.destroy(); this.state.dragging.dragPlaceholder = null; } } handleDragOut() { if(this.state.dragging.isForeign) { this.clearDragPlaceholder(true); this.clearDragParameters(); } } acceptNewLauncher(path, pos = -1) { this.pinnedFavorites.addFavorite({appId: path, pos: pos}); // Need to determine why the favorites setting signal doesn't emit outside the applet actions this.updateFavorites(); } moveLauncher(source) { const currentWorkspace = this.getCurrentWorkspace(); this.clearDragParameters(); Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { currentWorkspace.updateAppGroupIndexes(); // Refresh the group's thumbnails so hoverMenu is aware of the position change // In the case of dragging a group that has a delay before Cinnamon can grab its // thumbnail texture, e.g., LibreOffice, defer the refresh. if (source.groupState.metaWindows.length > 0) { setTimeout(() => source.groupState.trigger('windowCount'), 0); } // Handle favoriting if pin on drag is enabled if (!source.groupState.app.is_window_backed()) { const refFav = this.pinnedFavorites._favorites.findIndex( favorite => favorite.id === source.groupState.appId ); if (refFav > -1) { const pinned = []; //pinned apps found before source for (const appGroup of currentWorkspace.appGroups) { if(appGroup.groupState.appId == source.groupState.appId) break; if(!pinned.includes(appGroup.groupState.appId)) pinned.push(appGroup.groupState.appId); } const opts = { appId: source.groupState.appId, app: source.groupState.app, pos : pinned.length }; if(pinned.length != refFav) this.pinnedFavorites.moveFavoriteToPos(opts); } } this.refreshAllWorkspaces({ exceptCurrentOne: true }); return false; }); return true; } onWorkspaceRemoved(workspaceManager, index) { if (this.workspaces.length <= index) { return; } const removedWorkspaces = []; for (let i = 0; i < this.workspaces.length; i++) { const workspaceIndex = this.workspaces[i].metaWorkspace.index(); if (workspaceIndex === -1) { if (this.workspaces[i] != null) { this.workspaces[i].destroy(); this.workspaces[i] = null; } removedWorkspaces.push(i); } else { this.workspaces[i].index = workspaceIndex; } } for (let i = removedWorkspaces.length - 1; i >= 0; i--) { this.workspaces.splice(removedWorkspaces[i], 1); } this.state.set({currentWs: global.workspace_manager.get_active_workspace_index()}); } onSwitchWorkspace() { setTimeout(() => this._onSwitchWorkspace(), 0); } _onSwitchWorkspace() { if (!this.state) return; this.state.set({currentWs: global.workspace_manager.get_active_workspace_index()}); const metaWorkspace = global.workspace_manager.get_workspace_by_index(this.state.currentWs); // If the workspace we switched to isn't in our list, // we need to create a Workspace for it let refWorkspace = this.workspaces.findIndex( workspace => workspace.metaWorkspace && workspace.metaWorkspace === metaWorkspace ); if (refWorkspace === -1) { this.workspaces.push( new Workspace({ metaWorkspace: metaWorkspace, state: this.state, index: this.state.currentWs }) ); refWorkspace = this.workspaces.length - 1; } this.actor.remove_all_children(); this.actor.add_child(this.workspaces[refWorkspace].actor); this.actor.queue_relayout(); } onWindowSkipTaskbarChanged(display, metaWindow) { const currentWorkspace = this.getCurrentWorkspace(); if (metaWindow.is_skip_taskbar()) { currentWorkspace.windowRemoved(currentWorkspace.metaWorkspace, metaWindow); return; } currentWorkspace.windowAdded(currentWorkspace.metaWorkspace, metaWindow); } onUIScaleChange() { this.state.set({thumbnailCloseButtonOffset: global.ui_scale > 1 ? -10 : 0}); this.refreshAllWorkspaces(); } _onNotificationReceived(mtray, notification) { let appId = notification.source.app?.get_id(); if (!appId) { return; } // Add notification to all appgroups with appId. let notificationAdded = false; this.workspaces.forEach(workspace => { if (!workspace) return; workspace.appGroups.forEach(appGroup => { if (!appGroup || !appGroup.groupState || appGroup.groupState.willUnmount) return; if (appId === appGroup.groupState.appId) { notificationAdded = true; appGroup.updateNotificationsBadge(); } }); }); if (notificationAdded) { notification.appId = appId; notification.connect('destroy', () => this._onNotificationDestroyed(notification)); } } _onNotificationDestroyed(notification) { if (!this.workspaces) return; this.workspaces.forEach(workspace => { if (!workspace) return; workspace.appGroups.forEach(appGroup => { if (!appGroup || !appGroup.groupState || appGroup.groupState.willUnmount) return; if (notification.appId === appGroup.groupState.appId) { appGroup.updateNotificationsBadge(); } }); }); } onEnableNotificationsChange() { this.workspaces.forEach(workspace => { if (!workspace) return; workspace.appGroups.forEach(appGroup => { if (!appGroup || !appGroup.groupState || appGroup.groupState.willUnmount) return; appGroup.updateNotificationsBadge(); }); }); } } function main(metadata, orientation, panel_height, instance_id) { return new GroupedWindowListApplet(metadata, orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/constants.js0000664000175000017500000000152115167446463031475 0ustar fabiofabioconst CLOSE_BTN_SIZE = 22; const constants = { CLOSE_BTN_SIZE, CLOSED_BUTTON_STYLE: 'padding: 0px; width: ' + CLOSE_BTN_SIZE + 'px; height: ' + CLOSE_BTN_SIZE + 'px; max-width: ' + CLOSE_BTN_SIZE + 'px; max-height: ' + CLOSE_BTN_SIZE + 'px; ' + '-cinnamon-close-overlap: 0px;' + 'background-size: ' + CLOSE_BTN_SIZE + 'px ' + CLOSE_BTN_SIZE + 'px;', THUMBNAIL_ICON_SIZE: 16, OPACITY_OPAQUE: 255, BUTTON_BOX_ANIMATION_TIME: 150, MAX_BUTTON_WIDTH: 150, // Pixels FLASH_INTERVAL: 500, FLASH_MAX_COUNT: 4, RESERVE_KEYS: ['willUnmount'], TitleDisplay: { None: 1, App: 2, Title: 3, Focused: 4 }, FavType: { favorites: 0, pinnedApps: 1, none: 2 }, autoStartStrDir: './.config/autostart', }; module.exports = constants; cinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/0000775000175000017500000000000015167446463030237 5ustar fabiofabio././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/news-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/news-symbolic0000664000175000017500000000373715167446463032767 0ustar fabiofabio image/svg+xml ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/pin-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/pin-symbolic.0000664000175000017500000000465215167446463032654 0ustar fabiofabio image/svg+xml ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/screenshot-area-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/screenshot-ar0000664000175000017500000000715715167446463032751 0ustar fabiofabio image/svg+xml ././@LongLink0000644000000000000000000000017200000000000011603 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/screenshot-fullscreen-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/screenshot-fu0000664000175000017500000000567115167446463032760 0ustar fabiofabio image/svg+xml ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/screenshot-window-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/screenshot-wi0000664000175000017500000000614715167446463032764 0ustar fabiofabio image/svg+xml ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/store-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/store-symboli0000664000175000017500000001033115167446463032770 0ustar fabiofabio image/svg+xml ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/unpin-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/unpin-symboli0000664000175000017500000000463515167446463032777 0ustar fabiofabio image/svg+xml ././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/view-private-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/view-private-0000664000175000017500000000604215167446463032663 0ustar fabiofabio image/svg+xml ././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/window-new-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/window-new-sy0000664000175000017500000000554615167446463032723 0ustar fabiofabio image/svg+xml ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/x-office-database-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/x-office-data0000664000175000017500000000445115167446463032575 0ustar fabiofabio image/svg+xml ././@LongLink0000644000000000000000000000016200000000000011602 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/x-office-math-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/x-office-math0000664000175000017500000000550215167446463032613 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js0000664000175000017500000013505115167446463030616 0ustar fabiofabioconst Clutter = imports.gi.Clutter; const Meta = imports.gi.Meta; const St = imports.gi.St; const Gio = imports.gi.Gio; const Main = imports.ui.main; const PopupMenu = imports.ui.popupMenu; const Applet = imports.ui.applet; const SignalManager = imports.misc.signalManager; const WindowUtils = imports.misc.windowUtils; const Mainloop = imports.mainloop; const {tryFn, unref, trySpawnCommandLine, spawn_async, getDesktopActionIcon} = imports.misc.util; const { CLOSE_BTN_SIZE, CLOSED_BUTTON_STYLE, OPACITY_OPAQUE, RESERVE_KEYS, FavType, autoStartStrDir } = require('./constants'); const convertRange = function(value, r1, r2) { return ((value - r1[0]) * (r2[1] - r2[0])) / (r1[1] - r1[0]) + r2[0]; }; const setOpacity = (peekTime, window_actor, targetOpacity, cb) => { const opacity = convertRange(targetOpacity, [0, 100], [0, 255]); const easeConfig = { duration: peekTime, mode: Clutter.AnimationMode.EASE_OUT_QUAD, opacity: opacity > 255 ? 255 : opacity, }; if (typeof cb === 'function') { easeConfig.onStopped = cb; } window_actor.ease(easeConfig); }; class AppMenuButtonRightClickMenu extends Applet.AppletPopupMenu { constructor(params, orientation) { super(params, orientation); this.state = params.state; this.groupState = params.groupState; this.signals = new SignalManager.SignalManager(null); this.signals.connect(this, 'open-state-changed', (...args) => this.onToggled(...args)); } monitorMoveWindows(i) { if (this.state.settings.monitorMoveAllWindows) { const metaWindows = this.groupState.metaWindows.slice(); while (metaWindows.length > 0) { const metaWindow = metaWindows[0]; if (metaWindow === this.groupState.lastFocused) { Main.activateWindow(metaWindow, global.get_current_time()); } metaWindow.move_to_monitor(i); metaWindows.splice(0, 1); } } else { this.groupState.lastFocused.move_to_monitor(i); Main.activateWindow(this.groupState.lastFocused, global.get_current_time()); } } populateMenu() { this.signals.disconnectAllSignals(); this.signals.connect(this, 'open-state-changed', (...args) => this.onToggled(...args)); let item; let length; const hasWindows = this.groupState.metaWindows.length > 0; const isWindowBacked = this.groupState.app.is_window_backed(); const createMenuItem = (opts = {label: '', icon: null}) => { if (opts.icon) { return new PopupMenu.PopupIconMenuItem(opts.label, opts.icon, St.IconType.SYMBOLIC); } return new PopupMenu.PopupMenuItem(opts.label); }; // TODO: When no windows exist on the active workspace, but do on another, // we should detect those cases and offer workspace options if they are pinned. Otherwise, // user needs to switch workspaces just to switch the window back. This should behave this way // when showAllWorkspaces is disabled as well since its a UX problem. if (hasWindows) { // Monitors if (Main.layoutManager.monitors.length > 1) { const connectMonitorEvent = (item, i) => { this.signals.connect(item, 'activate', () => this.monitorMoveWindows(i)); }; for (let i = 0, len = Main.layoutManager.monitors.length; i < len; i++) { if (!this.groupState.lastFocused || i === this.groupState.lastFocused.get_monitor()) { continue; } item = createMenuItem({ label: Main.layoutManager.monitors.length === 2 ? _('Move to the other monitor') : _('Move to monitor ') + (i + 1) }); connectMonitorEvent(item, i); this.addMenuItem(item); } } // Workspace if ((length = global.workspace_manager.n_workspaces) > 1) { if (this.groupState.lastFocused && this.groupState.lastFocused.is_on_all_workspaces()) { item = createMenuItem({label: _('Only on this workspace')}); this.signals.connect(item, 'activate', () => { this.groupState.lastFocused.unstick(); // Always index windows from all workspaces while showAllWorkspaces is enabled if (this.state.settings.showAllWorkspaces) return; this.state.removingWindowFromWorkspaces = true; this.state.trigger('removeWindowFromOtherWorkspaces', this.groupState.lastFocused); }); this.addMenuItem(item); } else { item = createMenuItem({label: _('Visible on all workspaces')}); this.signals.connect(item, 'activate', () => { this.groupState.lastFocused.stick(); this.state.trigger('addWindowToAllWorkspaces', this.groupState.lastFocused); }); this.addMenuItem(item); item = new PopupMenu.PopupSubMenuMenuItem(_('Move to another workspace')); this.addMenuItem(item); const connectWorkspaceEvent = (ws, j) => { this.signals.connect(ws, 'activate', () => { this.groupState.lastFocused.change_workspace(global.workspace_manager.get_workspace_by_index(j)); }); }; for (let i = 0; i < length; i++) { // Make the index a local variable to pass to function const j = i; const name = Main.workspace_names[i] ? Main.workspace_names[i] : Main._makeDefaultWorkspaceName(i); const menuItem = createMenuItem({label: _(name)}); const ws = this.groupState.lastFocused.get_workspace(); if (ws && i === ws.index()) { menuItem.setSensitive(false); } connectWorkspaceEvent(menuItem, j); item.menu.addMenuItem(menuItem); } } } this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); } // Preferences const subMenu = new PopupMenu.PopupSubMenuMenuItem(_('Applet preferences')); this.addMenuItem(subMenu); item = createMenuItem({label: _('About...'), icon: 'dialog-question'}); this.signals.connect(item, 'activate', () => this.state.trigger('openAbout')); subMenu.menu.addMenuItem(item); item = createMenuItem({label: _('Configure...'), icon: 'xsi-preferences'}); this.signals.connect(item, 'activate', () => this.state.trigger('configureApplet')); subMenu.menu.addMenuItem(item); item = createMenuItem({label: _("Remove '%s'").format(_("Grouped window list")), icon: 'edit-delete'}); this.signals.connect(item, 'activate', (actor, event) => this.state.trigger('removeApplet', event)); subMenu.menu.addMenuItem(item); this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); if (this.state.settings.showRecent) { // Recent Files const recentItems = this.state.trigger('getRecentItems'); const items = []; for (let i = 0, len = recentItems.length; i < len; i++) { const mimeType = recentItems[i].get_mime_type(); const appInfo = Gio.app_info_get_default_for_type(mimeType, false); if (appInfo && this.groupState.appInfo && appInfo.get_id() === this.groupState.appId) { items.push(recentItems[i]); } } let itemsLength = items.length; if (itemsLength > 0) { const subMenu = new PopupMenu.PopupSubMenuMenuItem(_('Recent')); this.addMenuItem(subMenu); const num = 10; if (itemsLength > num) { itemsLength = num; } const handleRecentLaunch = (item, i) => { this.signals.connect(item, 'activate', () => { Gio.app_info_launch_default_for_uri(items[i].get_uri(), global.create_app_launch_context()) }); }; for (let i = 0; i < itemsLength; i++) { item = createMenuItem({label: _(items[i].get_short_name()), icon: 'list-add'}); handleRecentLaunch(item, i); subMenu.menu.addMenuItem(item); } this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); } } if (Main.gpu_offload_supported && !hasWindows) { item = createMenuItem({label: _("Run with dedicated GPU"), icon: 'cpu'}); this.signals.connect(item, 'activate', () => this.groupState.trigger('launchNewInstance', true)); this.addMenuItem(item); this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); } // Actions tryFn(() => { if (!this.groupState.appInfo) return; const actions = this.groupState.appInfo.list_actions(); if (actions) { this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); const handleAction = (action) => { let icon = getDesktopActionIcon(action); if (icon == null) icon = 'application-x-executable'; item = createMenuItem({ label: _(this.groupState.appInfo.get_action_name(action)), icon }); this.signals.connect(item, 'activate', () => { this.groupState.appInfo.launch_action(action, global.create_app_launch_context()); }); }; for (let i = 0, len = actions.length; i < len; i++) { handleAction(actions[i]); this.addMenuItem(item); } this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); } }, () => { if (isWindowBacked) { this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); } }); // Pin/unpin, shortcut handling if (!isWindowBacked) { let label, icon; if (this.groupState.isFavoriteApp) { label = _('Unpin from Panel'); icon = 'unpin'; } else { label = _('Pin to Panel'); icon = 'pin'; } this.pinToggleItem = createMenuItem({label, icon}); this.signals.connect(this.pinToggleItem, 'activate', (...args) => this.toggleFavorite(...args)); this.addMenuItem(this.pinToggleItem); if (this.state.settings.autoStart) { const label = this.groupState.autoStartIndex !== -1 ? _('Remove from Autostart') : _('Add to Autostart'); item = createMenuItem({label: label, icon: 'insert-object'}); this.signals.connect(item, 'activate', (...args) => this.toggleAutostart(...args)); this.addMenuItem(item); } } else { this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); item = createMenuItem({label: _('Create Shortcut'), icon: 'list-add'}); this.signals.connect(item, 'activate', (...args) => this.createShortcut(...args)); this.addMenuItem(item); } this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); // Window controls if (hasWindows) { const metaWindowActor = this.groupState.lastFocused.get_compositor_private(); // Miscellaneous if (metaWindowActor && metaWindowActor.opacity !== 255) { item = createMenuItem({label: _('Restore to full opacity')}); this.signals.connect(item, 'activate', () => metaWindowActor.set_opacity(255)); this.addMenuItem(item); } if (this.groupState.lastFocused.minimized) { item = createMenuItem({label: _('Restore'), icon: 'view-sort-descending'}); this.signals.connect(item, 'activate', () => { Main.activateWindow(this.groupState.lastFocused, global.get_current_time()); }); } else { item = createMenuItem({label: _('Minimize'), icon: 'view-sort-ascending'}); this.signals.connect(item, 'activate', () => this.groupState.lastFocused.minimize()); } this.addMenuItem(item); if (this.groupState.lastFocused.get_maximized()) { item = createMenuItem({label: _('Unmaximize'), icon: 'view-restore'}); this.signals.connect(item, 'activate', () => { this.groupState.lastFocused.unmaximize( Meta.MaximizeFlags.HORIZONTAL | Meta.MaximizeFlags.VERTICAL ); }); } else { item = createMenuItem({label: _('Maximize'), icon: 'view-fullscreen'}); this.signals.connect(item, 'activate', () => { this.groupState.lastFocused.maximize( Meta.MaximizeFlags.HORIZONTAL | Meta.MaximizeFlags.VERTICAL ); }); } this.addMenuItem(item); item.setSensitive(this.groupState.lastFocused.can_maximize()); if (this.groupState.metaWindows && this.groupState.metaWindows.length > 1) { // Close others item = createMenuItem({label: _('Close others'), icon: 'window-close'}); this.signals.connect(item, 'activate', () => { this.groupState.metaWindows.forEach( metaWindow => { if (metaWindow !== this.groupState.lastFocused && !metaWindow._needsAttention) { metaWindow.delete(global.get_current_time()); } }); }); this.addMenuItem(item); // Close all // TODO: We should detect if windows from this group are on another workspace // and close windows across all workspaces while showAllWorkspaces is enabled. // Ditto for 'Close others'. item = createMenuItem({label: _('Close all'), icon: 'application-exit'}); this.signals.connect(item, 'activate', () => { if (!this.groupState.isFavoriteApp) { this.groupState.set({willUnmount: true}); } this.groupState.app.request_quit(); }); this.addMenuItem(item); this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); } else { item = createMenuItem({label: _('Close'), icon: 'edit-delete'}); this.signals.connect(item, 'activate', () => { this.groupState.lastFocused.delete(global.get_current_time()); }); this.addMenuItem(item); this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); } } } onToggled(actor, isOpening) { this.state.set({menuOpen: this.isOpen}); } toggle() { if (!this.isOpen) { this.removeAll(); this.populateMenu(); } Applet.AppletPopupMenu.prototype.toggle.call(this); } toggleAutostart() { if (this.groupState.autoStartIndex !== -1) { this.state.autoStartApps[this.groupState.autoStartIndex].file.delete(null); this.state.autoStartApps[this.groupState.autoStartIndex] = undefined; this.state.autoStartApps.splice(this.groupState.autoStartIndex, 1); this.groupState.set({autoStartIndex: -1}); } else { const filePath = this.groupState.appInfo.get_filename(); trySpawnCommandLine('bash -c "cp ' + filePath + ' ' + autoStartStrDir + '"'); setTimeout(() => { this.state.trigger('getAutoStartApps'); this.groupState.set({autoStartIndex: this.state.autoStartApps.length - 1}); }, 500); } } toggleFavorite() { if (this.groupState.isFavoriteApp) { this.state.trigger('removeFavorite', this.groupState.appId); } else if (!this.groupState.app.is_window_backed()) { this.state.trigger('addFavorite', { appId: this.groupState.appId, app: this.groupState.app, pos: -1 }); } } createShortcut() { const proc = this.groupState.lastFocused.get_pid(); const cmd = [ 'bash', '-c', 'python3 /usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/utils.py get_process ' + proc.toString() ]; spawn_async(cmd, (stdout) => { if (stdout) { setTimeout(() => { this.state.trigger('addFavorite', {appId: stdout.trim(), app: null, pos: -1}); this.state.trigger('refreshCurrentWorkspace'); }, 2000); } }); } destroy() { this.signals.disconnectAllSignals(); super.destroy(); unref(this, RESERVE_KEYS); } } class HoverMenuController extends PopupMenu.PopupMenuManager { constructor(actor, groupState) { super({actor}, false); // owner, shouldGrab this.groupState = groupState; this.connectId = this.groupState.connect({ thumbnailMenuEntered: ({thumbnailMenuEntered}) => { this.shouldGrab = thumbnailMenuEntered; this._onMenuOpenState(this._menus[0], this._menus[0].isOpen); this.groupState.trigger('checkFocusStyle'); if (!this.grabbed) return; if (!thumbnailMenuEntered) this._ungrab(); } }); } _onEventCapture() { return false; } destroy() { this.groupState.disconnect(this.connectId); super.destroy(); } _onMenuOpenState(menu, open) { if (open) { if (this._activeMenu && this._activeMenu.isChildMenu(menu)) { this._menuStack.push(this._activeMenu); } this._activeMenu = menu; } else { if (this._menuStack.length > 0) { this._activeMenu = this._menuStack.pop(); if (menu.sourceActor) this._didPop = true; } } } } class WindowThumbnail { constructor(params) { this.state = params.state; this.stateConnectId = this.state.connect({ scrollActive: () => { this.destroyOverlayPreview(); }, thumbnailCloseButtonOffset: ({thumbnailCloseButtonOffset}) => { this.button.style = CLOSED_BUTTON_STYLE + `position: ${thumbnailCloseButtonOffset}px -2px;`; } }); this.groupState = params.groupState; this.connectId = this.groupState.connect({ isFavoriteApp: () => this.handleFavorite(), lastFocused: () => { if (!this.groupState || !this.groupState.metaWindows || this.groupState.metaWindows.length === 0) { return; } this.isFocused = this.groupState.lastFocused === this.metaWindow; this.onFocusWindowChange(); }, windowCount: () => this.refreshThumbnail() }); this.metaWindow = params.metaWindow; this.index = params.index; this.get_thumb_id = 0; this.metaWindowActor = null; this.thumbnailPadding = 16; this.willUnmount = false; this.stopClick = false; this.entered = false; this.isFocused = false; this.signals = new SignalManager.SignalManager(null); // Inherit the theme from the alt-tab menu' this.actor = new St.BoxLayout({ name: 'this.actor', style_class: 'item-box', important: true, reactive: true, track_hover: true, vertical: true, can_focus: true, style: 'border-width:2px;padding:' + 3 * global.ui_scale + 'px;' }); this.actor._delegate = null; // Override with own theme. this.thumbnailActor = new St.Bin({ style_class: 'thumbnail', important: true }); this.container = new St.BoxLayout(); this.bin = new St.BoxLayout({ y_expand: false }); const label = new St.Label({ style_class: 'grouped-window-list-thumbnail-label', important: true }); this.labelContainer = new St.Bin({ y_align: St.Align.MIDDLE, x_expand: true, child: label }); this.container.add_actor(this.labelContainer); this.button = new St.Button({ style_class: 'window-close', reactive: true, width: CLOSE_BTN_SIZE, height: CLOSE_BTN_SIZE, style: CLOSED_BUTTON_STYLE + `position: ${this.state.thumbnailCloseButtonOffset}px -2px;` }); this.button.set_opacity(0); this.bin.add_actor(this.container); this.bin.add_actor(this.button); this.actor.add_actor(this.bin); this.actor.add_actor(this.thumbnailActor); this.signals.connect(this.actor, 'enter-event', (...args) => this.onEnter(...args)); this.signals.connect(this.actor, 'leave-event', (...args) => this.onLeave(...args)); this.signals.connect(this.button, 'button-release-event', (...args) => this.onCloseButtonRelease(...args)); this.signals.connect(this.actor, 'button-release-event', (...args) => this.connectToWindow(...args)); this.handleFavorite(); // Update focused style this.onFocusWindowChange(); } onEnter(a, e) { this.entered = true; this.actor.add_style_pseudo_class('selected'); this.button.set_opacity(255); if (!e) return; if (e.get_related() === this.button) { return; } this.destroyOverlayPreview(); this.hoverPeek(this.state.settings.peekOpacity); } onLeave() { this.entered = false; this.stopClick = false; this.actor.remove_style_pseudo_class('selected'); this.onFocusWindowChange(); this.button.set_opacity(0); } setThumbnailDemandsAttention(attention) { //if (this.metaWindow === window) { if (attention) { if (this._needsAttention) { return; } this._needsAttention = true; this.actor.add_style_class_name('grouped-window-list-thumbnail-alert'); } else { if (!this._needsAttention) { return; } this._needsAttention = false; this.actor.remove_style_class_name('grouped-window-list-thumbnail-alert'); } } onFocusWindowChange() { if (this.willUnmount) return; if (this.isFocused && this.state.settings.highlightLastFocusedThumbnail && this.groupState.metaWindows.length > 1) { this.actor.add_style_pseudo_class('outlined'); } else { this.isFocused = false; this.actor.remove_style_pseudo_class('outlined'); } } handleFavorite() { if (!this.groupState) return; if (this.groupState.metaWindows && this.groupState.metaWindows.length > 0) { this.refreshThumbnail(); } } handleCloseClick() { this.onLeave(); this.stopClick = true; this.metaWindow.delete(global.get_current_time()); if (!this.groupState.metaWindows || this.groupState.metaWindows.length <= 1) { this.groupState.trigger('hoverMenuClose'); } else { this.groupState.trigger('checkShouldClose'); } } onCloseButtonRelease(actor, event) { const button = event.get_button(); if (button === 1 && actor === this.button) { this.handleCloseClick(); } } connectToWindow(actor, event) { if (!this.metaWindow || !this.groupState.metaWindows || this.groupState.metaWindows.length === 0) { this.groupState.trigger('hoverMenuClose'); return; } const button = typeof event === 'number' ? event : event.get_button(); if (button === 1 && !this.stopClick) { Main.activateWindow(this.metaWindow, global.get_current_time()); this.groupState.trigger('hoverMenuClose'); this.onLeave(); } else if (button === 2 && !this.stopClick) { this.handleCloseClick(); } this.stopClick = false; } getThumbnail(thumbnailWidth, thumbnailHeight) { if (this.groupState.verticalThumbs || !this.state.settings.showThumbs) { this.thumbnailActor.hide(); return null; } else if (this.thumbnailActor.realized) { this.thumbnailActor.show(); } // Create our own thumbnail if it doesn't exist if (this.metaWindowActor) { this.disconnectSizeNotify(); } else { this.metaWindowActor = this.metaWindow.get_compositor_private(); } if (this.metaWindowActor && !this.metaWindowActor.is_finalized()) { this.signals.connect(this.metaWindow, 'unmanaging', () => this.disconnectSizeNotify()); const texture = this.metaWindowActor.get_texture(); if (texture == null) { return; } this.signals.connect(texture, 'size-changed', () => this.refreshThumbnail()); let [width, height] = this.metaWindowActor.get_size(); const scale = Math.min(1.0, thumbnailWidth / width, thumbnailHeight / height) * global.ui_scale; width = Math.round(width * scale); height = Math.round(height * scale); if (this.thumbnailActor.child == null || (this.thumbnailActor.child.name?.startsWith("TextureWindowClone"))) { if (this.thumbnailActor.child != null) { this.thumbnailActor.child.destroy() } this.thumbnailActor.child = WindowUtils.getCloneOrContent(this.metaWindowActor, width, height); if (this.thumbnailActor.child.name?.startsWith("TextureWindowClone")) { this.signals.connect(this.metaWindow, 'notify::minimized', () => this.refreshThumbnail()); } } else { this.thumbnailActor.child.width = width; this.thumbnailActor.child.height = height; this.thumbnailActor.queue_relayout(); } } else if (this.groupState.isFavoriteApp) { this.groupState.trigger('removeThumbnailFromMenu', this.metaWindow); } } disconnectSizeNotify(actor) { this.signals.disconnect('unmanaging', this.metaWindow); const texture = this.metaWindowActor.get_texture(); if (texture) { this.signals.disconnect("size-changed", texture); } this.signals.disconnect("notify::minimized", this.metaWindow); } calcThumbsFullSize(singleThumbSize) { const padding = this.thumbnailActor.style_length('padding'); const margin = this.thumbnailActor.style_length('margin'); const size = (singleThumbSize + this.thumbnailPadding) * global.ui_scale; return (size + padding + margin) * this.groupState.windowCount; } refreshThumbnail() { if (this.willUnmount || !this.groupState || !this.groupState.app || !this.groupState.metaWindows || !this.metaWindow) { return; } const monitor = this.state.trigger('getPanelMonitor'); if (!monitor) return; if (!this.thumbnailActor || this.thumbnailActor.is_finalized()) return; const divider = 80 * global.ui_scale; let {thumbSize} = this.state.settings; if (monitor.height / global.ui_scale <= 1024) { thumbSize += 6; } else if (monitor.height / global.ui_scale <= 1200) { thumbSize += 3; } let thumbnailWidth = Math.floor((monitor.width / divider) * thumbSize); let thumbnailHeight = Math.floor((monitor.height / divider) * thumbSize); let monitorSize, thumbnailSize; if (!this.state.isHorizontal) { monitorSize = monitor.height; thumbnailSize = thumbnailHeight; } else { monitorSize = monitor.width; thumbnailSize = thumbnailWidth; } let i = 0; while (this.calcThumbsFullSize(thumbnailSize) > monitorSize && thumbnailWidth > 64 && thumbnailHeight > 64) { // --- thumbnailWidth -= 1; thumbnailHeight -= 1; thumbnailSize -= 1; i++; // Bail after 200 iterations if (i > 200) { break; } } // If we can't fit all the thumbnails, revert to a vertical menu orientation // with no thumbnails, which can hold more window selections. const verticalThumbs = this.calcThumbsFullSize(thumbnailSize) > monitorSize; const currentVerticalThumbsState = this.groupState.verticalThumbs; this.groupState.set({verticalThumbs}); if (verticalThumbs !== currentVerticalThumbsState) return; this.thumbnailActor.width = thumbnailWidth * global.ui_scale; this.container.style = `width: ${Math.floor(thumbnailWidth - 16)}px;`; if (this.state.settings.verticalThumbs && !this.groupState.verticalThumbs && !this.state.settings.showThumbs) { this.thumbnailActor.height = 0; } else { this.thumbnailActor.height = thumbnailHeight * global.ui_scale; } this.labelContainer.child.text = this.metaWindow.title || ''; if (this.get_thumb_id > 0) { Mainloop.source_remove(this.get_thumb_id); } this.get_thumb_id = Mainloop.timeout_add(0, () => { this.get_thumb_id = 0; this.getThumbnail(thumbnailWidth, thumbnailHeight); return false; }); } hoverPeek(opacity) { if (!this.state.settings.enablePeek || this.state.scrollActive || (this.metaWindowActor && this.metaWindowActor.is_finalized())) { return; } if (!this.metaWindowActor) { this.metaWindowActor = this.metaWindow.get_compositor_private(); } const preview = WindowUtils.getCloneOrContent(this.metaWindowActor); preview.opacity = 0; this.state.set({ lastOverlayPreview: preview }); let [x, y] = this.metaWindowActor.get_position(); let [width, height] = this.metaWindowActor.get_size(); this.state.lastOverlayPreview.set_position(x, y); this.state.lastOverlayPreview.set_size(width, height); global.overlay_group.add_child(this.state.lastOverlayPreview); global.overlay_group.set_child_above_sibling(this.state.lastOverlayPreview, null); setOpacity(this.state.settings.peekTimeIn, this.state.lastOverlayPreview, opacity); } destroyOverlayPreview() { if (!this.state.lastOverlayPreview) return; if (this.state.settings.peekTimeOut) { const currOverlayPreview = this.state.lastOverlayPreview; setOpacity( this.state.settings.peekTimeOut, currOverlayPreview, 0, () => this._destroyOverlayPreview(currOverlayPreview) ); } else { this._destroyOverlayPreview(this.state.lastOverlayPreview); } } _destroyOverlayPreview(overlayPreview) { global.overlay_group.remove_child(overlayPreview); overlayPreview.destroy(); if(overlayPreview === this.state.lastOverlayPreview) { this.state.set({lastOverlayPreview: null}); } } destroy() { this.willUnmount = true; if (!this.groupState) return; if (this.get_thumb_id > 0) { Mainloop.source_remove(this.get_thumb_id); this.get_thumb_id = 0; } this.state.disconnect(this.stateConnectId); this.groupState.disconnect(this.connectId); this.signals.disconnectAllSignals(); this.container.destroy(); this.bin.destroy(); this.actor.destroy(); unref(this, RESERVE_KEYS); } } class AppThumbnailHoverMenu extends PopupMenu.PopupMenu { _init(state, groupState) { super._init.call(this, groupState.trigger('getActor'), state.orientation, 0.5); this.state = state; this.groupState = groupState; this.shouldClose = true; this.isOpen = false; this.setCustomStyleClass("grouped-window-list-thumbnail-menu"); this.connectId = this.groupState.connect({ hoverMenuClose: () => { this.shouldClose = true; this.groupState.set({thumbnailMenuEntered: false}); this.close(); }, checkShouldClose: () => { // This is called after a close button is clicked. When the menu size changes, it can leave the cursor // outside the menu bounds, and no leave event will be able to correct this situation where the menu is // dangling open and only closable upon hovering over it again. This checks if the cursor is hovering // over the menu and closes it if not. setTimeout(() => { let [x, y, mask] = global.get_pointer(); const draggedOverActor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y); const parent = draggedOverActor.get_parent(); if (!(parent instanceof St.Widget)) { this.close(true); } }, 500); }, addThumbnailToMenu: (win) => { if (this.isOpen) { this.addThumbnail(win); return; } this.queuedWindows.push(win); }, removeThumbnailFromMenu: (win) => { let index = this.appThumbnails.findIndex( item => item.metaWindow === win); if (index > -1) { this.appThumbnails[index].destroy(); this.appThumbnails[index] = undefined; this.appThumbnails.splice(index, 1); } index = this.queuedWindows.indexOf(win); if (index > -1) this.queuedWindows.splice(index, 1); }, verticalThumbs: () => { // Preserve the menu's open state after refreshing const {isOpen} = this; this.setVerticalSetting(); if (isOpen) this.open(true); }, fileDrag: ({fileDrag}) => { if (fileDrag) { // When a drag operation from another app is started, no events fire, so we have to grab the // cursor, find the actor by coordinates, and then look up the thumbnail actor. Do this on a // 50ms loop until the menu closes so we continue getting data in the absence of events. this.interval = setInterval(() => { let [x, y, mask] = global.get_pointer(); const draggedOverActor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y); if (draggedOverActor instanceof Meta.ShapedTexture) { this.groupState.set({fileDrag: false}); this.close(true); return; } for (const thumbnail of this.appThumbnails) { if (thumbnail.thumbnailActor === draggedOverActor) { Main.activateWindow(thumbnail.metaWindow, global.get_current_time()); break; } } }, 50); } else if (this.interval) { clearInterval(this.interval); } } }); this.appThumbnails = []; this.queuedWindows = []; this.fullyRefreshThumbnails(); } addQueuedThumbnails() { if (this.queuedWindows.length === 0) return; this.queuedWindows.forEach( win => this.addThumbnail(win)); this.queuedWindows = []; } onButtonPress() { if (this.state.settings.onClickThumbs && this.box.get_children().length > 1) { return; } this.shouldClose = true; setTimeout(() => this.close(), this.state.settings.thumbTimeout); } onMenuEnter(actor) { if (this.state.panelEditMode || (!this.isOpen && this.state.settings.onClickThumbs) || this.state.menuOpen) { return false; } this.shouldClose = false; let timeout; if (this.state.thumbnailMenuOpen) { timeout = 50; } else { timeout = this.state.settings.thumbTimeout; } this.addQueuedThumbnails(); if (actor != null) { this.groupState.set({thumbnailMenuEntered: this.isOpen}); } setTimeout(() => this.open(), timeout); } onMenuLeave(actor) { if (this.state.menuOpen || this.state.panelEditMode) { return false; } this.shouldClose = true; if (actor != null) { this.groupState.set({thumbnailMenuEntered: false}); } setTimeout(() => this.close(), 50); } onKeyRelease(actor, event) { const symbol = event.get_key_symbol(); if (this.isOpen && (symbol === Clutter.KEY_Super_L || symbol === Clutter.KEY_Super_R)) { // Close this menu, if opened by super + # this.close(true); } return true; } open (force) { if (!force && (!this.actor || this.willUnmount || this.isOpen || (this.shouldClose && !this.state.settings.onClickThumbs))) { return; } if (!this.groupState.metaWindows || this.groupState.metaWindows.length === 0) { this.groupState.tooltip.set_text(this.groupState.appName); this.groupState.tooltip.show(); } else { if (force || this.state.settings.onClickThumbs) this.addQueuedThumbnails(); this.state.set({thumbnailMenuOpen: true}); super.open(this.state.settings.animateThumbs); } } close (force) { if (!force && (!this.shouldClose || (!this.shouldClose && this.state.settings.onClickThumbs)) || !this.groupState || !this.groupState.tooltip) { return; } if ((!this.groupState.metaWindows || this.groupState.metaWindows.length === 0) && !this.groupState.tooltip._tooltip.is_finalized()) { this.groupState.tooltip.set_text(''); this.groupState.tooltip.hide(); } if (this.isOpen) { this.state.set({thumbnailMenuOpen: false}); if (!this.actor.is_finalized()) super.close(this.state.settings.animateThumbs); } for (let i = 0; i < this.appThumbnails.length; i++) { this.appThumbnails[i].destroyOverlayPreview(); } if (this.groupState.fileDrag) { this.groupState.set({fileDrag: false}); } } onKeyPress(actor, e) { const {orientation} = this.state; const {vertical} = this.box; const symbol = e.get_key_symbol(); let i = this.appThumbnails.findIndex( item => item.entered === true ); const entered = i > -1; if (!entered) { i = this.appThumbnails.findIndex( thumbnail => thumbnail.isFocused ); if (i === -1) { i = 0; } } let args; let closeArg; if (orientation === St.Side.TOP) { closeArg = Clutter.KEY_Up; args = [Clutter.KEY_Left, Clutter.KEY_Right]; } else if (orientation === St.Side.BOTTOM) { closeArg = Clutter.KEY_Down; args = [Clutter.KEY_Right, Clutter.KEY_Left]; } else if (orientation === St.Side.LEFT) { closeArg = Clutter.KEY_Left; args = [Clutter.KEY_Up, Clutter.KEY_Down]; } else if (orientation === St.Side.RIGHT) { closeArg = Clutter.KEY_Right; args = [Clutter.KEY_Down, Clutter.KEY_Up]; } // Panel is oriented horizontally, but the menu is vertical if (vertical && (orientation === St.Side.TOP || orientation === St.Side.BOTTOM)) { args = [Clutter.KEY_Down, Clutter.KEY_Up]; } let index; if (symbol === args[0]) { if (!entered) { index = i; } else if (this.appThumbnails[i + 1] !== undefined) { index = i + 1; } else { index = 0; } } else if (symbol === args[1]) { if (!entered) { index = i; } else if (this.appThumbnails[i - 1] !== undefined) { index = i - 1; } else { index = this.appThumbnails.length - 1; } } else if ((symbol === Clutter.KEY_Return || symbol === Clutter.KEY_KP_Enter) && entered) { this.appThumbnails[i].connectToWindow(null, 1); } else if (symbol === closeArg) { this.appThumbnails[i].onLeave(); this.close(true); } else return; if (this.appThumbnails[index] !== undefined) { this.appThumbnails[i].onLeave(); this.appThumbnails[index].onEnter(); if (this.appThumbnails[i].isFocused) { this.appThumbnails[i].onFocusWindowChange(); } } } fullyRefreshThumbnails() { if (this.appThumbnails.length > 0) { this.destroyThumbnails(); } this.addWindowThumbnails(this.groupState.metaWindows); } destroyThumbnails() { this.box.destroy_children(); for (let i = 0; i < this.appThumbnails.length; i++) { this.appThumbnails[i].destroy(); this.appThumbnails[i] = undefined; } this.appThumbnails = []; } updateThumbnails(exceptIndex) { for (let i = 0; i < this.appThumbnails.length; i++) { if (i !== exceptIndex) { this.appThumbnails[i].refreshThumbnail(); this.box.set_child_at_index(this.appThumbnails[i].actor, i); } } } addThumbnail(metaWindow) { if (this.state.settings.sortThumbs) { this.appThumbnails.sort(function(a, b) { if (!a.metaWindow || !b.metaWindow) { return -1; } return b.metaWindow.user_time - a.metaWindow.user_time; }); } const refThumb = this.appThumbnails.findIndex( thumbnail => thumbnail.metaWindow === metaWindow ); if (!this.appThumbnails[refThumb] && refThumb === -1) { const thumbnail = new WindowThumbnail({ state: this.state, groupState: this.groupState, metaWindow: metaWindow, index: this.appThumbnails.length // correct index before actual push }); this.appThumbnails.push(thumbnail); this.box.insert_actor(thumbnail.actor, -1); // TBD: Update the thumbnail scaling for the other thumbnails belonging to this group. // Since the total window count determines the scaling used, this needs to be done // each time a window is added. this.updateThumbnails(thumbnail.index); } else if (this.appThumbnails[refThumb]) { this.appThumbnails[refThumb].index = refThumb; this.appThumbnails[refThumb].metaWindow = metaWindow; this.appThumbnails[refThumb].refreshThumbnail(); this.box.set_child_at_index(this.appThumbnails[refThumb].actor, refThumb); } } addWindowThumbnails() { if (this.willUnmount || !this.box || !this.appThumbnails || !this.groupState || !this.groupState.metaWindows) { return; } for (let i = 0, len = this.groupState.metaWindows.length; i < len; i++) { this.addThumbnail(this.groupState.metaWindows[i]); } } setVerticalSetting() { if (this.state.orientation === St.Side.TOP || this.state.orientation === St.Side.BOTTOM) { this.box.vertical = this.groupState.verticalThumbs || this.state.settings.verticalThumbs; } else { this.box.vertical = true; } // Do a full refresh if thumbnails don't exist - this happens when the thumbnail menu // initializes vertically from lack of calculated space, or thumbnails are disabled. if (!this.appThumbnails[0] || !this.appThumbnails[0].thumbnailActor.child) { this.fullyRefreshThumbnails(); } else { this.updateThumbnailSize(); } } updateThumbnailSize() { for (let i = 0; i < this.appThumbnails.length; i++) { if (this.appThumbnails[i]) { this.appThumbnails[i].refreshThumbnail(); } } } destroy() { this.willUnmount = true; if (!this.box) return; if (this.isOpen) this.close(true); for (let w = 0, len = this.appThumbnails.length; w < len; w++) { if (this.appThumbnails[w] !== undefined) { if (this.appThumbnails[w].entered) { this.appThumbnails[w].onLeave(); } this.appThumbnails[w].destroy(true); this.appThumbnails[w] = null; this.appThumbnails.splice(w, 1); } } this.removeAll(); super.destroy(); this.groupState.disconnect(this.connectId); unref(this, RESERVE_KEYS); } } module.exports = { AppMenuButtonRightClickMenu, HoverMenuController, AppThumbnailHoverMenu }; cinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/metadata.json0000664000175000017500000000040015167446463031571 0ustar fabiofabio{ "name": "Grouped window list", "role": "panellauncher, windowattentionhandler", "uuid": "grouped-window-list@cinnamon.org", "description": "Main Cinnamon window list with app grouping", "icon": "cs-windows", "max-instances": -1 } ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/settings-schema.jsoncinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/settings-schema.jso0000664000175000017500000001755515167446463032754 0ustar fabiofabio{ "layout": { "type" : "layout", "pages": ["generalPage", "panelPage", "thumbnailsPage", "contextMenuPage"], "generalPage": { "type" : "page", "title" : "General", "sections": ["generalSection", "hotKeysSection"] }, "panelPage": { "type" : "page", "title" : "Panel", "sections": ["appButtonsSection"] }, "thumbnailsPage": { "type" : "page", "title" : "Thumbnails", "sections": ["thumbnailsSection", "hoverPeekSection"] }, "contextMenuPage": { "type" : "page", "title" : "Context Menu", "sections": ["contextMenuSection"] }, "generalSection": { "type" : "section", "title" : "Behavior", "keys": [ "group-apps", "scroll-behavior", "left-click-action", "middle-click-action", "show-all-workspaces", "window-display-settings" ] }, "hotKeysSection": { "type" : "section", "title" : "Hot Keys", "keys": [ "cycleMenusHotkey", "show-apps-order-hotkey", "show-apps-order-timeout", "super-num-hotkeys" ] }, "appButtonsSection": { "type" : "section", "title" : "Application Buttons", "keys": [ "title-display", "launcher-animation-effect", "enable-window-count-badges", "enable-notification-badges", "enable-app-button-dragging" ] }, "thumbnailsSection": { "type" : "section", "title" : "Thumbnails", "keys": [ "thumbnail-scroll-behavior", "show-thumbnails", "animate-thumbnails", "vertical-thumbnails", "sort-thumbnails", "highlight-last-focused-thumbnail", "onclick-thumbnails", "thumbnail-timeout", "thumbnail-size" ] }, "hoverPeekSection": { "type" : "section", "title" : "Hover Peek", "keys": [ "enable-hover-peek", "hover-peek-time-in", "hover-peek-time-out", "hover-peek-opacity" ] }, "contextMenuSection": { "type" : "section", "title" : "", "keys": [ "show-recent", "autostart-menu-item", "monitor-move-all-windows" ] } }, "group-apps": { "type": "checkbox", "default": true, "description": "Group windows by application" }, "scroll-behavior": { "type": "combobox", "default": 1, "description": "Mouse wheel scroll action", "options": { "None": 1, "Cycle apps": 2, "Cycle windows": 3 } }, "left-click-action": { "type": "combobox", "default": 2, "description": "Left click action", "options": { "None": 1, "Toggle activation of last focused window": 2, "Cycle windows": 3 } }, "middle-click-action": { "type": "combobox", "default": 3, "description": "Middle click action", "options": { "None": 1, "Launch new app instance": 2, "Close last focused window in group": 3 } }, "show-all-workspaces": { "type": "checkbox", "default": false, "description": "Show windows from all workspaces" }, "window-display-settings": { "type": "combobox", "default": 1, "description": "Show windows from other monitors", "options": { "Only from monitors without a window list": 1, "From all monitors": 2 } }, "cycleMenusHotkey": { "type": "keybinding", "default": "", "description": "Global hotkey for cycling through thumbnail menus" }, "show-apps-order-hotkey": { "type": "keybinding", "default": "grave", "description": "Global hotkey to show the order of apps" }, "show-apps-order-timeout": { "type": "spinbutton", "default": 2500, "min": 100, "max": 10000, "step": 10, "units": "milliseconds", "description": "Duration of the apps order display on hotkey press" }, "super-num-hotkeys": { "type": "checkbox", "default": true, "description": "Enable Super+ shortcut to switch/open apps" }, "title-display": { "type": "combobox", "default": 1, "description": "Button label", "options": { "None": 1, "Application name": 2, "Window title": 3, "Window title (only for the focused window)": 4 } }, "launcher-animation-effect": { "type": "combobox", "default": 3, "description": "Launcher animation", "options": { "None": 1, "Fade": 2, "Scale": 3 } }, "enable-window-count-badges": { "type": "checkbox", "default": true, "description": "Show window count badges", "tooltip": "Indicate on the panel the number of open windows an application has" }, "enable-notification-badges": { "type": "checkbox", "default": true, "description": "Show notification badges", "tooltip": "Indicate on the panel when an application has notifications" }, "enable-app-button-dragging": { "type": "checkbox", "default": true, "description": "Enable app button dragging" }, "thumbnail-scroll-behavior": { "type": "checkbox", "default": false, "description": "Cycle windows on mouse wheel scroll" }, "show-thumbnails": { "type": "checkbox", "default": true, "description": "Show thumbnails" }, "animate-thumbnails": { "type": "checkbox", "default": false, "description": "Animate thumbnails" }, "vertical-thumbnails": { "type": "checkbox", "default": false, "description": "Enable vertical thumbnails" }, "sort-thumbnails": { "type": "checkbox", "default": false, "description": "Sort thumbnails according to the last focused windows" }, "highlight-last-focused-thumbnail": { "type": "checkbox", "default": true, "description": "Highlight the thumbnail of the last focused window" }, "onclick-thumbnails": { "type": "checkbox", "default": false, "description": "Click to show thumbnails" }, "thumbnail-timeout": { "dependency": "!onclick-thumbnails", "type": "combobox", "default": 250, "description": "Delay before showing thumbnails", "options": { "50 ms": 50, "250 ms": 250, "500 ms": 500 } }, "thumbnail-size": { "type": "combobox", "default": 6, "description": "Thumbnail size", "options": { "Small": 3, "Medium": 6, "Large": 9, "Largest": 12 } }, "enable-hover-peek": { "type": "checkbox", "default": true, "description": "Show the window when hovering its thumbnail" }, "hover-peek-time-in": { "dependency": "enable-hover-peek", "type": "combobox", "default": 300, "description": "Window fade-in time", "options": { "150 ms": 150, "300 ms": 300, "450 ms": 450 } }, "hover-peek-time-out": { "dependency": "enable-hover-peek", "type": "combobox", "default": 0, "description": "Window fade-out time", "options": { "None": 0, "150 ms": 150, "300 ms": 300, "450 ms": 450 } }, "hover-peek-opacity": { "dependency": "enable-hover-peek", "type": "spinbutton", "default": 100, "min": 0, "max": 100, "step": 1, "units": "percent", "description": "Window opacity" }, "show-recent": { "type": "checkbox", "default": true, "description": "Show recent items" }, "autostart-menu-item": { "type": "checkbox", "default": false, "description": "Show autostart option" }, "monitor-move-all-windows": { "type": "checkbox", "default": true, "description": "Apply the monitor move option to all windows", "tooltip": "When clicking \"Move to monitor\" in the context menu, this option will move all of an app's windows instead of just the last focused window from the app." }, "pinned-apps": { "type": "generic", "default": ["nemo.desktop", "firefox.desktop", "org.gnome.Terminal.desktop"] } } cinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/state.js0000664000175000017500000002121415167446463030602 0ustar fabiofabio function intersect(array1, array2, difference = false) { let result = []; for (let i = 0; i < array1.length; i++) { if ((!difference && array2.indexOf(array1[i]) > -1) || (difference && array2.indexOf(array1[i]) === -1)) { result.push(array1[i]); } } return result; } function clone(object, refs = [], cache = null) { if (!cache) { cache = object; } let copy; if (!object || typeof object !== 'object' || object.prototype || object.toString().indexOf('[0x') > -1) { return object; } if (object instanceof Date) { copy = new Date(); copy.setTime(object.getTime()); return copy; } if (Array.isArray(object) || object instanceof Array) { refs.push(object); copy = []; for (let i = 0; i < object.length; i++) { if (refs.indexOf(object[i]) >= 0) { // circular return null; } copy[i] = clone(object[i], refs, cache); } refs.pop(); return copy; } refs.push(object); copy = {}; if (object instanceof Error) { copy.name = object.name; copy.message = object.message; copy.stack = object.stack; } let keys = Object.keys(object); for (let i = 0; i < keys.length; i++) { if (!Object.prototype.hasOwnProperty.call(object, keys[i])) { continue; } if (refs.indexOf(object[keys[i]]) >= 0) { return null; } copy[keys[i]] = clone(object[keys[i]], refs, cache); } refs.pop(); return copy; } /** * init: * @state (object): The applet that contains the context menu. * @listeners (array): The orientation of the applet. * * Constructor function * * Returns (object): The public API with state. */ /** * get: * @key (string|null): The key to get from the state object. * * Passing null or an asterisk will retrieve the entire state object. * Passing keys with dot notation will return the corresponding object path. * E.g., "bar.foo". * * Returns (object): The cloned object. */ /** * set: * @object (object): The object to assign into state. * @forceDispatch (boolean): Whether or not to force dispatching of callbacks from any * connected listeners on @object's keys. By default, this only occurs if the state has * actually changed as a result of setting. * * Copies a keyed object back into state, and calls dispatch to fire any connected callbacks. * * Returns (object): The public API for chaining. */ /** * exclude: * @excludeKeys (array): Array of string keys. * * Returns (object): The public API with filtered state. */ /** * trigger: * * Fires a callback event for any matching keys in the listener queue. * It supports passing through unlimited arguments to the callback. * Useful for setting up actions. * * Returns (any): Return result of the callback. */ /** * connect: * @actions (string|array|object): Actions * @callback (function): The function to be invoked on either state * property change, or through the trigger method. * * Returns (number): The connection ID to use for later disconnection. */ /** * disconnect: * @key (string): The ID to disconnect. * * Removes a callback listener from the queue. */ /** * destroy: * * Assigns undefined to all state properties and listeners. Intended * to be used at the end of the application life cycle. * */ function createStore(state = {}, listeners = [], connections = 0) { const publicAPI = Object.freeze({ get, set, exclude, trigger, connect, disconnect, destroy }); function getAPIWithObject(object) { return Object.assign(object, publicAPI); } function dispatch(object) { let keys = Object.keys(object); for (let i = 0; i < listeners.length; i++) { let commonKeys = intersect(keys, listeners[i].keys); if (commonKeys.length === 0) { continue; } if (listeners[i].callback) { let partialState = {}; for (let z = 0; z < listeners[i].keys.length; z++) { partialState[listeners[i].keys[z]] = state[listeners[i].keys[z]]; } listeners[i].callback(partialState); } } } function storeError(method, key, message) { global.log(new Error('[store -> ' + method + ' -> ' + key + '] ' + message)); } function getByPath(key, state) { const path = key.split('.'); let object = clone(state); for (let i = 0; i < path.length; i++) { object = object[path[i]]; if (!object) { return object; } } return object; } function get(key = null) { if (!key || key === '*') { return state; } if (key.indexOf('.') > -1) { return getByPath(key, state); } return clone(state[key]); } function set(object, forceDispatch) { let keys = Object.keys(object); let changed = false; for (let i = 0; i < keys.length; i++) { if (state[keys[i]] !== object[keys[i]]) { changed = true; state[keys[i]] = object[keys[i]]; } } if ((changed || forceDispatch) && listeners.length > 0) { dispatch(object); } return publicAPI; } function exclude(excludeKeys) { let object = {}; let keys = Object.keys(state); for (let i = 0; i < keys.length; i++) { if (excludeKeys.indexOf(keys[i]) === -1) { object[keys[i]] = state[keys[i]]; } } return getAPIWithObject(object); } function trigger() { const [key, ...args] = Array.from(arguments); let matchedListeners = listeners.filter(function(listener) { return listener.keys.indexOf(key) > -1 && listener.callback; }); if (matchedListeners.length === 0) { storeError('trigger', key, 'Action not found.'); } for (let i = 0, len = matchedListeners.length; i < len; i++) { if (len > 1) { matchedListeners[i].callback(...args); } else { return matchedListeners[i].callback(...args); } } } function _connect(keys, callback, id) { let listener; if (callback) { listener = listeners.find(function(listener) { return listener.callback === callback; }); } if (listener) { let newKeys = intersect(keys, listener.keys, true); listener.keys.concat(newKeys); } else { listeners.push({keys, callback, id}); } } function connect(actions, callback) { const id = connections++; if (Array.isArray(actions)) { _connect(actions, callback, id); } else if (typeof actions === 'string') { _connect([actions], callback, id); } else if (typeof actions === 'object') { let keys = Object.keys(actions); for (let i = 0; i < keys.length; i++) { _connect([keys[i]], actions[keys[i]], id); } } return id; } function disconnectByKey(key) { let listener = listeners.filter(function(listener) { return listener.keys.indexOf(key) > -1; }); let listenerIndex = listeners.indexOf(listener); if (listenerIndex === -1) { storeError('disconnect', key, 'Invalid disconnect key.'); } listeners[listenerIndex] = undefined; listeners.splice(listenerIndex, 1); } function disconnect(key) { if (typeof key === 'string') { disconnectByKey(key); } else if (Array.isArray(key)) { for (let i = 0; i < key.length; i++) { disconnectByKey(key[i]); } } else if (typeof key === 'number') { let len = listeners.slice().length; for (let i = 0; i < len; i++) { if (!listeners[i] || listeners[i].id !== key) { continue; } listeners[i] = undefined; listeners.splice(i, 1); } } } function destroy() { let keys = Object.keys(state); for (let i = 0; i < keys.length; i++) { state[keys[i]] = undefined; } for (let i = 0; i < listeners.length; i++) { listeners[i] = undefined; } } return getAPIWithObject(state); } module.exports = createStore;cinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/utils.py0000775000175000017500000000671215167446463030647 0ustar fabiofabio#!/usr/bin/python3 import subprocess import os import json import sys CLI = sys.argv def parse_args(command): return command.split(' ') def spawn(command): try: process = subprocess.run( parse_args(command), stdout=subprocess.PIPE, check=True ) except Exception: raise subprocess.CalledProcessError(1, command) out = process.stdout.decode('utf-8') return out # Utility script that creates GDesktop files for Wine and other window backed applications. def handle_cli(): if CLI[1] == 'get_process': process = spawn('cat /proc/{}/cmdline'.format(CLI[2])) if '.exe' in process: if 'Z:' in process: process = process.split('Z:')[1] process = process.replace('\\', '/') process = process.split('.exe')[0] + '.exe' process = 'wine '+process.replace(' ', r'\ ') process = json.dumps(process) if '\\u0000' in process: process = process.replace('\\u0000', ' ') process = json.loads(process) if '.exe' not in process: process = process[:-1] if process == 'python mainwindow.py': process = 'playonlinux' try: proc_array = process.split('/') pa_len = len(proc_array) process_name = proc_array[pa_len - 1].title() # Since this is a window backed app, make sure it has an icon association. icons_dir = '{}/.local/share/icons/hicolor/48x48/apps/'.format(os.getenv('HOME')) if '\\ ' in process_name: process_name = process_name.replace('\\ ', ' ') if '.Exe' in process_name: process_name = process_name.replace('.Exe', '') icon_file = process_name+'.png' if ' ' in icon_file: icon_file = icon_file.replace(' ', '') icon = icons_dir+icon_file try: try: spawn('gnome-exe-thumbnailer {} {}'.format(process.split('wine ')[1], icon)) except IndexError: spawn('gnome-exe-thumbnailer {} {}'.format(process, icon)) except subprocess.CalledProcessError: icon = None g_menu = '[Desktop Entry]\n' \ 'Type=Application\n' \ 'Encoding=UTF-8\n' \ 'Name={}\n' \ 'Comment={}\n' \ 'Exec={}\n' \ 'Terminal=false\n' \ 'StartupNotify=true\n'.format(process_name, process_name, process) if icon: g_menu += 'Icon={}\n'.format(icon) if '.exe' in process: g_menu += 'GenericName=Wine application\n' \ 'Categories=Wine;\n' \ 'MimeType=application/x-ms-dos-executable;' \ 'application/x-msi;application/x-ms-shortcut; \n' \ desktop_file = '{}.cinnamon-generated.desktop'.format(process_name) desktop_path = '{}/.local/share/applications/{}'.format(os.getenv('HOME'), desktop_file) with open(desktop_path, 'w', encoding='utf-8') as desktop: print(g_menu) desktop.write(g_menu) spawn('chmod +x {}'.format(desktop_path)) print(desktop_file) except KeyError as err: print(err) return handle_cli() cinnamon-6.6.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/workspace.js0000664000175000017500000003702715167446463031471 0ustar fabiofabioconst Clutter = imports.gi.Clutter; const Main = imports.ui.main; const {SignalManager} = imports.misc.signalManager; const {unref} = imports.misc.util; const createStore = require('./state'); const AppGroup = require('./appGroup'); const {RESERVE_KEYS} = require('./constants'); class Workspace { constructor(params) { this.state = params.state; this.state.connect({ orientation: () => this.on_orientation_changed(false) }); this.workspaceState = createStore({ workspaceIndex: params.index, lastFocusedApp: null }); this.workspaceState.connect({ getWorkspace: () => this.metaWorkspace, updateAppGroupIndexes: () => this.updateAppGroupIndexes(), closeAllRightClickMenus: (cb) => this.closeAllRightClickMenus(cb), closeAllHoverMenus: (cb) => this.closeAllHoverMenus(cb), windowAdded: (win) => this.windowAdded(this.metaWorkspace, win), windowRemoved: (win) => this.windowRemoved(this.metaWorkspace, win), removeChild: (actor) => { if (this.state.willUnmount) { return; } this.actor.remove_child(actor); }, updateFocusState: (focusedAppId) => { this.appGroups.forEach( appGroup => { if (focusedAppId === appGroup.groupState.appId) return; appGroup.onFocusChange(false); }); } }); this.signals = new SignalManager(null); this.metaWorkspace = params.metaWorkspace; const managerOrientation = this.state.isHorizontal ? 'HORIZONTAL' : 'VERTICAL'; this.manager = new Clutter.BoxLayout({orientation: Clutter.Orientation[managerOrientation]}); this.actor = new Clutter.Actor({layout_manager: this.manager}); this.appGroups = []; this.lastFocusedApp = null; // Connect all the signals this.signals.connect(global.display, 'window-workspace-changed', (...args) => this.windowWorkspaceChanged(...args)); // Ugly change: refresh the removed app instances from all workspaces this.signals.connect(this.metaWorkspace, 'window-removed', (...args) => this.windowRemoved(...args)); this.signals.connect(global.window_manager, 'switch-workspace' , (...args) => this.reloadList(...args)); this.on_orientation_changed(null, true); } on_orientation_changed() { if (!this.manager) return; if (!this.state.isHorizontal) { this.manager.set_orientation(Clutter.Orientation.VERTICAL); this.actor.set_x_align(Clutter.ActorAlign.CENTER); } else { this.manager.set_orientation(Clutter.Orientation.HORIZONTAL); } this.refreshList(); } getWindowCount(appId) { let windowCount = 0; this.appGroups.forEach( appGroup => { if (appGroup.groupState.appId !== appId) return; windowCount += appGroup.groupState.metaWindows.length; }); return windowCount; } closeAllHoverMenus(cb) { this.appGroups.forEach( appGroup => { const {hoverMenu, groupState} = appGroup; if (hoverMenu && hoverMenu.isOpen) { groupState.set({thumbnailMenuEntered: false}); hoverMenu.close(true); } }); if (typeof cb === 'function') cb(); } closeAllRightClickMenus(cb) { this.appGroups.forEach( appGroup => { if (typeof appGroup.rightClickMenu !== 'undefined' && appGroup.rightClickMenu.isOpen) { appGroup.rightClickMenu.close(); } }); if (typeof cb === 'function') cb(); } onAppKeyPress(number) { if (!this.appGroups[number - 1]) return; this.appGroups[number - 1].onAppKeyPress(number); } onNewAppKeyPress(number) { if (number > this.appGroups.length) return; this.appGroups[number - 1].launchNewInstance(); } showAppsOrder() { for (let i = 0, len = this.appGroups.length; i < len; i++) { this.appGroups[i].showOrderLabel(i); } setTimeout(() => this.calcAllWindowNumbers(), this.state.settings.showAppsOrderTimeout); } cycleMenus(r = 0) { if (r > this.appGroups.length) { this.state.set({lastCycled: -1}); return; } let {lastCycled} = this.state; this.lastCycledTime = Date.now(); if (lastCycled < 0) { lastCycled = this.appGroups.findIndex( appGroup => appGroup.groupState.appId === this.workspaceState.lastFocusedApp ); } if (lastCycled < 0 || lastCycled > this.appGroups.length - 1) { lastCycled = 0; } const refApp = this.appGroups[lastCycled]; lastCycled++; this.state.set({lastCycled}); if (refApp.groupState.metaWindows.length !== 0) { // open hoverMenu if app has windows this.closeAllHoverMenus() refApp.groupState.set({thumbnailMenuEntered: true}); if (!refApp.hoverMenu) { refApp.initThumbnailMenu(); } refApp.hoverMenu.open(true); const lastCycledTime = this.lastCycledTime; setTimeout(() => { if (lastCycledTime === this.lastCycledTime) { if (refApp.hoverMenu.shouldClose) { // do not close hoverMenu if user is using it refApp.hoverMenu.close(); } this.state.set({lastCycled: -1}); } }, 2000) } else { this.cycleMenus(r + 1); } } reloadList() { const windows = this.metaWorkspace.list_windows(); for (let i = 0, len = windows.length; i < len; i++) { this.windowAdded(this.metaWorkspace, windows[i]); } } refreshList() { this.appGroups.forEach( appGroup => { appGroup.destroy(); appGroup = null; }); this.appGroups = []; this.loadFavorites(); this.refreshApps(); } loadFavorites() { const favorites = this.state.trigger('getFavorites'); const appSystem = this.state.trigger('getAppSystem'); for (let i = 0; i < favorites.length; i++) { const app = appSystem.lookup_app(favorites[i].id); if (!app) continue; const appWindows = app.get_windows().filter( metaWindow => this.shouldWindowBeAdded(metaWindow) ); if (appWindows.length === 0) { this.windowAdded(this.metaWorkspace, null, app, true); continue; } for (let i = 0; i < appWindows.length; i++) { this.windowAdded(this.metaWorkspace, appWindows[i], app, true); } } } refreshApps() { let windows; if (this.state.settings.showAllWorkspaces) { windows = global.display.list_windows(0); } else { windows = this.metaWorkspace.list_windows(); } for (let i = 0, len = windows.length; i < len; i++) { this.windowAdded(this.metaWorkspace, windows[i]); } } updateAttentionState(display, window) { this.appGroups.forEach( appGroup => { if (appGroup.groupState.metaWindows) { appGroup.onWindowDemandsAttention(window); } if (appGroup.hoverMenu) { const thumbnail = appGroup.hoverMenu.appThumbnails.find( thumbnail => thumbnail.metaWindow === window ); if (thumbnail) { thumbnail.setThumbnailDemandsAttention(true); } } }); } shouldWindowBeAdded(metaWindow) { return (this.state.settings.showAllWorkspaces || metaWindow.is_on_all_workspaces() || metaWindow.get_workspace() === this.metaWorkspace) && Main.isInteresting(metaWindow) && this.state.monitorWatchList.indexOf(metaWindow.get_monitor()) > -1; } windowWorkspaceChanged(display, metaWorkspace, metaWindow) { this.windowAdded(metaWindow, metaWorkspace); } windowAdded(metaWorkspace, metaWindow, app, isFavoriteApp) { if (!this.state) return; if (metaWindow && !this.shouldWindowBeAdded(metaWindow)) return; if (metaWindow && this.state.appletReady && this.state.settings.showAllWorkspaces && !this.state.addingWindowToWorkspaces) { this.state.addingWindowToWorkspaces = true; this.state.trigger('addWindowToAllWorkspaces', metaWindow, app, isFavoriteApp); } // Check to see if the window that was added already has an app group. // If it does, then we don't need to do anything. If not, we need to // create an app group. if (!app) { app = this.state.trigger('getAppFromWindow', metaWindow); } if (!app || (!isFavoriteApp && metaWindow && this.state.monitorWatchList.indexOf(metaWindow.get_monitor()) === -1)) { return; } let refApp = -1, refWindow = -1, transientFavorite = false; for (let i = 0; i < this.appGroups.length; i++) { if (app === this.appGroups[i].groupState.app) { refApp = i; } const ref = this.appGroups[i].groupState.metaWindows.indexOf(metaWindow); if (ref > -1) { if (refApp === -1 || !this.state.settings.groupApps) { refApp = i; } refWindow = ref; break; } } if (!this.state.settings.groupApps && !isFavoriteApp) { const refFav = this.state.trigger('getFavorites').findIndex( favorite => favorite.app === app ); if (refFav > -1) { isFavoriteApp = true; transientFavorite = true; } } const initApp = (idx) => { const appGroup = new AppGroup({ state: this.state, workspaceState: this.workspaceState, app, isFavoriteApp, metaWorkspace, metaWindow, appId: app.get_id() }); if(idx > -1) { this.actor.insert_child_at_index(appGroup.actor, idx); this.appGroups.splice(idx, 0, appGroup); } else { this.actor.add_child(appGroup.actor); this.appGroups.push(appGroup); } appGroup.windowAdded(metaWindow); }; if (refApp === -1) { initApp(-1); } else if (metaWindow) { if (this.state.settings.groupApps) { this.appGroups[refApp].windowAdded(metaWindow); } else if (transientFavorite && this.appGroups[refApp].groupState.metaWindows.length === 0) { this.appGroups[refApp].windowAdded(metaWindow); } else if (refWindow === -1) { initApp(refApp+1); } } } calcAllWindowNumbers() { this.appGroups.forEach( appGroup => { appGroup.calcWindowNumber(); }); } updateAppGroupIndexes() { const newAppGroups = []; this.actor.get_children().forEach( child => { const appGroup = this.appGroups.find( appGroup => appGroup.actor === child); if (appGroup) { newAppGroups.push(appGroup); } }); this.appGroups = newAppGroups; } windowRemoved(metaWorkspace, metaWindow) { if (!this.state) return; if ((metaWindow.is_on_all_workspaces() || this.state.settings.showAllWorkspaces || !this.state.settings.showAllWorkspaces) && !this.state.removingWindowFromWorkspaces) { // Abort the remove if the window is just changing workspaces, window // should always remain indexed on all workspaces while its mapped. // if (!metaWindow.showing_on_its_workspace()) return; if ((this.state.settings.showAllWorkspaces) && (metaWindow.has_focus() && global.workspace_manager.get_active_workspace_index() !== metaWorkspace.index())) return; this.state.removingWindowFromWorkspaces = true; this.state.trigger('removeWindowFromAllWorkspaces', metaWindow); return; } let refWindow = -1; const refApp = this.appGroups.findIndex( appGroup => { const window = appGroup.groupState.metaWindows.findIndex( win => win === metaWindow); if (window > -1) { refWindow = window; return true; } }); if (refApp > -1) { this.appGroups[refApp].windowRemoved(metaWorkspace, metaWindow, refWindow, (appId, isFavoriteApp) => { if (isFavoriteApp) { if (this.state.settings.groupApps || this.getWindowCount(appId) === 0) { this.appGroups[refApp].groupState.set({groupReady: false, lastFocused: null}); this.appGroups[refApp].actor.set_style_pseudo_class('closed'); this.appGroups[refApp].actor.remove_style_class_name('grouped-window-list-item-demands-attention'); this.appGroups[refApp].setActiveStatus(false); if (this.state.settings.titleDisplay > 1) { this.appGroups[refApp].hideLabel(); } } else { // pinned app closed in ungrouped-windows mode and another instance of app already exists in appGroups // move other instance to original apps' position const refAppId = this.appGroups[refApp].groupState.appId; this.appGroups[refApp].destroy(true); this.appGroups[refApp] = undefined; this.appGroups.splice(refApp, 1); const otherApp = this.appGroups.findIndex( appGroup => appGroup.groupState.appId === refAppId ); const otherAppObject = this.appGroups[otherApp] // in edge case when multiple apps of the same program are favorited, do not move other app if(!otherAppObject.groupState.isFavoriteApp) { this.appGroups.splice(otherApp, 1); this.actor.set_child_at_index(otherAppObject.actor, refApp); this.appGroups.splice(refApp, 0, otherAppObject); // change previously unpinned app status to pinned otherAppObject.groupState.isFavoriteApp = true; } } } else { this.appGroups[refApp].destroy(true); this.appGroups[refApp] = undefined; this.appGroups.splice(refApp, 1); } }); } } destroy() { this.signals.disconnectAllSignals(); this.appGroups.forEach( appGroup => appGroup.destroy() ); this.workspaceState.destroy(); this.manager = null; this.actor.destroy(); unref(this, RESERVE_KEYS); } } module.exports = Workspace; cinnamon-6.6.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/0000775000175000017500000000000015167446463024627 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js0000664000175000017500000004170115167446463026455 0ustar fabiofabioconst Applet = imports.ui.applet; const Gio = imports.gi.Gio; const Lang = imports.lang; const Main = imports.ui.main; const St = imports.gi.St; const Tooltips = imports.ui.tooltips; const PopupMenu = imports.ui.popupMenu; const GnomeSession = imports.misc.gnomeSession; const Settings = imports.ui.settings; const Util = imports.misc.util; const INHIBIT_IDLE_FLAG = 8; const INHIBIT_SLEEP_FLAG = 4; class InhibitAppletIcon { constructor(applet, notificationStatus, inhibitStatus) { this._applet = applet; this.icon_name = 'inhibit'; this.notificationStatus = notificationStatus; this.inhibitStatus = inhibitStatus; } setAppletIcon() { this._applet.set_applet_icon_symbolic_name(this.getAppletIcon()); } getAppletIcon() { let appletIcon = this.icon_name; if (this.inhibitStatus) { appletIcon += '-active'; } if (this.notificationStatus) { appletIcon += '-notifications-disabled'; } return appletIcon; } toggleNotificationStatus() { this.notificationStatus = !this.notificationStatus; this.setAppletIcon(); } toggleInhibitStatus(status) { this.inhibitStatus = status; this.setAppletIcon(); } } class InhibitSwitch extends PopupMenu.PopupBaseMenuItem { constructor(applet) { super(); this._applet = applet; this.label = new St.Label({ text: _("Power management") }); this.actor.label_actor = this.label; this._statusIcon = new St.Icon({ style_class: 'popup-menu-icon', icon_type: St.IconType.SYMBOLIC, icon_name: "xsi-dialog-warning-symbolic", reactive: true }); this._switch = new PopupMenu.Switch(true); this.addActor(this.label); this.addActor(this._statusIcon); this._statusBin = new St.Bin({ x_align: St.Align.END }); this.addActor(this._statusBin, { expand: true, span: -1, align: St.Align.END }); this._statusBin.child = this._switch.actor; this.actor.hide(); this.tooltip = new Tooltips.Tooltip(this._statusIcon, ""); this.sessionProxy = null; this.sessionCookie = null; this.sigAddedId = 0; this.sigRemovedId = 0; GnomeSession.SessionManager(Lang.bind(this, function(proxy, error) { if (error) return; this.sessionProxy = proxy; this.actor.show(); this.updateStatus(); this.sigAddedId = this.sessionProxy.connectSignal( "InhibitorAdded", Lang.bind(this, this.updateStatus) ); this.sigRemovedId = this.sessionProxy.connectSignal( "InhibitorRemoved", Lang.bind(this, this.updateStatus) ); })); } activate(event) { if (this._switch.actor.mapped) { this._switch.toggle(); } this.toggled(this._switch.state); PopupMenu.PopupBaseMenuItem.prototype.activate.call(this, event, true); } updateStatus(o) { let current_state = this.sessionProxy.InhibitedActions; if (current_state & INHIBIT_IDLE_FLAG || current_state & INHIBIT_SLEEP_FLAG) { this._applet.icon.toggleInhibitStatus(true); this._applet.set_applet_tooltip(_("Power management: Inhibited")); } else { this._applet.icon.toggleInhibitStatus(false); this._applet.set_applet_tooltip(_("Power management: Active")); } if (current_state >= INHIBIT_SLEEP_FLAG && !this.sessionCookie) { this.tooltip.set_text(_("Power management is already inhibited by another program")); this._applet.set_applet_tooltip(_("Power management: inhibited by another program")); this._statusIcon.set_opacity(255); this._applet.inhibitors.updateInhibitors(this.sessionProxy); } else { this.tooltip.set_text(""); this._statusIcon.set_opacity(0); this._applet.inhibitors.resetInhibitors(); } } toggled(active) { if (!active && !this.sessionCookie) { this.sessionProxy.InhibitRemote("inhibit@cinnamon.org", 0, "prevent idle functions like screen blanking and dimming", INHIBIT_IDLE_FLAG, Lang.bind(this, function(cookie) { this.sessionCookie = cookie; this.updateStatus(); })); } else if (active && this.sessionCookie) { this.sessionProxy.UninhibitRemote(this.sessionCookie, Lang.bind(this, this.updateStatus)); this.sessionCookie = null; } } kill() { if (!this.sessionProxy) return; if (this.sessionCookie) { this.sessionProxy.UninhibitRemote(this.sessionCookie); this.sessionCookie = null; } if (this.sigAddedId) { this.sessionProxy.disconnectSignal(this.sigAddedId); } if (this.sigRemovedId) { this.sessionProxy.disconnectSignal(this.sigRemovedId); } } } class InhibitingAppMenuItem extends PopupMenu.PopupIconMenuItem { constructor(appId) { super( appId, "xsi-dialog-information-symbolic", St.IconType.SYMBOLIC, { activate: false, hover: false } ); this.appId = appId; this._reasonsByObjPath = {}; this._inhibitorCount = 0; this._tooltip = new Tooltips.Tooltip(this.actor, ""); } addInhibitor(objectPath, reason) { if (!(objectPath in this._reasonsByObjPath)) { this._reasonsByObjPath[objectPath] = reason; this._inhibitorCount++; this._updateTooltip(); } } updateInhibitor(objectPath, reason) { if (objectPath in this._reasonsByObjPath) { this._reasonsByObjPath[objectPath] = reason; this._updateTooltip(); } } removeInhibitor(objectPath) { if (objectPath in this._reasonsByObjPath) { delete this._reasonsByObjPath[objectPath]; this._inhibitorCount--; this._updateTooltip(); } } hasInhibitor() { return !!this._inhibitorCount; } _updateTooltip() { let reasons = Object.values(this._reasonsByObjPath) .map(r => r && r.trim()) // Remove extraneous whitespace. .filter(Boolean); // Discard null/empty reasons. reasons = Array.from(new Set(reasons)); // Keep only unique reasons. this._tooltip.set_text(reasons.join("\n")); } } class InhibitorMenuSection extends PopupMenu.PopupMenuSection { constructor() { super(); // Menu items indexed by app ID e.g. "org.gnome.Rhythmbox3". // Each menu item is associated with exactly one app ID and vice versa. this._itemsByAppId = {}; // Menu items indexed by object path e.g. "/org/gnome/SessionManager/Inhibitor42". // Multiple paths may point to the same item if an app creates multiple inhibitors. this._itemsByObjPath = {}; this._itemCount = 0; this._updateId = 0; // light-weight way to abort an in-progress update (by incrementing) this._createHeading(); this.actor.hide(); } _createHeading() { let headingText = _("Apps inhibiting power management:"); let heading = new PopupMenu.PopupMenuItem(headingText, { reactive: false }); this.addMenuItem(heading); } resetInhibitors() { // Abort any in-progress update or else it may continue to add menu items // even after we've cleared them. this._updateId++; if (this._itemCount) { this._itemsByAppId = {}; this._itemsByObjPath = {}; this._itemCount = 0; // Clear all, but make sure we still have a heading for next time we're shown. this.removeAll(); this._createHeading(); this.actor.hide(); } } updateInhibitors(sessionProxy) { // Grab a new ID for this update while at the same time aborting any other in-progress // update. We don't want to end up with duplicate menu items! let updateId = ++this._updateId; sessionProxy.GetInhibitorsRemote(Lang.bind(this, function(objectPaths) { if (updateId != this._updateId) { return; } objectPaths = String(objectPaths).split(','); // Given object, convert to string[]. // Add menu items for any paths we haven't seen before, and keep track of the paths // iterated so we can figure out which of our existing paths are no longer present. let pathsPresent = {}; for (let objectPath of objectPaths) { if (objectPath) { pathsPresent[objectPath] = true; if (!(objectPath in this._itemsByObjPath)) { this._addInhibitor(objectPath, updateId); } } } // Remove menu items for those paths no longer present. for (let objectPath in this._itemsByObjPath) { if (!(objectPath in pathsPresent)) { this._removeInhibitor(objectPath); } } })); } // Precondition: objectPath not already in _itemsByObjPath _addInhibitor(objectPath, updateId) { GnomeSession.Inhibitor(objectPath, Lang.bind(this, function(inhibitorProxy, error) { if (error || updateId != this._updateId) { return; } inhibitorProxy.GetFlagsRemote(Lang.bind(this, function(flags) { if (updateId != this._updateId) { return; } flags = parseInt(flags, 10); // Given object, convert to integer. // Only include those inhibiting sleep, idle, or both. if (flags < INHIBIT_SLEEP_FLAG) { return; } inhibitorProxy.GetAppIdRemote(Lang.bind(this, function(appId) { if (updateId != this._updateId) { return; } appId = String(appId); // Given object, convert to string. // Get/create the menu item for this app. let menuItem; if (appId in this._itemsByAppId) { menuItem = this._itemsByAppId[appId]; } else { menuItem = new InhibitingAppMenuItem(appId); this._itemsByAppId[appId] = menuItem; this.addMenuItem(menuItem); // Show the menu section upon adding the first menu item. if (!(this._itemCount++)) { this.actor.show(); } } this._itemsByObjPath[objectPath] = menuItem; // Go ahead and add the inhibitor to the item now and fill in the reason later. menuItem.addInhibitor(objectPath); inhibitorProxy.GetReasonRemote(Lang.bind(this, function(reason) { if (updateId != this._updateId) { return; } reason = String(reason); // Given object, convert to string. menuItem.updateInhibitor(objectPath, reason); })); })); })); })); } // Precondition: objectPath already in _itemsByObjPath _removeInhibitor(objectPath) { let menuItem = this._itemsByObjPath[objectPath]; delete this._itemsByObjPath[objectPath]; menuItem.removeInhibitor(objectPath); // Remove the menu item if the last inhibitor for the app has been removed. if (!menuItem.hasInhibitor()) { delete this._itemsByAppId[menuItem.appId]; menuItem.destroy(); // Hide the menu section upon removing the last menu item. if (!(--this._itemCount)) { this.actor.hide(); } } } } class CinnamonInhibitApplet extends Applet.IconApplet { constructor(metadata, orientation, panel_height, instanceId) { super(orientation, panel_height, instanceId); this.metadata = metadata; this.menuManager = new PopupMenu.PopupMenuManager(this); this.menu = new Applet.AppletPopupMenu(this, orientation); this.menuManager.addMenu(this.menu); this.inhibitSwitch = new InhibitSwitch(this); this.menu.addMenuItem(this.inhibitSwitch); this.set_applet_tooltip(_("Inhibit applet")); this.notif_settings = new Gio.Settings({ schema_id: "org.cinnamon.desktop.notifications" }); this.notificationsSwitch = new PopupMenu.PopupSwitchMenuItem(_("Notifications"), this.notif_settings.get_boolean("display-notifications")); this.icon = new InhibitAppletIcon(this, !this.notificationsSwitch.state, !this.inhibitSwitch.state); this.icon.setAppletIcon(); this.notif_settings.connect('changed::display-notifications', Lang.bind(this, function() { this.notificationsSwitch.setToggleState(this.notif_settings.get_boolean("display-notifications")); })); this.notificationsSwitch.connect('toggled', Lang.bind(this, function() { this.notif_settings.set_boolean("display-notifications", this.notificationsSwitch.state); this.icon.toggleNotificationStatus(); })); this.menu.addMenuItem(this.notificationsSwitch); this.settings = new Settings.AppletSettings(this, metadata.uuid, instanceId); this.settings.bind("keyPower", "keyPower", this._setKeybinding); this.settings.bind("keyNotifications", "keyNotifications", this._setKeybinding); this._setKeybinding(); this._createInhibitorMenuSection(orientation); } _createInhibitorMenuSection(orientation) { this._inhibitorMenuSection = new InhibitorMenuSection(); this._inhibitorSeparator = new PopupMenu.PopupSeparatorMenuItem(); if (orientation == St.Side.BOTTOM) { // Add above the switches. this.menu.addMenuItem(this._inhibitorSeparator, 0); this.menu.addMenuItem(this._inhibitorMenuSection, 0); } else { // Add below the switches. this.menu.addMenuItem(this._inhibitorSeparator); this.menu.addMenuItem(this._inhibitorMenuSection); } } _setKeybinding() { Main.keybindingManager.addXletHotKey(this, "inhibit-power", this.keyPower, Lang.bind(this, this.toggle_inhibit_power)); Main.keybindingManager.addXletHotKey(this, "inhibit-notifications", this.keyNotifications, Lang.bind(this, this.toggle_inhibit_notifications)); } on_applet_clicked(event) { this.menu.toggle(); } on_btn_open_system_power_settings_clicked() { Util.spawnCommandLine("cinnamon-settings power"); } on_btn_open_system_notification_settings_clicked() { Util.spawnCommandLine("cinnamon-settings notifications"); } on_applet_removed_from_panel() { Main.keybindingManager.removeXletHotKey(this, "inhibit-power"); Main.keybindingManager.removeXletHotKey(this, "inhibit-notifications"); this.inhibitSwitch.kill(); } on_orientation_changed(orientation) { this._inhibitorMenuSection.destroy(); this._inhibitorSeparator.destroy(); this._createInhibitorMenuSection(orientation); // Will put the inhibitor menu section into the correct state. this.inhibitSwitch.updateStatus(); } toggle_inhibit_power() { this.inhibitSwitch._switch.toggle(); this.inhibitSwitch.toggled(this.inhibitSwitch._switch.state); let _symbol = this.inhibitSwitch._switch.state ? "inhibit-symbolic" : "inhibit-active-symbolic"; let _text = this.inhibitSwitch._switch.state ? _("Power management: Active") : _("Power management: Inhibited"); Main.osdWindowManager.show(-1, Gio.ThemedIcon.new(_symbol), _text); } toggle_inhibit_notifications() { this.notificationsSwitch.toggle(); let _symbol = this.notificationsSwitch._switch.state ? "inhibit-notification-symbolic" : "inhibit-notification-active-symbolic"; let _text = this.notificationsSwitch._switch.state ? _("Notifications: Active") : _("Notifications: Inhibited"); Main.osdWindowManager.show(-1, Gio.ThemedIcon.new(_symbol), _text); } get inhibitors() { return this._inhibitorMenuSection; } } function main(metadata, orientation, panel_height, instanceId) { return new CinnamonInhibitApplet(metadata, orientation, panel_height, instanceId); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/icons/0000775000175000017500000000000015167446463025742 5ustar fabiofabio././@LongLink0000644000000000000000000000017600000000000011607 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/icons/inhibit-active-notifications-disabled-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/icons/inhibit-active-notificati0000664000175000017500000000317215167446463032716 0ustar fabiofabio Gnome Symbolic Icon Theme ././@LongLink0000644000000000000000000000014700000000000011605 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/icons/inhibit-active-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/icons/inhibit-active-symbolic.s0000664000175000017500000000144115167446463032644 0ustar fabiofabio Gnome Symbolic Icon Theme ././@LongLink0000644000000000000000000000016400000000000011604 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/icons/inhibit-notification-active-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/icons/inhibit-notification-acti0000664000175000017500000000250015167446463032712 0ustar fabiofabio ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/icons/inhibit-notification-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/icons/inhibit-notification-symb0000664000175000017500000000152215167446463032747 0ustar fabiofabio ././@LongLink0000644000000000000000000000016700000000000011607 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/icons/inhibit-notifications-disabled-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/icons/inhibit-notifications-dis0000664000175000017500000000304615167446463032742 0ustar fabiofabio Gnome Symbolic Icon Theme cinnamon-6.6.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/icons/inhibit-symbolic.svg0000664000175000017500000000134315167446463031731 0ustar fabiofabio Gnome Symbolic Icon Theme cinnamon-6.6.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/metadata.json0000664000175000017500000000037415167446463027306 0ustar fabiofabio{ "uuid": "inhibit@cinnamon.org", "name": "Inhibit Applet", "icon": "preferences-desktop-screensaver", "description": "This applet is used to disable notifications and power management (including the screensaver and the session from going idle)" } cinnamon-6.6.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/settings-schema.json0000664000175000017500000000166015167446463030623 0ustar fabiofabio{ "section1": { "type": "section", "description": "Keyboard shortcuts" }, "keyPower": { "type": "keybinding", "description": "Inhibit power management", "default": "", "tooltip": "Set keybinding(s) to inhibit power management." }, "keyNotifications": { "type": "keybinding", "description": "Inhibit notifications", "default": "", "tooltip": "Set keybinding(s) to inhibit notifications." }, "section2": { "type": "section", "description": "" }, "btnSystemPowerSettings": { "type": "button", "description": "Open power settings", "callback": "on_btn_open_system_power_settings_clicked" }, "btnSystemNotificationSettings": { "type": "button", "description": "Open notification settings", "callback": "on_btn_open_system_notification_settings_clicked" } } cinnamon-6.6.8/files/usr/share/cinnamon/applets/keyboard@cinnamon.org/0000775000175000017500000000000015167446463025001 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/keyboard@cinnamon.org/applet.js0000664000175000017500000003062715167446463026634 0ustar fabiofabioconst Applet = imports.ui.applet; const St = imports.gi.St; const Main = imports.ui.main; const PopupMenu = imports.ui.popupMenu; const Util = imports.misc.util; const Gio = imports.gi.Gio; const Signals = imports.signals; const KeyboardManager = imports.ui.keyboardManager; const IBus = imports.gi.IBus; const IBusManager = imports.misc.ibusManager; const SignalManager = imports.misc.signalManager; const PANEL_EDIT_MODE_KEY = "panel-edit-mode"; const POPUP_MENU_ICON_STYLE_CLASS = "popup-menu-icon"; const APPLET_ICON_STYLE_CLASS = "applet-icon"; class LayoutMenuItem extends PopupMenu.PopupBaseMenuItem { constructor(layout_setter, indicator, long_name) { super(); this._layout_setter = layout_setter; this.label = new St.Label({ text: long_name }); this.indicator = indicator; this.addActor(this.label); this.addActor(this.indicator); } activate(event) { PopupMenu.PopupBaseMenuItem.prototype.activate.call(this); this._layout_setter(); } } class CinnamonKeyboardApplet extends Applet.Applet { constructor(metadata, orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this._panel_icon_box = new St.Bin(); this._panel_icon_box.set_fill(true, false); this._panel_icon_box.set_alignment(St.Align.MIDDLE, St.Align.MIDDLE); this._signalManager = new SignalManager.SignalManager(null); this._signalManager.connect(this.panel, "icon-size-changed", () => this._syncGroup()); this.actor.add(this._panel_icon_box, { y_align: St.Align.MIDDLE, y_fill: false }); this.setAllowedLayout(Applet.AllowedLayout.BOTH); this._selectedLayout = null; this._layoutItems = new Map(); try { this.metadata = metadata; Main.systrayManager.registerTrayIconReplacement("keyboard", metadata.uuid); Main.systrayManager.registerTrayIconReplacement("input-method", metadata.uuid); this.menuManager = new PopupMenu.PopupMenuManager(this); this.menu = new Applet.AppletPopupMenu(this, orientation); this.menuManager.addMenu(this.menu); this.actor.add_style_class_name('panel-status-button'); const _syncConfig = () => this._syncConfig(); this._signalManager.connect(global.settings, 'changed::' + PANEL_EDIT_MODE_KEY, () => this._onPanelEditModeChanged()); this._layoutSection = new PopupMenu.PopupMenuSection(); this.menu.addMenuItem(this._layoutSection); this._propSeparator = new PopupMenu.PopupSeparatorMenuItem(); this.menu.addMenuItem(this._propSeparator); this._propSection = new PopupMenu.PopupMenuSection(); this.menu.addMenuItem(this._propSection); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.showLayoutAction = this.menu.addAction(_("Show Keyboard Layout"), () => this._showActiveLayout()); this.menu.addAction(_("Show Character Table"), () => { Main.overview.hide(); Util.spawn(['gucharmap']); }); this._applet_context_menu.addSettingsAction(_("Manage keyboard layouts"), 'keyboard', "layouts"); this._inputSourcesManager = KeyboardManager.getInputSourceManager(); this._signalManager.connect(this._inputSourcesManager, "sources-changed", this._onSourcesChanged.bind(this)); this._signalManager.connect(this._inputSourcesManager, "current-source-changed", this._onCurrentSourceChanged.bind(this)); this._syncConfig(); this._syncGroup(); } catch (e) { global.logError(e); } } _showActiveLayout() { Main.overview.hide(); let source = this._inputSourcesManager.currentSource; let description = source.xkbLayout; if (source.variant.length > 0) description = '%s\t%s'.format(description, source.variant); Util.spawn(['gkbd-keyboard-display', '-l', description]); } _onCurrentSourceChanged() { this._syncGroup(); } _onSourcesChanged() { this._syncConfig(); } _onPanelEditModeChanged() { this.actor.visible = global.settings.get_boolean(PANEL_EDIT_MODE_KEY) || this._inputSourcesManager.multipleSources; } on_applet_added_to_panel() { if (global.settings.get_boolean(PANEL_EDIT_MODE_KEY)) { this._onPanelEditModeChanged(); } this._signalManager.connect(this, 'orientation-changed', () => this.on_orientation_changed()); } on_orientation_changed() { this._syncGroup(); } _onButtonPressEvent(actor, event) { // Cycle to the next layout if (event.get_button() === 2) { let new_index = this._inputSourcesManager.currentSource.index + 1; if (new_index == this._inputSourcesManager.numInputSources) { new_index = 0; } this._inputSourcesManager.activateInputSourceIndex(new_index); } return Applet.Applet.prototype._onButtonPressEvent.call(this, actor, event); } on_applet_clicked(event) { this.menu.toggle(); } _syncConfig() { this._layoutItems.forEach((v, k, m) => v.destroy()); this._layoutItems = new Map() this._selectedLayout = null; for (const sourceId of Object.keys(this._inputSourcesManager.inputSources)) { const source = this._inputSourcesManager.inputSources[sourceId]; let actor = null; if (this._inputSourcesManager.showFlags) { actor = this._inputSourcesManager.createFlagIcon(source, POPUP_MENU_ICON_STYLE_CLASS, 22 * global.ui_scale); } if (actor == null) { actor = new St.Label({ text: source.shortName, style_class: "applet-label" }); } const menuItem = new LayoutMenuItem( () => source.activate(true), actor, source.displayName ); this._layoutItems.set(source, menuItem); this._layoutSection.addMenuItem(menuItem); } if (!this._inputSourcesManager.multipleSources) { this.menu.close(); this.actor.hide(); } else { this.actor.show(); } } _syncGroup() { const selected = this._inputSourcesManager.currentSource; if (this._selectedLayout) { this._selectedLayout.setShowDot(false); this._selectedLayout = null; } const item = this._layoutItems.get(selected); item.setShowDot(true); this._selectedLayout = item; this.set_applet_tooltip(selected.displayName); let actor = null; const iconSize = this.getPanelIconSize(St.IconType.SYMBOLIC); if (this._inputSourcesManager.showFlags) { actor = this._inputSourcesManager.createFlagIcon(selected, APPLET_ICON_STYLE_CLASS, iconSize); } if (actor == null) { actor = new St.Label({ text: selected.shortName, style_class: "applet-label" }); } this._panel_icon_box.set_child(actor); if (!this._inputSourcesManager.multipleSources) { this.actor.hide(); } this.showLayoutAction.setSensitive(selected.type === 'xkb'); this._updatePropertySection(selected.properties); } _setPanelIBusLabel(label) { let actor = new St.Label({ text: label, style_class: "applet-label" }); this._panel_icon_box.set_child(actor); } _updatePropertySection(properties) { // this._propSeparator.hide(); this._propSection.actor.hide(); this._propSection.removeAll(); this._buildPropSubMenu(this._propSection, properties); } _buildPropSubMenu(menu, props) { if (!props) return; this._propSection.actor.show(); let ibusManager = IBusManager.getIBusManager(); let radioGroup = []; let p; for (let i = 0; (p = props.get(i)) != null; ++i) { let prop = p; if (!prop.get_visible()) continue; if (prop.get_key() == 'InputMode') { let text; if (prop.get_symbol) text = prop.get_symbol().get_text(); else text = prop.get_label().get_text(); let currentSource = this._inputSourcesManager.currentSource; if (currentSource) { let indicatorLabel = this._layoutItems.get(currentSource); if (text && text.length > 0 && text.length < 3) this._setPanelIBusLabel(text) } } let item; let type = prop.get_prop_type(); switch (type) { case IBus.PropType.MENU: item = new PopupMenu.PopupSubMenuMenuItem(prop.get_label().get_text()); this._buildPropSubMenu(item.menu, prop.get_sub_props()); break; case IBus.PropType.RADIO: item = new PopupMenu.PopupMenuItem(prop.get_label().get_text()); item.prop = prop; radioGroup.push(item); item.radioGroup = radioGroup; item.setOrnament(PopupMenu.OrnamentType.DOT, prop.get_state() == IBus.PropState.CHECKED); item.connect('activate', () => { if (item.prop.get_state() == IBus.PropState.CHECKED) return; let group = item.radioGroup; for (let j = 0; j < group.length; ++j) { if (group[j] == item) { item.setOrnament(PopupMenu.OrnamentType.DOT, true); item.prop.set_state(IBus.PropState.CHECKED); ibusManager.activateProperty(item.prop.get_key(), IBus.PropState.CHECKED); } else { group[j].setOrnament(PopupMenu.OrnamentType.DOT, false); group[j].prop.set_state(IBus.PropState.UNCHECKED); ibusManager.activateProperty(group[j].prop.get_key(), IBus.PropState.UNCHECKED); } } }); break; case IBus.PropType.TOGGLE: item = new PopupMenu.PopupSwitchMenuItem(prop.get_label().get_text(), prop.get_state() == IBus.PropState.CHECKED); item.prop = prop; item.connect('toggled', () => { if (item.state) { item.prop.set_state(IBus.PropState.CHECKED); ibusManager.activateProperty(item.prop.get_key(), IBus.PropState.CHECKED); } else { item.prop.set_state(IBus.PropState.UNCHECKED); ibusManager.activateProperty(item.prop.get_key(), IBus.PropState.UNCHECKED); } }); break; case IBus.PropType.NORMAL: item = new PopupMenu.PopupMenuItem(prop.get_label().get_text()); item.prop = prop; item.connect('activate', () => { ibusManager.activateProperty(item.prop.get_key(), item.prop.get_state()); }); break; case IBus.PropType.SEPARATOR: item = new PopupMenu.PopupSeparatorMenuItem(); break; default: log('IBus property %s has invalid type %d'.format(prop.get_key(), type)); continue; } item.setSensitive(prop.get_sensitive()); menu.addMenuItem(item); } } on_applet_removed_from_panel() { this._signalManager.disconnectAllSignals(); Main.systrayManager.unregisterTrayIconReplacement(this.metadata.uuid); } }; function main(metadata, orientation, panel_height, instance_id) { return new CinnamonKeyboardApplet(metadata, orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/keyboard@cinnamon.org/metadata.json0000664000175000017500000000021315167446463027450 0ustar fabiofabio{ "uuid": "keyboard@cinnamon.org", "name": "Keyboard", "description": "Keyboard layout", "icon": "cs-keyboard", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/menu@cinnamon.org/0000775000175000017500000000000015167446463024145 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/menu@cinnamon.org/appUtils.js0000664000175000017500000000634015167446463026307 0ustar fabiofabioconst Cinnamon = imports.gi.Cinnamon; const CMenu = imports.gi.CMenu; let appsys = Cinnamon.AppSystem.get_default(); function decomp_string(s) { return s.normalize('NFKD').replace(/\p{Grapheme_Extend}/gu,"").toLowerCase(); } function decomp_stripped(s) { return decomp_string(s).replace(/[^\p{L}\p{N}]/gu, ""); } function decomp_unstripped(s) { return decomp_string(s); } // sort apps by their locale sensitive sort order function appSort(a, b) { const an = a[0].get_name(); const bn = b[0].get_name(); return an.localeCompare(bn, undefined, {sensitivity: "base", ignorePunctuation: true}); } // sort cmenu directories with special categories at the bottom function dirSort(a, b) { const menuIdA = a.get_menu_id().toLowerCase(); const menuIdB = b.get_menu_id().toLowerCase(); const bottomOrder = ["development", "other", "preferences", "administration"]; const idxA = bottomOrder.indexOf(menuIdA); const idxB = bottomOrder.indexOf(menuIdB); // if neither is in the list, sort alphabetically if (idxA < 0 && idxB < 0) return a.get_name().localeCompare(b.get_name(), undefined, {sensitivity: "base", ignorePunctuation: true}); // if only one is in the list, put it AFTER the other if (idxA < 0) return -1; if (idxB < 0) return 1; // if both are in the list, preserve that internal order return idxA - idxB; } /* returns all apps and the categories they belong to, and all top level categories * * [ * [ * app 1, * [ * top level category 1, * random category, * random category * ] * ], * ... * ], * [ * top level category 1, * top level category 2, * top level category 3, * top level category 4, * ... * ] */ function getApps() { let apps = new Map(); let dirs = []; let tree = appsys.get_tree(); let root = tree.get_root_directory(); let iter = root.iter(); let nextType; while ((nextType = iter.next()) != CMenu.TreeItemType.INVALID) { if (nextType == CMenu.TreeItemType.DIRECTORY) { let dir = iter.get_directory(); if (dir.get_is_nodisplay()) continue; if (loadDirectory(dir, dir, apps)) dirs.push(dir); } } dirs.sort(dirSort); let sortedApps = Array.from(apps.entries()).sort(appSort); return [sortedApps, dirs]; } // load all apps and their categories from a cmenu directory // into 'apps' Map function loadDirectory(dir, top_dir, apps) { let iter = dir.iter(); let has_entries = false; let nextType; while ((nextType = iter.next()) != CMenu.TreeItemType.INVALID) { if (nextType == CMenu.TreeItemType.ENTRY) { let desktopId = iter.get_entry().get_desktop_file_id(); let app = appsys.lookup_app(desktopId); if (!app || app.get_nodisplay()) continue; has_entries = true; if (apps.has(app)) apps.get(app).push(dir.get_menu_id()); else apps.set(app, [top_dir.get_menu_id()]); } else if (nextType == CMenu.TreeItemType.DIRECTORY) { has_entries = loadDirectory(iter.get_directory(), top_dir, apps); } } return has_entries; } cinnamon-6.6.8/files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js0000664000175000017500000033311015167446463025771 0ustar fabiofabioconst Applet = imports.ui.applet; const Mainloop = imports.mainloop; const Cinnamon = imports.gi.Cinnamon; const St = imports.gi.St; const Clutter = imports.gi.Clutter; const Main = imports.ui.main; const MessageTray = imports.ui.messageTray; const PopupMenu = imports.ui.popupMenu; const UserWidget = imports.ui.userWidget; const AppFavorites = imports.ui.appFavorites; const Gtk = imports.gi.Gtk; const Atk = imports.gi.Atk; const Gio = imports.gi.Gio; const XApp = imports.gi.XApp; const AccountsService = imports.gi.AccountsService; const GnomeSession = imports.misc.gnomeSession; const ScreenSaver = imports.misc.screenSaver; const FileUtils = imports.misc.fileUtils; const Util = imports.misc.util; const DND = imports.ui.dnd; const Meta = imports.gi.Meta; const DocInfo = imports.misc.docInfo; const GLib = imports.gi.GLib; const Settings = imports.ui.settings; const Pango = imports.gi.Pango; const SearchProviderManager = imports.ui.searchProviderManager; const SignalManager = imports.misc.signalManager; const Params = imports.misc.params; const INITIAL_BUTTON_LOAD = 30; const USER_DESKTOP_PATH = FileUtils.getUserDesktopDir(); const PRIVACY_SCHEMA = "org.cinnamon.desktop.privacy"; const REMEMBER_RECENT_KEY = "remember-recent-files"; const AppUtils = require('./appUtils'); let appsys = Cinnamon.AppSystem.get_default(); const POPUP_MIN_WIDTH = 500; const POPUP_MAX_WIDTH = 900; const POPUP_MIN_HEIGHT = 400; const POPUP_MAX_HEIGHT = 1400; const RefreshFlags = Object.freeze({ APP: 0b000001, FAV_APP: 0b000010, FAV_DOC: 0b000100, PLACE: 0b001000, RECENT: 0b010000, SYSTEM: 0b100000 }); const REFRESH_ALL_MASK = 0b111111; const NO_MATCH = 99999; const MATCH_ADDERS = [ 0, // name 1000, // keywords 2000, // desc 3000 // id ]; function calc_angle(x, y) { if (x === 0) { x = .001 } if (y === 0) { y = .001 } let r = Math.atan2(y, x) * (180 / Math.PI); return r; } function shorten_path(path, filename) { let str = path.replace("file://", ""); str = str.replace(GLib.get_home_dir(), "~"); str = str.replace("/" + filename, ""); return str; } /* VisibleChildIterator takes a container (boxlayout, etc.) * and creates an array of its visible children and their index * positions. We can then work through that list without * mucking about with positions and math, just give a * child, and it'll give you the next or previous, or first or * last child in the list. * * We could have this object regenerate off a signal * every time the visibles have changed in our applicationBox, * but we really only need it when we start keyboard * navigating, so increase speed, we reload only when we * want to use it. */ class VisibleChildIterator { constructor(container) { this.container = container; this.reloadVisible(); } reloadVisible() { this.array = this.container.get_focus_chain() .filter(x => !(x._delegate instanceof PopupMenu.PopupSeparatorMenuItem)); } next(curChild) { return this.getVisibleItem(this.array.indexOf(curChild) + 1); } prev(curChild) { return this.getVisibleItem(this.array.indexOf(curChild) - 1); } first() { return this.array[0]; } last() { return this.array[this.array.length - 1]; } getVisibleItem(index) { let len = this.array.length; index = ((index % len) + len) % len; return this.array[index]; } } /** * SimpleMenuItem type strings in use: * ------------------------------------------------- * app ApplicationButton * category CategoryButton * fav FavoritesButton * no-recent "No recent documents" button * no-favorites "No favorite documents" button * none Default type * place PlaceButton * favorite PathButton * recent PathButton * recent-clear "Clear recent documents" button * search-provider SearchProviderResultButton * system SystemButton * transient TransientButton */ /** * SimpleMenuItem default parameters. */ const SMI_DEFAULT_PARAMS = Object.freeze({ name: '', description: '', type: 'none', styleClass: 'popup-menu-item', reactive: true, activatable: true, withMenu: false }); /** * A simpler alternative to PopupBaseMenuItem - does not implement all interfaces of PopupBaseMenuItem. Any * additional properties in the params object beyond defaults will also be set on the instance. * @param {Object} applet - The menu applet instance * @param {Object} params - Object containing item parameters, all optional. * @param {string} params.name - The name for the menu item. * @param {string} params.description - The description for the menu item. * @param {string} params.type - A string describing the type of item. * @param {string} params.styleClass - The item's CSS style class. * @param {boolean} params.reactive - Item receives events. * @param {boolean} params.activatable - Activates via primary click. Must provide an 'activate' function on * the prototype or instance. * @param {boolean} params.withMenu - Shows menu via secondary click. Must provide a 'populateMenu' function * on the prototype or instance. */ class SimpleMenuItem { constructor(applet, params) { params = Params.parse(params, SMI_DEFAULT_PARAMS, true); this._signals = new SignalManager.SignalManager(); this.actor = new St.BoxLayout({ style_class: params.styleClass, reactive: params.reactive, accessible_role: Atk.Role.MENU_ITEM, }); this._signals.connect(this.actor, 'destroy', () => this.destroy(true)); this.actor._delegate = this; this.applet = applet; this.labelContainer = new St.BoxLayout({ vertical: true, y_expand: true, y_align: Clutter.ActorAlign.CENTER, }); this.label = null; this.descriptionLabel = null; this.icon = null; this.matchIndex = NO_MATCH; for (let prop in params) this[prop] = params[prop]; if (params.reactive) { this._signals.connect(this.actor, 'enter-event', () => applet._buttonEnterEvent(this)); this._signals.connect(this.actor, 'leave-event', () => applet._buttonLeaveEvent(this)); if (params.activatable || params.withMenu) { this._signals.connect(this.actor, 'button-release-event', this._onButtonReleaseEvent.bind(this)); this._signals.connect(this.actor, 'key-press-event', this._onKeyPressEvent.bind(this)); } } } _onButtonReleaseEvent(actor, event) { let button = event.get_button(); if (this.activate && button === Clutter.BUTTON_PRIMARY) { this.activate(); return Clutter.EVENT_STOP; } else if (this.populateMenu && button === Clutter.BUTTON_SECONDARY) { this.applet.toggleContextMenu(this); return Clutter.EVENT_STOP; } return Clutter.EVENT_PROPAGATE; } _onKeyPressEvent(actor, event) { let symbol = event.get_key_symbol(); if (this.activate && (symbol === Clutter.KEY_space || symbol === Clutter.KEY_Return || symbol === Clutter.KEY_KP_Enter)) { this.activate(); return Clutter.EVENT_STOP; } return Clutter.EVENT_PROPAGATE; } /** * Adds an StIcon as the next child, accessible as `this.icon`. * * Either an icon name or gicon is required. Only one icon is supported by the * base SimpleMenuItem. * * @param {number} iconSize - The icon size in px. * @param {string} iconName - (optional) The icon name string. * @param {object} gicon - (optional) A gicon. * @param {boolean} symbolic - (optional) Whether the icon should be symbolic. Default: false. */ addIcon(iconSize, iconName='', gicon=null, symbolic=false) { if (this.icon) return; let params = { icon_size: iconSize }; if (iconName) params.icon_name = iconName; else if (gicon) params.gicon = gicon; params.icon_type = symbolic ? St.IconType.SYMBOLIC : St.IconType.FULLCOLOR; this.icon = new St.Icon(params); this.actor.add_actor(this.icon); } /** * Adds an StLabel as the next child, accessible as `this.label`. * * Only one label is supported by the base SimpleMenuItem prototype. * * @param {string} label - (optional) An unformatted string. If markup is required, use * native methods directly: `this.label.clutter_text.set_markup()`. * @param {string} styleClass - (optional) A style class for the label. */ addLabel(label='', styleClass=null) { if (this.label) return; this.label = new St.Label({ text: label }); if (styleClass) this.label.set_style_class_name(styleClass); this.label.clutter_text.ellipsize = Pango.EllipsizeMode.END; this.actor.add_actor(this.labelContainer); this.labelContainer.add_actor(this.label); this.actor.set_label_actor(this.label); } addDescription(label='', styleClass=null) { if (this.descriptionLabel) return; if (label === '') return; this.descriptionLabel = new St.Label({ text: label, y_expand: true, y_align: Clutter.ActorAlign.CENTER }); if (styleClass) this.descriptionLabel.set_style_class_name(styleClass); this.descriptionLabel.clutter_text.ellipsize = Pango.EllipsizeMode.END; this.labelContainer.add_actor(this.descriptionLabel); } updateAccessibleName() { this.actor.set_label_actor(null); let name = ""; if (this.label) name += this.label.get_text(); if (this.descriptionLabel) { if (name.length > 0) name += ". "; name += this.descriptionLabel.get_text(); } this.actor.set_accessible_name(name); } /** * Adds a ClutterActor as the next child. * * @param {ClutterActor} child */ addActor(child) { this.actor.add_actor(child); } destroy(actorDestroySignal=false) { this._signals.disconnectAllSignals(); if (this.label) this.label.destroy(); if (this.descriptionLabel) this.descriptionLabel.destroy(); if (this.icon) this.icon.destroy(); if (!actorDestroySignal) this.actor.destroy(); delete this.actor._delegate; delete this.actor; delete this.label; delete this.descriptionLabel; delete this.icon; } } class ApplicationContextMenuItem extends PopupMenu.PopupBaseMenuItem { constructor(appButton, label, action, iconName) { super({focusOnHover: false}); this._appButton = appButton; this._action = action; this.label = new St.Label({ text: label }); if (iconName != null) { this.icon = new St.Icon({ icon_name: iconName, icon_size: 12, icon_type: St.IconType.SYMBOLIC, }); if (this.icon) this.addActor(this.icon); } this.addActor(this.label); this.actor.set_label_actor(this.label); this._signals.connect(this, "active-changed", () => { if (this.active) this.actor.add_accessible_state(Atk.StateType.FOCUSED); else this.actor.remove_accessible_state(Atk.StateType.FOCUSED); }); } activate (event) { let closeMenu = true; switch (this._action) { case "add_to_panel": if (!Main.AppletManager.get_role_provider_exists(Main.AppletManager.Roles.PANEL_LAUNCHER)) { let new_applet_id = global.settings.get_int("next-applet-id"); global.settings.set_int("next-applet-id", (new_applet_id + 1)); let enabled_applets = global.settings.get_strv("enabled-applets"); enabled_applets.push("panel1:right:0:panel-launchers@cinnamon.org:" + new_applet_id); global.settings.set_strv("enabled-applets", enabled_applets); } // wait until the panel launchers instance is actually loaded // 10 tries, delay 100ms let retries = 10; Mainloop.timeout_add(100, () => { if (retries--) { let launcherApplet = Main.AppletManager.get_role_provider(Main.AppletManager.Roles.PANEL_LAUNCHER); if (!launcherApplet) return true; launcherApplet.acceptNewLauncher(this._appButton.app.get_id()); } return false; }); break; case "add_to_desktop": let file = Gio.file_new_for_path(this._appButton.app.get_app_info().get_filename()); let destFile = Gio.file_new_for_path(USER_DESKTOP_PATH+"/"+file.get_basename()); try{ file.copy(destFile, 0, null, function(){}); FileUtils.changeModeGFile(destFile, 755); }catch(e){ global.log(e); } break; case "add_to_favorites": AppFavorites.getAppFavorites().addFavorite(this._appButton.app.get_id()); this.label.set_text(_("Remove from favorites")); this.icon.icon_name = "xsi-starred"; this._action = "remove_from_favorites"; closeMenu = false; break; case "remove_from_favorites": AppFavorites.getAppFavorites().removeFavorite(this._appButton.app.get_id()); this.label.set_text(_("Add to favorites")); this.icon.icon_name = "xsi-non-starred"; this._action = "add_to_favorites"; closeMenu = false; break; case "app_properties": Util.spawnCommandLine("cinnamon-desktop-editor -mlauncher -o" + GLib.shell_quote(this._appButton.app.get_app_info().get_filename())); break; case "uninstall": Util.spawnCommandLine("/usr/bin/cinnamon-remove-application '" + this._appButton.app.get_app_info().get_filename() + "'"); break; case "offload_launch": try { this._appButton.app.launch_offloaded(0, [], -1); } catch (e) { logError(e, "Could not launch app with dedicated gpu: "); } break; default: if (this._action.startsWith("action_")) { let action = this._action.substring(7); this._appButton.app.get_app_info().launch_action(action, global.create_app_launch_context()); } else return true; } if (closeMenu) { this._appButton.applet.toggleContextMenu(this._appButton); this._appButton.applet.menu.close(); } return false; } } class GenericApplicationButton extends SimpleMenuItem { constructor(applet, app, type, withMenu=false, styleClass="") { let desc = app.get_description() || ""; super(applet, { name: app.get_name(), description: desc.split("\n")[0], type: type, withMenu: withMenu, styleClass: styleClass, app: app, }); } set_application_icon(icon_size) { this.icon = this.app.create_icon_texture(icon_size); if (this.icon instanceof St.Icon) { let gicon = this.icon.get_gicon(); if (gicon?.get_names) { let iconTheme = Gtk.IconTheme.get_default(); let hasAnyIcon = gicon.get_names() .some(name => iconTheme.lookup_icon(name, this.icon.icon_size, 0)); if (!hasAnyIcon) { this.icon = new St.Icon({ icon_name: 'application-x-executable', icon_size: icon_size, icon_type: St.IconType.FULLCOLOR }); } } } } highlight() { if (this.actor.has_style_pseudo_class('highlighted')) return; this.actor.add_style_pseudo_class('highlighted'); } unhighlight() { if (!this.actor.has_style_pseudo_class('highlighted')) return; let appKey = this.app.get_id() || `${this.name}:${this.description}`; this.applet._knownApps.add(appKey); this.actor.remove_style_pseudo_class('highlighted'); } activate() { this.unhighlight(); this.app.open_new_window(-1); this.applet.menu.close(); } populateMenu(menu) { let menuItem; if (Main.gpu_offload_supported) { menuItem = new ApplicationContextMenuItem(this, _("Run with dedicated GPU"), "offload_launch", "xsi-cpu"); menu.addMenuItem(menuItem); } menuItem = new ApplicationContextMenuItem(this, _("Add to panel"), "add_to_panel", "xsi-list-add"); menu.addMenuItem(menuItem); if (USER_DESKTOP_PATH){ menuItem = new ApplicationContextMenuItem(this, _("Add to desktop"), "add_to_desktop", "xsi-computer"); menu.addMenuItem(menuItem); } if (AppFavorites.getAppFavorites().isFavorite(this.app.get_id())){ menuItem = new ApplicationContextMenuItem(this, _("Remove from favorites"), "remove_from_favorites", "xsi-starred"); menu.addMenuItem(menuItem); } else { menuItem = new ApplicationContextMenuItem(this, _("Add to favorites"), "add_to_favorites", "xsi-non-starred"); menu.addMenuItem(menuItem); } const appinfo = this.app.get_app_info(); if (appinfo.get_filename() != null) { menuItem = new ApplicationContextMenuItem(this, _("Properties"), "app_properties", "xsi-document-properties-symbolic"); menu.addMenuItem(menuItem); } if (this.applet._canUninstallApps) { menuItem = new ApplicationContextMenuItem(this, _("Uninstall"), "uninstall", "xsi-edit-delete"); menu.addMenuItem(menuItem); } for (const action of appinfo.list_actions()) { let icon = Util.getDesktopActionIcon(action); let label = appinfo.get_action_name(action); menuItem = new ApplicationContextMenuItem(this, label, "action_" + action, icon); menu.addMenuItem(menuItem); } } } class TransientButton extends SimpleMenuItem { constructor(applet, pathOrCommand) { super(applet, { description: pathOrCommand, type: 'transient', styleClass: 'appmenu-application-button', }); if (pathOrCommand.startsWith('~')) { pathOrCommand = pathOrCommand.slice(1); pathOrCommand = GLib.get_home_dir() + pathOrCommand; } this.isPath = pathOrCommand.substr(pathOrCommand.length - 1) == '/'; if (this.isPath) { this.path = pathOrCommand; } else { let n = pathOrCommand.lastIndexOf('/'); if (n != 1) { this.path = pathOrCommand.substr(0, n); } } this.pathOrCommand = pathOrCommand; this.file = Gio.file_new_for_path(this.pathOrCommand); try { this.handler = this.file.query_default_handler(null); let contentType = Gio.content_type_guess(this.pathOrCommand, null); let themedIcon = Gio.content_type_get_icon(contentType[0]); this.icon = new St.Icon({ gicon: themedIcon, icon_size: applet.applicationIconSize, icon_type: St.IconType.FULLCOLOR, }); } catch (e) { this.handler = null; let iconName = this.isPath ? 'folder' : 'unknown'; this.icon = new St.Icon({ icon_name: iconName, icon_size: applet.applicationIconSize, icon_type: St.IconType.FULLCOLOR, }); // @todo Would be nice to indicate we don't have a handler for this file. } this.addActor(this.icon); this.addLabel(this.description, 'appmenu-application-button-label'); this.isDraggableApp = false; } activate() { if (this.handler != null) { this.handler.launch([this.file], null); } else { // Try anyway, even though we probably shouldn't. try { Util.spawn(['gio', 'open', this.file.get_uri()]); } catch (e) { global.logError("No handler available to open " + this.file.get_uri()); } } this.applet.menu.close(); } } class ApplicationButton extends GenericApplicationButton { constructor(applet, app) { super(applet, app, 'app', true, 'appmenu-application-button'); this.category = []; this.set_application_icon(applet.applicationIconSize); this.addActor(this.icon); this.addLabel(this.name, 'appmenu-application-button-label'); if (applet.showDescription) this.addDescription(this.description, 'appmenu-application-button-description'); this.updateAccessibleName(); this._draggable = DND.makeDraggable(this.actor); this._signals.connect(this._draggable, 'drag-end', this._onDragEnd.bind(this)); this.isDraggableApp = true; this.searchStrings = [ AppUtils.decomp_string(app.get_name()).replace(/\s/g, ''), app.get_keywords() ? AppUtils.decomp_string(app.get_keywords()) : "", app.get_description() ? AppUtils.decomp_string(app.get_description()).replace(/\s/g, '') : "", app.get_id() ? AppUtils.decomp_string(app.get_id()) : "" ]; } get_app_id() { return this.app.get_id(); } getDragActor() { return this.app.create_icon_texture(this.applet.sidebarIconSize); } // Returns the original actor that should align with the actor // we show as the item is being dragged. getDragActorSource() { return this.actor; } _onDragEnd() { this.applet.favoriteAppsBox._delegate._clearDragPlaceholder(); } destroy() { delete this._draggable; super.destroy(); } } class SearchProviderResultButton extends SimpleMenuItem { constructor(applet, provider, result) { super(applet, { name:result.label, description: result.description, type: 'search-provider', styleClass: 'appmenu-application-button', provider: provider, result: result, }); if (result.icon) { this.icon = result.icon; } else if (result.icon_app) { this.icon = result.icon_app.create_icon_texture(applet.applicationIconSize); } else if (result.icon_filename) { this.icon = new St.Icon({ gicon: new Gio.FileIcon({ file: Gio.file_new_for_path(result.icon_filename) }), icon_size: applet.applicationIconSize, }); } if (this.icon) this.addActor(this.icon); this.addLabel(result.label, 'appmenu-application-button-label'); } activate() { try { this.provider.on_result_selected(this.result); this.applet.menu.close(); } catch(e) { global.logError(e); } } destroy() { delete this.provider; delete this.result; super.destroy(); } } class PlaceButton extends SimpleMenuItem { constructor(applet, place) { let selectedAppId = place.idDecoded.substr(place.idDecoded.indexOf(':') + 1); let fileIndex = selectedAppId.indexOf('file:///'); if (fileIndex !== -1) selectedAppId = selectedAppId.substr(fileIndex + 7); if (selectedAppId === "home" || selectedAppId === "desktop" || selectedAppId === "connect") { selectedAppId = place.name } super(applet, { name: place.name, type: 'place', styleClass: 'appmenu-sidebar-button', place: place, }); this.icon = place.iconFactory(applet.sidebarIconSize); if (this.icon) this.addActor(this.icon); else this.addIcon(applet.applicationIconSize, 'folder'); this.addLabel(this.name, 'appmenu-application-button-label'); } activate() { this.place.launch(); this.applet.menu.close(); } } class RecentButton extends SimpleMenuItem { constructor(applet, recent) { let path = recent.uriDecoded.replace("file://", ""); path = path.replace(GLib.get_home_dir(), "~").replace("/" + recent.name, ""); super(applet, { name: recent.name, description: path, type: 'recent', styleClass: 'appmenu-application-button', withMenu: true, uri: recent.uri, }); this.icon = recent.createIcon(applet.applicationIconSize); this.addActor(this.icon); this.addLabel(this.name, 'appmenu-application-button-label'); if (applet.showDescription) this.addDescription(this.description, 'appmenu-application-button-description'); this.searchStrings = [ AppUtils.decomp_string(recent.name).replace(/\s/g, '') ]; } activate() { try { Gio.app_info_launch_default_for_uri(this.uri, global.create_app_launch_context()); this.applet.menu.close(); } catch (e) { let source = new MessageTray.SystemNotificationSource(); Main.messageTray.add(source); let notification = new MessageTray.Notification(source, _("This file is no longer available"), e.message); notification.setTransient(true); notification.setUrgency(MessageTray.Urgency.NORMAL); source.notify(notification); } } } class PathButton extends SimpleMenuItem { constructor(applet, type, name, uri, icon) { super(applet, { name: name, description: shorten_path(uri, name), type: type, styleClass: 'appmenu-application-button', withMenu: false, uri: uri, }); this.icon = icon; this.addActor(this.icon); this.addLabel(name, 'appmenu-application-button-label'); if (applet.showDescription) this.addDescription(this.description, 'appmenu-application-button-description'); this.searchStrings = [ AppUtils.decomp_string(name).replace(/\s/g, '') ]; } activate() { try { Gio.app_info_launch_default_for_uri(this.uri, global.create_app_launch_context()); this.applet.menu.close(); } catch (e) { let source = new MessageTray.SystemNotificationSource(); Main.messageTray.add(source); let notification = new MessageTray.Notification(source, _("This file is no longer available"), e.message); notification.setTransient(true); notification.setUrgency(MessageTray.Urgency.NORMAL); source.notify(notification); } } } class CategoryButton extends SimpleMenuItem { constructor(applet, categoryId, label, icon, symbolic=false) { super(applet, { name: label, type: 'category', styleClass: 'appmenu-category-button', categoryId: categoryId, }); let size = applet.categoryIconSize; if (applet.symbolicCategoryIcons) { symbolic = true; if (typeof icon !== 'string') if (icon?.get_names) icon = icon.get_names()[0]; else icon = ""; if (icon.startsWith("applications-") || icon === "folder-recent") icon = "xsi-" + icon; else if (icon == "xapp-user-favorites") icon = "xsi-user-favorites-symbolic"; else if (icon == "preferences-system") icon = "xsi-applications-administration"; else if (icon == "preferences-desktop") icon = "xsi-applications-preferences"; else if (icon == "wine") icon = "xsi-applications-wine"; else icon = "xsi-applications-other"; } if (typeof icon === 'string') this.addIcon(size, icon, null, symbolic); else if (icon) this.addIcon(size, null, icon, symbolic); this.addLabel(this.name, 'appmenu-category-button-label'); this.actor_motion_id = 0; } activate() { if(this.applet.searchActive || this.categoryId === this.applet.lastSelectedCategory) return; this.applet._select_category(this.categoryId); this.applet.hoveredApp = null; this.applet.categoriesBox.get_children().forEach(child => child.set_style_class_name("appmenu-category-button")); this.actor.style_class = "appmenu-category-button-selected"; } } class FavoritesButton extends GenericApplicationButton { constructor(applet, app) { super(applet, app, 'fav', false, 'appmenu-sidebar-button'); this.set_application_icon(applet.sidebarIconSize); this.addActor(this.icon); this.addLabel(this.name, 'appmenu-application-button-label'); this._draggable = DND.makeDraggable(this.actor); this._signals.connect(this._draggable, 'drag-end', this._onDragEnd.bind(this)); this.isDraggableApp = true; } _onDragEnd() { this.actor.get_parent()._delegate._clearDragPlaceholder(); } get_app_id() { return this.app.get_id(); } getDragActor() { return new Clutter.Clone({ source: this.actor }); } // Returns the original actor that should align with the actor // we show as the item is being dragged. getDragActorSource() { return this.actor; } destroy() { delete this._draggable; super.destroy(); } } class SystemButton extends SimpleMenuItem { constructor(applet, iconName, name, desc) { super(applet, { name: name, description: desc, type: 'system', styleClass: 'appmenu-system-button', }); this.addIcon(16, iconName, null, true); this.actor.set_accessible_name(name); this.actor.set_accessible_role(Atk.Role.BUTTON); } } class CategoriesApplicationsBox { constructor() { this.actor = new St.BoxLayout({ vertical: false, style_class: 'appmenu-categories-applications-box' }); this.actor._delegate = this; } acceptDrop (source, actor, x, y, time) { if (source instanceof FavoritesButton){ source.actor.destroy(); actor.destroy(); AppFavorites.getAppFavorites().removeFavorite(source.app.get_id()); return true; } return false; } handleDragOver (source, actor, x, y, time) { if (source instanceof FavoritesButton) return DND.DragMotionResult.POINTING_DROP; return DND.DragMotionResult.CONTINUE; } } class SidebarScrollBox { constructor() { this.actor = new St.BoxLayout({ vertical: true, y_expand: true, y_align: Clutter.ActorAlign.START, style_class: 'appmenu-sidebar-scrollbox' }); this.actor._delegate = this; } } class FavoriteAppsBox { constructor() { this.actor = new St.BoxLayout({ vertical: true, y_expand: true, y_align: Clutter.ActorAlign.START, style_class: 'appmenu-favs-box' }); this.actor._delegate = this; this._dragPlaceholder = null; this._dragPlaceholderPos = -1; this._animatingPlaceholdersCount = 0; } _clearDragPlaceholder() { if (this._dragPlaceholder) { this._dragPlaceholder.animateOutAndDestroy(); this._dragPlaceholder = null; this._dragPlaceholderPos = -1; } } handleDragOver (source, actor, x, y, time) { let app = source.app; let favorites = AppFavorites.getAppFavorites().getFavorites(); let numFavorites = favorites.length; let favPos = favorites.indexOf(app); let children = this.actor.get_children(); let numChildren = children.length; let boxHeight = this.actor.height; // Keep the placeholder out of the index calculation; assuming that // the remove target has the same size as "normal" items, we don't // need to do the same adjustment there. if (this._dragPlaceholder) { boxHeight -= this._dragPlaceholder.actor.height; numChildren--; } let pos = Math.round(y * numChildren / boxHeight); if (pos != this._dragPlaceholderPos && pos <= numFavorites) { if (this._animatingPlaceholdersCount > 0) { let appChildren = children.filter(function(actor) { return (actor._delegate instanceof FavoritesButton); }); this._dragPlaceholderPos = children.indexOf(appChildren[pos]); } else { this._dragPlaceholderPos = pos; } // Don't allow positioning before or after self if (favPos != -1 && (pos == favPos || pos == favPos + 1)) { if (this._dragPlaceholder) { this._dragPlaceholder.animateOutAndDestroy(); this._animatingPlaceholdersCount++; this._dragPlaceholder.actor.connect('destroy', () => { this._animatingPlaceholdersCount--; }); } this._dragPlaceholder = null; return DND.DragMotionResult.CONTINUE; } // If the placeholder already exists, we just move // it, but if we are adding it, expand its size in // an animation let fadeIn; if (this._dragPlaceholder) { this._dragPlaceholder.actor.destroy(); fadeIn = false; } else { fadeIn = true; } this._dragPlaceholder = new DND.GenericDragPlaceholderItem(); this._dragPlaceholder.child.set_width (source.actor.height); this._dragPlaceholder.child.set_height (source.actor.height); this.actor.insert_child_at_index(this._dragPlaceholder.actor, this._dragPlaceholderPos); if (fadeIn) this._dragPlaceholder.animateIn(); } let id = app.get_id(); let favoritesMap = AppFavorites.getAppFavorites().getFavoriteMap(); let srcIsFavorite = (id in favoritesMap); if (!srcIsFavorite) return DND.DragMotionResult.COPY_DROP; return DND.DragMotionResult.MOVE_DROP; } // Draggable target interface acceptDrop (source, actor, x, y, time) { let app = source.app; let id = app.get_id(); let favorites = AppFavorites.getAppFavorites().getFavoriteMap(); let srcIsFavorite = (id in favorites); let favPos = 0; let children = this.actor.get_children(); for (let i = 0; i < this._dragPlaceholderPos; i++) { if (this._dragPlaceholder && children[i] == this._dragPlaceholder.actor) continue; if (!(children[i]._delegate instanceof FavoritesButton)) continue; let childId = children[i]._delegate.app.get_id(); if (childId == id) continue; if (childId in favorites) favPos++; } Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { let appFavorites = AppFavorites.getAppFavorites(); if (srcIsFavorite) appFavorites.moveFavoriteToPos(id, favPos); else appFavorites.addFavoriteAtPos(id, favPos); return false; }); return true; } } /* This is so we can override the default key-press-event handler in PopupMenu.PopupMenu * and prevent animation when the menu via Escape. */ class Menu extends Applet.AppletPopupMenu { constructor(launcher, orientation) { super(launcher, orientation); } _onKeyPressEvent(actor, event) { if (event.get_key_symbol() === Clutter.KEY_Escape) { this.close(false); return true; } return false; } } class CinnamonMenuApplet extends Applet.TextIconApplet { constructor(orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.setAllowedLayout(Applet.AllowedLayout.BOTH); this.set_applet_tooltip(_("Menu")); this.menuManager = new PopupMenu.PopupMenuManager(this); this.menu = new Menu(this, orientation); this.menuManager.addMenu(this.menu); const edit_item = new PopupMenu.PopupIconMenuItem(_("Edit menu"), "xsi-document-edit", St.IconType.SYMBOLIC); edit_item.connect("activate", () => Util.spawnCommandLine("cinnamon-menu-editor")); this._applet_context_menu.addMenuItem(edit_item); this.settings = new Settings.AppletSettings(this, "menu@cinnamon.org", instance_id); this.settings.connect("settings-changed", () => { this._size_dirty = true; }); global.connect("scale-changed", () => { this._size_dirty = true; }) this._resizer = new Applet.PopupResizeHandler(this.menu.actor, () => this._orientation, (w,h) => this._onBoxResized(w,h), () => this.popup_width * global.ui_scale, () => this.popup_height * global.ui_scale); this.settings.bind("show-favorites", "showFavorites", () => this.queueRefresh(RefreshFlags.FAV_DOC)); this.settings.bind("show-recents", "showRecents", () => this.queueRefresh(RefreshFlags.RECENT)); this._appletEnterEventId = 0; this._appletLeaveEventId = 0; this._appletHoverDelayId = 0; this.settings.bind("hover-delay", "hover_delay_ms", this._updateActivateOnHover); this.settings.bind("activate-on-hover", "activateOnHover", this._updateActivateOnHover); this._updateActivateOnHover(); this.menu.setCustomStyleClass('appmenu-background'); this.menu.connect('open-state-changed', this._onOpenStateChanged.bind(this)); this.menu.connect('menu-animated-closed', () => { this._clearAllSelections(); this._hideAllAppActors(); }); this.settings.bind("menu-custom", "menuCustom", this._updateIconAndLabel); this.settings.bind("menu-icon", "menuIcon", this._updateIconAndLabel); this.settings.bind("menu-icon-size", "menuIconSize", this._updateIconAndLabel); this.settings.bind("menu-label", "menuLabel", this._updateIconAndLabel); this.settings.bind("overlay-key", "overlayKey", this._updateKeybinding); this.settings.bind("symbolic-category-icons", "symbolicCategoryIcons", () => this.queueRefresh(REFRESH_ALL_MASK)); this.settings.bind("category-icon-size", "categoryIconSize", () => this.queueRefresh(REFRESH_ALL_MASK)); this.settings.bind("category-hover", "categoryHover", this._updateCategoryHover); this.settings.bind("application-icon-size", "applicationIconSize", () => this.queueRefresh(REFRESH_ALL_MASK)); this.settings.bind("search-position", "searchPosition", () => this._layout()); this.settings.bind("system-position", "systemPosition", () => this._layout()); this.settings.bind("show-description", "showDescription", () => this.queueRefresh(REFRESH_ALL_MASK)); this.settings.bind("show-sidebar", "showSidebar", this._sidebarToggle); this.settings.bind("sidebar-max-width", "sidebarMaxWidth", this._sidebarToggle); this.settings.bind("show-avatar", "showAvatar", this._avatarToggle); this.settings.bind("show-home", "showHome", () => this.queueRefresh(REFRESH_ALL_MASK)); this.settings.bind("show-desktop", "showDesktop", () => this.queueRefresh(REFRESH_ALL_MASK)); this.settings.bind("show-downloads", "showDownloads", () => this.queueRefresh(REFRESH_ALL_MASK)); this.settings.bind("show-documents", "showDocuments", () => this.queueRefresh(REFRESH_ALL_MASK)); this.settings.bind("show-music", "showMusic", () => this.queueRefresh(REFRESH_ALL_MASK)); this.settings.bind("show-pictures", "showPictures", () => this.queueRefresh(REFRESH_ALL_MASK)); this.settings.bind("show-videos", "showVideos", () => this.queueRefresh(REFRESH_ALL_MASK)); this.settings.bind("show-bookmarks", "showBookmarks", () => this.queueRefresh(REFRESH_ALL_MASK)); this.settings.bind("sidebar-icon-size", "sidebarIconSize", () => this.queueRefresh(REFRESH_ALL_MASK)); this.settings.bind("enable-animation", "enableAnimation", null); this.settings.bind("popup-width", "popup_width"); this.settings.bind("popup-height", "popup_height"); this._updateKeybinding(); Main.themeManager.connect("theme-set", this._theme_set.bind(this)); this._updateIconAndLabel(); this._searchInactiveIcon = new St.Icon({ style_class: 'appmenu-search-entry-icon', icon_name: 'xsi-edit-find', icon_type: St.IconType.SYMBOLIC, }); this._searchActiveIcon = new St.Icon({ style_class: 'appmenu-search-entry-icon', icon_name: 'xsi-edit-clear', icon_type: St.IconType.SYMBOLIC, }); this._searchIconClickedId = 0; this._applicationsButtons = []; this._placesButtons = []; this._transientButtons = []; this.recentButton = null; this._recentButtons = []; this.favoriteDocsButton = null; this._favoriteDocButtons = []; this._categoryButtons = []; this._searchProviderButtons = []; this.hoveredApp = null; this.hoveredCategory = null; this._activeContainer = null; this._activeActor = null; this._knownApps = new Set(); // Used to keep track of apps that are already installed, so we can highlight newly installed ones this._appsWereRefreshed = false; this._canUninstallApps = GLib.file_test("/usr/bin/cinnamon-remove-application", GLib.FileTest.EXISTS); this.RecentManager = DocInfo.getDocManager(); this.privacy_settings = new Gio.Settings( {schema_id: PRIVACY_SCHEMA} ); this.noRecentDocuments = true; this._activeContextMenuParent = null; this._activeContextMenuItem = null; this._display(); appsys.connect('installed-changed', () => this.queueRefresh(RefreshFlags.APP | RefreshFlags.FAV_APP)); AppFavorites.getAppFavorites().connect('changed', () => this.queueRefresh(RefreshFlags.FAV_APP)); Main.placesManager.connect('places-updated', () => this.queueRefresh(RefreshFlags.PLACE)); this.RecentManager.connect('changed', () => this.queueRefresh(RefreshFlags.RECENT)); this.privacy_settings.connect("changed::" + REMEMBER_RECENT_KEY, () => this.queueRefresh(RefreshFlags.RECENT)); XApp.Favorites.get_default().connect("changed", () => this.queueRefresh(RefreshFlags.FAV_DOC)); this._pathCompleter = new Gio.FilenameCompleter(); this._pathCompleter.set_dirs_only(false); this.contextMenu = null; this.lastSelectedCategory = null; this.orderDirty = false; this._session = new GnomeSession.SessionManager(); this._screenSaverProxy = new ScreenSaver.ScreenSaverProxy(); // We shouldn't need to call refreshAll() here... since we get a "icon-theme-changed" signal when CSD starts. // The reason we do is in case the Cinnamon icon theme is the same as the one specified in GTK itself (in .config) // In that particular case we get no signal at all. this.refreshId = 0; this.refreshMask = REFRESH_ALL_MASK; this._doRefresh(); this.set_show_label_in_vertical_panels(false); } _onBoxResized(width, height) { width = (width / global.ui_scale).clamp(POPUP_MIN_WIDTH, POPUP_MAX_WIDTH); height = (height / global.ui_scale).clamp(POPUP_MIN_HEIGHT, POPUP_MAX_HEIGHT); //Only update settings when resizing is completed to avoid excessive disk writes. if (!this._resizer.resizingInProgress) { this.popup_width = width; this.popup_height = height; } this._setMenuSize(width, height); } _updateKeybinding() { Main.keybindingManager.addXletHotKey(this, "overlay-key", this.overlayKey, () => { if (!Main.overview.visible && !Main.expo.visible) { this.menu.toggle_with_options(this.enableAnimation); } }); } _updateCategoryHover() { this.categoriesBox.get_children().forEach(child => { if (child._delegate.actor_motion_id > 0) { child.disconnect(child._delegate.actor_motion_id); child._delegate.actor_motion_id = 0; } if (this.categoryHover) { child._delegate.actor_motion_id = child.connect("motion-event", this._categoryMotionEvent.bind(this)); } }, this); } queueRefresh(refreshFlags) { if (!refreshFlags) return; this.refreshMask |= refreshFlags; if (this.refreshId) Mainloop.source_remove(this.refreshId); this.refreshId = Mainloop.timeout_add(500, () => this._doRefresh(), Mainloop.PRIORITY_LOW); } _doRefresh() { this.refreshId = 0; if (this.refreshMask === 0) return; let m = this.refreshMask; if ((m & RefreshFlags.APP) === RefreshFlags.APP) this._refreshApps(); if ((m & RefreshFlags.SYSTEM) === RefreshFlags.SYSTEM) this._refreshSystemButtons(); if ((m & RefreshFlags.FAV_DOC) === RefreshFlags.FAV_DOC) this._refreshFavDocs(); if ((m & RefreshFlags.PLACE) === RefreshFlags.PLACE) this._refreshSidebar(); if ((m & RefreshFlags.FAV_APP) === RefreshFlags.FAV_APP) this._refreshSidebar(); if ((m & RefreshFlags.RECENT) === RefreshFlags.RECENT) this._refreshRecent(); this.refreshMask = 0; // Repack the three special categories at the bottom of the category list. if (this.favoriteDocsButton) { this.categoriesBox.set_child_at_index(this.favoriteDocsButton.actor, -1); } if (this.recentButton) { this.categoriesBox.set_child_at_index(this.recentButton.actor, -1); } this._size_dirty = true; this._updateCategoryHover(); } openMenu() { if (!this._applet_context_menu.isOpen) { this.menu.open(this.enableAnimation); } } _clearDelayCallbacks() { if (this._appletHoverDelayId > 0) { Mainloop.source_remove(this._appletHoverDelayId); this._appletHoverDelayId = 0; } if (this._appletLeaveEventId > 0) { this.actor.disconnect(this._appletLeaveEventId); this._appletLeaveEventId = 0; } return false; } _updateActivateOnHover() { if (this._appletEnterEventId > 0) { this.actor.disconnect(this._appletEnterEventId); this._appletEnterEventId = 0; } this._clearDelayCallbacks(); if (!this.activateOnHover) return; this._appletEnterEventId = this.actor.connect('enter-event', () => { if (this.hover_delay_ms > 0) { this._appletLeaveEventId = this.actor.connect('leave-event', () => { this._clearDelayCallbacks }); this._appletHoverDelayId = Mainloop.timeout_add(this.hover_delay_ms, () => { this.openMenu(); this._clearDelayCallbacks(); }); } else { this.openMenu(); } }); } _setMenuSize(width, height) { this.main_container.natural_height = (height * global.ui_scale); this.main_container.natural_width = (width * global.ui_scale); this._size_dirty = false; } on_orientation_changed (orientation) { this._updateIconAndLabel(); this._size_dirty = true; } on_applet_removed_from_panel () { Main.keybindingManager.removeXletHotKey(this, "overlay-key"); } // settings button callbacks _launch_editor() { Util.spawnCommandLine("cinnamon-menu-editor"); } _reset_menu_size() { this.popup_width = this.settings.getDefaultValue("popup-width"); this.popup_height = this.settings.getDefaultValue("popup-height"); this._setMenuSize(this.popup_width, this.popup_height); } on_applet_clicked(event) { this.menu.toggle_with_options(this.enableAnimation); } _onOpenStateChanged(menu, open) { if (open) { this.actor.add_style_pseudo_class('active'); global.stage.set_key_focus(this.searchEntry); this._activeContainer = null; this._activeActor = null; this.lastSelectedCategory = null; if (this._size_dirty) { this._setMenuSize(this.popup_width, this.popup_height); } let n = Math.min(this._applicationsButtons.length, INITIAL_BUTTON_LOAD); for (let i = 0; i < n; i++) { this._applicationsButtons[i].actor.show(); } this._allAppsCategoryButton.actor.style_class = "appmenu-category-button-selected"; Mainloop.idle_add(() => { if(this.lastSelectedCategory !== null) //if a category is already selected return; for (let i = n; i < this._applicationsButtons.length; i++) this._applicationsButtons[i].actor.show(); }); } else { this.actor.remove_style_pseudo_class('active'); if (this.searchActive) { this.resetSearch(); } this.hoveredCategory = null; this.hoveredApp = null; this.closeContextMenu(false); this._disableVectorMask(); this._scrollToButton(null, this.applicationsScrollView); this._scrollToButton(null, this.categoriesScrollView); this._scrollToButton(null, this.sidebarScrollView); } } destroy() { this.actor._delegate = null; this.menu.destroy(); this.actor.destroy(); this.emit('destroy'); } _sidebarToggle() { if (!this.showSidebar) this.sidebar.hide(); else { this.sidebar.show(); this.sidebar.set_style(`max-width: ${this.sidebarMaxWidth}px;`); } this.updateNavigation(); } _avatarToggle() { if (!this.showAvatar) { this.userIcon.hide(); this.avatarSeparator.hide(); } else { this.userIcon.show(); this.avatarSeparator.show(); } } // Override js/applet.js so _updateIconAndLabel doesn't have to fight with size changes // from the panel configuration. This gets called any time set_applet_icon() variants are // called. _setStyle() { let icon_type = this._applet_icon.get_icon_type(); let size; if (this.menuCustom) { size = Math.min(this.menuIconSize, this.panel.height); } else { size = this.getPanelIconSize(icon_type); } if (icon_type === St.IconType.FULLCOLOR) { this._applet_icon.set_style_class_name('applet-icon'); } else { this._applet_icon.set_style_class_name('system-status-icon'); } this._applet_icon.set_icon_size(size); } on_panel_icon_size_changed() { this._updateIconAndLabel(); } _theme_set() { this._size_dirty = true; this._updateIconAndLabel(); } _updateIconAndLabel(){ try { if (this.menuCustom) { if (this.menuIcon == "") { this.set_applet_icon_name(""); } else if (GLib.path_is_absolute(this.menuIcon) && GLib.file_test(this.menuIcon, GLib.FileTest.EXISTS)) { if (this.menuIcon.search("-symbolic") != -1) this.set_applet_icon_symbolic_path(this.menuIcon); else this.set_applet_icon_path(this.menuIcon); } else if (Gtk.IconTheme.get_default().has_icon(this.menuIcon)) { if (this.menuIcon.search("-symbolic") != -1) this.set_applet_icon_symbolic_name(this.menuIcon); else this.set_applet_icon_name(this.menuIcon); } } else { let icon_name = global.settings.get_string('app-menu-icon-name'); if (icon_name.search("-symbolic") != -1) { this.set_applet_icon_symbolic_name(icon_name); } else { this.set_applet_icon_name(icon_name); } } } catch(e) { global.logWarning("Could not load icon file \""+this.menuIcon+"\" for menu button"); } // Hide the icon box if the icon name/path is empty if ((this.menuCustom && this.menuIcon == "") || (!this.menuCustom && global.settings.get_string('app-menu-icon-name') == "")){ this._applet_icon_box.hide(); } else { this._applet_icon_box.show(); } // Hide the menu label in vertical panels if (this._orientation == St.Side.LEFT || this._orientation == St.Side.RIGHT) { this.set_applet_label(""); } else { if (this.menuCustom) { if (this.menuLabel != "") this.set_applet_label(_(this.menuLabel)); else this.set_applet_label(""); } else { this.set_applet_label(global.settings.get_string('app-menu-label')); } } } _contextMenuOpenStateChanged(menu) { if (menu.isOpen) { this._activeContextMenuParent = menu.sourceActor._delegate; this._scrollToButton(menu); } else { this._activeContextMenuItem = null; this._activeContextMenuParent = null; menu.sourceActor = null; } } toggleContextMenu(button) { if (!button.withMenu) return; if (!this.contextMenu) { let menu = new PopupMenu.PopupSubMenu(null); // hack: creating without actor // More hack! Let the application box adjust its scrollbar instead of allowing this // context menu to have one (which ends up with a tiny allocation) - this occurs when // the menu is restrained by the work area. menu._needsScrollbar = function() { return false; }; menu.actor.set_style_class_name('appmenu-context-menu'); menu.connect('open-state-changed', this._contextMenuOpenStateChanged.bind(this)); this.contextMenu = menu; this.applicationsBox.add_actor(menu.actor); } else if (this.contextMenu.isOpen && this.contextMenu.sourceActor != button.actor) { this.contextMenu.close(); } if (!this.contextMenu.isOpen) { this.contextMenu.box.destroy_all_children(); this.applicationsBox.set_child_above_sibling(this.contextMenu.actor, button.actor); this.contextMenu.sourceActor = button.actor; button.populateMenu(this.contextMenu); } this.contextMenu.toggle(); } _navigateContextMenu(button, symbol, ctrlKey) { if (symbol === Clutter.KEY_Menu || symbol === Clutter.KEY_Escape || (ctrlKey && (symbol === Clutter.KEY_Return || symbol === Clutter.KEY_KP_Enter))) { this.toggleContextMenu(button); return; } let minIndex = 0; let goUp = symbol === Clutter.KEY_Up || symbol === Clutter.KEY_KP_Up; let nextActive = null; let menuItems = this.contextMenu._getMenuItems(); // The context menu items // The first context menu item of a RecentButton is used just as a label. // So remove it from the iteration. if (button && button instanceof RecentButton) { minIndex = 1; } let menuItemsLength = menuItems.length; switch (symbol) { case Clutter.KEY_Page_Up: this._activeContextMenuItem = menuItems[minIndex]; this._activeContextMenuItem.setActive(true); return; case Clutter.KEY_Page_Down: this._activeContextMenuItem = menuItems[menuItemsLength - 1]; this._activeContextMenuItem.setActive(true); return; } if (!this._activeContextMenuItem) { if (symbol === Clutter.KEY_Return || symbol === Clutter.KEY_KP_Enter) { button.activate(); } else { this._activeContextMenuItem = menuItems[goUp ? menuItemsLength - 1 : minIndex]; this._activeContextMenuItem.setActive(true); } return; } else if (this._activeContextMenuItem && (symbol === Clutter.KEY_Return || symbol === Clutter.KEY_KP_Enter)) { this._activeContextMenuItem.activate(); this._activeContextMenuItem = null; return; } for (let i = minIndex; i < menuItemsLength; i++) { if (menuItems[i] === this._activeContextMenuItem) { let nextActiveIndex = (goUp ? i - 1 : i + 1); if (nextActiveIndex < minIndex) { nextActiveIndex = menuItemsLength - 1; } else if (nextActiveIndex > menuItemsLength - 1) { nextActiveIndex = minIndex; } nextActive = menuItems[nextActiveIndex]; nextActive.setActive(true); this._activeContextMenuItem = nextActive; break; } } } _onMenuKeyPress(actor, event) { let symbol = event.get_key_symbol(); let item_actor; this.appBoxIter.reloadVisible(); this.catBoxIter.reloadVisible(); this.placesBoxIter.reloadVisible(); this.favBoxIter.reloadVisible(); this.sysBoxIter.reloadVisible(); let keyCode = event.get_key_code(); let modifierState = Cinnamon.get_event_state(event); /* Accounts for mirrored RTL layout. Switches between left/right key presses */ if(St.Widget.get_default_direction() === St.TextDirection.RTL) { switch(symbol) { case Clutter.KEY_Right: symbol = Clutter.KEY_Left; break; case Clutter.KEY_KP_Right: symbol = Clutter.KEY_RP_Left; break; case Clutter.KEY_Left: symbol = Clutter.KEY_Right; break; case Clutter.KEY_KP_Left: symbol = Clutter.KEY_KP_Right; break; } } /* check for a keybinding and quit early, otherwise we get a double hit of the keybinding callback */ let action = global.display.get_keybinding_action(keyCode, modifierState); if (action == Meta.KeyBindingAction.CUSTOM) { return Clutter.EVENT_STOP; } if (this.searchEntryText.has_preedit()) { // There is an uncommitted text in the search box, let the input method to handle this. return Clutter.EVENT_PROPAGATE; } let ctrlKey = modifierState & Clutter.ModifierType.CONTROL_MASK; // If a context menu is open, hijack keyboard navigation and concentrate on the context menu. if (this._activeContextMenuParent && this._activeContainer === this.applicationsBox) { let continueNavigation = false; switch (symbol) { case Clutter.KEY_Up: case Clutter.KEY_KP_Up: case Clutter.KEY_Down: case Clutter.KEY_KP_Down: case Clutter.KEY_Return: case Clutter.KEY_KP_Enter: case Clutter.KEY_Menu: case Clutter.KEY_Page_Up: case Clutter.KEY_Page_Down: case Clutter.KEY_Escape: this._navigateContextMenu(this._activeContextMenuParent, symbol, ctrlKey); break; case Clutter.KEY_Right: case Clutter.KEY_KP_Right: case Clutter.KEY_Left: case Clutter.KEY_KP_Left: case Clutter.KEY_Tab: case Clutter.KEY_ISO_Left_Tab: continueNavigation = true; break; } if (!continueNavigation) return Clutter.EVENT_STOP; } if (this._activeContainer === null) { this._setKeyFocusToCurrentCategoryButton(); } if (this._activeContainer === null) { // Likely there are no categories or apps visible due to a bad search, let the key event // event continue to the search entry. return Clutter.EVENT_PROPAGATE; } let iter = this._activeContainer._vis_iter; let active = this._activeActor; switch (symbol) { case Clutter.KEY_Up: case Clutter.KEY_KP_Up: item_actor = iter.prev(active); if (iter.up && active === iter.first()) item_actor = iter.up.last(); break; case Clutter.KEY_Down: case Clutter.KEY_KP_Down: item_actor = iter.next(active); if (iter.down && active === iter.last()) item_actor = iter.down.first(); break; case Clutter.KEY_Right: case Clutter.KEY_KP_Right: case Clutter.KEY_Tab: if (!this.searchActive) { item_actor = iter.right.first(); if (iter.right === this.catBoxIter) item_actor = this.hoveredCategory || iter.right.first(); else if (iter.right === this.appBoxIter) item_actor = this.hoveredApp || iter.right.first(); if (this._activeContainer === this.systemBox) { if (active === iter.last()) item_actor = iter.right.first(); else item_actor = iter.next(active); } } break; case Clutter.KEY_Left: case Clutter.KEY_KP_Left: case Clutter.KEY_ISO_Left_Tab: if (!this.searchActive) { item_actor = iter.left.first(); if (iter.left === this.catBoxIter) item_actor = this.hoveredCategory || iter.left.first(); else if (iter.left === this.appBoxIter) item_actor = this.hoveredApp || iter.left.first(); else if (iter.left === this.sysBoxIter) item_actor = iter.left.last(); if (this._activeContainer === this.systemBox) { if (active === iter.first()) item_actor = iter.left.first(); else item_actor = iter.prev(active); } } break; case Clutter.KEY_Return: case Clutter.KEY_KP_Enter: if (ctrlKey && this._activeContainer === this.applicationsBox) { this.toggleContextMenu(active._delegate); return Clutter.EVENT_STOP; } else { active._delegate.activate(); return Clutter.EVENT_STOP; } break; case Clutter.KEY_Menu: if (this._activeContainer === this.applicationsBox) { this.toggleContextMenu(active._delegate); return Clutter.EVENT_STOP; } default: break; } if (!item_actor || item_actor === this.searchEntry) { return Clutter.EVENT_PROPAGATE; } if (item_actor._delegate instanceof CategoryButton) this._scrollToButton(item_actor._delegate, this.categoriesScrollView); else if (item_actor._delegate instanceof FavoritesButton) this._scrollToButton(item_actor._delegate, this.sidebarScrollView); else if (item_actor.get_parent() === this.applicationsBox) this._scrollToButton(item_actor._delegate, this.applicationsScrollView); this._buttonEnterEvent(item_actor._delegate); return Clutter.EVENT_STOP; } _buttonEnterEvent(button) { this.categoriesBox.get_children().forEach(child => child.remove_style_pseudo_class("hover")); this.categoriesBox.get_children().forEach(child => child.remove_accessible_state(Atk.StateType.FOCUSED)); this.applicationsBox.get_children().forEach(child => child.set_style_class_name("appmenu-application-button")); this.favoriteAppsBox.get_children().forEach(child => child.remove_style_pseudo_class("hover")); this.placesBox.get_children().forEach(child => child.remove_style_pseudo_class("hover")); this.systemBox.get_children().forEach(child => child.remove_style_pseudo_class("hover")); if (button instanceof CategoryButton) { if (this.searchActive) return; if (button.categoryId !== this.lastSelectedCategory) { if (this.categoryHover) { this.categoriesBox.get_children().forEach(child => child.set_style_class_name("appmenu-category-button")); button.activate(); } else { button.actor.add_style_pseudo_class("hover"); } } this.hoveredCategory = button.actor; } else { const isFav = button instanceof FavoritesButton || button instanceof SystemButton || button instanceof PlaceButton; if (isFav) { button.actor.add_style_pseudo_class("hover"); } else { button.actor.set_style_class_name(`${button.styleClass}-selected`); this.hoveredApp = button.actor; } } button.actor.add_accessible_state(Atk.StateType.FOCUSED); let parent = button.actor.get_parent(); this._activeContainer = parent; this._activeActor = button.actor; } _buttonLeaveEvent (button) { if (button instanceof CategoryButton) { if (button.categoryId !== this.lastSelectedCategory && !this.searchActive) { button.actor.set_style_class_name("appmenu-category-button"); if (button.actor.has_style_pseudo_class("hover")) { button.actor.remove_style_pseudo_class("hover"); } } } else { if (button instanceof FavoritesButton || button instanceof SystemButton) button.actor.remove_style_pseudo_class("hover"); else button.actor.set_style_class_name(button.styleClass); } button.actor.remove_accessible_state(Atk.StateType.FOCUSED); // This method is only called on mouse leave so return key focus to the // currently active category button. this._setKeyFocusToCurrentCategoryButton(); } _setKeyFocusToCurrentCategoryButton() { const currentSelectedCategoryActor = this.categoriesBox.get_children().find(child => child._delegate.categoryId === this.lastSelectedCategory); if (currentSelectedCategoryActor) { this._activeContainer = this.categoriesBox; this._activeActor = currentSelectedCategoryActor; } } /* Category Box * _____ * | /|T * | / | * | /__|__________pointer Y * | |\ | * | | \ | * |_|__\|B * | * | * |pointer X */ /* * The vector mask activates on any motion from a category button. At this point, all * category buttons are made non-reactive. * * The starting point and two corners of the category box are taken, and two angles are * calculated to intersect with the right box corners. If a movement is within those two * angles, the current position is made the last position and used on the next interval. * * In this manner the left vertex of the triangle follows the mouse and category-switching * is disabled as long as the pointer stays in bounds. * * If the poll interval is made too large, category switching will become sluggish. Polling * stops when there is no movement. */ static DEBUG_VMASK = false; static POLL_INTERVAL = 30; static MIN_MOVEMENT = 2; // Movement smaller than this disables the mask. _getNewVectorInfo() { let [mx, my, mask] = global.get_pointer(); let [bx, by] = this.categoriesScrollView.get_transformed_position(); // The allocation is the only thing that works here - the 'height' // property (and natural height) are the size of the entire scrollable // area (the inner categoriesBox), which is weird... let alloc = this.categoriesScrollView.get_allocation_box(); let bw = alloc.x2 - alloc.x1; let bh = alloc.y2 - alloc.y1; let x_dist = bx + bw - mx; let y_dist = my - by; // Calculate their angle from 3 o'clock. let top_angle = calc_angle(x_dist, y_dist); y_dist -= bh; let bottom_angle = calc_angle(x_dist, y_dist); let debug_actor = null; if (CinnamonMenuApplet.DEBUG_VMASK) { debug_actor = new St.Polygon({ ulc_x: mx, ulc_y: my, llc_x: mx, llc_y: my, urc_x: bx + bw, urc_y: by, lrc_x: bx + bw, lrc_y: by + bh, reactive: false, debug: true }); global.stage.add_actor(debug_actor); } return { start_x: mx, start_y: my, bx: bx, by1: by, by2: by + bh, bw: bw, bh: bh, top_angle: top_angle, bottom_angle: bottom_angle, debug_actor: debug_actor }; } _updateVectorInfo(mx, my) { let bx = this.vector_mask_info.bx; let by = this.vector_mask_info.by1; let bw = this.vector_mask_info.bw; let bh = this.vector_mask_info.bh; let x_dist = bx + bw - mx; let y_dist = my - by; // Calculate their angle from 3 o'clock. let top_angle = calc_angle(x_dist, y_dist); y_dist -= bh; let bottom_angle = calc_angle(x_dist, y_dist); // Padding moves the saved x position slightly left, this makes the mask // more forgiving of random small movement when starting to choose an // app button. this.vector_mask_info.start_x = mx; this.vector_mask_info.start_y = my; this.vector_mask_info.top_angle = top_angle; this.vector_mask_info.bottom_angle = bottom_angle; if (CinnamonMenuApplet.DEBUG_VMASK) { this.vector_mask_info.debug_actor.ulc_x = mx; this.vector_mask_info.debug_actor.llc_x = mx; this.vector_mask_info.debug_actor.ulc_y = my; this.vector_mask_info.debug_actor.llc_y = my; } } _keepMaskActive() { let ret = false; let angle = 0; let [mx, my, mask] = global.get_pointer(); // Check for out of range entirely. if (mx >= this.vector_mask_info.bx + this.vector_mask_info.bw || my < this.vector_mask_info.by1 || my > this.vector_mask_info.by2) { return false; } let x_dist = mx - this.vector_mask_info.start_x; let y_dist = this.vector_mask_info.start_y - my; if (Math.abs(Math.hypot(x_dist, y_dist)) < CinnamonMenuApplet.MIN_MOVEMENT) { return false; } angle = calc_angle(x_dist, y_dist); ret = angle <= this.vector_mask_info.top_angle && angle >= this.vector_mask_info.bottom_angle; this._updateVectorInfo(mx, my); if (CinnamonMenuApplet.DEBUG_VMASK) { log(`${this.vector_mask_info.top_angle.toFixed()} <---${angle.toFixed()}---> ${this.vector_mask_info.bottom_angle.toFixed()} - Continue? ${ret}`); } return ret; } _enableVectorMask(actor) { this._disableVectorMask(); this.vector_mask_info = this._getNewVectorInfo(actor); // While the mask is active, disable category buttons. this._setCategoryButtonsReactive(false); this.vector_update_loop = Mainloop.timeout_add(CinnamonMenuApplet.POLL_INTERVAL, this._maskPollTimeout.bind(this)); } _maskPollTimeout() { if (this._keepMaskActive()) { return GLib.SOURCE_CONTINUE; } this._disableVectorMask(); return GLib.SOURCE_REMOVE; } _categoryMotionEvent(actor, event) { // Always keep the mask engaged - motion-events on the category buttons // trigger this. if (this.vector_update_loop == 0) { this._enableVectorMask(actor); } return Clutter.EVENT_PROPAGATE; } _disableVectorMask() { if (this.vector_update_loop > 0) { this._setCategoryButtonsReactive(true); Mainloop.source_remove(this.vector_update_loop); this.vector_update_loop = 0; if (CinnamonMenuApplet.DEBUG_VMASK) { this.vector_mask_info.debug_actor.destroy(); } } } _setCategoryButtonsReactive(active) { for (let button of this._categoryButtons) { button.actor.reactive = active; button.actor.queue_redraw(); } } _refreshSidebar() { //Remove all places this.placesBox.destroy_all_children(); //Load places again this._placesButtons = []; let places = [...Main.placesManager.getDefaultPlaces(), ...Main.placesManager.getBookmarks()]; for (let place of places) { let path = place.idDecoded.replace("bookmark:file://", "") switch (path) { case "special:home": if (!this.showHome) continue; break; case "special:desktop": if (!this.showDesktop) continue; break; case GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOWNLOAD): if (!this.showDownloads) continue; break; case GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOCUMENTS): if (!this.showDocuments) continue; break; case GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_MUSIC): if (!this.showMusic) continue; break; case GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_PICTURES): if (!this.showPictures) continue; break; case GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_VIDEOS): if (!this.showVideos) continue; break; default: if (!this.showBookmarks) continue; break; } let button = new PlaceButton(this, place); this._placesButtons.push(button); this.placesBox.add(button.actor, { y_align: St.Align.END, y_fill: false }); } this.placesBox.queue_relayout(); // Update navigation because the presence/absence of places // can impact it. this.updateNavigation(); // FAV APPS this.favoriteAppsBox.destroy_all_children(); let showingSomeFavorites = false; let launchers = global.settings.get_strv('favorite-apps'); for (let launcher of launchers) { let app = appsys.lookup_app(launcher); if (app) { let button = new FavoritesButton(this, app); showingSomeFavorites = true; this.favoriteAppsBox.add(button.actor, { y_align: St.Align.END, y_fill: false }); } } this.favoriteAppsBox.queue_relayout(); // Separator between favs and places if (this._placesButtons.length > 0 && showingSomeFavorites) this.placesSeparator.show(); else this.placesSeparator.hide(); this.sidebarScrollBox.queue_relayout(); } _refreshRecent () { this._recentButtons.forEach(button => button.destroy()); this._recentButtons = []; const index = this._categoryButtons.findIndex(button => button.categoryId === 'recent'); if (index !== -1) { this._categoryButtons[index].destroy(); this._categoryButtons.splice(index, 1); this.recentButton = null; } if (!this.showRecents || !this.privacy_settings.get_boolean(REMEMBER_RECENT_KEY)) { return; } if (!this.recentButton) { this.recentButton = new CategoryButton(this, 'recent', _('Recent Files'), 'folder-recent'); this._categoryButtons.push(this.recentButton); this.categoriesBox.add_actor(this.recentButton.actor); } let recents = this.RecentManager._infosByTimestamp.filter(info => !info.name.startsWith(".")); if (recents.length > 0) { this.noRecentDocuments = false; recents.forEach( info => { let icon = info.createIcon(this.applicationIconSize); let button = new PathButton(this, 'recent', info.name, info.uri, icon); this._recentButtons.push(button); this.applicationsBox.add_actor(button.actor); button.actor.visible = this.menu.isOpen && this.lastSelectedCategory === "recent"; }); let button = new SimpleMenuItem(this, { name: _("Clear list"), description: _("Clear all recent documents"), type: 'recent-clear', styleClass: 'appmenu-application-button' }); button.addIcon(22, 'edit-clear', null, true); button.addLabel(button.name, 'appmenu-application-button-label'); button.label.set_style('font-weight: bold;'); button.activate = () => { this.menu.close(); (new Gtk.RecentManager()).purge_items(); }; this._recentButtons.push(button); this.applicationsBox.add_actor(button.actor); button.actor.visible = this.menu.isOpen && this.lastSelectedCategory === "recent"; } else { this.noRecentDocuments = true; let button = new SimpleMenuItem(this, { name: _("No recent documents"), type: 'no-recent', styleClass: 'appmenu-application-button', reactive: false, activatable: false }); button.addLabel(button.name, 'appmenu-application-button-label'); this._recentButtons.push(button); this.applicationsBox.add_actor(button.actor); button.actor.visible = this.menu.isOpen && this.lastSelectedCategory === "recent"; } } _refreshFavDocs() { this._favoriteDocButtons.forEach(button => button.destroy()); this._favoriteDocButtons = []; const index = this._categoryButtons.findIndex(button => button.categoryId === 'favorite'); if (index !== -1) { this._categoryButtons[index].destroy(); this._categoryButtons.splice(index, 1); this.favoriteDocsButton = null; } let favorite_infos = XApp.Favorites.get_default().get_favorites(null); if (!this.showFavorites) { return; } if (!this.favoriteDocsButton) { this.favoriteDocsButton = new CategoryButton(this, 'favorite', _('Favorites'), 'xapp-user-favorites'); this._categoryButtons.push(this.favoriteDocsButton); this.categoriesBox.add_actor(this.favoriteDocsButton.actor); } if (favorite_infos.length > 0) { favorite_infos.forEach( info => { let icon = new St.Icon({ gicon: Gio.content_type_get_icon(info.cached_mimetype), icon_size: this.applicationIconSize }); let button = new PathButton(this, 'favorite', info.display_name, info.uri, icon); this._favoriteDocButtons.push(button); this.applicationsBox.add_actor(button.actor); button.actor.visible = this.menu.isOpen && this.lastSelectedCategory === "favorite"; }); } else { let button = new SimpleMenuItem(this, { name: _("No favorite documents"), type: 'no-favorites', styleClass: 'appmenu-application-button', reactive: false, activatable: false }); button.addLabel(button.name, 'appmenu-application-button-label'); this._favoriteDocButtons.push(button); this.applicationsBox.add_actor(button.actor); button.actor.visible = this.menu.isOpen && this.lastSelectedCategory === "favorite"; } } _refreshApps() { /* iterate in reverse, so multiple splices will not upset * the remaining elements */ for (let i = this._categoryButtons.length - 1; i > -1; i--) { let b = this._categoryButtons[i]; if (['recent', 'favorite'].includes(b.categoryId)) continue; this._categoryButtons[i].destroy(); this._categoryButtons.splice(i, 1); } this._applicationsButtons.forEach(button => button.destroy()); this._applicationsButtons = []; const index = this._categoryButtons.findIndex(button => button.categoryId == null); if (index !== -1) { this._categoryButtons[index].destroy(); this._categoryButtons.splice(index, 1); this._allAppsCategoryButton = null; } this._allAppsCategoryButton = new CategoryButton(this, null, _("All Applications"), "cinnamon-all-applications", true); this.categoriesBox.add_actor(this._allAppsCategoryButton.actor); this._categoryButtons.push(this._allAppsCategoryButton); // grab top level directories and all apps in them let [apps, dirs] = AppUtils.getApps(); // generate all category buttons from top-level directories dirs.forEach( d => { let categoryButton = new CategoryButton(this, d.get_menu_id(), d.get_name(), d.get_icon()); this._categoryButtons.push(categoryButton); this.categoriesBox.add_actor(categoryButton.actor); }); /* we add them in reverse at index 0 so they are always above places and * recent buttons, and below */ for (let i = apps.length - 1; i > -1; i--) { let app = apps[i][0]; let button = new ApplicationButton(this, app); button.category = apps[i][1]; let appKey = app.get_id() || `${app.get_name()}:${app.get_description()}`; // appsWereRefreshed if this is not initial load. on initial load every // app is marked known. if (this._appsWereRefreshed && !this._knownApps.has(appKey)) button.highlight(); else this._knownApps.add(appKey); this._applicationsButtons.push(button); this.applicationsBox.insert_child_at_index(button.actor, 0); button.actor.visible = this.menu.isOpen && (this.lastSelectedCategory === button.category || this.lastSelectedCategory == null); } // we expect this array to be in the same order as the child list this._applicationsButtons.reverse(); this._appsWereRefreshed = true; } _refreshSystemButtons() { // Remove all system buttons this.systemBox.destroy_all_children(); // Load system buttons again let button; //Lock screen button = new SystemButton(this, "xsi-lock-screen", _("Lock Screen"), _("Lock the screen")); button.actor.add_style_class_name("appmenu-system-button-lock"); button.activate = () => { this.menu.close(); let screensaver_settings = new Gio.Settings({ schema_id: "org.cinnamon.desktop.screensaver" }); let screensaver_dialog = GLib.find_program_in_path("cinnamon-screensaver-command"); if (screensaver_dialog) { if (screensaver_settings.get_boolean("ask-for-away-message")) { Util.spawnCommandLine("cinnamon-screensaver-lock-dialog"); } else { Util.spawnCommandLine("cinnamon-screensaver-command --lock"); } } else { this._screenSaverProxy.LockRemote(""); } }; this.systemBox.add(button.actor, { y_align: St.Align.MIDDLE, y_fill: false }); //Logout button button = new SystemButton(this, "xsi-log-out", _("Log Out"), _("Leave the session")); button.actor.add_style_class_name("appmenu-system-button-logout"); button.activate = () => { this.menu.close(); this._session.LogoutRemote(0); }; this.systemBox.add(button.actor, { y_align: St.Align.MIDDLE, y_fill: false }); //Shutdown button button = new SystemButton(this, "xsi-shutdown", _("Shut Down"), _("Shut down the computer")); button.actor.add_style_class_name("appmenu-system-button-shutdown"); button.activate = () => { this.menu.close(); this._session.ShutdownRemote(); }; this.systemBox.add(button.actor, { y_align: St.Align.MIDDLE, y_fill: false }); } _scrollToButton(button, scrollBox = this.applicationsScrollView) { let adj = scrollBox.get_vscroll_bar().get_adjustment(); if (button) { let box = scrollBox.get_allocation_box(); let boxHeight = box.y2 - box.y1; let actorBox = button.actor.get_allocation_box(); let currentValue = adj.get_value(); let newValue = currentValue; if (currentValue > actorBox.y1 - 10) newValue = actorBox.y1 - 10; if (boxHeight + currentValue < actorBox.y2 + 10) newValue = actorBox.y2 - boxHeight + 10; if (newValue != currentValue) adj.set_value(newValue); } else { adj.set_value(0); } } _layout() { // Position the search bar this.right_box.remove_all_children(); if (this.searchPosition == "top") { this.right_box.add(this.searchBox, {span: 1}); this.right_box.add(this.searchSeparator); this.right_box.add(this.categoriesApplicationsBox.actor, { expand: true, span: 1, }); this.categoriesApplicationsBox.actor.remove_style_pseudo_class("top"); } else { this.right_box.add(this.categoriesApplicationsBox.actor, { expand: true, span: 1, }); this.categoriesApplicationsBox.actor.add_style_pseudo_class("top"); this.right_box.add(this.searchSeparator); this.right_box.add(this.searchBox, {span: 1}); } // Position the system box if (this.systemPosition == "sidebar") global.reparentActor(this.systemBox, this.sidebar); else global.reparentActor(this.systemBox, this.searchBox); } _buildSidebar() { this.sidebar = new St.BoxLayout({ style_class: 'appmenu-sidebar', vertical: true }); this.userBox = new St.BoxLayout({ style_class: 'appmenu-sidebar-user-box', vertical: true, reactive: false }); let user = AccountsService.UserManager.get_default().get_user(GLib.get_user_name()); this.userIcon = new UserWidget.UserWidget(user, Clutter.Orientation.VERTICAL, false); this.userIcon.set_reactive(true); this.userIcon.track_hover = true; this.userIcon.set_accessible_role(Atk.Role.BUTTON); this.userIcon.set_accessible_name(_("Account details")); this.userIcon.connect('button-press-event', () => { this.menu.toggle(); Util.spawnCommandLine("cinnamon-settings user"); }); this.userBox.add(this.userIcon); this.avatarSeparator = new PopupMenu.PopupSeparatorMenuItem().actor; this.placesSeparator = new PopupMenu.PopupSeparatorMenuItem().actor; this.sidebarScrollBox = new SidebarScrollBox().actor; this.sidebarScrollView = new St.ScrollView({ y_align: St.Align.START, style_class: 'appmenu-sidebar-scrollview' }); this.sidebarScrollView.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC); this.sidebarScrollView.add_actor(this.sidebarScrollBox); this.sidebarScrollView.get_vscroll_bar().hide(); this.placesBox = new St.BoxLayout({ vertical: true, y_align: Clutter.ActorAlign.START, style_class: 'appmenu-places-box' }); this.favoriteAppsBox = new FavoriteAppsBox().actor; this.main_container.add(this.sidebar, { span: 1 }); this.sidebar.add(this.userBox, { x_fill: true, y_fill: true, x_align: St.Align.MIDDLE, y_align: St.Align.START }); this.sidebar.add(this.avatarSeparator); this.sidebar.add(this.sidebarScrollView, { expand: true }); this.sidebarScrollBox.add(this.placesBox); this.sidebarScrollBox.add(this.placesSeparator); this.sidebarScrollBox.add(this.favoriteAppsBox); } _display() { this._activeContainer = null; this._activeActor = null; this.actor_motion_id = 0; this.vector_update_loop = 0; let section = new PopupMenu.PopupMenuSection(); this.menu.addMenuItem(section); this.main_container = new St.BoxLayout({ vertical: false, style_class: 'appmenu-main-box' }); this.main_container._delegate = null; section.addActor(this.main_container, { expand: true, span: -1, align: St.Align.START, }); this._buildSidebar(); this.right_box = new St.BoxLayout({ vertical: true, style_class: 'appmenu-right-box'}); this.main_container.add(this.right_box, { expand: true }); this.searchBox = new St.BoxLayout({ style_class: 'appmenu-search-box', vertical: false, }); this.searchEntry = new St.Entry({ name: 'appmenu-search-entry', track_hover: true, can_focus: true, accessible_name: _("Search"), accessible_role: Atk.Role.ENTRY, }); this.searchEntry.add_accessible_state(Atk.StateType.EDITABLE); this.searchEntry.set_secondary_icon(this._searchInactiveIcon); this.searchActive = false; this.searchEntryText = this.searchEntry.clutter_text; this.searchEntryText.connect('text-changed', this._onSearchTextChanged.bind(this)); this.searchEntryText.connect('key-press-event', this._onMenuKeyPress.bind(this)); this._previousSearchPattern = ""; this.categoriesApplicationsBox = new CategoriesApplicationsBox(); this.categoriesBox = new St.BoxLayout({ style_class: 'appmenu-categories-box', vertical: true, accessible_role: Atk.Role.LIST }); this.categoriesScrollView = new St.ScrollView({ style_class: 'appmenu-categories-scrollview' }); this.categoriesScrollView.add_actor(this.categoriesBox); this.categoriesScrollView.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC); this.categoriesScrollView.set_clip_to_allocation(true); this.categoriesScrollView.get_vscroll_bar().hide(); this.categoriesApplicationsBox.actor.add(this.categoriesScrollView); this.applicationsBox = new St.BoxLayout({ style_class: 'appmenu-applications-box', vertical:true }); this.applicationsScrollView = new St.ScrollView({ style_class: 'vfade appmenu-applications-scrollview'}); this.applicationsScrollView.add_actor(this.applicationsBox); this.applicationsScrollView.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC); this.applicationsScrollView.set_clip_to_allocation(true); let vscroll = this.applicationsScrollView.get_vscroll_bar(); vscroll.connect('scroll-start', () => { this.menu.passEvents = true; }); vscroll.connect('scroll-stop', () => { this.menu.passEvents = false; }); let vscrollCat = this.categoriesScrollView.get_vscroll_bar(); vscrollCat.connect('scroll-start', () => { this.menu.passEvents = true; }); vscrollCat.connect('scroll-stop', () => { this.menu.passEvents = false; }); this.categoriesApplicationsBox.actor.add(this.applicationsScrollView, {span: -1, expand: true}); this.systemBox = new St.BoxLayout({ style_class: 'appmenu-system-box', y_expand: false, x_expand: false, x_align: Clutter.ActorAlign.CENTER }); this.searchSeparator = new PopupMenu.PopupSeparatorMenuItem().actor; this.searchBox.add(this.searchEntry, { x_align: St.Align.START, y_align: St.Align.MIDDLE, expand: true, }); this._layout(); this.appBoxIter = new VisibleChildIterator(this.applicationsBox); this.applicationsBox._vis_iter = this.appBoxIter; this.catBoxIter = new VisibleChildIterator(this.categoriesBox); this.categoriesBox._vis_iter = this.catBoxIter; this.placesBoxIter = new VisibleChildIterator(this.placesBox); this.placesBox._vis_iter = this.placesBoxIter; this.favBoxIter = new VisibleChildIterator(this.favoriteAppsBox); this.favoriteAppsBox._vis_iter = this.favBoxIter; this.sysBoxIter = new VisibleChildIterator(this.systemBox); this.systemBox._vis_iter = this.sysBoxIter; this.updateNavigation(); Mainloop.idle_add(() => { this._clearAllSelections(); this._hideAllAppActors(); }); this.a11y_settings = new Gio.Settings({ schema_id: "org.cinnamon.desktop.a11y.applications" }); this.a11y_settings.connect("changed::screen-magnifier-enabled", this._updateVFade.bind(this)); this.a11y_mag_settings = new Gio.Settings({ schema_id: "org.cinnamon.desktop.a11y.magnifier" }); this.a11y_mag_settings.connect("changed::mag-factor", this._updateVFade.bind(this)); this._updateVFade(); this.settings.bind("enable-autoscroll", "autoscroll_enabled", this._update_autoscroll); this._update_autoscroll(); this._sidebarToggle(); this._avatarToggle(); } updateNavigation() { this.placesBoxIter.left = this.sysBoxIter; this.placesBoxIter.right = this.catBoxIter; this.placesBoxIter.up = this.favBoxIter; this.placesBoxIter.down = this.favBoxIter; this.favBoxIter.left = this.sysBoxIter; this.favBoxIter.right = this.catBoxIter; this.favBoxIter.up = null; this.favBoxIter.down = null; this.catBoxIter.right = this.appBoxIter; this.catBoxIter.left = this.sysBoxIter; this.appBoxIter.left = this.catBoxIter; this.appBoxIter.right = this.sysBoxIter; this.sysBoxIter.left = this.appBoxIter; this.sysBoxIter.right = this.catBoxIter; if (this.showSidebar) { if (this._placesButtons.length > 0) { this.favBoxIter.up = this.placesBoxIter; this.favBoxIter.down = this.placesBoxIter; this.catBoxIter.left = this.placesBoxIter; this.sysBoxIter.right = this.placesBoxIter; } else { this.catBoxIter.left = this.favBoxIter; this.sysBoxIter.right = this.favBoxIter; } } } _updateVFade() { let mag_on = this.a11y_settings.get_boolean("screen-magnifier-enabled") && this.a11y_mag_settings.get_double("mag-factor") > 1.0; if (mag_on) { this.applicationsScrollView.style_class = "appmenu-applications-scrollbox"; } else { this.applicationsScrollView.style_class = "vfade appmenu-applications-scrollbox"; } } _update_autoscroll() { this.applicationsScrollView.set_auto_scrolling(this.autoscroll_enabled); this.categoriesScrollView.set_auto_scrolling(this.autoscroll_enabled); this.sidebarScrollView.set_auto_scrolling(this.autoscroll_enabled); } _hideAllAppActors() { this.applicationsBox.get_children().forEach(actor => { actor.hide(); }); } _clearAllSelections() { this.applicationsBox.get_children().forEach(actor => { actor.style_class = "appmenu-application-button"; }); this.categoriesBox.get_children().forEach(actor => { actor.remove_style_pseudo_class("hover") actor.style_class = "appmenu-category-button"; actor.show(); }); this.placesBox.get_children().forEach(actor => { actor.remove_style_pseudo_class("hover"); actor.show(); }); this.favoriteAppsBox.get_children().forEach(actor => { actor.remove_style_pseudo_class("hover"); actor.show(); }); this.systemBox.get_children().forEach(actor => { actor.remove_style_pseudo_class("hover"); actor.show(); }); } _resetSortOrder() { let pos = 0; for (let i = 0; i < this._applicationsButtons.length; i++) { this.applicationsBox.set_child_at_index(this._applicationsButtons[i].actor, pos++); } for (let i = 0; i < this._favoriteDocButtons.length; i++) { this.applicationsBox.set_child_at_index(this._favoriteDocButtons[i].actor, pos++); } for (let i = 0; i < this._recentButtons.length; i++) { this.applicationsBox.set_child_at_index(this._recentButtons[i].actor, pos++); } } _select_category (name = null) { if (name === this.lastSelectedCategory){ return; } this.lastSelectedCategory = name; this._displayButtons(name || 'app'); this.closeContextMenu(false); this._scrollToButton(null); } closeContextMenu(animate) { if (!this.contextMenu || !this.contextMenu.isOpen) return; if (animate) this.contextMenu.toggle(); else this.contextMenu.close(); } /** * Reset the ApplicationsBox to a specific category or list of buttons. * @param {String} category (optional) The button type or application category to be displayed. * @param {Array} buttons (optional) A list of existing buttons to show. * @param {Array} autoCompletes (optional) A list of autocomplete strings to add buttons for and show. */ _displayButtons(category, buttons=[], autoCompletes=[]){ /* We only operate on SimpleMenuItems here. If any other menu item types * are added, they should be managed independently. */ if (category) { if (this.orderDirty) { this._resetSortOrder(); this.orderDirty = false; } this.applicationsBox.get_children().forEach( c => { let b = c._delegate; if (!(b instanceof SimpleMenuItem)) return; // destroy temporary buttons if (b.type === 'transient' || b.type === 'search-provider') { b.destroy(); return; } c.visible = b.type.includes(category) || b.type === 'app' && b.category.includes(category); }); } else { this.orderDirty = true; this.applicationsBox.get_children().forEach( c => { let b = c._delegate; if (!(b instanceof SimpleMenuItem)) return; // destroy temporary buttons if (b.type === 'transient' || b.type === 'search-provider' || b.type === 'search-result') { b.destroy(); return; } c.visible = false; }); buttons.sort((ba, bb) => { if (ba.matchIndex < bb.matchIndex) { return -1; } else if (bb.matchIndex < ba.matchIndex) { return 1; } return ba.name.localeCompare(bb.name); }); for (let i = 0; i < buttons.length; i++) { this.applicationsBox.set_child_at_index(buttons[i].actor, i); buttons[i].actor.visible = true; } } // reset temporary button storage this._transientButtons = []; this._searchProviderButtons = []; if (autoCompletes) { autoCompletes.forEach( item => { let button = new TransientButton(this, item); this._transientButtons.push(button); this.applicationsBox.add_actor(button.actor); }); } } _setCategoriesButtonActive(active) { try { let categoriesButtons = this.categoriesBox.get_children(); for (var i in categoriesButtons) { let button = categoriesButtons[i]; let icon = button._delegate.icon; if (active){ button.set_style_class_name("appmenu-category-button"); if (icon) { icon.set_opacity(255); } } else { button.set_style_class_name("appmenu-category-button-greyed"); if (icon) { let icon_opacity = icon.get_theme_node().get_double('opacity'); icon_opacity = Math.min(Math.max(0, icon_opacity), 1); if (icon_opacity) // Don't set opacity to 0 if not defined icon.set_opacity(icon_opacity * 255); } } } } catch (e) { global.log(e); } } resetSearch(){ this.searchEntry.set_text(""); } _onSearchTextChanged (se, prop) { let searchString = this.searchEntry.get_text().trim(); let searchActive = !(searchString == ''); if (!this.searchActive && !searchActive) return; if (searchString == this._previousSearchPattern) return; this._previousSearchPattern = searchString; this.searchActive = searchActive; this._clearAllSelections(); if (searchActive) { this.searchEntry.set_secondary_icon(this._searchActiveIcon); if (!this._searchIconClickedId) { this._searchIconClickedId = this.searchEntry.connect('secondary-icon-clicked', () => { this.resetSearch(); this._select_category(); }); } this._setCategoriesButtonActive(false); this.lastSelectedCategory = "search" this._doSearch(searchString); } else { if (this._searchIconClickedId > 0) this.searchEntry.disconnect(this._searchIconClickedId); this._searchIconClickedId = 0; this.searchEntry.set_secondary_icon(this._searchInactiveIcon); this._previousSearchPattern = ""; this._setCategoriesButtonActive(true); this._select_category(); this._allAppsCategoryButton.actor.style_class = "appmenu-category-button-selected"; this._activeContainer = null; } } _matchNames(buttons, pattern){ let ret = []; let regexpPattern = new RegExp(Util.escapeRegExp(pattern)); for (let button of buttons) { if (button.type == "recent-clear" || button.type == "no-recent" || button.type == "no-favorites") { continue; } let res = button.searchStrings[0].match(regexpPattern); if (res) { button.matchIndex = res.index; ret.push(button); } else { button.matchIndex = NO_MATCH; } } return ret; } _listApplications(pattern){ if (!pattern) return []; let apps = []; let regexpPattern = new RegExp(Util.escapeRegExp(pattern)); for (let button of this._applicationsButtons) { for (let i = 0; i < button.searchStrings.length; i++) { let res = button.searchStrings[i].match(regexpPattern); if (res) { button.matchIndex = res.index + MATCH_ADDERS[i]; apps.push(button); break; } else { button.matchIndex = NO_MATCH; } } } return apps; } _doSearch(rawPattern){ let lowerPattern = AppUtils.decomp_unstripped(rawPattern); let pattern = AppUtils.decomp_stripped(rawPattern); this._searchTimeoutId = 0; this._activeContainer = null; this._activeActor = null; this.hoveredCategory = null; var acResultButtons = []; // search box autocompletion results var buttons = [] buttons = this._listApplications(pattern); let result = this._matchNames(this._favoriteDocButtons, pattern); buttons = [...buttons, ...result]; result = this._matchNames(this._recentButtons, pattern); buttons = [...buttons, ...result]; this._displayButtons(null, buttons, acResultButtons); if (buttons.length || acResultButtons.length) { this.appBoxIter.reloadVisible(); this._activeActor = this.appBoxIter.first(); this._activeContainer = this.applicationsBox; this._scrollToButton(this._activeActor._delegate); this._buttonEnterEvent(this._activeActor._delegate); } SearchProviderManager.launch_all(lowerPattern, (provider, results) => { try { for (let result of results) { if (result.type != 'software') { let button = new SearchProviderResultButton(this, provider, result); this._searchProviderButtons.push(button); this.applicationsBox.add_actor(button.actor); if (this._activeActor === null) { this.appBoxIter.reloadVisible(); this._activeActor = this.appBoxIter.first(); this._activeContainer = this.applicationsBox; if (this._activeActor && this._activeActor != this.searchEntry) { this._buttonEnterEvent(this._activeActor._delegate); } } } } } catch(e) { global.log(e); } }); return false; } }; function main(metadata, orientation, panel_height, instance_id) { return new CinnamonMenuApplet(orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/menu@cinnamon.org/metadata.json0000664000175000017500000000021515167446463026616 0ustar fabiofabio{ "uuid": "menu@cinnamon.org", "name": "Menu", "description": "Main Cinnamon menu", "icon": "applications-other", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/menu@cinnamon.org/settings-schema.json0000664000175000017500000001534215167446463030143 0ustar fabiofabio{ "layout1" : { "type" : "layout", "pages" : ["content", "appearance", "behavior"], "content" : { "type" : "page", "title" : "Content", "sections" : ["content-places", "content-content"] }, "appearance" : { "type" : "page", "title" : "Appearance", "sections" : ["appearance-menu", "appearance-panel"] }, "behavior" : { "type" : "page", "title" : "Behavior", "sections" : ["behavior-menu", "behavior-panel"] }, "behavior-menu" : { "type" : "section", "title" : "Menu", "keys" : ["category-hover", "enable-autoscroll"] }, "behavior-panel" : { "type" : "section", "title" : "Panel", "keys" : ["overlay-key", "activate-on-hover", "hover-delay", "enable-animation"] }, "appearance-menu" : { "type" : "section", "title" : "Options", "keys" : ["search-position", "system-position", "show-description", "symbolic-category-icons", "category-icon-size", "application-icon-size", "sidebar-icon-size", "sidebar-max-width", "reset-menu-size-button"] }, "appearance-panel" : { "type" : "section", "title" : "Panel", "keys" : ["menu-custom", "menu-icon", "menu-icon-size", "menu-label"] }, "content-places" : { "type" : "section", "title" : "Places", "keys" : ["show-home", "show-desktop", "show-documents", "show-downloads", "show-music", "show-pictures", "show-videos", "show-bookmarks"] }, "content-content" : { "type" : "section", "title" : "Content", "keys" : ["show-sidebar", "show-avatar", "show-favorites", "show-recents", "menu-editor-button"] } }, "overlay-key" : { "type" : "keybinding", "description" : "Keyboard shortcut to open and close the menu", "default" : "Super_L::Super_R" }, "menu-custom" : { "type" : "switch", "default" : false, "description" : "Use a custom icon and label" }, "menu-icon" : { "type" : "iconfilechooser", "default" : "cinnamon-symbolic", "description" : "Icon", "default_icon" : "cinnamon-symbolic", "dependency" : "menu-custom" }, "menu-icon-size" : { "type": "spinbutton", "default" : 32, "min" : 16, "max" : 96, "step" : 1, "units" : "px", "description" : "Icon size", "dependency" : "menu-custom" }, "menu-label" : { "type" : "entry", "default" : "Menu", "description" : "Text", "dependency" : "menu-custom" }, "symbolic-category-icons" : { "type" : "switch", "default" : true, "description" : "Use symbolic icons for categories" }, "category-icon-size" : { "type": "spinbutton", "default" : 16, "min" : 8, "max" : 48, "step" : 1, "units" : "px", "description" : "Categories icon size" }, "application-icon-size" : { "type": "spinbutton", "default" : 32, "min" : 8, "max" : 48, "step" : 1, "units" : "px", "description" : "Applications icon size" }, "show-sidebar" : { "type" : "switch", "default" : true, "description" : "Sidebar" }, "show-avatar" : { "type" : "switch", "default" : true, "description" : "Avatar" }, "show-home" : { "type" : "switch", "default" : false, "description" : "Home" }, "show-desktop" : { "type" : "switch", "default" : true, "description" : "Desktop" }, "show-documents" : { "type" : "switch", "default" : false, "description" : "Documents" }, "show-downloads" : { "type" : "switch", "default" : true, "description" : "Downloads" }, "show-music" : { "type" : "switch", "default" : false, "description" : "Music" }, "show-pictures" : { "type" : "switch", "default" : false, "description" : "Pictures" }, "show-videos" : { "type" : "switch", "default" : false, "description" : "Videos" }, "show-bookmarks" : { "type" : "switch", "default" : true, "description" : "Other bookmarks" }, "system-position" : { "type": "combobox", "default" : "sidebar", "description" : "Position of the system buttons", "options" : { "In the sidebar" : "sidebar", "Alongside the search bar" : "search" } }, "search-position" : { "type": "combobox", "default" : "bottom", "description" : "Position of the search bar", "options" : { "At the top" : "top", "At the bottom" : "bottom" } }, "sidebar-icon-size" : { "type": "spinbutton", "default" : 24, "min" : 8, "max" : 48, "step" : 1, "units" : "px", "description" : "Sidebar icon size", "dependency" : "show-sidebar" }, "sidebar-max-width": { "type": "spinbutton", "default": 180, "min": 130, "max": 600, "step": 1, "description": "Maximum sidebar width (px)" }, "show-favorites" : { "type" : "switch", "default" : true, "description": "Favorites" }, "show-recents" : { "type" : "switch", "default" : true, "description": "Recents" }, "show-description" : { "type" : "switch", "default" : true, "description": "Show application descriptions" }, "category-hover" : { "type" : "switch", "default" : true, "description": "Change categories on hover" }, "enable-autoscroll" : { "type" : "switch", "default" : true, "description": "Enable autoscrolling in application list" }, "activate-on-hover" : { "type" : "switch", "default" : false, "description": "Open the menu when I move my mouse over it", "tooltip": "Enable opening the menu when the mouse enters the applet" }, "hover-delay" : { "type": "spinbutton", "default" : 0, "min" : 0, "max" : 1000, "step" : 50, "units" : "milliseconds", "dependency" : "activate-on-hover", "description" : "Menu hover delay", "tooltip" : "Delay before the menu opens when hovered" }, "enable-animation" : { "type": "switch", "default": false, "description": "Use menu animations", "tooltip": "Allow the menu to animate on open and close" }, "menu-editor-button" : { "type" : "button", "description" : "Open the menu editor", "callback" : "_launch_editor", "tooltip" : "Press this button to customize your menu entries." }, "popup-width" : { "type" : "generic", "default" : 665 }, "popup-height" : { "type" : "generic", "default" : 425 }, "reset-menu-size-button" : { "type" : "button", "description" : "Restore the menu to its original size", "callback" : "_reset_menu_size" } } cinnamon-6.6.8/files/usr/share/cinnamon/applets/network@cinnamon.org/0000775000175000017500000000000015167446463024672 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js0000664000175000017500000030532415167446463026524 0ustar fabiofabioconst Applet = imports.ui.applet; const GLib = imports.gi.GLib; const Gio = imports.gi.Gio; const GObject = imports.gi.GObject; const Lang = imports.lang; const NM = imports.gi.NM; const Signals = imports.signals; const St = imports.gi.St; const Mainloop = imports.mainloop; const Main = imports.ui.main; const PopupMenu = imports.ui.popupMenu; const MessageTray = imports.ui.messageTray; const ModemManager = imports.misc.modemManager; const Util = imports.misc.util; const Settings = imports.ui.settings; const DEFAULT_PERIODIC_UPDATE_FREQUENCY_SECONDS = 10; const FAST_PERIODIC_UPDATE_FREQUENCY_SECONDS = 2; const NMConnectionCategory = { INVALID: 'invalid', WIRED: 'wired', WIRELESS: 'wireless', WWAN: 'wwan', VPN: 'vpn', WIREGUARD: 'wireguard' }; const NMAccessPointSecurity = { UNKNOWN: 0, NONE: 1, WEP: 2, WPA_PSK: 3, WPA2_PSK: 4, WPA_ENT: 5, WPA2_ENT: 6 }; // small optimization, to avoid using [] all the time const NM80211Mode = NM['80211Mode']; const NM80211ApFlags = NM['80211ApFlags']; const NM80211ApSecurityFlags = NM['80211ApSecurityFlags']; // number of wireless networks that should be visible // (the remaining are placed into More...) const NUM_VISIBLE_NETWORKS = 5; var NMIface = '\ \ \ \ \ \ \ '; var NMProxy = Gio.DBusProxy.makeProxyWrapper(NMIface); function NMDBus(initCallback, cancellable) { return new NMProxy(Gio.DBus.system, 'org.freedesktop.NetworkManager', '/org/freedesktop/NetworkManager', initCallback, cancellable); } // shared between NMNetworkMenuItem and NMDeviceWWAN function signalToIcon(value) { if (value > 80) return 'excellent'; if (value > 55) return 'good'; if (value > 30) return 'ok'; if (value > 5) return 'weak'; return 'none'; } // shared between NMNetworkMenuItem and NMDeviceWireless function sortAccessPoints(accessPoints) { return accessPoints.sort(function (one, two) { return two.strength - one.strength; }); } function ssidToLabel(ssid) { let label = NM.utils_ssid_to_utf8(ssid.get_data()); if (!label) label = _(""); return label; } function NMNetworkMenuItem() { this._init.apply(this, arguments); } function default_to_private_connections(client) { let perms = client.get_permission_result (NM.ClientPermission.SETTINGS_MODIFY_SYSTEM); return (perms != NM.ClientPermissionResult.YES); } NMNetworkMenuItem.prototype = { __proto__: PopupMenu.PopupBaseMenuItem.prototype, _init: function(accessPoints, title, params) { PopupMenu.PopupBaseMenuItem.prototype._init.call(this, params); accessPoints = sortAccessPoints(accessPoints); this.bestAP = accessPoints[0]; if (!title) { let ssid = this.bestAP.get_ssid(); title = ssidToLabel(ssid); } this._label = new St.Label({ text: title }); this.addActor(this._label); let strStrengh = String(this.bestAP.strength); strStrengh = strStrengh + '%'; this._labelStrength = new St.Label({ text: strStrengh }); this.addActor(this._labelStrength, { align: St.Align.END }); this._icons = new St.BoxLayout({ style_class: 'nm-menu-item-icons' }); this.addActor(this._icons, { align: St.Align.END }); this._signalIcon = new St.Icon({ icon_name: this._getIcon(), style_class: 'popup-menu-icon' }); this._icons.add_actor(this._signalIcon); this._accessPoints = [ ]; for (let i = 0; i < accessPoints.length; i++) { let ap = accessPoints[i]; // need a wrapper object here, because the access points can be shared // between many NMNetworkMenuItems let apObj = { ap: ap, updateId: ap.connect('notify::strength', Lang.bind(this, this._updated)) }; this._accessPoints.push(apObj); } }, _updated: function(ap) { if (ap.strength > this.bestAP.strength) this.bestAP = ap; this._signalIcon.icon_name = this._getIcon(); let strStrengh = String(this.bestAP.strength); strStrengh = strStrengh + '%'; this._labelStrength.set_text(strStrengh); }, _getIcon: function() { if (this.bestAP.mode == NM80211Mode.ADHOC) return 'xsi-network-workgroup'; else if (this.bestAP._secType != NMAccessPointSecurity.UNKNOWN && this.bestAP._secType != NMAccessPointSecurity.NONE) return 'xsi-network-wireless-signal-' + signalToIcon(this.bestAP.strength) + '-secure'; else return 'xsi-network-wireless-signal-' + signalToIcon(this.bestAP.strength); }, updateAccessPoints: function(accessPoints) { for (let i = 0; i < this._accessPoints.length; i++) { let apObj = this._accessPoints[i]; apObj.ap.disconnect(apObj.updateId); apObj.updateId = 0; } accessPoints = sortAccessPoints(accessPoints); this.bestAP = accessPoints[0]; this._accessPoints = [ ]; for (let i = 0; i < accessPoints; i++) { let ap = accessPoints[i]; let apObj = { ap: ap, updateId: ap.connect('notify::strength', Lang.bind(this, this._updated)) }; this._accessPoints.push(apObj); } }, destroy: function() { for (let i = 0; i < this._accessPoints.length; i++) { let apObj = this._accessPoints[i]; apObj.ap.disconnect(apObj.updateId); apObj.updateId = 0; } PopupMenu.PopupBaseMenuItem.prototype.destroy.call(this); } }; function NMWiredSectionTitleMenuItem() { this._init.apply(this, arguments); } NMWiredSectionTitleMenuItem.prototype = { __proto__: PopupMenu.PopupSwitchMenuItem.prototype, _init: function(label, params) { params = params || { }; params.style_class = 'popup-subtitle-menu-item'; PopupMenu.PopupSwitchMenuItem.prototype._init.call(this, label, false, params); }, updateForDevice: function(device) { if (device) { this._device = device; this.setStatus(device.statusLabel); this.setToggleState(device.connected); // if this device is not controllable, hide the switch this._switch.actor.visible = device.controllable; } else { this.setStatus(''); this._switch.actor.visible = false; } }, activate: function(event) { PopupMenu.PopupSwitchMenuItem.prototype.activate.call(this, event); if (!this._device) { log('Section title activated when there is more than one device, should be non reactive'); return; } let newState = this._switch.state; // Immediately reset the switch to false, it will be updated appropriately // by state-changed signals in devices (but fixes the VPN not being in sync // if the ActiveConnection object is never seen by libnm-glib) this._switch.setToggleState(false); if (newState) this._device.activate(); else this._device.deactivate(); } }; function NMWirelessSectionTitleMenuItem() { this._init.apply(this, arguments); } NMWirelessSectionTitleMenuItem.prototype = { __proto__: PopupMenu.PopupSwitchMenuItem.prototype, _init: function(client, property, title, params) { params = params || { }; params.style_class = 'popup-subtitle-menu-item'; PopupMenu.PopupSwitchMenuItem.prototype._init.call(this, title, false, params); this._client = client; this._property = property + '_enabled'; this._propertyHardware = property + '_hardware_enabled'; this._setEnabledFunc = property + '_set_enabled'; this._client.connect('notify::' + property + '-enabled', Lang.bind(this, this._propertyChanged)); this._client.connect('notify::' + property + '-hardware-enabled', Lang.bind(this, this._propertyChanged)); this._propertyChanged(); }, updateForDevice: function(device) { this._device = device; // we show the switch // - if there not just one device // - if the switch is off // - if the device is activated or disconnected if (device && this._softwareEnabled && this._hardwareEnabled) { this.setStatus(device.statusLabel); this._switch.actor.visible = device.controllable; } else { this.setStatus(null); this._switch.actor.show(); } }, activate: function(event) { PopupMenu.PopupSwitchMenuItem.prototype.activate.call(this, event); this._client[this._setEnabledFunc](this._switch.state); if (!this._device) { log('Section title activated when there is more than one device, should be non reactive'); return; } let newState = this._switch.state; if (newState) this._device.activate(); else this._device.deactivate(); this.emit('enabled-changed', this._switch.state); }, _propertyChanged: function() { this._softwareEnabled = this._client[this._property]; this._hardwareEnabled = this._client[this._propertyHardware]; let enabled = this._softwareEnabled && this._hardwareEnabled; this.setToggleState(enabled); if (!this._hardwareEnabled) /* Translators: this indicates that wireless or wwan is disabled by hardware killswitch */ this.setStatus(_("disabled")); this.emit('enabled-changed', enabled); } }; function NMDevice() { throw new TypeError('Instantanting abstract class NMDevice'); } NMDevice.prototype = { _init: function(client, device, connections) { this.device = device; if (device) { this.device._delegate = this; this._stateChangedId = this.device.connect('state-changed', Lang.bind(this, this._deviceStateChanged)); } else this._stateChangedId = 0; // protected this._client = client; this._connections = [ ]; for (let i = 0; i < connections.length; i++) { if (!connections[i]._uuid) continue; if (!this.connectionValid(connections[i])) continue; // record the connection let obj = { connection: connections[i], name: connections[i]._name, uuid: connections[i]._uuid, timestamp: connections[i]._timestamp, }; this._connections.push(obj); } this._connections.sort(this._connectionSortFunction); this._activeConnection = null; this._activeConnectionItem = null; this._autoConnectionItem = null; this._overflowItem = null; this._carrierChangedId = 0; this._firmwareChangedId = 0; this._firmwareMissingId = 0; if (this.device) { this.statusItem = new PopupMenu.PopupSwitchMenuItem(this._getDescription(), this.connected, { style_class: 'popup-subtitle-menu-item' }); this._statusChanged = this.statusItem.connect('toggled', Lang.bind(this, function(item, state) { if (state) this.activate(); else this.deactivate(); this.emit('enabled-changed'); })); this._updateStatusItem(); } this.section = new PopupMenu.PopupMenuSection(); this._createSection(); }, destroy: function() { if (this.device) this.device._delegate = null; if (this._stateChangedId) { // Need to go through GObject.Object.prototype because // nm_device_disconnect conflicts with g_signal_disconnect GObject.Object.prototype.disconnect.call(this.device, this._stateChangedId); this._stateChangedId = 0; } if (this._carrierChangedId) { // see above for why this is needed GObject.Object.prototype.disconnect.call(this.device, this._carrierChangedId); this._carrierChangedId = 0; } if (this._firmwareChangedId) { GObject.Object.prototype.disconnect.call(this.device, this._firmwareChangedId); this._firmwareChangedId = 0; } if (this._firmwareMissingId) { GObject.Object.prototype.disconnect.call(this.device, this._firmwareMissingId); this._firmwareMissingId = 0; } this._clearSection(); if (this.statusItem) this.statusItem.destroy(); this.section.destroy(); }, deactivate: function() { this.device.disconnect_async(null, null); }, activate: function() { if (this._activeConnection) // nothing to do return; // pick the most recently used connection and connect to that // or if no connections ever set, create an automatic one if (this._connections.length > 0) { this._client.activate_connection_async(this._connections[0].connection, this.device, null, null, null); } else if (this._autoConnectionName) { let connection = this._createAutomaticConnection(); if (connection) this._client.add_and_activate_connection_async(connection, this.device, null, null, null); } }, get connected() { return this.device.state == NM.DeviceState.ACTIVATED; }, setActiveConnection: function(activeConnection) { if (activeConnection == this._activeConnection) // nothing to do return; // remove any UI if (this._activeConnectionItem) { this._activeConnectionItem.destroy(); this._activeConnectionItem = null; } this._activeConnection = activeConnection; this._clearSection(); this._createSection(); }, checkConnection: function(connection) { let exists = this._findConnection(connection._uuid) != -1; let valid = this.connectionValid(connection); if (exists && !valid) this.removeConnection(connection); else if (!exists && valid) this.addConnection(connection); }, addConnection: function(connection) { // record the connection let obj = { connection: connection, name: connection._name, uuid: connection._uuid, timestamp: connection._timestamp, }; this._connections.push(obj); this._connections.sort(this._connectionSortFunction); this._clearSection(); this._createSection(); }, removeConnection: function(connection) { if (!connection._uuid) { log('Cannot remove a connection without an UUID'); return; } let pos = this._findConnection(connection._uuid); if (pos == -1) { // this connection was never added, nothing to do here return; } let obj = this._connections[pos]; if (obj.item) obj.item.destroy(); this._connections.splice(pos, 1); if (this._connections.length <= 1) { // We need to show the automatic connection again // (or in the case of NMDeviceWired, we want to hide // the only explicit connection) this._clearSection(); this._createSection(); } }, connectionValid: function(connection) { return this.device.connection_valid(connection); }, _connectionSortFunction: function(one, two) { if (one.timestamp == two.timestamp) return GLib.utf8_collate(one.name, two.name); return two.timestamp - one.timestamp; }, setEnabled: function(enabled) { // do nothing by default, we want to keep the connection list visible // in the majority of cases (wired, wwan, vpn) }, get statusLabel(){ switch(this.device.state) { case NM.DeviceState.DISCONNECTED: case NM.DeviceState.ACTIVATED: return null; case NM.DeviceState.UNMANAGED: /* Translators: this is for network devices that are physically present but are not under NetworkManager's control (and thus cannot be used in the menu) */ return _("unmanaged"); case NM.DeviceState.DEACTIVATING: return _("disconnecting..."); case NM.DeviceState.PREPARE: case NM.DeviceState.CONFIG: case NM.DeviceState.IP_CONFIG: case NM.DeviceState.IP_CHECK: case NM.DeviceState.SECONDARIES: return _("connecting..."); case NM.DeviceState.NEED_AUTH: /* Translators: this is for network connections that require some kind of key or password */ return _("authentication required"); case NM.DeviceState.UNAVAILABLE: // This state is actually a compound of various states (generically unavailable, // firmware missing, carrier not available), that are exposed by different properties // (whose state may or may not updated when we receive state-changed). if (!this._firmwareMissingId) this._firmwareMissingId = this.device.connect('notify::firmware-missing', Lang.bind(this, this._substateChanged)); if (this.device.firmware_missing) { /* Translators: this is for devices that require some kind of firmware or kernel module, which is missing */ return _("firmware missing"); } if (this.device.capabilities & NM.DeviceCapabilities.CARRIER_DETECT) { if (!this._carrierChangedId) this._carrierChangedId = this.device.connect('notify::carrier', Lang.bind(this, this._substateChanged)); if (!this.carrier) { /* Translators: this is for wired network devices that are physically disconnected */ return _("cable unplugged"); } } /* Translators: this is for a network device that cannot be activated (for example it is disabled by rfkill, or it has no coverage */ return _("unavailable"); case NM.DeviceState.FAILED: return _("connection failed"); default: log('Device state invalid, is %d'.format(this.device.state)); return 'invalid'; } }, get controllable(){ // controllable for every state except unavailable or unmanaged if(this.device.state === NM.DeviceState.UNAVAILABLE || this.device.state === NM.DeviceState.UNMANAGED) return false; return true; }, // protected _createAutomaticConnection: function() { throw new TypeError('Invoking pure virtual function NMDevice.createAutomaticConnection'); }, _findConnection: function(uuid) { for (let i = 0; i < this._connections.length; i++) { let obj = this._connections[i]; if (obj.uuid == uuid) return i; } return -1; }, _clearSection: function() { // Clear everything this.section.removeAll(); this._autoConnectionItem = null; this._activeConnectionItem = null; this._overflowItem = null; for (let i = 0; i < this._connections.length; i++) { this._connections[i].item = null; } }, _shouldShowConnectionList: function() { return (this.device.state >= NM.DeviceState.DISCONNECTED); }, _createSection: function() { if (!this._shouldShowConnectionList()) return; if (this._activeConnection) { this._createActiveConnectionItem(); this.section.addMenuItem(this._activeConnectionItem); } if (this._connections.length > 0) { let activeOffset = this._activeConnectionItem ? 1 : 0; for(let j = 0; j < this._connections.length; ++j) { let obj = this._connections[j]; if (this._activeConnection && obj.connection == this._activeConnection.connection) { activeOffset = 0; // we no longer need to account for this continue; } obj.item = this._createConnectionItem(obj); if (j + activeOffset >= NUM_VISIBLE_NETWORKS) { if (!this._overflowItem) { this._overflowItem = new PopupMenu.PopupSubMenuMenuItem(_("More")); this.section.addMenuItem(this._overflowItem); } this._overflowItem.menu.addMenuItem(obj.item); } else this.section.addMenuItem(obj.item); } } else if (this._autoConnectionName) { this._autoConnectionItem = new PopupMenu.PopupMenuItem(this._autoConnectionName); this._autoConnectionItem.connect('activate', Lang.bind(this, function() { let connection = this._createAutomaticConnection(); if (connection) this._client.add_and_activate_connection_async(connection, this.device, null, null, null); })); this.section.addMenuItem(this._autoConnectionItem); } }, _createConnectionItem: function(obj) { let connection = obj.connection; let item = new PopupMenu.PopupMenuItem(obj.name); item.connect('activate', Lang.bind(this, function() { this._client.activate_connection_async(connection, this.device, null, null, null); })); return item; }, _createActiveConnectionItem: function() { let title; let active = this._activeConnection.connection; if (active) { title = active._name; } else { /* Translators: this is the indication that a connection for another logged in user is active, and we cannot access its settings (including the name) */ title = _("Connected (private)"); } this._activeConnectionItem = new PopupMenu.PopupMenuItem(title, { reactive: false }); this._activeConnectionItem.setShowDot(true); this._activeConnectionItem.actor.add_style_class_name('popup-device-menu-item'); }, _deviceStateChanged: function(device, newstate, oldstate, reason) { if (newstate == oldstate) { log('device emitted state-changed without actually changing state'); return; } if (oldstate == NM.DeviceState.ACTIVATED) { this.emit('network-lost'); } if (newstate == NM.DeviceState.FAILED) { this.emit('activation-failed', reason); } this._updateStatusItem(); this._clearSection(); this._createSection(); this.emit('state-changed'); }, _updateStatusItem: function() { if (this._carrierChangedId) { // see above for why this is needed GObject.Object.prototype.disconnect.call(this.device, this._carrierChangedId); this._carrierChangedId = 0; } if (this._firmwareChangedId) { GObject.Object.prototype.disconnect.call(this.device, this._firmwareChangedId); this._firmwareChangedId = 0; } this.statusItem.setStatus(this.statusLabel); this.statusItem.setToggleState(this.connected); // if this device is not controllable, hide the switch this.statusItem._switch.actor.visible = this.controllable; }, _substateChanged: function() { this.statusItem.setStatus(this.statusLabel); this.statusItem._switch.actor.visible = this.controllable; this.emit('state-changed'); }, _getDescription: function() { let dev_product = this.device.get_product(); let dev_vendor = this.device.get_vendor(); if (!dev_product || !dev_vendor) { if (this.device.name) { return this.device.name; } else { switch (this.device.get_device_type()) { case NM.DeviceType.ETHERNET: return _("Ethernet"); case NM.DeviceType.WIFI: return _("Wifi"); case NM.DeviceType.MODEM: return _("Modem"); case NM.DeviceType.BT: return _("Bluetooth"); case NM.DeviceType.WIREGUARD: return _("WireGuard"); default: return ""; } } } let product = Util.fixupPCIDescription(dev_product); let vendor = Util.fixupPCIDescription(dev_vendor); let out = ''; // Another quick hack; if all of the fixed up vendor string // is found in product, ignore the vendor. if (product.indexOf(vendor) == -1) out += vendor + ' '; out += product; return out; } }; Signals.addSignalMethods(NMDevice.prototype); function NMDeviceWired() { this._init.apply(this, arguments); } NMDeviceWired.prototype = { __proto__: NMDevice.prototype, _init: function(client, device, connections) { this._autoConnectionName = _("Auto Ethernet"); this.category = NMConnectionCategory.WIRED; NMDevice.prototype._init.call(this, client, device, connections); }, _createSection: function() { NMDevice.prototype._createSection.call(this); // if we have only one connection (normal or automatic) // we hide the connection list, and use the switch to control // the device // we can do it here because addConnection and removeConnection // both call _createSection at some point if (this._connections.length <= 1) this.section.actor.hide(); else this.section.actor.show(); }, _createAutomaticConnection: function() { let connection = new NM.SimpleConnection(); connection._uuid = NM.utils_uuid_generate(); connection.add_setting(new NM.SettingWired()); let setting_conn = new NM.SettingConnection({ uuid: connection._uuid, id: this._autoConnectionName, type: NM.SETTING_WIRED_SETTING_NAME, autoconnect: true }); setting_conn.add_permission('user', GLib.get_user_name(), null); connection.add_setting(setting_conn); return connection; } }; function NMDeviceModem() { this._init.apply(this, arguments); } NMDeviceModem.prototype = { __proto__: NMDevice.prototype, _init: function(client, device, connections) { let is_wwan = false; this._enabled = true; this.mobileDevice = null; this._connectionType = 'ppp'; this._capabilities = device.current_capabilities; // Support new ModemManager1 devices if (device.udi.indexOf('/org/freedesktop/ModemManager1/Modem') == 0) { try { is_wwan = true; this.mobileDevice = new ModemManager.BroadbandModem(device.udi, device.current_capabilities); if (this._capabilities & NM.DeviceModemCapabilities.GSM_UMTS) { this._connectionType = NM.SETTING_GSM_SETTING_NAME; } else if (this._capabilities & NM.DeviceModemCapabilities.LTE) { this._connectionType = NM.SETTING_GSM_SETTING_NAME; } else if (this._capabilities & NM.DeviceModemCapabilities.CDMA_EVDO) { this._connectionType = NM.SETTING_CDMA_SETTING_NAME; } } catch (e){ global.logError(e); } } else if (this._capabilities & NM.DeviceModemCapabilities.GSM_UMTS) { is_wwan = true; this.mobileDevice = new ModemManager.ModemGsm(device.udi); this._connectionType = NM.SETTING_GSM_SETTING_NAME; } else if (this._capabilities & NM.DeviceModemCapabilities.CDMA_EVDO) { is_wwan = true; this.mobileDevice = new ModemManager.ModemCdma(device.udi); this._connectionType = NM.SETTING_CDMA_SETTING_NAME; } else if (this._capabilities & NM.DeviceModemCapabilities.LTE) { is_wwan = true; // FIXME: support signal quality } if (is_wwan) { this.category = NMConnectionCategory.WWAN; this._autoConnectionName = _("Auto broadband"); } else { this.category = NMConnectionCategory.WIRED; this._autoConnectionName = _("Auto dial-up"); } if (this.mobileDevice) { this._operatorNameId = this.mobileDevice.connect('notify::operator-name', Lang.bind(this, function() { if (this._operatorItem) { let name = this.mobileDevice.operator_name; if (name) { this._operatorItem.label.text = name; this._operatorItem.actor.show(); } else this._operatorItem.actor.hide(); } })); this._signalQualityId = this.mobileDevice.connect('notify::signal-quality', Lang.bind(this, function() { if (this._operatorItem) { this._operatorItem.setIcon(this._getSignalIcon()); } })); } NMDevice.prototype._init.call(this, client, device, connections); }, setEnabled: function(enabled) { this._enabled = enabled; if (this.category == NMConnectionCategory.WWAN) { if (enabled) { // prevent "network unavailable" statuses this.statusItem.setStatus(null); } else this.statusItem.setStatus(this.statusLabel); } NMDevice.prototype.setEnabled.call(this, enabled); }, get connected() { return this._enabled && this.device.state == NM.DeviceState.ACTIVATED; }, destroy: function() { if (this._operatorNameId) { this.mobileDevice.disconnect(this._operatorNameId); this._operatorNameId = 0; } if (this._signalQualityId) { this.mobileDevice.disconnect(this._signalQualityId); this._signalQualityId = 0; } NMDevice.prototype.destroy.call(this); }, _getSignalIcon: function() { return 'xsi-network-cellular-signal-' + signalToIcon(this.mobileDevice.signal_quality); }, _createSection: function() { if (!this._shouldShowConnectionList()) return; if (this.mobileDevice) { // If operator_name is null, just pass the empty string, as the item is hidden anyway this._operatorItem = new PopupMenu.PopupImageMenuItem(this.mobileDevice.operator_name || '', this._getSignalIcon(), { reactive: false }); if (!this.mobileDevice.operator_name) this._operatorItem.actor.hide(); this.section.addMenuItem(this._operatorItem); this._operatorItem.actor.add_style_class_name('popup-device-menu-item'); } NMDevice.prototype._createSection.call(this); }, _clearSection: function() { this._operatorItem = null; NMDevice.prototype._clearSection.call(this); }, _createAutomaticConnection: function() { // Mobile wizard is too complex for Cinnamon UI and // is handled by the network panel Util.spawn(['cinnamon-settings', 'network', 'connect-3g', this.device.get_path()]); return null; } }; function NMDeviceBluetooth() { this._init.apply(this, arguments); } NMDeviceBluetooth.prototype = { __proto__: NMDevice.prototype, _init: function(client, device, connections) { this._autoConnectionName = this._makeConnectionName(device); device.connect('notify::name', Lang.bind(this, this._updateAutoConnectionName)); this.category = NMConnectionCategory.WWAN; NMDevice.prototype._init.call(this, client, device, connections); }, _createAutomaticConnection: function() { let connection = new NM.SimpleConnection(); connection._uuid = NM.utils_uuid_generate(); connection.add_setting(new NM.SettingBluetooth()); connection.add_setting(new NM.SettingConnection({ uuid: connection._uuid, id: this._autoConnectionName, type: NM.SETTING_BLUETOOTH_SETTING_NAME, autoconnect: false })); return connection; }, _makeConnectionName: function(device) { let name = device.name; if (name) return _("Auto %s").format(name); else return _("Auto bluetooth"); }, _updateAutoConnectionName: function() { this._autoConnectionName = this._makeConnectionName(this.device); this._clearSection(); this._createSection(); } }; // Not a real device, but I save a lot code this way function NMDeviceVPN() { this._init.apply(this, arguments); } NMDeviceVPN.prototype = { __proto__: NMDevice.prototype, _init: function(client) { this._client = client this._autoConnectionName = null; this.category = NMConnectionCategory.VPN; this._activeConnections = []; NMDevice.prototype._init.call(this, client, null, []); }, connectionValid: function(connection) { return connection._type == NM.SETTING_VPN_SETTING_NAME; }, get empty() { return this._connections.length == 0; }, get connected() { return this._activeConnections.length > 0; }, setActiveConnections: function(activeConnections) { this._activeConnections = activeConnections || []; this._createSection(); this.emit('active-connections-changed'); }, deactivate: function() { for (let ac of this._activeConnections) this._client.deactivate_connection(ac, null); this._activeConnections = [] }, statusLabel: null, controllable: true, _clearSection: function() { if (this.section && this.section.removeAll) this.section.removeAll(); this._autoConnectionItem = null; this._overflowItem = null; for (let i = 0; i < this._connections.length; i++) { if (this._connections[i].item && this._connections[i].item.destroy) this._connections[i].item.destroy(); this._connections[i].item = null; } }, _updateConnectionItemView: function(item, connection, active) { item.label.text = connection._name || _("Connected (private)"); if (active) { item.setShowDot(true); item.actor.add_style_class_name('popup-device-menu-item'); } else { item.setShowDot(false); item.actor.remove_style_class_name('popup-device-menu-item'); } }, _createSection: function() { for (let obj of this._connections) { if (!obj.item) { obj.item = new PopupMenu.PopupMenuItem(obj.name); this._updateConnectionItemView(obj.item, obj.connection); obj.item.connect('activate', Lang.bind(this, function() { let activeConnection = this._activeConnections.find(ac => ac.connection === obj.connection); if (activeConnection) { this._client.deactivate_connection(activeConnection, null); } else { this._client.activate_connection_async(obj.connection, this.device, null, null, null); } })); this.section.addMenuItem(obj.item); } else { this._updateConnectionItemView(obj.item, obj.connection, this._activeConnections.some(ac => ac.connection == obj.connection)); } } }, }; function NMDeviceWIREGUARD() { this._init.apply(this, arguments); } NMDeviceWIREGUARD.prototype = { __proto__: NMDevice.prototype, _init: function(client, device, connections) { // Disable autoconnections this._autoConnectionName = null; this._client = client; this.category = NMConnectionCategory.WIREGUARD; this._type = NM.SETTING_WIREGUARD_SETTING_NAME; NMDevice.prototype._init.call(this, client, null, [ ]); // Tests: this.category = NMConnectionCategory.WIREGUARD; this._type = NM.SETTING_WIREGUARD_SETTING_NAME; }, connectionValid: function(connection) { return connection._type == NM.SETTING_WIREGUARD_SETTING_NAME; }, get empty() { return this._connections.length == 0; }, get connected() { return !!this._activeConnection; }, setActiveConnection: function(activeConnection) { if (activeConnection) { activeConnection._type = NM.SETTING_WIREGUARD_SETTING_NAME; } NMDevice.prototype.setActiveConnection.call(this, activeConnection); this.emit('active-connection-changed'); }, _shouldShowConnectionList: function() { return true; }, deactivate: function() { if (this._activeConnection) this._client.deactivate_connection(this._activeConnection, null); }, statusLabel: null, controllable: true }; function NMDeviceWireless() { this._init.apply(this, arguments); } NMDeviceWireless.prototype = { __proto__: NMDevice.prototype, _init: function(client, device, connections) { this.category = NMConnectionCategory.WIRELESS; this._overflowItem = null; this._networks = [ ]; this._client = client; // breaking the layers with this, but cannot call // this.connectionValid until I have a device this.device = device; let validConnections = connections.filter(Lang.bind(this, function(connection) { return this.connectionValid(connection); })); let accessPoints = device.get_access_points() || [ ]; for (let i = 0; i < accessPoints.length; i++) { // Access points are grouped by network let ap = accessPoints[i]; if (ap.get_ssid() == null) { // hidden access point cannot be added, we need to know // the SSID and security details to connect // nevertheless, the access point can acquire a SSID when // NetworkManager connects to it (via nmcli or cinnamon-settings) ap._notifySsidId = ap.connect('notify::ssid', Lang.bind(this, this._notifySsidCb)); continue; } let pos = this._findNetwork(ap); let obj; if (pos != -1) { obj = this._networks[pos]; obj.accessPoints.push(ap); } else { obj = { ssid: ap.get_ssid(), mode: ap.mode, security: this._getApSecurityType(ap), connections: [ ], item: null, accessPoints: [ ap ] }; obj.ssidText = ssidToLabel(obj.ssid); this._networks.push(obj); } // Check if some connection is valid for this AP for (let j = 0; j < validConnections.length; j++) { let connection = validConnections[j]; if (ap.connection_valid(connection) && obj.connections.indexOf(connection) == -1) { obj.connections.push(connection); } } } if (this.device.active_access_point) { let networkPos = this._findNetwork(this.device.active_access_point); if (networkPos == -1) // the connected access point is invisible this._activeNetwork = null; else this._activeNetwork = this._networks[networkPos]; } else { this._activeNetwork = null; } this._networks.sort(this._networkSortFunction); this._apChangedId = device.connect('notify::active-access-point', Lang.bind(this, this._activeApChanged)); this._apAddedId = device.connect('access-point-added', Lang.bind(this, this._accessPointAdded)); this._apRemovedId = device.connect('access-point-removed', Lang.bind(this, this._accessPointRemoved)); NMDevice.prototype._init.call(this, client, device, validConnections); }, destroy: function() { if (this._apChangedId) { // see above for this HACK GObject.Object.prototype.disconnect.call(this.device, this._apChangedId); this._apChangedId = 0; } if (this._apAddedId) { GObject.Object.prototype.disconnect.call(this.device, this._apAddedId); this._apAddedId = 0; } if (this._apRemovedId) { GObject.Object.prototype.disconnect.call(this.device, this._apRemovedId); this._apRemovedId = 0; } NMDevice.prototype.destroy.call(this); }, setEnabled: function(enabled) { if (enabled) { this.statusItem.actor.show(); this.section.actor.show(); } else { this.statusItem.actor.hide(); this.section.actor.hide(); } }, activate: function() { if (this._activeConnection) // nothing to do return; // among all visible networks, pick the last recently used connection let best = null; let bestApObj = null; let bestTime = 0; for (let i = 0; i < this._networks.length; i++) { let apObj = this._networks[i]; for (let j = 0; j < apObj.connections.length; j++) { let connection = apObj.connections[j]; if (connection._timestamp > bestTime) { best = connection; bestTime = connection._timestamp; bestApObj = apObj; } } } if (best) { for (let i = 0; i < bestApObj.accessPoints.length; i++) { let ap = bestApObj.accessPoints[i]; if (ap.connection_valid(best)) { this._client.activate_connection_async(best, this.device, ap.path, null, null); break; } } return; } // XXX: what else to do? // for now, just pick a random network // (this function is called in a corner case anyway, that is, only when // the user toggles the switch and has more than one wireless device) if (this._networks.length > 0) { let connection = this._createAutomaticConnection(this._networks[0]); let accessPoints = sortAccessPoints(this._networks[0].accessPoints); this._client.add_and_activate_connection_async(connection, this.device, accessPoints[0].path, null, null); } }, _notifySsidCb: function(accessPoint) { if (accessPoint.get_ssid() != null) { accessPoint.disconnect(accessPoint._notifySsidId); accessPoint._notifySsidId = 0; this._accessPointAdded(this.device, accessPoint); } }, _activeApChanged: function() { this._activeNetwork = null; let activeAp = this.device.active_access_point; if (activeAp) { let res = this._findExistingNetwork(activeAp); if (res != null) this._activeNetwork = this._networks[res.network]; } // we don't refresh the view here, setActiveConnection will }, _getApSecurityType: function(accessPoint) { if (accessPoint._secType) return accessPoint._secType; let flags = accessPoint.flags; let wpa_flags = accessPoint.wpa_flags; let rsn_flags = accessPoint.rsn_flags; let type; if (rsn_flags != NM80211ApSecurityFlags.NONE) { /* RSN check first so that WPA+WPA2 APs are treated as RSN/WPA2 */ if (rsn_flags & NM80211ApSecurityFlags.KEY_MGMT_802_1X) type = NMAccessPointSecurity.WPA2_ENT; else if (rsn_flags & NM80211ApSecurityFlags.KEY_MGMT_PSK) type = NMAccessPointSecurity.WPA2_PSK; } else if (wpa_flags != NM80211ApSecurityFlags.NONE) { if (wpa_flags & NM80211ApSecurityFlags.KEY_MGMT_802_1X) type = NMAccessPointSecurity.WPA_ENT; else if (wpa_flags & NM80211ApSecurityFlags.KEY_MGMT_PSK) type = NMAccessPointSecurity.WPA_PSK; } else { if (flags & NM80211ApFlags.PRIVACY) type = NMAccessPointSecurity.WEP; else type = NMAccessPointSecurity.NONE; } // cache the found value to avoid checking flags all the time accessPoint._secType = type; return type; }, _networkSortFunction: function(one, two) { let oneHasConnection = one.connections.length != 0; let twoHasConnection = two.connections.length != 0; // place known connections first // (-1 = good order, 1 = wrong order) if (oneHasConnection && !twoHasConnection) return -1; else if (!oneHasConnection && twoHasConnection) return 1; return two.accessPoints[0].strength - one.accessPoints[0].strength; /** let oneHasSecurity = one.security != NMAccessPointSecurity.NONE; let twoHasSecurity = two.security != NMAccessPointSecurity.NONE; // place secure connections first // (we treat WEP/WPA/WPA2 the same as there is no way to // take them apart from the UI) if (oneHasSecurity && !twoHasSecurity) return -1; else if (!oneHasSecurity && twoHasSecurity) return 1; // sort alphabetically return GLib.utf8_collate(one.ssidText, two.ssidText); **/ }, _networkCompare: function(network, accessPoint) { if (!network.ssid.equal (accessPoint.get_ssid())) return false; if (network.mode != accessPoint.mode) return false; if (network.security != this._getApSecurityType(accessPoint)) return false; return true; }, _findExistingNetwork: function(accessPoint) { for (let i = 0; i < this._networks.length; i++) { let apObj = this._networks[i]; for (let j = 0; j < apObj.accessPoints.length; j++) { if (apObj.accessPoints[j] == accessPoint) return { network: i, ap: j }; } } return null; }, _findNetwork: function(accessPoint) { if (accessPoint.get_ssid() == null) return -1; for (let i = 0; i < this._networks.length; i++) { if (this._networkCompare(this._networks[i], accessPoint)) return i; } return -1; }, _accessPointAdded: function(device, accessPoint) { if (accessPoint.get_ssid() == null) { // This access point is not visible yet // Wait for it to get a ssid accessPoint._notifySsidId = accessPoint.connect('notify::ssid', Lang.bind(this, this._notifySsidCb)); return; } let pos = this._findNetwork(accessPoint); let apObj; let needsupdate = false; if (pos != -1) { apObj = this._networks[pos]; if (apObj.accessPoints.indexOf(accessPoint) != -1) { log('Access point was already seen, not adding again'); return; } apObj.accessPoints.push(accessPoint); if (apObj.item) apObj.item.updateAccessPoints(apObj.accessPoints); } else { apObj = { ssid: accessPoint.get_ssid(), mode: accessPoint.mode, security: this._getApSecurityType(accessPoint), connections: [ ], item: null, accessPoints: [ accessPoint ] }; apObj.ssidText = ssidToLabel(apObj.ssid); needsupdate = true; } // check if this enables new connections for this group for (let i = 0; i < this._connections.length; i++) { let connection = this._connections[i].connection; if (accessPoint.connection_valid(connection) && apObj.connections.indexOf(connection) == -1) { apObj.connections.push(connection); // this potentially changes the order needsupdate = true; } } if (needsupdate) { this._accessPointRemoved(device, accessPoint); if (pos != -1) this._networks.splice(pos, 1); if (this._networks.length == 0) { // only network in the list this._networks.push(apObj); this._clearSection(); this._createSection(); return; } // skip networks that should appear earlier let menuPos = this._activeConnectionItem ? 1 : 0; for (pos = 0; pos < this._networks.length && this._networkSortFunction(this._networks[pos], apObj) < 0; ++pos) { if (this._networks[pos] != this._activeNetwork) menuPos++; } // (re-)add the network this._networks.splice(pos, 0, apObj); if (this._shouldShowConnectionList()) { this._createNetworkItem(apObj, menuPos); if (menuPos < NUM_VISIBLE_NETWORKS && this._networks.length > NUM_VISIBLE_NETWORKS) { for (; menuPos < NUM_VISIBLE_NETWORKS; ++pos) { if (this._networks[pos] != this._activeNetwork) menuPos++; } let item = this._networks[pos].item; if (item && item._apObj) { item.destroy(); item._apObj.item = null; this._createNetworkItem(item._apObj, NUM_VISIBLE_NETWORKS); } } } } }, _accessPointRemoved: function(device, accessPoint) { let res = this._findExistingNetwork(accessPoint); if (res == null) { return; } let apObj = this._networks[res.network]; apObj.accessPoints.splice(res.ap, 1); if (apObj.accessPoints.length == 0) { if (this._activeNetwork == apObj) this._activeNetwork = null; if (apObj.item) apObj.item.destroy(); if (this._overflowItem) { if (!apObj.isMore) { // we removed an item in the main menu, and we have a more submenu // we need to extract the first item in more and move it to the submenu let item = this._overflowItem.menu.firstMenuItem; if (item && item._apObj) { item.destroy(); // clear the cycle, and allow the construction of the new item item._apObj.item = null; this._createNetworkItem(item._apObj, NUM_VISIBLE_NETWORKS-1); } else { log('The more... menu was existing and empty! This should not happen'); } } // This can happen if the removed connection is from the overflow // menu, or if we just moved the last connection out from the menu if (this._overflowItem.menu.numMenuItems == 0) { this._overflowItem.destroy(); this._overflowItem = null; } } this._networks.splice(res.network, 1); } else if (apObj.item) apObj.item.updateAccessPoints(apObj.accessPoints); }, _createAPItem: function(connection, accessPointObj, useConnectionName) { let item = new NMNetworkMenuItem(accessPointObj.accessPoints, useConnectionName ? connection._name : undefined); item._connection = connection; item.connect('activate', Lang.bind(this, function() { let accessPoints = sortAccessPoints(accessPointObj.accessPoints); for (let i = 0; i < accessPoints.length; i++) { if (accessPoints[i].connection_valid(connection)) { this._client.activate_connection_async(connection, this.device, accessPoints[i].path, null, null); break; } } })); return item; }, _clearSection: function() { NMDevice.prototype._clearSection.call(this); for (let i = 0; i < this._networks.length; i++) this._networks[i].item = null; this._overflowItem = null; }, removeConnection: function(connection) { if (!connection._uuid) return; let pos = this._findConnection(connection._uuid); if (pos == -1) { // removing connection that was never added return; } this._connections.splice(pos, 1); let anyauto = false, forceupdate = false; for (let i = 0; i < this._networks.length; i++) { let apObj = this._networks[i]; let connections = apObj.connections; for (let k = 0; k < connections.length; k++) { if (connections[k]._uuid == connection._uuid) { // remove the connection from the access point group connections.splice(k); anyauto = connections.length == 0; if (anyauto) { // this potentially changes the sorting order forceupdate = true; break; } if (apObj.item) { if (apObj.item instanceof PopupMenu.PopupSubMenuMenuItem) { let items = apObj.item.menu.getMenuItems(); if (items.length == 2) { // we need to update the connection list to convert this to a normal item forceupdate = true; } else { for (let j = 0; j < items.length; j++) { if (items[j]._connection._uuid == connection._uuid) { items[j].destroy(); break; } } } } else { apObj.item.destroy(); apObj.item = null; } } break; } } } if (forceupdate || anyauto) { this._networks.sort(this._networkSortFunction); this._clearSection(); this._createSection(); } }, addConnection: function(connection) { // record the connection let obj = { connection: connection, name: connection._name, uuid: connection._uuid, }; this._connections.push(obj); // find an appropriate access point let forceupdate = false; for (let i = 0; i < this._networks.length; i++) { let apObj = this._networks[i]; // Check if connection is valid for any of these access points for (let k = 0; k < apObj.accessPoints.length; k++) { let ap = apObj.accessPoints[k]; if (ap.connection_valid(connection)) { apObj.connections.push(connection); // this potentially changes the sorting order forceupdate = true; break; } } } if (forceupdate) { this._networks.sort(this._networkSortFunction); this._clearSection(); this._createSection(); } }, _createActiveConnectionItem: function() { if (this._activeConnection.connection) { if (!this._activeNetwork) { if (this.device.active_access_point) { let networkPos = this._findNetwork(this.device.active_access_point); if (networkPos == -1) // the connected access point is invisible this._activeNetwork = null; else this._activeNetwork = this._networks[networkPos]; } else { this._activeNetwork = null; } } if (this._activeNetwork) this._activeConnectionItem = new NMNetworkMenuItem(this._activeNetwork.accessPoints, undefined, { reactive: false }); else this._activeConnectionItem = new PopupMenu.PopupImageMenuItem(this._activeConnection.connection._name, 'xsi-network-wireless-connected', { reactive: false }); } else { // We cannot read the connection (due to ACL, or API incompatibility), but we still show signal if we have it if (this._activeNetwork) this._activeConnectionItem = new NMNetworkMenuItem(this._activeNetwork.accessPoints, undefined, { reactive: false }); else this._activeConnectionItem = new PopupMenu.PopupImageMenuItem(_("Connected (private)"), 'xsi-network-wireless-connected', { reactive: false }); } this._activeConnectionItem.setShowDot(true); this._activeConnectionItem.actor.add_style_class_name('popup-device-menu-item'); }, _createAutomaticConnection: function(apObj) { let name; let ssid = NM.utils_ssid_to_utf8(apObj.ssid.get_data()); if (ssid) { /* Translators: this the automatic wireless connection name (including the network name) */ name = _("Auto %s").format(ssid); } else name = _("Auto wireless"); let connection = new NM.SimpleConnection(); connection.add_setting(new NM.SettingWireless()); let setting_conn = new NM.SettingConnection({ id: name, autoconnect: true, // NetworkManager will know to ignore this if appropriate uuid: NM.utils_uuid_generate(), type: NM.SETTING_WIRELESS_SETTING_NAME }); if (default_to_private_connections(this._client)) { setting_conn.add_permission('user', GLib.get_user_name(), null); if (apObj.security == NMAccessPointSecurity.WPA2_PSK || apObj.security == NMAccessPointSecurity.WPA_PSK) { connection.add_setting(new NM.SettingWirelessSecurity({ psk_flags: NM.SettingSecretFlags.AGENT_OWNED })); } if (apObj.security == NMAccessPointSecurity.WEP) { connection.add_setting(new NM.SettingWirelessSecurity({ wep_key_flags: NM.SettingSecretFlags.AGENT_OWNED })); } } connection.add_setting(setting_conn); return connection; }, _createNetworkItem: function(apObj, position) { if(!apObj.accessPoints || apObj.accessPoints.length == 0) { // this should not happen, but I have no idea why it happens return; } if(apObj.connections.length > 0) { if (apObj.connections.length == 1) { apObj.item = this._createAPItem(apObj.connections[0], apObj, false); } else { let title = apObj.ssidText; apObj.item = new PopupMenu.PopupSubMenuMenuItem(title); for (let i = 0; i < apObj.connections.length; i++) apObj.item.menu.addMenuItem(this._createAPItem(apObj.connections[i], apObj, true)); } } else { apObj.item = new NMNetworkMenuItem(apObj.accessPoints); apObj.item.connect('activate', Lang.bind(this, function() { let accessPoints = sortAccessPoints(apObj.accessPoints); if ((accessPoints[0]._secType == NMAccessPointSecurity.WPA2_ENT) || (accessPoints[0]._secType == NMAccessPointSecurity.WPA_ENT)) { // 802.1x-enabled APs require further configuration, so they're // handled in cinnamon-settings Util.spawn(['cinnamon-settings', 'network', 'connect-8021x-wifi', this.device.get_path(), accessPoints[0].path]); } else { let connection = this._createAutomaticConnection(apObj); this._client.add_and_activate_connection_async(connection, this.device, accessPoints[0].path, null, null); } })); } apObj.item._apObj = apObj; if (position < NUM_VISIBLE_NETWORKS) { apObj.isMore = false; this.section.addMenuItem(apObj.item, position); } else { if (!this._overflowItem) { this._overflowItem = new PopupMenu.PopupSubMenuMenuItem(_("More")); this.section.addMenuItem(this._overflowItem); } this._overflowItem.menu.addMenuItem(apObj.item, position - NUM_VISIBLE_NETWORKS); apObj.isMore = true; } }, _createSection: function() { if (!this._shouldShowConnectionList()) return; if(this._activeConnection) { this._createActiveConnectionItem(); this.section.addMenuItem(this._activeConnectionItem); } let activeOffset = this._activeConnectionItem ? 1 : 0; for(let j = 0; j < this._networks.length; j++) { let apObj = this._networks[j]; if (apObj == this._activeNetwork) { activeOffset = 0; // we no longer need to account for this continue; } this._createNetworkItem(apObj, j + activeOffset); } }, }; function NMMessageTraySource() { this._init(); } NMMessageTraySource.prototype = { __proto__: MessageTray.Source.prototype, _init: function() { MessageTray.Source.prototype._init.call(this, _("Network Manager")); let icon = new St.Icon({ icon_name: 'xsi-network-transmit-receive', icon_type: St.IconType.SYMBOLIC, icon_size: this.ICON_SIZE }); this._setSummaryIcon(icon); } }; function CinnamonNetworkApplet(metadata, orientation, panel_height, instance_id) { this._init(metadata, orientation, panel_height, instance_id); } CinnamonNetworkApplet.prototype = { __proto__: Applet.IconApplet.prototype, _init: function(metadata, orientation, panel_height, instance_id) { Applet.IconApplet.prototype._init.call(this, orientation, panel_height, instance_id); try { this.metadata = metadata; Main.systrayManager.registerTrayIconReplacement("network", metadata.uuid); Main.systrayManager.registerTrayIconReplacement("nm-applet", metadata.uuid); this.menuManager = new PopupMenu.PopupMenuManager(this); this.menu = new Applet.AppletPopupMenu(this, orientation); this.menuManager.addMenu(this.menu); this._currentIconName = undefined; this._setIcon('xsi-network-offline'); this.settings = new Settings.AppletSettings(this, metadata.uuid, this.instance_id); this.settings.bind("keyOpen", "keyOpen", this._setKeybinding); this._setKeybinding(); NM.Client.new_async(null, Lang.bind(this, this._clientGot)); } catch (e) { global.logError(e); } }, _setKeybinding() { Main.keybindingManager.addXletHotKey(this, "network-open", this.keyOpen, Lang.bind(this, this._openMenu)); }, _clientGot: function(obj, result) { try { this._client = NM.Client.new_finish(result); this._v1_28_0 = Util.version_exceeds(this._client.get_version(), "1.28.0"); this._nm_proxy = null; if (!this._v1_28_0) { new NMDBus(Lang.bind(this, function(proxy, error) { this._nm_proxy = proxy; })); } this._statusSection = new PopupMenu.PopupMenuSection(); this._statusItem = new PopupMenu.PopupMenuItem('', { style_class: 'popup-inactive-menu-item', reactive: false }); this._statusSection.addMenuItem(this._statusItem); this._statusSection.addAction(_("Enable networking"), Lang.bind(this, function() { this._client.networking_enabled = true; })); this._statusSection.actor.hide(); this.menu.addMenuItem(this._statusSection); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this._devices = { }; this._devices.wired = { section: new PopupMenu.PopupMenuSection(), devices: [ ], item: new NMWiredSectionTitleMenuItem(_("Wired")) }; this._devices.wired.section.addMenuItem(this._devices.wired.item); this._devices.wired.section.actor.hide(); this.menu.addMenuItem(this._devices.wired.section); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this._devices.wireless = { section: new PopupMenu.PopupMenuSection(), devices: [ ], item: this._makeToggleItem('wireless', _("Wireless")) }; this._devices.wireless.section.addMenuItem(this._devices.wireless.item); this._devices.wireless.section.actor.hide(); this.menu.addMenuItem(this._devices.wireless.section); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this._devices.wwan = { section: new PopupMenu.PopupMenuSection(), devices: [ ], item: this._makeToggleItem('wwan', _("Mobile broadband")) }; this._devices.wwan.section.addMenuItem(this._devices.wwan.item); this._devices.wwan.section.actor.hide(); this.menu.addMenuItem(this._devices.wwan.section); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this._devices.vpn = { section: new PopupMenu.PopupMenuSection(), device: new NMDeviceVPN(this._client), item: new NMWiredSectionTitleMenuItem(_("VPN Connections")) }; this._devices.vpn.device.connect('active-connections-changed', Lang.bind(this, function() { this._devices.vpn.item.updateForDevice(this._devices.vpn.device); })); this._devices.vpn.item.updateForDevice(this._devices.vpn.device); this._devices.vpn.section.addMenuItem(this._devices.vpn.item); this._devices.vpn.section.addMenuItem(this._devices.vpn.device.section); this._devices.vpn.section.actor.hide(); this.menu.addMenuItem(this._devices.vpn.section); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this._devices.wireguard = { section: new PopupMenu.PopupMenuSection(), device: new NMDeviceWIREGUARD(this._client), item: new NMWiredSectionTitleMenuItem(_("WIREGUARD Connections")) }; this._devices.wireguard.device.connect('active-connection-changed', Lang.bind(this, function() { this._devices.wireguard.item.updateForDevice(this._devices.wireguard.device); })); this._devices.wireguard.item.updateForDevice(this._devices.wireguard.device); this._devices.wireguard.section.addMenuItem(this._devices.wireguard.item); this._devices.wireguard.section.addMenuItem(this._devices.wireguard.device.section); this._devices.wireguard.section.actor.hide(); this.menu.addMenuItem(this._devices.wireguard.section); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addSettingsAction(_("Network Settings"), 'network'); this.menu.addAction(_("Network Connections"), Lang.bind(this, function() { Util.spawnCommandLine("nm-connection-editor"); })); this.menu.connect("open-state-changed", Lang.bind(this, this._onMenuOpenStateChanged)); this._periodicTimeoutId = 0; this._updateFrequencySeconds = 0; this._checkingConnectivity = false; this._lastConnectivityState = NM.ConnectivityState.UNKNOWN; this._activeConnections = [ ]; this._connections = [ ]; this._mainConnection = null; // Device types this._dtypes = { }; this._dtypes[NM.DeviceType.ETHERNET] = NMDeviceWired; this._dtypes[NM.DeviceType.WIFI] = NMDeviceWireless; this._dtypes[NM.DeviceType.MODEM] = NMDeviceModem; this._dtypes[NM.DeviceType.BT] = NMDeviceBluetooth; // Connection types this._ctypes = { }; this._ctypes[NM.SETTING_WIRELESS_SETTING_NAME] = NMConnectionCategory.WIRELESS; this._ctypes[NM.SETTING_WIRED_SETTING_NAME] = NMConnectionCategory.WIRED; this._ctypes[NM.SETTING_PPPOE_SETTING_NAME] = NMConnectionCategory.WIRED; this._ctypes[NM.SETTING_PPP_SETTING_NAME] = NMConnectionCategory.WIRED; this._ctypes[NM.SETTING_BLUETOOTH_SETTING_NAME] = NMConnectionCategory.WWAN; this._ctypes[NM.SETTING_CDMA_SETTING_NAME] = NMConnectionCategory.WWAN; this._ctypes[NM.SETTING_GSM_SETTING_NAME] = NMConnectionCategory.WWAN; this._ctypes[NM.SETTING_VPN_SETTING_NAME] = NMConnectionCategory.VPN; this._ctypes[NM.SETTING_WIREGUARD_SETTING_NAME] = NMConnectionCategory.WIREGUARD; this._readConnections(); this._readDevices(); this._syncNMState(); this._client.connect('notify::nm-running', Lang.bind(this, this._syncNMState)); this._client.connect('notify::networking-enabled', Lang.bind(this, this._syncNMState)); this._client.connect('notify::state', Lang.bind(this, this._syncNMState)); this._client.connect('notify::active-connections', Lang.bind(this, this._updateIcon)); this._client.connect('device-added', Lang.bind(this, this._deviceAdded)); this._client.connect('device-removed', Lang.bind(this, this._deviceRemoved)); this._client.connect('connection-added', Lang.bind(this, this._connectionAdded)); this._client.connect('connection-removed', Lang.bind(this, this._connectionRemoved)); this._inited = true; this._periodicUpdateIcon(); } catch (e) { global.logError(e); } }, _setIcon: function(name) { if (this._currentIconName !== name) { this.set_applet_icon_symbolic_name(name); this._currentIconName = name; } }, on_applet_clicked: function(event) { this.menu.toggle(); }, _openMenu: function () { this.menu.toggle(); }, _ensureSource: function() { if (!this._source) { this._source = new NMMessageTraySource(); this._source.connect('destroy', Lang.bind(this, function() { this._source = null; })); if (Main.messageTray) Main.messageTray.add(this._source); } }, _makeToggleItem: function(type, title) { let item = new NMWirelessSectionTitleMenuItem(this._client, type, title); item.connect('enabled-changed', Lang.bind(this, function(item, enabled) { let devices = this._devices[type].devices; devices.forEach(function(dev) { dev.setEnabled(enabled); }); this._syncSectionTitle(type); })); return item; }, _syncSectionTitle: function(category) { let devices = this._devices[category].devices; let vis_devices = []; let item = this._devices[category].item; let section = this._devices[category].section; /* We don't want unmanaged entries to clutter the list, but we do need to * keep them around in case they become manageable and need to be made visible * later (some valid wifi hardware starts out initially unmanaged, for instance.) * We'll only count managed devices for evaluating what entries to display, and * when to show or hide section titles. */ if (devices) { for (let i = 0; i < devices.length; i++) { if (devices[i].device.state == NM.DeviceState.UNMANAGED) { continue; } vis_devices.push(devices[i]); } } if (vis_devices.length == 0) { section.actor.hide(); } else { section.actor.show(); if (vis_devices.length == 1) { devices.forEach(function(dev) { dev.statusItem.actor.hide(); }); let dev = vis_devices[0]; item.updateForDevice(dev); } else { devices.forEach(function(dev) { dev.statusItem.actor.visible = (dev.device.state != NM.DeviceState.UNMANAGED); }); // remove status text from the section title item item.updateForDevice(null); } } }, _readDevices: function() { let devices = this._client.get_devices() || [ ]; for (let i = 0; i < devices.length; ++i) { this._deviceAdded(this._client, devices[i]); } }, _notifyForDevice: function(device, iconName, title, text, urgency) { if (device._notification) device._notification.destroy(); /* must call after destroying previous notification, or this._source will be cleared */ this._ensureSource(); let icon = new St.Icon({ icon_name: iconName, icon_type: St.IconType.SYMBOLIC, icon_size: this._source.ICON_SIZE }); device._notification = new MessageTray.Notification(this._source, title, text, { icon: icon }); device._notification.setUrgency(urgency); device._notification.setTransient(true); device._notification.connect('destroy', function() { device._notification = null; }); this._source.notify(device._notification); }, _deviceAdded: function(client, device) { if (device._delegate) { // already seen, not adding again return; } let wrapperClass = this._dtypes[device.get_device_type()]; if (wrapperClass) { let wrapper = new wrapperClass(this._client, device, this._connections); wrapper._activationFailedId = wrapper.connect('activation-failed', Lang.bind(this, function(device, reason) { // XXX: nm-applet has no special text depending on reason // but I'm not sure of this generic message this._notifyForDevice(device, 'network-error', _("Connection failed"), _("Activation of network connection failed"), MessageTray.Urgency.HIGH); })); wrapper._deviceStateChangedId = wrapper.connect('state-changed', Lang.bind(this, function(dev) { this._syncSectionTitle(dev.category); })); wrapper._destroyId = wrapper.connect('destroy', function(wrapper) { wrapper.disconnect(wrapper._activationFailedId); wrapper.disconnect(wrapper._deviceStateChangedId); wrapper.disconnect(wrapper._destroyId); }); let section = this._devices[wrapper.category].section; let devices = this._devices[wrapper.category].devices; section.addMenuItem(wrapper.section, 1); section.addMenuItem(wrapper.statusItem, 1); devices.push(wrapper); this._syncSectionTitle(wrapper.category); } else log('Unknown network device type, is ' + device.get_device_type()); }, _deviceRemoved: function(client, device) { if (!device._delegate) { log('Removing a network device that was not added'); return; } let wrapper = device._delegate; wrapper.destroy(); let devices = this._devices[wrapper.category].devices; let pos = devices.indexOf(wrapper); devices.splice(pos, 1); this._syncSectionTitle(wrapper.category); }, _syncActiveConnections: function() { let closedConnections = []; let newActiveConnections = this._client.get_active_connections() || []; for (let a of this._activeConnections) { if (!newActiveConnections.includes(a)) closedConnections.push(a); } for (let active of closedConnections) { if (active._primaryDevice) { if (active._type == NM.SETTING_VPN_SETTING_NAME) this._devices.vpn.device.setActiveConnections([]); else active._primaryDevice.setActiveConnection(null); active._primaryDevice = null; } if (active._inited) { active.disconnect(active._notifyStateId); active._inited = false; } } this._activeConnections = newActiveConnections; this._mainConnection = null; let activating = null; let activated = null; let default_ip4 = null; let default_ip6 = null; let vpnConnections = []; for (let a of this._activeConnections) { if (!a._inited) { a._notifyStateId = a.connect('notify::state', Lang.bind(this, this._notifyActivated)); a._inited = true; } if (!a._type) { a._type = a.connection._type; a._section = this._ctypes[a._type]; if (a._errorLogged) { log('network applet: Found connection for active'); a._errorLogged = false; } } if (!a._section){ // Do not take connections which section is undefined into account // For instance, in Mint 18, when the "vpn" is "activated", we sometimes see a "tun" act as the default ipv4 connection. continue; } if (a.state == NM.ActiveConnectionState.ACTIVATED) { if (!default_ip4) { // We didn't find the default IPV4 device yet.. if (!default_ip6) { // We didn't find the default IPV6 device either so consider this one. activated = a; } else { // We already found the default IPV6 device, so only use this one if it's the default IPV4 device if (a['default']) { activated = a; } } } } if (a.state == NM.ActiveConnectionState.ACTIVATING) { activating = a; } if (a['default']) { default_ip4 = a; } if (a.default6) { default_ip6 = a; } if (!a._primaryDevice) { if (a._type != NM.SETTING_VPN_SETTING_NAME && a._type != NM.SETTING_WIREGUARD_SETTING_NAME) { // find a good device to be considered primary a._primaryDevice = null; let devices = a.get_devices() || [ ]; for (let j = 0; j < devices.length; j++) { let d = devices[j]; if (d._delegate) { a._primaryDevice = d._delegate; break; } } } else { if (a._type == NM.SETTING_VPN_SETTING_NAME) a._primaryDevice = this._devices.vpn.device; else { a._primaryDevice = this._devices.wireguard.device; } } if (a.state == NM.ActiveConnectionState.ACTIVATED && a._primaryDevice && a._primaryDevice._notification) { a._primaryDevice._notification.destroy(); a._primaryDevice._notification = null; } } if (a._primaryDevice) { if (a._type == NM.SETTING_VPN_SETTING_NAME) { vpnConnections.push(a); } else { a._primaryDevice.setActiveConnection(a); } } } if (this._devices.vpn && this._devices.vpn.device) this._devices.vpn.device.setActiveConnections(vpnConnections); this._mainConnection = activated || activating || default_ip4 || default_ip6 || null; }, _notifyActivated: function(activeConnection) { if (activeConnection.state == NM.ActiveConnectionState.ACTIVATED && activeConnection._primaryDevice && activeConnection._primaryDevice._notification) { activeConnection._primaryDevice._notification.destroy(); activeConnection._primaryDevice._notification = null; } this._updateIcon(); }, _readConnections: function() { let connections = this._client.get_connections(); for (let i = 0; i < connections.length; i++) { let connection = connections[i]; if (connection._uuid) { // connection was already seen (for example because NetworkManager was restarted) continue; } connection._updatedId = connection.connect('changed', Lang.bind(this, this._updateConnection)); this._updateConnection(connection); this._connections.push(connection); } }, _connectionAdded: function(client, connection) { if (connection._uuid) { // connection was already seen return; } connection._updatedId = connection.connect('changed', Lang.bind(this, this._updateConnection)); this._updateConnection(connection); this._connections.push(connection); this._updateIcon(); }, _connectionRemoved: function(client, connection) { let pos = this._connections.indexOf(connection); if (pos != -1) this._connections.splice(pos); let section = connection._section; if (section == NMConnectionCategory.VPN) { this._devices.vpn.device.removeConnection(connection); if (this._devices.vpn.device.empty) this._devices.vpn.section.actor.hide(); } else if (section != NMConnectionCategory.INVALID) { let devices = this._devices[section].devices; for (let i = 0; i < devices.length; i++) devices[i].removeConnection(connection); } connection._uuid = null; connection.disconnect(connection._updatedId); }, _updateConnection: function(connection) { let connectionSettings = connection.get_setting_by_name(NM.SETTING_CONNECTION_SETTING_NAME); connection._type = connectionSettings.type; connection._section = this._ctypes[connection._type] || NMConnectionCategory.INVALID; connection._name = connectionSettings.id; connection._uuid = connectionSettings.uuid; connection._timestamp = connectionSettings.timestamp; let section = connection._section; if (connection._section == NMConnectionCategory.INVALID) return; if (section == NMConnectionCategory.VPN) { this._devices.vpn.device.checkConnection(connection); this._devices.vpn.section.actor.show(); } else if (section == NMConnectionCategory.WIREGUARD) { this._devices.wireguard.device.checkConnection(connection); this._devices.wireguard.section.actor.show(); } else { let devices = this._devices[section].devices; for (let i = 0; i < devices.length; i++) { devices[i].checkConnection(connection); } } }, _hideDevices: function() { this._devicesHidden = true; for (let category in this._devices) this._devices[category].section.actor.hide(); }, _showNormal: function() { if (!this._devicesHidden) // nothing to do return; this._devicesHidden = false; this._statusSection.actor.hide(); this._syncSectionTitle('wired'); this._syncSectionTitle('wireless'); this._syncSectionTitle('wwan'); if (!this._devices.vpn.device.empty) this._devices.vpn.section.actor.show(); if (!this._devices.wireguard.device.empty) this._devices.wireguard.section.actor.show(); }, _syncNMState: function() { if (!this._client.nm_running) { log('NetworkManager is not running, hiding...'); this.menu.close(); this.actor.hide(); return; } else this.actor.show(); if (!this._client.networking_enabled) { this._setIcon('xsi-network-offline'); this._hideDevices(); this._statusItem.label.text = _("Networking is disabled"); this._statusSection.actor.show(); return; } this._showNormal(); this._updateIcon(); }, _updateIcon: function() { let new_delay = DEFAULT_PERIODIC_UPDATE_FREQUENCY_SECONDS; try { this._syncActiveConnections(); let mc = this._mainConnection; if (!mc) { this._setIcon('xsi-network-offline'); this.set_applet_tooltip(_("No connection")); } else if (mc.state == NM.ActiveConnectionState.ACTIVATING) { new_delay = FAST_PERIODIC_UPDATE_FREQUENCY_SECONDS; switch (mc._section) { case NMConnectionCategory.WWAN: this._setIcon('xsi-network-cellular-acquiring'); this.set_applet_tooltip(_("Connecting to the cellular network...")); break; case NMConnectionCategory.WIRELESS: this._setIcon('xsi-network-wireless-acquiring'); this.set_applet_tooltip(_("Connecting to the wireless network...")); break; case NMConnectionCategory.WIRED: this._setIcon('xsi-network-wired-acquiring'); this.set_applet_tooltip(_("Connecting to the wired network...")); break; case NMConnectionCategory.VPN: this._setIcon('xsi-network-vpn-acquiring'); this.set_applet_tooltip(_("Connecting to the VPN...")); break; case NMConnectionCategory.WIREGUARD: this._setIcon('xsi-network-vpn-acquiring'); this.set_applet_tooltip(_("Connecting to WIREGUARD...")); break; default: // fallback to a generic connected icon // (it could be a private connection of some other user) this._setIcon('xsi-network-wired-acquiring'); this.set_applet_tooltip(_("Connecting to the network...")); } } else { let dev; let limited_conn = false; // let limited_conn = this._correctStateForTunnel(this._client.get_connectivity()) !== NM.ConnectivityState.FULL; switch (mc._section) { case NMConnectionCategory.WIRELESS: dev = mc._primaryDevice; if (dev) { let ap = dev.device.active_access_point; let mode = dev.device.mode; if (!ap) { if (mode != NM80211Mode.ADHOC) { log('An active wireless connection, in infrastructure mode, involves no access point?'); break; } this._setIcon('xsi-network-wireless-connected'); this.set_applet_tooltip(_("Connected to the wireless network")); } else { if (limited_conn) { this._setIcon('xsi-network-wireless-no-route'); this.set_applet_tooltip(_("Wireless connection") + ": " + ssidToLabel(ap.get_ssid()) + " " + _("(Limited connectivity)")); } else { this._setIcon('xsi-network-wireless-signal-' + signalToIcon(ap.strength)); this.set_applet_tooltip(_("Wireless connection") + ": " + ssidToLabel(ap.get_ssid()) + " ("+ ap.strength +"%)"); } } } else { log('Active connection with no primary device?'); } break; case NMConnectionCategory.WIRED: if (limited_conn) { this._setIcon('xsi-network-wired-no-route'); this.set_applet_tooltip(_("Connected to the wired network") + " " + _("(Limited connectivity)")); } else { this._setIcon('xsi-network-wired'); this.set_applet_tooltip(_("Connected to the wired network")); } break; case NMConnectionCategory.WWAN: dev = mc._primaryDevice; if (!dev) { log('Active connection with no primary device?'); break; } if (!dev.mobileDevice) { // this can happen for bluetooth in PAN mode this._setIcon('xsi-network-cellular-connected'); this.set_applet_tooltip(_("Connected to the cellular network")); break; } if (limited_conn) { this._setIcon('xsi-network-cellular-no-route'); this.set_applet_tooltip(_("Connected to the cellular network") + " " + _("(Limited connectivity)")); } else { this._setIcon('xsi-network-cellular-signal-' + signalToIcon(dev.mobileDevice.signal_quality)); this.set_applet_tooltip(_("Connected to the cellular network")); } break; case NMConnectionCategory.VPN: // Should we indicate limited connectivity for VPNs like we do above? What if the connection is to // a local machine? Need to test. this._setIcon('xsi-network-vpn'); this.set_applet_tooltip(_("Connected to the VPN")); break; case NMConnectionCategory.WIREGUARD: // Should we indicate limited connectivity for WIREGUARDs like we do above? What if the connection is to // a local machine? Need to test. this._setIcon('xsi-network-vpn'); this.set_applet_tooltip(_("Connected to WIREGUARD")); break; default: // fallback to a generic connected icon // (it could be a private connection of some other user) this._setIcon('xsi-network-wired'); this.set_applet_tooltip(_("Connected to the network")); break; } } if (this._devices.wireguard.item && this._devices.wireguard.item._switch.state) { this._setIcon('xsi-network-vpn'); this.set_applet_tooltip(_("Connected to WIREGUARD")); } for (let i = 0; i < this._activeConnections.length; i++) { const a = this._activeConnections[i]; if (a._section === NMConnectionCategory.VPN && a.state === NM.ActiveConnectionState.ACTIVATING) { this._setIcon('xsi-network-vpn-acquiring'); this.set_applet_tooltip(_("Connecting to the VPN...")); break; } else if (a._section === NMConnectionCategory.VPN && a.state === NM.ActiveConnectionState.ACTIVATED) { let iconName = 'xsi-network-vpn'; if (mc._section == NMConnectionCategory.WIRELESS) { const dev = mc._primaryDevice; if (dev) { const ap = dev.device.active_access_point; iconName = 'xsi-network-wireless-signal-' + signalToIcon(ap.strength) + '-secure-symbolic'; } } this._setIcon(iconName); this.set_applet_tooltip(_("Connected to the VPN")); break; } } } catch (e) { global.logError(e); } if (this.menu.isOpen) { return FAST_PERIODIC_UPDATE_FREQUENCY_SECONDS; } return new_delay; }, _periodicUpdateIcon: function() { let new_delay = this._updateIcon(); this._lastConnectivityState = this._client.get_connectivity(); // TODO: This can be unreliable with multiple interfaces, and libnm // can be flaky with its connectivity state - on one machine of mine, // I observed regular switching between full and limited connectivity, // when no noticeable change in my actual ability to reach the internet. // We might re-implement to be independent of libnm. For now just disable it. // // if (!this._checkingConnectivity) { // // https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/issues/476 // if (this._v1_28_0) { // this._checkingConnectivity = true; // this._client.check_connectivity_async(null, Lang.bind(this, this._connectivityCheckCallback)); // } else // if (this._nm_proxy != null) { // this._checkingConnectivity = true; // this._nm_proxy.CheckConnectivityRemote(Lang.bind(this, this._proxyConnectivityCheckCallback)); // } // } if (this._updateFrequencySeconds != new_delay) { this._restartPeriodicUpdateTimer(new_delay); } else { return GLib.SOURCE_CONTINUE; } return GLib.SOURCE_REMOVE; }, _correctStateForTunnel(state) { if (state !== NM.ConnectivityState.LIMITED) { return state; } // if our primary connection state is 'limited', check if there's a tunnel // connection active, and assume 'full' if so - this prevents reporting limited // connectivity when something like PIA vpn is active. This could end up reporting // a full connection when there isn't one, depending on what the tunnel is for, // but NM doesn't seem to provide any way to discern a relationship between a virtual // device (tunnel) and the physical device in use. The physical device is always returned // as the primary. if (this._activeConnections.some(con => con.get_connection_type() === "tun")) { return NM.ConnectivityState.FULL; } if (this._activeConnections.some(con => con.get_connection_type() === "wireguard")) { return NM.ConnectivityState.FULL; } }, _proxyConnectivityCheckCallback(new_state) { let state = this._correctStateForTunnel(new_state[0]); if (state !== this._lastConnectivityState) { this._updateIcon(); } this._checkingConnectivity = false; }, _connectivityCheckCallback(source, result) { let new_state = NM.ConnectivityState.UNKNOWN; try { new_state = source.check_connectivity_finish(result); } catch (e) { log(e); } let state = this._correctStateForTunnel(new_state); if (state !== this._lastConnectivityState) { this._updateIcon(); } this._checkingConnectivity = false; }, _restartPeriodicUpdateTimer: function(new_delay) { if (this._periodicTimeoutId > 0) { Mainloop.source_remove(this._periodicTimeoutId); } this._updateFrequencySeconds = new_delay; this._periodicTimeoutId = Mainloop.timeout_add_seconds(this._updateFrequencySeconds, Lang.bind(this, this._periodicUpdateIcon)); }, _rescanAccessPoints: function() { try { let devices = this._devices.wireless.devices; for (let i = 0; i < devices.length; i++) { if (devices[i]._client.wireless_get_enabled()) { devices[i].device.request_scan(null); } } } catch (gerror) { if (gerror.code == NM.DeviceError.NOTALLOWED) { // NM only allows a rescan every 10 seconds return; } else { log(gerror); } } }, _onMenuOpenStateChanged: function(popup, open) { this._periodicUpdateIcon(); if (open) { this._rescanAccessPoints(); } }, on_applet_removed_from_panel: function() { Main.systrayManager.unregisterTrayIconReplacement(this.metadata.uuid); Main.keybindingManager.removeXletHotKey(this, "network-open"); if (this._periodicTimeoutId){ Mainloop.source_remove(this._periodicTimeoutId); } }, }; function main(metadata, orientation, panel_height, instance_id) { return new CinnamonNetworkApplet(metadata, orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/network@cinnamon.org/metadata.json0000664000175000017500000000020115167446463027336 0ustar fabiofabio{ "uuid": "network@cinnamon.org", "name": "Network Manager", "description": "Network manager applet", "icon": "cs-network" } cinnamon-6.6.8/files/usr/share/cinnamon/applets/network@cinnamon.org/settings-schema.json0000664000175000017500000000037415167446463030667 0ustar fabiofabio{ "section1": { "type": "section", "description": "Menu" }, "keyOpen": { "type": "keybinding", "description": "Show menu", "default": "n", "tooltip": "Set keybinding(s) to show the network applet menu." } }cinnamon-6.6.8/files/usr/share/cinnamon/applets/nightlight@cinnamon.org/0000775000175000017500000000000015167446463025342 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/nightlight@cinnamon.org/applet.js0000664000175000017500000000346415167446463027174 0ustar fabiofabioconst Applet = imports.ui.applet; const Gio = imports.gi.Gio; const PopupMenu = imports.ui.popupMenu; const Util = imports.misc.util; const St = imports.gi.St; class NightLightSwitch extends Applet.IconApplet { constructor(metadata, orientation, panelHeight, instance_id) { super(orientation, panelHeight, instance_id); this.gsettings = Gio.Settings.new("org.cinnamon.settings-daemon.plugins.color"); this.nightLightEnabled = this.gsettings.get_boolean("night-light-enabled"); this.connectColorID = this.gsettings.connect("changed", () => this.set_icon()); this.set_icon(); let items = this._applet_context_menu._getMenuItems(); if (this.context_menu_item_configure == null) { this.context_menu_item_configure = new PopupMenu.PopupIconMenuItem(_("Configure..."), "xsi-preferences", St.IconType.SYMBOLIC); this.context_menu_item_configure.connect('activate', () => { Util.spawnCommandLineAsync("cinnamon-settings nightlight"); } ); } if (items.indexOf(this.context_menu_item_configure) == -1) { this._applet_context_menu.addMenuItem(this.context_menu_item_configure); } } on_applet_clicked() { this.gsettings.set_boolean("night-light-enabled", !this.nightLightEnabled); this.set_icon(); } set_icon() { this.nightLightEnabled = this.gsettings.get_boolean("night-light-enabled"); if (this.nightLightEnabled) { this.set_applet_icon_symbolic_name("xsi-night-light-symbolic"); } else { this.set_applet_icon_symbolic_name("xsi-night-light-disabled-symbolic"); } } on_applet_removed_from_panel() { this.gsettings.disconnect(this.connectColorID); } } function main(metadata, orientation, panel_height, instance_id) { return new NightLightSwitch(metadata, orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/nightlight@cinnamon.org/icons/0000775000175000017500000000000015167446463026455 5ustar fabiofabio././@LongLink0000644000000000000000000000015700000000000011606 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/nightlight@cinnamon.org/icons/nightlight-disabled-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/nightlight@cinnamon.org/icons/nightlight-disabled-sy0000664000175000017500000000150215167446463032735 0ustar fabiofabio ././@LongLink0000644000000000000000000000014600000000000011604 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/nightlight@cinnamon.org/icons/nightlight-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/nightlight@cinnamon.org/icons/nightlight-symbolic.sv0000664000175000017500000000100415167446463033002 0ustar fabiofabio cinnamon-6.6.8/files/usr/share/cinnamon/applets/nightlight@cinnamon.org/metadata.json0000664000175000017500000000033015167446463030011 0ustar fabiofabio{ "description": "Activate/deactivate Night Light mode.", "icon": "cs-nightlight", "max-instances": "1", "hide-configuration": true, "uuid": "nightlight@cinnamon.org", "name": "Night Light" } cinnamon-6.6.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/0000775000175000017500000000000015167446463026052 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/applet.js0000664000175000017500000003272315167446463027704 0ustar fabiofabioconst Applet = imports.ui.applet; const Lang = imports.lang; const Main = imports.ui.main; const Gtk = imports.gi.Gtk; const Gio = imports.gi.Gio; const PopupMenu = imports.ui.popupMenu; const St = imports.gi.St; const Mainloop = imports.mainloop; const Urgency = imports.ui.messageTray.Urgency; const MessageTray = imports.ui.messageTray; const NotificationDestroyedReason = imports.ui.messageTray.NotificationDestroyedReason; const Settings = imports.ui.settings; const Gettext = imports.gettext.domain("cinnamon-applets"); const Util = imports.misc.util; const PANEL_EDIT_MODE_KEY = "panel-edit-mode"; class CinnamonNotificationsApplet extends Applet.TextIconApplet { constructor(metadata, orientation, panel_height, instanceId) { super(orientation, panel_height, instanceId); this.setAllowedLayout(Applet.AllowedLayout.BOTH); // Settings this.settings = new Settings.AppletSettings(this, metadata.uuid, instanceId); this.settings.bind("ignoreTransientNotifications", "ignoreTransientNotifications"); this.settings.bind("showEmptyTray", "showEmptyTray", this._show_hide_tray); this.settings.bind("keyOpen", "keyOpen", this._setKeybinding); this.settings.bind("keyClear", "keyClear", this._setKeybinding); this.settings.bind("showNotificationCount", "showNotificationCount", this.update_list); this.settings.bind("showNewestFirst", "showNewestFirst", this.update_list); this._setKeybinding(); // Layout this._orientation = orientation; this.menuManager = new PopupMenu.PopupMenuManager(this); // Lists this.notifications = []; // The list of notifications, in order from oldest to newest. // Events Main.messageTray.connect('notify-applet-update', Lang.bind(this, this._notification_added)); this.panelEditModeHandler = global.settings.connect('changed::' + PANEL_EDIT_MODE_KEY, Lang.bind(this, this._on_panel_edit_mode_changed)); // States this._blinking = false; this._blink_toggle = false; } _setKeybinding() { Main.keybindingManager.addXletHotKey(this, "notification-open", this.keyOpen, Lang.bind(this, this._openMenu)); Main.keybindingManager.addXletHotKey(this, "notification-clear", this.keyClear, Lang.bind(this, this._clear_all)); } on_applet_removed_from_panel () { Main.keybindingManager.removeXletHotKey(this, "notification-open"); Main.keybindingManager.removeXletHotKey(this, "notification-clear"); global.settings.disconnect(this.panelEditModeHandler); MessageTray.extensionsHandlingNotifications--; if (MessageTray.extensionsHandlingNotifications === 0) { this._clear_all(); } } _openMenu() { this._update_timestamp(); this.menu.toggle(); } _display() { // Always start the applet empty, void of any notifications. this.set_applet_icon_symbolic_name("empty-notif"); this.set_applet_tooltip(_("Notifications")); // Setup the notification container. this._maincontainer = new St.BoxLayout({name: 'traycontainer', vertical: true}); this._notificationbin = new St.BoxLayout({vertical:true}); this.button_label_box = new St.BoxLayout(); // Setup the tray icon. this.menu_label = new PopupMenu.PopupMenuItem(stringify(this.notifications.length)); this.menu_label.actor.reactive = false; this.menu_label.actor.can_focus = false; this.menu_label.label.add_style_class_name('popup-subtitle-menu-item'); this.clear_separator = new PopupMenu.PopupSeparatorMenuItem(); this.clear_action = new PopupMenu.PopupMenuItem(_("Clear notifications")); this.clear_action.connect('activate', Lang.bind(this, this._clear_all)); this.clear_action.actor.hide(); if (this._orientation == St.Side.BOTTOM) { this.menu.addMenuItem(this.menu_label); this.menu.addActor(this._maincontainer); this.menu.addMenuItem(this.clear_separator); this.menu.addMenuItem(this.clear_action); } else { this.menu.addMenuItem(this.clear_action); this.menu.addMenuItem(this.clear_separator); this.menu.addMenuItem(this.menu_label); this.menu.addActor(this._maincontainer); } this.scrollview = new St.ScrollView({ x_fill: true, y_fill: true, y_align: St.Align.START, style_class: "vfade"}); this._maincontainer.add(this.scrollview); this.scrollview.add_actor(this._notificationbin); this.scrollview.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC); this.scrollview.set_clip_to_allocation(true); let vscroll = this.scrollview.get_vscroll_bar(); vscroll.connect('scroll-start', Lang.bind(this, function() { this.menu.passEvents = true; })); vscroll.connect('scroll-stop', Lang.bind(this, function() { this.menu.passEvents = false; })); // Alternative tray icons. this._crit_icon = new St.Icon({icon_name: 'critical-notif', icon_type: St.IconType.SYMBOLIC, reactive: true, track_hover: true, style_class: 'system-status-icon' }); this._alt_crit_icon = new St.Icon({icon_name: 'alt-critical-notif', icon_type: St.IconType.SYMBOLIC, reactive: true, track_hover: true, style_class: 'system-status-icon' }); this._on_panel_edit_mode_changed(); this.menu.addSettingsAction(_("Notification Settings"), 'notifications'); } _notification_added (mtray, notification) { // Notification event handler. // Ignore transient notifications? if (this.ignoreTransientNotifications && notification.isTransient) { notification.destroy(); return; } notification.actor.unparent(); let existing_index = this.notifications.indexOf(notification); if (existing_index != -1) { // This notification is already listed. if (notification._destroyed) { this.notifications.splice(existing_index, 1); } else { notification._inNotificationBin = true; global.reparentActor(notification.actor, this._notificationbin); notification._timeLabel.show(); } this.update_list(); return; } else if (notification._destroyed) { return; } // Add notification to list. notification._inNotificationBin = true; this.notifications.push(notification); // Steal the notification panel. this._notificationbin.add(notification.actor); notification.actor._parent_container = this._notificationbin; notification.actor.add_style_class_name('notification-applet-padding'); // Register for destruction. notification.connect('scrolling-changed', (notif, scrolling) => { this.menu.passEvents = scrolling }); notification.connect('destroy', () => { let i = this.notifications.indexOf(notification); if (i != -1) this.notifications.splice(i, 1); this.update_list(); }); notification._timeLabel.show(); this.update_list(); } update_list () { try { let count = this.notifications.length; if (count > 0) { // There are notifications. this.actor.show(); this.clear_action.actor.show(); this.set_applet_label(count.toString()); this._reorderNotifications(); // Find max urgency and derive list icon. let max_urgency = -1; for (let i = 0; i < count; i++) { let cur_urgency = this.notifications[i].urgency; if (cur_urgency > max_urgency) max_urgency = cur_urgency; } switch (max_urgency) { case Urgency.LOW: this._blinking = false; this.set_applet_icon_symbolic_name("low-notif"); break; case Urgency.NORMAL: case Urgency.HIGH: this._blinking = false; this.set_applet_icon_symbolic_name("normal-notif"); break; case Urgency.CRITICAL: if (!this._blinking) { this._blinking = true; this.critical_blink(); } break; } } else { // There are no notifications. this._blinking = false; this.set_applet_label(''); this.set_applet_icon_symbolic_name("empty-notif"); this.clear_action.actor.hide(); if (!this.showEmptyTray) { this.actor.hide(); } } if (!this.showNotificationCount) { // Don't show notification count this.set_applet_label(''); // this.clear_action.actor.hide(); } this.menu_label.label.set_text(stringify(count)); this._notificationbin.queue_relayout(); } catch (e) { global.logError(e); } } _clear_all() { let count = this.notifications.length; if (count > 0) { for (let i = count-1; i >=0; i--) { this._notificationbin.remove_actor(this.notifications[i].actor); this.notifications[i].destroy(NotificationDestroyedReason.DISMISSED); } } this.notifications = []; this.update_list(); } _reorderNotifications() { let orderedNotifications = this.notifications.slice(); if (this.showNewestFirst) { orderedNotifications.reverse(); } // Remove all children without destroying them. let children = this._notificationbin.get_children(); for (let i = 0; i < children.length; i++) { this._notificationbin.remove_child(children[i]); } // Add them back in desired order. for (let i = 0; i < orderedNotifications.length; i++) { this._notificationbin.add_child(orderedNotifications[i].actor); } } _show_hide_tray() { // Show or hide the notification tray. if(!global.settings.get_boolean(PANEL_EDIT_MODE_KEY)) { if (this.notifications.length || this.showEmptyTray) { this.actor.show(); } else { this.actor.hide(); } } } _on_panel_edit_mode_changed () { if (global.settings.get_boolean(PANEL_EDIT_MODE_KEY)) { this.actor.show(); } else { this.update_list(); } } on_applet_added_to_panel() { this.on_orientation_changed(this._orientation); MessageTray.extensionsHandlingNotifications++; } on_orientation_changed (orientation) { this._orientation = orientation; if (this.menu) { this.menu.destroy(); } this.menu = new Applet.AppletPopupMenu(this, orientation); this.menuManager.addMenu(this.menu); this._display(); } on_applet_clicked(event) { this._openMenu(); } on_btn_open_system_settings_clicked() { Util.spawnCommandLine("cinnamon-settings notifications"); } _update_timestamp() { let len = this.notifications.length; if (len > 0) { for (let i = 0; i < len; i++) { let notification = this.notifications[i]; let orig_time = notification._timestamp; notification._timeLabel.clutter_text.set_markup(timeify(orig_time)); } } } critical_blink () { if (!this._blinking) return; if (this._blink_toggle) { this._applet_icon_box.child = this._crit_icon; } else { this._applet_icon_box.child = this._alt_crit_icon; } this._blink_toggle = !this._blink_toggle; Mainloop.timeout_add_seconds(1, Lang.bind(this, this.critical_blink)); } } function main(metadata, orientation, panel_height, instanceId) { return new CinnamonNotificationsApplet(metadata, orientation, panel_height, instanceId); } function stringify(count) { if (count === 0) { return _("No notifications"); } else { return ngettext("%d notification", "%d notifications", count).format(count); } } function timeify(orig_time) { let settings = new Gio.Settings({schema_id: 'org.cinnamon.desktop.interface'}); let use_24h = settings.get_boolean('clock-use-24h'); let now = new Date(); let diff = Math.floor((now.getTime() - orig_time.getTime()) / 1000); // get diff in seconds let str; if (use_24h) { str = orig_time.toLocaleFormat('%x, %T'); } else { str = orig_time.toLocaleFormat('%x, %r'); } switch (true) { case (diff <= 15): { str += " (" + _("just now") + ")"; break; } case (diff > 15 && diff <= 59): { str += " (" + ngettext("%d second ago", "%d seconds ago", diff).format(diff) + ")"; break; } case (diff > 59 && diff <= 3540): { let diff_minutes = Math.floor(diff / 60); str += " (" + ngettext("%d minute ago", "%d minutes ago", diff_minutes).format(diff_minutes) + ")"; break; } } return str; } cinnamon-6.6.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/icons/0000775000175000017500000000000015167446463027165 5ustar fabiofabio././@LongLink0000644000000000000000000000016100000000000011601 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/icons/alt-critical-notif-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/icons/alt-critical-notif-0000664000175000017500000000316615167446463032660 0ustar fabiofabio image/svg+xml ././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/icons/critical-notif-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/icons/critical-notif-symb0000664000175000017500000000336615167446463032777 0ustar fabiofabio image/svg+xml ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/icons/empty-notif-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/icons/empty-notif-symboli0000664000175000017500000000271515167446463033044 0ustar fabiofabio image/svg+xml ././@LongLink0000644000000000000000000000015000000000000011577 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/icons/low-notif-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/icons/low-notif-symbolic.0000664000175000017500000000411315167446463032722 0ustar fabiofabio image/svg+xml ././@LongLink0000644000000000000000000000015300000000000011602 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/icons/normal-notif-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/icons/normal-notif-symbol0000664000175000017500000000416715167446463033030 0ustar fabiofabio image/svg+xml cinnamon-6.6.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/metadata.json0000664000175000017500000000024115167446463030522 0ustar fabiofabio{ "uuid": "notifications@cinnamon.org", "name": "Notifications", "description": "Click to display and manage system notifications", "icon": "cs-notifications" } cinnamon-6.6.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/settings-schema.json0000664000175000017500000000317415167446463032050 0ustar fabiofabio{ "section1": { "type": "section", "description": "Behavior" }, "ignoreTransientNotifications": { "type": "switch", "default": true, "description": "Ignore transient notifications", "tooltip" : "Check this to ignore transient notifications." }, "section2": { "type": "section", "description": "Display" }, "showEmptyTray": { "type": "switch", "default": false, "description": "Show empty tray", "tooltip": "Check this to show the tray even when there are no new notifications." }, "showNotificationCount": { "type": "switch", "default": true, "description": "Show the number of notifications" }, "showNewestFirst": { "type": "switch", "default": false, "description": "Show newest notifications first" }, "section3": { "type": "section", "description": "Keyboard shortcuts" }, "keyOpen": { "type": "keybinding", "description": "Show notifications", "default": "n", "tooltip" : "Set keybinding(s) to show the notification popup menu." }, "keyClear": { "type": "keybinding", "description": "Clear notifications", "default": "c", "tooltip" : "Set keybinding(s) to clear all notifications." }, "section4": { "type": "section", "description": "" }, "btnSystemSettings" : { "type" : "button", "description" : "Open notification settings", "callback": "on_btn_open_system_settings_clicked" } } cinnamon-6.6.8/files/usr/share/cinnamon/applets/on-screen-keyboard@cinnamon.org/0000775000175000017500000000000015167446463026670 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/on-screen-keyboard@cinnamon.org/applet.js0000664000175000017500000000366615167446463030526 0ustar fabiofabioconst Applet = imports.ui.applet; const Gio = imports.gi.Gio; const Lang = imports.lang; const PopupMenu = imports.ui.popupMenu; const Main = imports.ui.main; class CinnamonOnScreenKeyboardApplet extends Applet.IconApplet { constructor(metadata, orientation, panel_height, instanceId) { super(orientation, panel_height, instanceId); this.settings = new Gio.Settings({ schema_id: 'org.cinnamon.desktop.a11y.applications' }); this.settings.connect('changed::screen-keyboard-enabled', () => this.update_status()); this.keyboard_switch = new PopupMenu.PopupSwitchMenuItem( _("Enable on-screen keyboard"), this.settings.get_boolean("screen-keyboard-enabled"), null); this._applet_context_menu.addMenuItem(this.keyboard_switch); this.keyboard_switch.connect("toggled", (item, state) => this.settings.set_boolean("screen-keyboard-enabled", state)); this._applet_context_menu.addSettingsAction(_("Virtual keyboard settings"), 'accessibility', "keyboard"); this._applet_context_menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.update_status(); } on_applet_clicked(event) { Main.virtualKeyboardManager.manualToggle(); } update_status() { if (this.settings.get_boolean("screen-keyboard-enabled")) { this.set_applet_icon_symbolic_name('on-screen-keyboard'); this.set_applet_tooltip(_("Click to toggle the on-screen keyboard")); this.keyboard_switch.setToggleState(true); } else { this.set_applet_icon_symbolic_name('on-screen-keyboard-disabled'); this.set_applet_tooltip(_("Click to enable the on-screen keyboard")); this.keyboard_switch.setToggleState(false); } } } function main(metadata, orientation, panel_height, instanceId) { return new CinnamonOnScreenKeyboardApplet(metadata, orientation, panel_height, instanceId); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/on-screen-keyboard@cinnamon.org/icons/0000775000175000017500000000000015167446463030003 5ustar fabiofabio././@LongLink0000644000000000000000000000017700000000000011610 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/on-screen-keyboard@cinnamon.org/icons/on-screen-keyboard-disabled-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/on-screen-keyboard@cinnamon.org/icons/on-screen-keyb0000664000175000017500000000526115167446463032553 0ustar fabiofabio image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme ././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/on-screen-keyboard@cinnamon.org/icons/on-screen-keyboard-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/on-screen-keyboard@cinnamon.org/icons/on-screen-keyb0000664000175000017500000000206315167446463032550 0ustar fabiofabio image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-6.6.8/files/usr/share/cinnamon/applets/on-screen-keyboard@cinnamon.org/metadata.json0000664000175000017500000000027215167446463031344 0ustar fabiofabio{ "uuid": "on-screen-keyboard@cinnamon.org", "name": "On-Screen keyboard", "icon": "cinnamon-virtual-keyboard", "description": "A Cinnamon applet to launch the on-screen keyboard" } cinnamon-6.6.8/files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/0000775000175000017500000000000015167446463026262 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js0000664000175000017500000006170315167446463030114 0ustar fabiofabioconst Applet = imports.ui.applet; const AppletManager = imports.ui.appletManager; const Clutter = imports.gi.Clutter; const St = imports.gi.St; const Cinnamon = imports.gi.Cinnamon; const CMenu = imports.gi.CMenu; const Lang = imports.lang; const Gio = imports.gi.Gio; const PopupMenu = imports.ui.popupMenu; const Main = imports.ui.main; const GLib = imports.gi.GLib; const Tooltips = imports.ui.tooltips; const DND = imports.ui.dnd; const Util = imports.misc.util; const Settings = imports.ui.settings; const Signals = imports.signals; const SignalManager = imports.misc.signalManager; const PANEL_EDIT_MODE_KEY = 'panel-edit-mode'; const PANEL_LAUNCHERS_KEY = 'panel-launchers'; const CUSTOM_LAUNCHERS_PATH = GLib.get_user_data_dir() + "/cinnamon/panel-launchers/"; const OLD_CUSTOM_LAUNCHERS_PATH = GLib.get_home_dir() + '/.cinnamon/panel-launchers/'; let pressLauncher = null; class PanelAppLauncherMenu extends Applet.AppletPopupMenu { constructor(launcher, orientation) { super(launcher, orientation); this._launcher = launcher; let appinfo = this._launcher.getAppInfo(); this._actions = appinfo.list_actions(); if (this._actions.length > 0) { for (let i = 0; i < this._actions.length; i++) { let actionName = this._actions[i]; this.addAction(appinfo.get_action_name(actionName), Lang.bind(this, this._launchAction, actionName)); } this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); } let item = new PopupMenu.PopupIconMenuItem(_("Launch"), "xsi-media-playback-start", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', Lang.bind(this, this._onLaunchActivate)); this.addMenuItem(item); if (Main.gpu_offload_supported) { let item = new PopupMenu.PopupIconMenuItem(_("Run with dedicated GPU"), "xsi-cpu", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', Lang.bind(this, this._onLaunchOffloadedActivate)); this.addMenuItem(item); } item = new PopupMenu.PopupIconMenuItem(_("Add"), "xsi-list-add", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', Lang.bind(this, this._onAddActivate)); this.addMenuItem(item); item = new PopupMenu.PopupIconMenuItem(_("Edit"), "xsi-edit", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', Lang.bind(this, this._onEditActivate)); this.addMenuItem(item); item = new PopupMenu.PopupIconMenuItem(_("Remove"), "xsi-list-remove", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', Lang.bind(this, this._onRemoveActivate)); this.addMenuItem(item); this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); let subMenu = new PopupMenu.PopupSubMenuMenuItem(_("Applet preferences")); this.addMenuItem(subMenu); item = new PopupMenu.PopupIconMenuItem(_("About..."), "xsi-dialog-question", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', Lang.bind(this._launcher.launchersBox, this._launcher.launchersBox.openAbout)); subMenu.menu.addMenuItem(item); item = new PopupMenu.PopupIconMenuItem(_("Configure..."), "xsi-preferences", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', () => this._launcher.launchersBox.configureApplet()); subMenu.menu.addMenuItem(item); this.remove_item = new PopupMenu.PopupIconMenuItem(_("Remove '%s'").format(_("Panel launchers")), "xsi-edit-delete", St.IconType.SYMBOLIC); subMenu.menu.addMenuItem(this.remove_item); } _onLaunchActivate(item, event) { this._launcher.launch(); } _onLaunchOffloadedActivate(item, event) { this._launcher.launch(true); } _onRemoveActivate(item, event) { this.close(); this._launcher.launchersBox.removeLauncher(this._launcher, this._launcher.isCustom()); } _onAddActivate(item, event) { this._launcher.launchersBox.showAddLauncherDialog(event.get_time()); } _onEditActivate(item, event) { this._launcher.launchersBox.showAddLauncherDialog(event.get_time(), this._launcher); } _launchAction(event, name) { this._launcher.launchAction(name); } } class PanelAppLauncher extends DND.LauncherDraggable { constructor(launchersBox, app, appinfo, orientation, icon_size) { super(launchersBox); this.app = app; this.appinfo = appinfo; this.orientation = orientation; this.icon_size = icon_size; this._signals = new SignalManager.SignalManager(null); this.actor = new St.Bin({ style_class: 'launcher', important: true, reactive: true, can_focus: true, x_fill: true, y_fill: true, track_hover: true }); this.actor.set_easing_mode(Clutter.AnimationMode.EASE_IN_QUAD); this.actor.set_easing_duration(100); this.actor._delegate = this; this._signals.connect(this.actor, 'button-release-event', Lang.bind(this, this._onButtonRelease)); this._signals.connect(this.actor, 'button-press-event', Lang.bind(this, this._onButtonPress)); this._iconBox = new St.Bin({ style_class: 'icon-box', important: true }); this.actor.add_actor(this._iconBox); this._iconBottomClip = 0; this.icon = this._getIconActor(); this._iconBox.set_child(this.icon); this._signals.connect(this._iconBox, 'style-changed', Lang.bind(this, this._updateIconSize)); this._signals.connect(this._iconBox, 'notify::allocation', Lang.bind(this, this._updateIconSize)); this._menuManager = new PopupMenu.PopupMenuManager(this); this._menu = new PanelAppLauncherMenu(this, orientation); this._signals.connect(this._menu.remove_item, 'activate', (actor, event) => launchersBox.confirmRemoveApplet(event)); this._menuManager.addMenu(this._menu); let tooltipText = this.isCustom() ? appinfo.get_name() : app.get_name(); this._tooltip = new Tooltips.PanelItemTooltip(this, tooltipText, orientation); this._dragging = false; this._draggable = DND.makeDraggable(this.actor); this._signals.connect(this._draggable, 'drag-begin', Lang.bind(this, this._onDragBegin)); this._signals.connect(this._draggable, 'drag-end', Lang.bind(this, this._onDragEnd)); this._updateInhibit(); this._signals.connect(this.launchersBox, 'launcher-draggable-setting-changed', Lang.bind(this, this._updateInhibit)); this._signals.connect(global.settings, 'changed::' + PANEL_EDIT_MODE_KEY, Lang.bind(this, this._updateInhibit)); } _onDragBegin() { this._dragging = true; this._tooltip.hide(); this._tooltip.preventShow = true; this.actor.set_hover(false); } _onDragEnd(source, time, success) { this._dragging = false; this._tooltip.preventShow = false; this.actor.sync_hover(); if (!success) this.launchersBox._clearDragPlaceholder(); } _updateInhibit() { let editMode = global.settings.get_boolean(PANEL_EDIT_MODE_KEY); this._draggable.inhibit = !this.launchersBox.allowDragging || editMode; this.actor.reactive = !editMode; } getDragActor() { return this._getIconActor(); } // Returns the original actor that should align with the actor // we show as the item is being dragged. getDragActorSource() { return this.icon; } _getIconActor() { if (this.isCustom()) { let icon = this.appinfo.get_icon(); if (icon == null) icon = new Gio.ThemedIcon({name: "gnome-panel-launcher"}); return new St.Icon({gicon: icon, icon_size: this.icon_size, icon_type: St.IconType.FULLCOLOR}); } else { return this.app.create_icon_texture(this.icon_size); } } _animateIcon(step) { if (step >= 3) return; this.icon.set_pivot_point(0.5, 0.5); this.icon.ease({ scale_x: 0.7, scale_y: 0.7, duration: 200, mode: Clutter.AnimationMode.EASE_OUT_QUAD, onComplete: () => { this.icon.ease({ scale_x: 1.0, scale_y: 1.0, duration: 200, mode: Clutter.AnimationMode.EASE_OUT_QUAD, onComplete: () => { this._animateIcon(step + 1); } }); } }); } launch(offload=false) { if (this.isCustom()) { this.appinfo.launch([], null); } else { if (offload) { try { this.app.launch_offloaded(0, [], -1); } catch (e) { logError(e, "Could not launch app with dedicated gpu: "); } } else { this.app.open_new_window(-1); } } this.icon.remove_all_transitions(); this._animateIcon(0); } launchAction(name) { this.getAppInfo().launch_action(name, null); this.icon.remove_all_transitions(); this._animateIcon(0); } getId() { if (this.isCustom()) return Gio.file_new_for_path(this.appinfo.get_filename()).get_basename(); else return this.app.get_id(); } isCustom() { return (this.app==null); } _onButtonPress(actor, event) { pressLauncher = this.getAppname(); if (event.get_button() == 3) this._menu.toggle(); } _onButtonRelease(actor, event) { if (pressLauncher == this.getAppname()){ let button = event.get_button(); if (button==1) { if (this._menu.isOpen) this._menu.toggle(); else this.launch(); } } } _updateIconSize() { let node = this._iconBox.get_theme_node(); let enforcedSize = 0; if (this._iconBox.height > 0) { enforcedSize = this._iconBox.height - node.get_vertical_padding(); } else if (this._iconBox.width > 0) { enforcedSize = this._iconBox.width - node.get_horizontal_padding(); } else { enforcedSize = -1; } if (enforcedSize < this.icon.get_icon_size()) { this.icon.set_icon_size(enforcedSize); } } getAppInfo() { return (this.isCustom() ? this.appinfo : this.app.get_app_info()); } getCommand() { return this.getAppInfo().get_commandline(); } getAppname() { return this.getAppInfo().get_name(); } getIcon() { let icon = this.getAppInfo().get_icon(); if (icon) { if (icon instanceof Gio.FileIcon) { return icon.get_file().get_path(); } else { return icon.get_names().toString(); } } return null; } destroy() { this._signals.disconnectAllSignals(); this._menu.destroy(); this._menuManager.destroy(); this.actor.destroy(); } } // holds launchers and contains DND functionality, instead of the // applet actor handling DND so that we don't have to apply extra // transformations to do hit testing. dnd methods get event coords // pre-transformed to be actor-relative. class LaunchersBox { constructor(applet) { this.actor = new St.BoxLayout({ style_class: 'panel-launchers', important: true }); this.actor._delegate = this; this.actor.connect("destroy", () => this._destroy()); this.applet = applet; this._dragAnimating = false; this._dragPlaceholder = null; this._dragTargetIndex = null; this._dragLocalOriginInfo = null; } _createDragPlaceholder(index, skipAnimation=false) { if (this._dragPlaceholder) return; let vertical = this.applet.orientation == St.Side.LEFT || this.applet.orientation == St.Side.RIGHT; this._dragPlaceholder = new DND.GenericDragPlaceholderItem(); let placeholderSize = vertical ? [1, this.applet.icon_size * global.ui_scale] : [this.applet.icon_size * global.ui_scale, 1]; this._dragPlaceholder.child.set_size(...placeholderSize); this.actor.insert_child_at_index(this._dragPlaceholder.actor, index); if (!skipAnimation) { this._dragAnimating = true; this._dragPlaceholder.animateIn(() => this._dragAnimating = false); } } // this resets drag placeholder and local drag state but is also used by DND so we can't rename it _clearDragPlaceholder(skipAnimation=false) { if (this._dragLocalOriginInfo != null) { this.actor.set_child_at_index(this._dragLocalOriginInfo.actor, this._dragLocalOriginInfo.index); } if (this._dragPlaceholder) { if (skipAnimation) { this._dragPlaceholder.actor.destroy(); } else { this._dragAnimating = true; this._dragPlaceholder.animateOutAndDestroy(() => this._dragAnimating = false); } } this._dragPlaceholder = null; this._dragLocalOriginInfo = null; this._dragTargetIndex = null; } handleDragOver(source, actor, x, y, time) { let isLauncher = source instanceof DND.LauncherDraggable; // don't present drop if the source isn't an app/launcher type, or if a drag hover // was just cancelled and we are still animating out a placeholder if (!(source.isDraggableApp || isLauncher) || (!this._dragPlaceholder && this._dragAnimating)) { return DND.DragMotionResult.NO_DROP; } let originalIndex = this.applet._launchers.indexOf(source); let vertical = this.applet.orientation == St.Side.LEFT || this.applet.orientation == St.Side.RIGHT; let boxSize = vertical ? this.actor.height : this.actor.width; let mPos = vertical ? y : x; let children = this.actor.get_children(); if(!vertical && St.Widget.get_default_direction () === St.TextDirection.RTL) //in RTL the dropIndex should be reversed mPos = boxSize - mPos; let dropIndex = Math.floor(mPos / boxSize * children.length); // -1 is end, 0 is start if (dropIndex >= children.length) dropIndex = -1; else if (dropIndex < -1) dropIndex = 0; if (this._dragTargetIndex != dropIndex) { if (originalIndex > -1) { // local drag without placeholder if (!this._dragLocalOriginInfo) this._dragLocalOriginInfo = { actor: source.actor, index: originalIndex }; this.actor.set_child_at_index(source.actor, dropIndex); this._dragTargetIndex = dropIndex; } else if (!this._dragAnimating) { // if we are already showing a placeholder (animate in) we don't update and // just return the correct DragMotionType, otherwise we create/set position if (!this._dragPlaceholder) { // animates in a new placeholder this._createDragPlaceholder(dropIndex); } else { this.actor.set_child_at_index(this._dragPlaceholder.actor, dropIndex); } this._dragTargetIndex = dropIndex; } } if (isLauncher) return DND.DragMotionResult.MOVE_DROP; return DND.DragMotionResult.COPY_DROP; } handleDragOut() { this._clearDragPlaceholder(); } acceptDrop(source, actor, x, y, time) { let isLauncher = source instanceof DND.LauncherDraggable; if (this._dragTargetIndex == null || !(source.isDraggableApp || isLauncher)) { // this _should_ be a no-drop-eligibility case only with no existing state, but just in this._clearDragPlaceholder(true); return false; } let dropIndex = this._dragTargetIndex; this._clearDragPlaceholder(true); if (this.applet._launchers.indexOf(source) != -1) { this.applet._reinsertAtIndex(source, dropIndex); } else { let sourceId; if (isLauncher) { sourceId = source.getId(); source.launchersBox.removeLauncher(source, false); } else { sourceId = source.get_app_id(); } this.applet.addForeignLauncher(sourceId, dropIndex, source); } return true; } _destroy() { this.actor._delegate = null; this.actor = null; this.applet = null; } } class CinnamonPanelLaunchersApplet extends Applet.Applet { constructor(metadata, orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.actor.set_track_hover(false); this.setAllowedLayout(Applet.AllowedLayout.BOTH); this.orientation = orientation; this.icon_size = this.getPanelIconSize(St.IconType.FULLCOLOR); // LaunchersBox() handles DND. This would be cleaner as a BoxLayout class but // would also add pointless overhead. this.launchersBox = new LaunchersBox(this); this.myactor = this.launchersBox.actor; this.settings = new Settings.AppletSettings(this, metadata.uuid, instance_id); this.settings.bind("launcherList", "launcherList", this._reload); this.settings.bind("allow-dragging", "allowDragging", this._updateLauncherDrag); this.uuid = metadata.uuid; this._settings_proxy = []; this._launchers = []; this.actor.add(this.myactor); this.actor.reactive = global.settings.get_boolean(PANEL_EDIT_MODE_KEY); global.settings.connect('changed::' + PANEL_EDIT_MODE_KEY, Lang.bind(this, this._onPanelEditModeChanged)); this.do_gsettings_import(); this.on_orientation_changed(orientation); } _updateLauncherDrag() { this.emit("launcher-draggable-setting-changed"); } do_gsettings_import() { let old_launchers = global.settings.get_strv(PANEL_LAUNCHERS_KEY); if (old_launchers.length >= 1 && old_launchers[0] != "DEPRECATED") { this.launcherList = old_launchers; } global.settings.set_strv(PANEL_LAUNCHERS_KEY, ["DEPRECATED"]); } _onPanelEditModeChanged() { this.actor.reactive = global.settings.get_boolean(PANEL_EDIT_MODE_KEY); } sync_settings_proxy_to_settings() { this.settings.unbind("launcherList"); this.launcherList = this._settings_proxy.map(x => x.file); this.settings.setValue("launcherList", this.launcherList); this.settings.bind("launcherList", "launcherList", this._reload); } _remove_launcher_from_proxy(visible_index) { let j = -1; for (let i = 0; i < this._settings_proxy.length; i++) { if (this._settings_proxy[i].valid) { j++; if (j == visible_index) { this._settings_proxy.splice(i, 1); break; } } } } _move_launcher_in_proxy(launcher, new_index) { let proxy_member; for (let i = 0; i < this._settings_proxy.length; i++) { if (this._settings_proxy[i].launcher == launcher) { proxy_member = this._settings_proxy.splice(i, 1)[0]; break; } } if (!proxy_member) return; this._insert_proxy_member(proxy_member, new_index); } _insert_proxy_member(member, visible_index) { if (visible_index == -1) { this._settings_proxy.push(member); return; } let j = -1; for (let i = 0; i < this._settings_proxy.length; i++) { if (this._settings_proxy[i].valid) { j++; if (j == visible_index) { this._settings_proxy.splice(i, 0, member); return; } } } if (visible_index == j + 1) this._settings_proxy.push(member); } _loadLauncher(path) { let appSys = Cinnamon.AppSystem.get_default(); let app = appSys.lookup_app(path); let appinfo = null; if (!app) { appinfo = CMenu.DesktopAppInfo.new_from_filename(CUSTOM_LAUNCHERS_PATH + path); // Fallback to old launcher folder if (!appinfo) { appinfo = CMenu.DesktopAppInfo.new_from_filename(OLD_CUSTOM_LAUNCHERS_PATH + path); } if (!appinfo) { global.logWarning(`Failed to add launcher from path: ${path}`); return null; } } return new PanelAppLauncher(this, app, appinfo, this.orientation, this.icon_size); } on_panel_height_changed() { this.icon_size = this.getPanelIconSize(St.IconType.FULLCOLOR); this._reload(); } on_panel_icon_size_changed(size) { this.icon_size = size; this._reload(); } on_orientation_changed(neworientation) { this.orientation = neworientation; if (this.orientation == St.Side.TOP || this.orientation == St.Side.BOTTOM) { this.myactor.remove_style_class_name('vertical'); this.myactor.set_vertical(false); this.myactor.set_x_expand(false); this.myactor.set_y_expand(true); } else { this.myactor.add_style_class_name('vertical'); this.myactor.set_vertical(true); this.myactor.set_x_expand(true); this.myactor.set_y_expand(false); } this._reload(); } _reload() { this._launchers.forEach(l => l.destroy()); this._launchers = []; this._settings_proxy = []; for (let file of this.launcherList) { let launcher = this._loadLauncher(file); let proxyObj = { file: file, valid: false, launcher: null }; if (launcher) { this.myactor.add(launcher.actor); this._launchers.push(launcher); proxyObj.valid = true; proxyObj.launcher = launcher; } this._settings_proxy.push(proxyObj); } } removeLauncher(launcher, delete_file) { let i = this._launchers.indexOf(launcher); if (i >= 0) { launcher.destroy(); this._launchers.splice(i, 1); this._remove_launcher_from_proxy(i); } if (delete_file) { let appid = launcher.getId(); let file = Gio.file_new_for_path(CUSTOM_LAUNCHERS_PATH + appid); if (file.query_exists(null)) file.delete(null); let old_file = Gio.file_new_for_path(OLD_CUSTOM_LAUNCHERS_PATH + appid); if (old_file.query_exists(null)) old_file.delete(null); } this.sync_settings_proxy_to_settings(); } acceptNewLauncher(path) { this.addForeignLauncher(path, -1); } addForeignLauncher(path, position) { let newLauncher = this._loadLauncher(path); if (!newLauncher) return; this.myactor.insert_child_at_index(newLauncher.actor, position); this._launchers.splice(position, 0, newLauncher); this._insert_proxy_member({ file: path, valid: true, launcher: newLauncher }, position); this.sync_settings_proxy_to_settings(); } showAddLauncherDialog(timestamp, launcher){ if (launcher) { Util.spawnCommandLine("cinnamon-desktop-editor -mcinnamon-launcher --icon-size %d -f %s %s" .format(this.icon_size, launcher.getId(), this.settings.file.get_path())); } else { Util.spawnCommandLine("cinnamon-desktop-editor -mcinnamon-launcher --icon-size %d %s" .format(this.icon_size, this.settings.file.get_path())) } } _reinsertAtIndex(launcher, newIndex) { let originalIndex = this._launchers.indexOf(launcher); if (originalIndex == -1) return; if (originalIndex != newIndex) { this.myactor.set_child_at_index(launcher.actor, newIndex); this._launchers.splice(originalIndex, 1); this._launchers.splice(newIndex, 0, launcher); this._move_launcher_in_proxy(launcher, newIndex); this.sync_settings_proxy_to_settings(); } } // backwards compatibility passthrough method for launcher code expecting DND on applet _clearDragPlaceholder(skipAnimation=false) { this.launchersBox._clearDragPlaceholder(skipAnimation); } } Signals.addSignalMethods(CinnamonPanelLaunchersApplet.prototype); function main(metadata, orientation, panel_height, instance_id) { return new CinnamonPanelLaunchersApplet(metadata, orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/metadata.json0000664000175000017500000000032215167446463030732 0ustar fabiofabio{ "uuid": "panel-launchers@cinnamon.org", "name": "Panel launchers", "description": "Launch applications from the panel", "icon": "cinnamon-panel-launcher", "role": "panellauncher", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/settings-schema.json0000664000175000017500000000055515167446463032260 0ustar fabiofabio{ "section1": { "type": "section", "description": "Behavior" }, "launcherList": { "type": "generic", "default": ["firefox.desktop", "org.gnome.Terminal.desktop", "nemo.desktop"] }, "allow-dragging": { "type": "switch", "default": true, "description": "Allow dragging of launchers" } } cinnamon-6.6.8/files/usr/share/cinnamon/applets/power@cinnamon.org/0000775000175000017500000000000015167446463024335 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js0000664000175000017500000010114415167446463026161 0ustar fabiofabioconst Applet = imports.ui.applet; const Clutter = imports.gi.Clutter; const Gio = imports.gi.Gio; const Interfaces = imports.misc.interfaces const Lang = imports.lang; const St = imports.gi.St; const Tooltips = imports.ui.tooltips; const UPowerGlib = imports.gi.UPowerGlib; const PopupMenu = imports.ui.popupMenu; const Main = imports.ui.main; const Settings = imports.ui.settings; const BrightnessBusName = "org.cinnamon.SettingsDaemon.Power.Screen"; const KeyboardBusName = "org.cinnamon.SettingsDaemon.Power.Keyboard"; const CSD_BACKLIGHT_NOT_SUPPORTED_CODE = 1; const PANEL_EDIT_MODE_KEY = "panel-edit-mode"; const { DeviceKind: UPDeviceKind, DeviceLevel: UPDeviceLevel, DeviceState: UPDeviceState, Device: UPDevice } = UPowerGlib const POWER_PROFILES = { "power-saver": _("Power Saver"), "balanced": _("Balanced"), "performance": _("Performance") }; function deviceLevelToString(level) { switch (level) { case UPDeviceLevel.FULL: return _("Battery full"); case UPDeviceLevel.HIGH: return _("Battery almost full"); case UPDeviceLevel.NORMAL: return _("Battery good"); case UPDeviceLevel.LOW: return _("Low battery"); case UPDeviceLevel.CRITICAL: return _("Critically low battery"); default: return _("Unknown"); } } function deviceKindToString(kind) { switch (kind) { case UPDeviceKind.LINE_POWER: return _("AC adapter"); case UPDeviceKind.BATTERY: return _("Laptop battery"); case UPDeviceKind.UPS: return _("UPS"); case UPDeviceKind.MONITOR: return _("Monitor"); case UPDeviceKind.MOUSE: return _("Mouse"); case UPDeviceKind.KEYBOARD: return _("Keyboard"); case UPDeviceKind.PDA: return _("PDA"); case UPDeviceKind.PHONE: return _("Cell phone"); case UPDeviceKind.MEDIA_PLAYER: return _("Media player"); case UPDeviceKind.TABLET: return _("Tablet"); case UPDeviceKind.COMPUTER: return _("Computer"); case UPDeviceKind.GAMING_INPUT: return _("Gaming input"); case UPDeviceKind.PEN: return _("Pen"); case UPDeviceKind.TOUCHPAD: return _("Touchpad"); case UPDeviceKind.MODEM: return _("Modem"); case UPDeviceKind.NETWORK: return _("Network"); case UPDeviceKind.HEADSET: return _("Headset"); case UPDeviceKind.SPEAKERS: return _("Speakers"); case UPDeviceKind.HEADPHONES: return _("Headphones"); case UPDeviceKind.VIDEO: return _("Video"); case UPDeviceKind.OTHER_AUDIO: return _("Audio device"); case UPDeviceKind.REMOTE_CONTROL: return _("Remote control"); case UPDeviceKind.PRINTER: return _("Printer"); case UPDeviceKind.SCANNER: return _("Scanner"); case UPDeviceKind.CAMERA: return _("Camera"); case UPDeviceKind.WEARABLE: return _("Wearable"); case UPDeviceKind.TOY: return _("Toy"); case UPDeviceKind.BLUETOOTH_GENERIC: return _("Bluetooth device"); default: { try { return UPDevice.kind_to_string(kind).replaceAll("-", " ").capitalize(); } catch { return _("Unknown"); } } } } function deviceKindToIcon(kind, icon) { switch (kind) { case UPDeviceKind.MONITOR: return ("xsi-video-display"); case UPDeviceKind.MOUSE: return ("xsi-input-mouse"); case UPDeviceKind.KEYBOARD: return ("xsi-input-keyboard"); case UPDeviceKind.PHONE: case UPDeviceKind.MEDIA_PLAYER: return ("xsi-phone-apple-iphone"); case UPDeviceKind.TABLET: return ("xsi-input-tablet"); case UPDeviceKind.COMPUTER: return ("xsi-computer"); case UPDeviceKind.GAMING_INPUT: return ("xsi-input-gaming"); case UPDeviceKind.TOUCHPAD: return ("xsi-input-touchpad"); case UPDeviceKind.HEADSET: return ("xsi-audio-headset"); case UPDeviceKind.SPEAKERS: return ("xsi-audio-speakers"); case UPDeviceKind.HEADPHONES: return ("xsi-audio-headphones"); case UPDeviceKind.PRINTER: return ("xsi-printer"); case UPDeviceKind.SCANNER: return ("xsi-scanner"); case UPDeviceKind.CAMERA: return ("xsi-camera-photo"); default: if (icon) { return icon; } else { return ("xsi-battery-level-100"); } } } function reportsPreciseLevels(battery_level) { return battery_level == UPDeviceLevel.NONE; } class DeviceItem extends PopupMenu.PopupBaseMenuItem { constructor(device, status, aliases) { super({ reactive: false }); let [device_id, vendor, model, device_kind, icon, percentage, state, battery_level, time] = device; this._box = new St.BoxLayout({ style_class: 'popup-device-menu-item' }); this._vbox = new St.BoxLayout({ style_class: 'popup-device-menu-item', vertical: true }); let description = deviceKindToString(device_kind); if (vendor != "" || model != "") { description = "%s %s".format(vendor, model); } for (let i = 0; i < aliases.length; ++i) { let alias = aliases[i]; try { let parts = alias.split(':='); if (parts[0] == device_id) { description = parts[1]; } } catch (e) { // ignore malformed aliases global.logError(alias); } } let statusLabel = null; if (battery_level == UPDeviceLevel.NONE) { this.label = new St.Label({ text: "%s %d%%".format(description, Math.round(percentage)) }); statusLabel = new St.Label({ text: "%s".format(status), style_class: 'popup-inactive-menu-item' }); } else { this.label = new St.Label({ text: "%s".format(description) }); statusLabel = new St.Label({ text: "%s".format(deviceLevelToString(battery_level)), style_class: 'popup-inactive-menu-item' }); } let device_icon = deviceKindToIcon(device_kind, icon); if (device_icon == icon) { this._icon = new St.Icon({ gicon: Gio.icon_new_for_string(icon), icon_type: St.IconType.SYMBOLIC, style_class: 'popup-menu-icon' }); } else { this._icon = new St.Icon({ icon_name: device_icon, icon_type: St.IconType.SYMBOLIC, icon_size: 16 }); } this._box.add_actor(this._icon); this._box.add_actor(this.label); this._vbox.add_actor(this._box); this._vbox.add_actor(statusLabel); this.addActor(this._vbox); } } class BrightnessSlider extends PopupMenu.PopupSliderMenuItem { constructor(applet, label, icon, busName, minimum_value) { super(0); this.actor.hide(); this._applet = applet; this._seeking = false; this._minimum_value = minimum_value; this._step = .05; this.connect("drag-begin", Lang.bind(this, function () { this._seeking = true; })); this.connect("drag-end", Lang.bind(this, function () { this._seeking = false; })); this.icon = new St.Icon({ icon_name: icon, icon_type: St.IconType.SYMBOLIC, icon_size: 16 }); this.removeActor(this._slider); this.addActor(this.icon, { span: 0 }); this.addActor(this._slider, { span: -1, expand: true }); this.label = label; this.tooltipText = label; this.tooltip = new Tooltips.Tooltip(this.actor, this.tooltipText); Interfaces.getDBusProxyAsync(busName, Lang.bind(this, function (proxy, error) { this._proxy = proxy; this._proxy.GetPercentageRemote(Lang.bind(this, this._dbusAcquired)); })); } _dbusAcquired(b, error) { if (error) return; try { this._proxy.GetStepRemote((step, error) => { if (error != null) { if (error.code != CSD_BACKLIGHT_NOT_SUPPORTED_CODE) { global.logError(`Could not get backlight step for ${busName}: ${error.message}`); return; } else { this._step = .05; } } this._step = (step / 100); }); } catch (e) { this._step = .05; } this._updateBrightnessLabel(b); this.setValue(b / 100); this.connect("value-changed", Lang.bind(this, this._sliderChanged)); this.actor.show(); //get notified this._proxy.connectSignal('Changed', Lang.bind(this, this._getBrightness)); this._applet.menu.connect("open-state-changed", Lang.bind(this, this._getBrightnessForcedUpdate)); } _sliderChanged(slider, value) { if (value < this._minimum_value) { value = this._minimum_value; } let i = this._minimum_value; let v = value; let step = this._step; while (i < 1.0) { if (v > (i + step)) { i = i + step; continue; } if (((i + step) - v) < (v - i)) { v = i + step; } else { v = i; } break; } this.setValue(v); // A non-zero minimum brightness can cause our stepped value // to exceed 100, making the slider jitter (because c-s-d rejects // the value) this._setBrightness(Math.min(100, Math.round(v * 100))); } _getBrightness() { //This func is called when dbus signal is received. //Only update items value when slider is not used if (!this._seeking) this._getBrightnessForcedUpdate(); } _getBrightnessForcedUpdate() { this._proxy.GetPercentageRemote(Lang.bind(this, function (b) { this._updateBrightnessLabel(b); this.setValue(b / 100); })); } _setBrightness(value) { this._proxy.SetPercentageRemote(value, Lang.bind(this, function (b) { this._updateBrightnessLabel(b); })); } _updateBrightnessLabel(value) { this.tooltipText = this.label; if (value) this.tooltipText += ": " + value + "%"; this.tooltip.set_text(this.tooltipText); if (this._dragging) this.tooltip.show(); } /* Overriding PopupSliderMenuItem so we can modify the scroll step */ _onScrollEvent(actor, event) { let direction = event.get_scroll_direction(); if (direction == Clutter.ScrollDirection.DOWN) { this._proxy.StepDownRemote(function () { }); } else if (direction == Clutter.ScrollDirection.UP) { this._proxy.StepUpRemote(function () { }); } this._slider.queue_repaint(); } } class CinnamonPowerApplet extends Applet.TextIconApplet { constructor(metadata, orientation, panel_height, instanceId) { super(orientation, panel_height, instanceId); this.setAllowedLayout(Applet.AllowedLayout.BOTH); this.metadata = metadata; this.settings = new Settings.AppletSettings(this, metadata.uuid, instanceId); Main.systrayManager.registerTrayIconReplacement("power", metadata.uuid); Main.systrayManager.registerTrayIconReplacement("battery", metadata.uuid); this.menuManager = new PopupMenu.PopupMenuManager(this); this.menu = new Applet.AppletPopupMenu(this, orientation); this.menuManager.addMenu(this.menu); this.aliases = global.settings.get_strv("device-aliases"); this._deviceItems = []; this._devices = []; this._primaryDeviceId = null; this.panel_icon_name = ''; // remember the panel icon name (so we only set it when it actually changes) this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.brightness = new BrightnessSlider(this, _("Brightness"), "display-brightness", BrightnessBusName, 0); this.keyboard = new BrightnessSlider(this, _("Keyboard backlight"), "keyboard-brightness", KeyboardBusName, 0); this.menu.addMenuItem(this.brightness); this.menu.addMenuItem(this.keyboard); try { // Hadess interface let PowerProfilesInterface = ` `; let PowerProfilesProxy = Gio.DBusProxy.makeProxyWrapper(PowerProfilesInterface); this._profilesProxy = new PowerProfilesProxy(Gio.DBus.system, "net.hadess.PowerProfiles", "/net/hadess/PowerProfiles"); // Upower if hadess doesn't work.. if (!this._profilesProxy.Profiles) { // UPower interface let PowerProfilesInterface = ` `; let PowerProfilesProxy = Gio.DBusProxy.makeProxyWrapper(PowerProfilesInterface); this._profilesProxy = new PowerProfilesProxy(Gio.DBus.system, "org.freedesktop.UPower.PowerProfiles", "/org/freedesktop/UPower/PowerProfiles"); } } catch { this._profilesProxy = null; } if (this._profilesProxy && this._profilesProxy.Profiles) { this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.contentSection = new PopupMenu.PopupMenuSection(); this.ActiveProfile = this._profilesProxy.ActiveProfile; this.Profiles = this._profilesProxy.Profiles; this._proxyId = this._profilesProxy.connect("g-properties-changed", (proxy, changed, invalidated) => { for (let [changedProperty, changedValue] of Object.entries(changed.deepUnpack())) { if (["ActiveProfile", "Profiles"].includes(changedProperty)) this[changedProperty] = changedValue.deepUnpack(); this._updateProfile(); } }); this._updateProfile(); } this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addSettingsAction(_("Power Settings"), 'power'); this.actor.connect("scroll-event", Lang.bind(this, this._onScrollEvent)); this._proxy = null; global.settings.connect('changed::' + PANEL_EDIT_MODE_KEY, Lang.bind(this, this._onPanelEditModeChanged)); this.csd_power_watch_id = Gio.bus_watch_name(Gio.BusType.SESSION, "org.cinnamon.SettingsDaemon.Power", 0, (c, name) => { Interfaces.getDBusProxyAsync("org.cinnamon.SettingsDaemon.Power", Lang.bind(this, function (proxy, error) { Gio.bus_unwatch_name(this.csd_power_watch_id); this.csd_power_watch_id = 0; if (error) { global.logError("Could not connect to csd-power", error.message); return; } this._proxy = proxy; this._proxy.connect("g-properties-changed", Lang.bind(this, this._devicesChanged)); global.settings.connect('changed::device-aliases', Lang.bind(this, this._on_device_aliases_changed)); this.settings.bind("labelinfo", "labelinfo", this._devicesChanged); this.settings.bind("showmulti", "showmulti", this._devicesChanged); this._devicesChanged(); })); }, null); this.set_show_label_in_vertical_panels(false); } _onPanelEditModeChanged() { if (global.settings.get_boolean(PANEL_EDIT_MODE_KEY)) { if (!this.actor.visible) { this.set_applet_icon_symbolic_name("xsi-battery-missing"); this.set_applet_enabled(true); } } else { this._devicesChanged(); } } _on_device_aliases_changed() { this.aliases = global.settings.get_strv("device-aliases"); this._devicesChanged(); } _onButtonPressEvent(actor, event) { //toggle keyboard brightness on middle click if (event.get_button() === 2) { this.keyboard._proxy.ToggleRemote(function () { }); } return Applet.Applet.prototype._onButtonPressEvent.call(this, actor, event); } on_applet_clicked(event) { this.menu.toggle(); } _onScrollEvent(actor, event) { //adjust screen brightness on scroll let direction = event.get_scroll_direction(); if (direction == Clutter.ScrollDirection.UP) { this.brightness._proxy.StepUpRemote(function () { }); } else if (direction == Clutter.ScrollDirection.DOWN) { this.brightness._proxy.StepDownRemote(function () { }); } this.brightness._getBrightnessForcedUpdate(); } _getDeviceStatus(device) { let status = ""; let [device_id, vendor, model, device_kind, icon, percentage, state, battery_level, seconds] = device; let time = Math.round(seconds / 60); let minutes = time % 60; let hours = Math.floor(time / 60); if (state == UPDeviceState.UNKNOWN) { status = ""; } else if (state == UPDeviceState.CHARGING) { if (time == 0) { status = _("Charging"); } else if (time >= 60) { if (minutes == 0) { status = ngettext("Charging - %d hour until fully charged", "Charging - %d hours until fully charged", hours).format(hours); } else { /* Translators: this is a time string, as in "%d hours %d minutes remaining" */ let template = _("Charging - %d %s %d %s until fully charged"); status = template.format(hours, ngettext("hour", "hours", hours), minutes, ngettext("minute", "minutes", minutes)); } } else { status = ngettext("Charging - %d minute until fully charged", "Charging - %d minutes until fully charged", minutes).format(minutes); } } else if (state == UPDeviceState.FULLY_CHARGED) { status = _("Fully charged"); } else if (state == UPDeviceState.DISCHARGING) { if (time == 0) { status = _("Using battery power"); } else if (time >= 60) { if (minutes == 0) { status = ngettext("Using battery power - %d hour remaining", "Using battery power - %d hours remaining", hours).format(hours); } else { /* Translators: this is a time string, as in "%d hours %d minutes remaining" */ let template = _("Using battery power - %d %s %d %s remaining"); status = template.format(hours, ngettext("hour", "hours", hours), minutes, ngettext("minute", "minutes", minutes)); } } else { status = ngettext("Using battery power - %d minute remaining", "Using battery power - %d minutes remaining", minutes).format(minutes); } } else if (state == UPDeviceState.EMPTY) { status = _("Fully discharged"); } else { status = _("Not charging"); } return status; } on_panel_height_changed() { if (this._proxy) this._devicesChanged(); } showDeviceInPanel(device) { let [device_id, vendor, model, device_kind, icon, percentage, state, battery_level, seconds] = device; let status = this._getDeviceStatus(device); this.set_applet_tooltip(status); let labelText = ""; if (this.labelinfo == "nothing") { ; } else if (this.labelinfo == "time" && seconds != 0) { let time = Math.round(seconds / 60); let minutes = time % 60; let hours = Math.floor(time / 60); labelText = C_("time of battery remaining", "%d:%02d").format(hours, minutes); } else if (this.labelinfo == "percentage" || (this.labelinfo == "percentage_time" && seconds == 0)) { labelText = C_("percent of battery remaining", "%d%%").format(Math.round(percentage)); } else if (this.labelinfo == "percentage_time") { let time = Math.round(seconds / 60); let minutes = Math.floor(time % 60); let hours = Math.floor(time / 60); labelText = C_("percent of battery remaining", "%d%%").format(Math.round(percentage)) + " (" + C_("time of battery remaining", "%d:%02d").format(hours, minutes) + ")"; } this.set_applet_label(labelText); if (icon) { if (this.panel_icon_name != icon) { this.panel_icon_name = icon; this.set_applet_icon_symbolic_name('xsi-battery-level-100'); let gicon = Gio.icon_new_for_string(icon); this._applet_icon.gicon = gicon; } } else { if (this.panel_icon_name != 'xsi-battery-level-100') { this.panel_icon_name = 'xsi-battery-level-100'; this.set_applet_icon_symbolic_name('xsi-battery-level-100'); } } this._applet_icon.set_style_class_name('system-status-icon'); } _updateProfile() { this.contentSection.removeAll(); for (let profileNum = 0; profileNum < this.Profiles.length; profileNum++) { let profileName = this.Profiles[profileNum].Profile.unpack(); let item; if (profileName == this.ActiveProfile) { this.profileIndex = profileNum; item = new PopupMenu.PopupMenuItem(POWER_PROFILES[profileName], { style_class: 'popup-device-menu-item', reactive: false }); item.setShowDot(true); } else { item = new PopupMenu.PopupMenuItem(POWER_PROFILES[profileName]); item.connect("activate", Lang.bind(this, function () { this._changeProfile(profileName); this.menu.toggle(); })); } this.contentSection.addMenuItem(item); } this.menu.addMenuItem(this.contentSection); } _changeProfile(newProfile) { this._profilesProxy.ActiveProfile = newProfile; this.ActiveProfile = this._profilesProxy.ActiveProfile; } _devicesChanged() { this._devices = []; this._primaryDevice = null; this._primaryDeviceId = null; if (!this._proxy) return; // Identify the primary battery device this._proxy.GetPrimaryDeviceRemote(Lang.bind(this, function (device, error) { if (error) { this._primaryDeviceId = null; } else { if (device.length == 1) { // Primary Device can be an array of primary devices rather than a single device, in that case, take the first one. device = device[0]; } let [device_id, vendor, model, device_kind, icon, percentage, state, battery_level, seconds] = device this._primaryDeviceId = device_id; } // Scan battery devices this._proxy.GetDevicesRemote(Lang.bind(this, function (result, error) { this._deviceItems.forEach(function (i) { i.destroy(); }); this._deviceItems = []; let devices_stats = []; let pct_support_count = 0; let _devices = []; let _deviceItems = []; if (!error) { let devices = result[0]; let position = 0; for (let i = 0; i < devices.length; i++) { let [device_id, vendor, model, device_kind, icon, percentage, state, battery_level, seconds] = devices[i]; // Ignore LINE_POWER devices if (device_kind == UPDeviceKind.LINE_POWER) continue; // Ignore devices which state is unknown if (state == UPDeviceState.UNKNOWN) continue; if (reportsPreciseLevels(battery_level)) { // Devices that give accurate % charge will return this for battery level. pct_support_count++; } let stats = "%s (%d%%)".format(deviceKindToString(device_kind), percentage); devices_stats.push(stats); _devices.push(devices[i]); if (this._primaryDeviceId == null || this._primaryDeviceId == device_id) { // Info for the primary battery (either the primary device, or any battery device if there is no primary device) if (device_kind == UPDeviceKind.BATTERY && this._primaryDevice == null) { this._primaryDevice = devices[i]; } } let status = this._getDeviceStatus(devices[i]); let item = new DeviceItem(devices[i], status, this.aliases); this.menu.addMenuItem(item, position); _deviceItems.push(item); position++; } } else { global.logError(error); } this._devices = _devices; this._deviceItems = _deviceItems; // The menu is built. Below, we update the information present in the panel (icon, tooltip and label) this.set_applet_enabled(true); let panel_device = null; // Things should only ever be in the panel if they provide accurate reporting (percentages), otherwise // they're probably not likely to drain quickly enough to merit showing except on demand, in the popup menu. // One or more devices, one is a real battery, and multi-device is disabled if (this._primaryDevice != null && (!this.showmulti || (this._devices.length === 1) && pct_support_count === 1)) { this.showDeviceInPanel(this._primaryDevice); } else { // One device, not marked primary, but has accurate reporting (not sure this will ever happen). if (this._devices.length === 1 && pct_support_count === 1) { this.showDeviceInPanel(this._devices[0]); } else if (this._devices.length > 0) { // Show a summary let labelText = ""; if (this.labelinfo !== "nothing") { let num = 0; for (let i = 0; i < this._devices.length; i++) { let [, , , , , percentage, , battery_level, seconds] = this._devices[i]; // Skip devices without accurate reporting if (!reportsPreciseLevels(battery_level)) { continue; } // Only number them if we'll have multiple items if (pct_support_count > 1) { labelText += (num++) + ': '; } if (this.labelinfo == "time" && seconds !== 0) { let time = Math.round(seconds / 60); let minutes = time % 60; let hours = Math.floor(time / 60); labelText += C_("time of battery remaining", "%d:%02d").format(hours, minutes); } else if (this.labelinfo == "percentage" || (this.labelinfo == "percentage_time" && seconds === 0)) { labelText += C_("percent of battery remaining", "%d%%").format(Math.round(percentage)); } else if (this.labelinfo == "percentage_time") { let time = Math.round(seconds / 60); let minutes = Math.floor(time % 60); let hours = Math.floor(time / 60); labelText += C_("percent of battery remaining", "%d%%").format(Math.round(percentage)) + " (" + C_("time of battery remaining", "%d:%02d").format(hours, minutes) + ")"; } // Only add a gap if we have remaining valid devices to show. if (num < pct_support_count) { labelText += ' '; } } } this.set_applet_tooltip(devices_stats.join(", ")); this.set_applet_label(labelText); let icon = this._proxy.Icon; if (icon) { if (icon != this.panel_icon_name) { this.panel_icon_name = icon; this.set_applet_icon_symbolic_name('xsi-battery-level-100'); let gicon = Gio.icon_new_for_string(icon); this._applet_icon.gicon = gicon; } } else { if (this.panel_icon_name != 'xsi-battery-level-100') { this.panel_icon_name = 'xsi-battery-level-100'; this.set_applet_icon_symbolic_name('xsi-battery-level-100'); } } } else { // If there are no battery devices, show brightness info or disable the applet this.set_applet_label(""); if (this.brightness.actor.visible) { // Show the brightness info this.set_applet_tooltip(_("Brightness")); this.panel_icon_name = 'xsi-display-brightness'; this.set_applet_icon_symbolic_name('xsi-display-brightness'); } else if (this.keyboard.actor.visible) { // Show the brightness info this.set_applet_tooltip(_("Keyboard backlight")); this.panel_icon_name = 'xsi-keyboard-brightness'; this.set_applet_icon_symbolic_name('xsi-keyboard-brightness'); } else { // Disable the applet this.set_applet_enabled(false); } } } })); })); } on_applet_removed_from_panel() { Main.systrayManager.unregisterTrayIconReplacement(this.metadata.uuid); if (!this._profilesProxy) return; if (this._proxyId) this._profilesProxy.disconnect(this._proxyId); } } function main(metadata, orientation, panel_height, instanceId) { return new CinnamonPowerApplet(metadata, orientation, panel_height, instanceId); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/power@cinnamon.org/metadata.json0000664000175000017500000000020515167446463027005 0ustar fabiofabio{ "uuid": "power@cinnamon.org", "name": "Power Manager", "description": "Cinnamon power management applet", "icon": "cs-power" } cinnamon-6.6.8/files/usr/share/cinnamon/applets/power@cinnamon.org/settings-schema.json0000664000175000017500000000114415167446463030326 0ustar fabiofabio{ "labelinfo": { "type": "combobox", "description": "Display", "default": "nothing", "options" : { "Show percentage": "percentage", "Show time remaining": "time", "Show percentage and time remaining": "percentage_time", "Hide label": "nothing" } }, "showmulti" : { "type" : "switch", "default" : false, "description": "Always show all batteries", "tooltip": "Check this to always show multiple batteries in the panel, regardless of whether one of them is marked primary." } } cinnamon-6.6.8/files/usr/share/cinnamon/applets/printers@cinnamon.org/0000775000175000017500000000000015167446463025047 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/printers@cinnamon.org/applet.js0000664000175000017500000002701515167446463026677 0ustar fabiofabioconst Applet = imports.ui.applet; const Lang = imports.lang; const Gio = imports.gi.Gio; const PopupMenu = imports.ui.popupMenu; const Mainloop = imports.mainloop; const Settings = imports.ui.settings; const St = imports.gi.St; const Util = imports.misc.util; const PANEL_EDIT_MODE_KEY = "panel-edit-mode"; const APPLET_PATH = imports.ui.appletManager.appletMeta['printers@cinnamon.org'].path; class CinnamonPrintersApplet extends Applet.TextIconApplet { constructor(metadata, orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.setAllowedLayout(Applet.AllowedLayout.BOTH); this._cupsSignal = Gio.DBus.system.signal_subscribe(null, 'org.cups.cupsd.Notifier', null, '/org/cups/cupsd/Notifier', null, Gio.DBusSignalFlags.NONE, this.onCupsSignal.bind(this)); this.set_applet_tooltip(_("Printers")); this.menu = new Applet.AppletPopupMenu(this, orientation); this.menu.connect('open-state-changed', Lang.bind(this, this.onMenuOpened)); this.menuManager = new PopupMenu.PopupMenuManager(this); this.menuManager.addMenu(this.menu); this.settings = new Settings.AppletSettings(this, metadata.uuid, instance_id); this.settings.bind('show-icon', 'show_icon', this.update); this.panelEditModeHandler = global.settings.connect('changed::' + PANEL_EDIT_MODE_KEY, Lang.bind(this, this._on_panel_edit_mode_changed)); this.jobsCount = 0; this.printersCount = 0; this.printWarning = false; this.printStatus = ''; this.updating = false; this.showLater = false; this.printers = []; this.set_applet_icon_symbolic_name('xsi-printer'); this.update(); } on_applet_clicked() { if(!this.menu.isOpen && this.updating) { this.showLater = true; return; } this.menu.toggle(); if(!this.printWarning && !this.menu.isOpen) { this.update(); } } on_applet_removed_from_panel() { this.settings.finalize(); global.settings.disconnect(this.panelEditModeHandler); } _on_panel_edit_mode_changed () { if (global.settings.get_boolean(PANEL_EDIT_MODE_KEY)) { this.actor.show(); } else { this.update(); } } onCupsSignal() { if(this.printWarning) return; this.printWarning = true; Mainloop.timeout_add_seconds(3, Lang.bind(this, this.warningTimeout)); this.update(); } warningTimeout() { this.printWarning = false; this.update(); } onMenuOpened() { if(this.sendSubMenu != null) { this.sendSubMenu.close(); this.sendSubMenu.open(); } if(this.cancelSubMenu != null) { this.cancelSubMenu.close(); this.cancelSubMenu.open(); } if(this.sendSubMenu != null) { this.sendSubMenu.close(); } } onShowPrintersClicked() { Util.spawn(['system-config-printer']); } onShowJobsClicked(item) { Util.spawn(['system-config-printer', '--show-jobs', item.label.text]); } onCancelAllJobsClicked() { Util.spawn_async(['python3', APPLET_PATH + '/cancel-print-dialog.py', 'all'], Lang.bind(this, function(out) { if(out.trim() == "Cancel") { for(var n = 0; n < this.printers.length; n++) { Util.spawn(['cancel', '-a', this.printers[n]]); } } })); } onCancelJobClicked(item) { Util.spawn_async(['python3', APPLET_PATH + '/cancel-print-dialog.py'], Lang.bind(this, function(out) { if(out.trim() == "Cancel") { Util.spawn(['cancel', item.job]); } })); } onSendToFrontClicked(item) { Util.spawn(['lp', '-i', item.job, '-q 100']); } update() { if(this.updating || this.menu.isOpen) return; this.updating = true; this.jobsCount = 0; this.printersCount = 0; this.menu.removeAll(); let printers = new PopupMenu.PopupIconMenuItem(_("Printers"), 'xsi-printer', St.IconType.SYMBOLIC); printers.connect('activate', Lang.bind(this, this.onShowPrintersClicked)); this.menu.addMenuItem(printers); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem); //Add Printers Util.spawn_async(['python3', APPLET_PATH + '/lpstat-a.py'], Lang.bind(this, function(out) { this.printers = []; Util.spawn_async(['/usr/bin/lpstat', '-d'], Lang.bind(this, function(out2) {//To check default printer if(out2.split(': ')[1] != undefined) { out2 = out2.split(': ')[1].trim(); } else { out2 = 'no default'; } out = out.split('\n'); if(out.includes('No printers available!')) { out = [] } this.printersCount = out.length - 2; for(var n = 0; n < this.printersCount; n++) { let printer = out[n].split(' ')[0].trim(); this.printers.push(printer); let printerItem = new PopupMenu.PopupIconMenuItem(printer, 'xsi-emblem-documents', St.IconType.SYMBOLIC); if(out2.toString() == printer.toString()) { printerItem.addActor(new St.Icon({ style_class: 'popup-menu-icon', icon_name: 'xsi-emblem-default', icon_type: St.IconType.SYMBOLIC })); } printerItem.connect('activate', Lang.bind(printerItem, this.onShowJobsClicked)); this.menu.addMenuItem(printerItem); } this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem); //Add Jobs Util.spawn_async(['/usr/bin/lpstat', '-o'], Lang.bind(this, function(out) { //Cancel all Jobs if(out.length > 0) { let cancelAll = new PopupMenu.PopupIconMenuItem(_("Cancel all jobs"), 'xsi-edit-delete', St.IconType.SYMBOLIC); cancelAll.connect('activate', Lang.bind(this, this.onCancelAllJobsClicked)); this.menu.addMenuItem(cancelAll); let _cancelSubMenu = new PopupMenu.PopupSubMenuMenuItem(null); _cancelSubMenu.actor.set_style_class_name(''); this.cancelSubMenu = _cancelSubMenu.menu; this.menu.addMenuItem(_cancelSubMenu); } //Cancel Job out = out.split(/\n/); this.jobsCount = out.length - 1; Util.spawn_async(['/usr/bin/lpstat', '-o'], Lang.bind(this, function(out2) { out2 = out2.replace(/\n/g, ' ').split(/\s+/); let sendJobs = []; for(var n = 0; n < out.length - 1; n++) { let line = out[n].split(' ')[0].split('-'); let job = line.slice(-1)[0]; let printer = line.slice(0, -1).join('-'); let doc = out2[out2.indexOf(job) + 1]; for(var m = out2.indexOf(job) + 2; m < out2.length - 1; m++) { if(isNaN(out2[m]) || out2[m + 1] != 'bytes') { doc = doc + ' ' + out2[m]; } else { break; } } if(doc.length > 30) { doc = doc + '...'; } let text = '(' + job + ') ' + _("'%s' on %s").format(doc, printer); let jobItem = new PopupMenu.PopupIconMenuItem(text, 'xsi-edit-delete', St.IconType.SYMBOLIC); if(out2[out2.indexOf(job) - 2] == 'active') { jobItem.addActor(new St.Icon({ style_class: 'popup-menu-icon', icon_name: 'xsi-emblem-default', icon_type: St.IconType.SYMBOLIC })); } jobItem.job = job; jobItem.connect('activate', Lang.bind(jobItem, this.onCancelJobClicked)); this.cancelSubMenu.addMenuItem(jobItem); if(out2[out2.indexOf(job) - 2] != 'active' && out2[out2.indexOf(job) - 2] != '1st') { sendJobs.push(new PopupMenu.PopupIconMenuItem(text, 'xsi-go-up', St.IconType.SYMBOLIC)); sendJobs[sendJobs.length - 1].job = job; sendJobs[sendJobs.length - 1].connect('activate', Lang.bind(sendJobs[sendJobs.length - 1], this.onSendToFrontClicked)); } } //Send to Front if(sendJobs.length > 0) { let _sendSubMenu = new PopupMenu.PopupSubMenuMenuItem(_("Send to front")); this.sendSubMenu =_sendSubMenu.menu; for(var i = 0; i < sendJobs.length; i++) { this.sendSubMenu.addMenuItem(sendJobs[i]); } this.menu.addMenuItem(_sendSubMenu); } this.updating = false; if(this.cancelSubMenu != null) { this.cancelSubMenu.open(); } if(this.showLater) { this.showLater = false; this.menu.open(); } //Update Icon if(this.jobsCount > 0) { this.set_applet_label(this.jobsCount.toString()); } else { this.set_applet_label(''); } if(this.show_icon == 'always' || (this.show_icon == 'printers' && this.printersCount > 0) || (this.show_icon == 'jobs' && this.jobsCount > 0) || global.settings.get_boolean(PANEL_EDIT_MODE_KEY)) { this.actor.show(); } else { this.actor.hide(); } Util.spawn_async(['/usr/bin/lpstat', '-l'], Lang.bind(this, function(out) { if(out != '') { let printStatus = out.split('\n')[1].trim(); this.set_applet_tooltip(printStatus); } else { this.set_applet_tooltip(_("Printers")); } if(this.printWarning) { this.set_applet_icon_symbolic_name('xsi-printer-warning'); } else if(this.jobsCount > 0) { this.set_applet_icon_symbolic_name('xsi-printer-printing'); } else { this.set_applet_icon_symbolic_name('xsi-printer'); } })); })) })) })) })) } }; function main(metadata, orientation, panel_height, instance_id) { return new CinnamonPrintersApplet(metadata, orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/printers@cinnamon.org/cancel-print-dialog.py0000664000175000017500000000216015167446463031234 0ustar fabiofabio#!/usr/bin/python3 import sys import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk import gettext # i18n gettext.install("cinnamon", "/usr/share/locale") class CancelPrintJob: def __init__(self): self.message_dialog = Gtk.MessageDialog( parent=Gtk.Window(), type=Gtk.MessageType.QUESTION, title=window_title, message_format=message, buttons=Gtk.ButtonsType.NONE ) self.message_dialog.add_buttons(continue_button_text, True, cancel_button_text, False) response = self.message_dialog.run() if response: print("Continue") else: print("Cancel") self.message_dialog.destroy() if __name__ == "__main__": window_title = _("Cancel Job") message = _("Do you really want to cancel this job?") cancel_button_text = _("Cancel Job") continue_button_text = _("Keep Printing") if len(sys.argv) == 2 and sys.argv[1] == "all": message = _("Do you really want to cancel all jobs?") cancel_button_text = _("Cancel All Jobs") CancelPrintJob() cinnamon-6.6.8/files/usr/share/cinnamon/applets/printers@cinnamon.org/lpstat-a.py0000664000175000017500000000031115167446463027141 0ustar fabiofabio#!/usr/bin/python3 import subprocess try: print(subprocess.check_output(['/usr/bin/lpstat', '-a']).decode("utf-8")) except subprocess.CalledProcessError as e: print("No printers available!") cinnamon-6.6.8/files/usr/share/cinnamon/applets/printers@cinnamon.org/metadata.json0000664000175000017500000000021315167446463027516 0ustar fabiofabio{ "uuid": "printers@cinnamon.org", "name": "Printers", "description": "Manage print jobs", "icon": "cs-printer", "max-instances": -1 }cinnamon-6.6.8/files/usr/share/cinnamon/applets/printers@cinnamon.org/settings-schema.json0000664000175000017500000000061215167446463031037 0ustar fabiofabio{ "section1": { "type": "section", "description": "Appearance" }, "show-icon": { "type": "radiogroup", "default": "printers", "description": "Show printer icon", "options": { "Always": "always", "When printers exist": "printers", "When printing": "jobs"}, "tooltip": "Choose when to show the printer icon in the panel" } }cinnamon-6.6.8/files/usr/share/cinnamon/applets/recent@cinnamon.org/0000775000175000017500000000000015167446463024461 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/recent@cinnamon.org/applet.js0000664000175000017500000001261015167446463026304 0ustar fabiofabioconst Clutter = imports.gi.Clutter; const DocInfo = imports.misc.docInfo; const Gtk = imports.gi.Gtk; const Gio = imports.gi.Gio; const St = imports.gi.St; const PopupMenu = imports.ui.popupMenu; const Lang = imports.lang; const Applet = imports.ui.applet; const PRIVACY_SCHEMA = "org.cinnamon.desktop.privacy"; const REMEMBER_RECENT_KEY = "remember-recent-files"; const PANEL_EDIT_MODE_KEY = "panel-edit-mode"; class MyPopupMenuItem extends PopupMenu.PopupBaseMenuItem { constructor(icon, text, uri, params) { super(params); this.box = new St.BoxLayout({ style_class: 'popup-combobox-item' }); this.icon = icon; this.uri = uri; if (this.icon) { this.box.add(this.icon); } this.label = new St.Label({ text: text, y_align: Clutter.ActorAlign.CENTER, }); this.box.add(this.label); this.addActor(this.box); } }; class CinnamonRecentApplet extends Applet.IconApplet { constructor(orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.set_applet_icon_symbolic_name("xsi-document-open-recent"); this.set_applet_tooltip(_("Recent documents")); this.menuManager = new PopupMenu.PopupMenuManager(this); this.menu = new Applet.AppletPopupMenu(this, orientation); this.menuManager.addMenu(this.menu); this.mainContainer = new St.BoxLayout({ vertical: true }); this.menu.addActor(this.mainContainer); this.recentsScrollBox = new St.ScrollView({ x_fill: true, y_fill: false, y_align: St.Align.START }); this.recentsScrollBox.set_auto_scrolling(true); this.mainContainer.add(this.recentsScrollBox); this.recentsBox = new St.BoxLayout({ vertical:true }); this.recentsScrollBox.add_actor(this.recentsBox); this.recentsScrollBox.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC); this.RecentManager = DocInfo.getDocManager(); this.privacy_settings = new Gio.Settings( {schema_id: PRIVACY_SCHEMA} ); this._recentButtons = []; this._refreshRecents(); this.recent_id = this.RecentManager.connect('changed', Lang.bind(this, this._refreshRecents)); this.settings_id = this.privacy_settings.connect("changed::" + REMEMBER_RECENT_KEY, Lang.bind(this, this._refreshRecents)); global.settings.connect('changed::' + PANEL_EDIT_MODE_KEY, Lang.bind(this, this._on_panel_edit_mode_changed)); } _on_panel_edit_mode_changed () { if (global.settings.get_boolean(PANEL_EDIT_MODE_KEY)) { this.actor.show(); } else { this.actor.visible = this._recentButtons.length > 0; } } on_applet_removed_from_panel () { this.RecentManager.disconnect(this.recent_id); this.privacy_settings.disconnect(this.settings_id); } on_applet_clicked(event) { this.menu.toggle(); } _launchFile(a, b, c, uri) { this.menu.toggle(); Gio.app_info_launch_default_for_uri(uri, global.create_app_launch_context()); } _clearAll() { let GtkRecent = new Gtk.RecentManager(); GtkRecent.purge_items(); } destroy() { this.RecentManager.disconnectAll(); this.actor._delegate = null; this.menu.destroy(); this.actor.destroy(); this._recentButtons = null; this.emit('destroy'); } _refreshRecents() { // Clean content for (let i = 0; i < this._recentButtons.length; i ++) { this._recentButtons[i].destroy(); } this._recentButtons = []; if (this.privacy_settings.get_boolean(REMEMBER_RECENT_KEY)) { if (this.RecentManager._infosByTimestamp.length > 0) { let id = 0; while (id < this.RecentManager._infosByTimestamp.length) { let recent = this.RecentManager._infosByTimestamp[id]; let button = new MyPopupMenuItem(recent.createIcon(22), recent.name, recent.uri, {}); button.connect('activate', Lang.bind(this, this._launchFile, recent.uri)); this._recentButtons.push(button); this.recentsBox.add_child(button.actor); id++; } let separator = new PopupMenu.PopupSeparatorMenuItem(); this._recentButtons.push(separator); this.recentsBox.add_child(separator.actor); let icon = new St.Icon({ icon_name: 'xsi-edit-clear', icon_type: St.IconType.SYMBOLIC, icon_size: 22 }); let clear_button = new MyPopupMenuItem(icon, _("Clear list"), "clear", {}); clear_button.connect('activate', Lang.bind(this, this._clearAll)); this._recentButtons.push(clear_button); this.recentsBox.add_child(clear_button.actor); } else { let no_recents_button = new MyPopupMenuItem(null, _("No recent documents"), "no-recents", {}); this._recentButtons.push(no_recents_button); this.recentsBox.add_child(no_recents_button.actor); } this.actor.show(); } else { this.actor.hide(); } this._on_panel_edit_mode_changed(); } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonRecentApplet(orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/recent@cinnamon.org/metadata.json0000664000175000017500000000025415167446463027135 0ustar fabiofabio{ "uuid": "recent@cinnamon.org", "name": "Recent documents", "description": "Access the documents you recently opened", "icon": "folder-recent", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/removable-drives@cinnamon.org/0000775000175000017500000000000015167446463026447 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/removable-drives@cinnamon.org/applet.js0000664000175000017500000000607415167446463030301 0ustar fabiofabioconst Lang = imports.lang; const St = imports.gi.St; const GLib = imports.gi.GLib; const Gio = imports.gi.Gio; const Applet = imports.ui.applet; const Main = imports.ui.main; const PopupMenu = imports.ui.popupMenu; const PANEL_EDIT_MODE_KEY = "panel-edit-mode"; class DriveMenuItem extends PopupMenu.PopupBaseMenuItem { constructor(place, applet) { super(); this.place = place; this.applet = applet; this.label = new St.Label({ text: place.name }); this.addActor(this.label); let ejectIcon = new St.Icon({ icon_name: 'xsi-media-eject', icon_type: St.IconType.SYMBOLIC, style_class: 'popup-menu-icon ' }); let ejectButton = new St.Button({ child: ejectIcon }); ejectButton.connect('clicked', Lang.bind(this, this._eject)); this.addActor(ejectButton); } _eject() { this.applet.menu.toggle(); this.place.remove(); } activate(event) { this.place.launch({ timestamp: event.get_time() }); super.activate(event); } } class CinnamonRemovableDrivesApplet extends Applet.IconApplet { constructor(orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.set_applet_icon_symbolic_name("xsi-drive-removable-media"); this.set_applet_tooltip(_("Removable drives")); global.settings.connect('changed::' + PANEL_EDIT_MODE_KEY, Lang.bind(this, this._onPanelEditModeChanged)); this.menuManager = new PopupMenu.PopupMenuManager(this); this.menu = new Applet.AppletPopupMenu(this, orientation); this.menuManager.addMenu(this.menu); this._contentSection = new PopupMenu.PopupMenuSection(); this.menu.addMenuItem(this._contentSection); this._update(); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addAction(_("Open file manager"), function(event) { let homeFile = Gio.file_new_for_path(GLib.get_home_dir()); let homeUri = homeFile.get_uri(); Gio.app_info_launch_default_for_uri(homeUri, null); }); Main.placesManager.connect('mounts-updated', Lang.bind(this, this._update)); this._onPanelEditModeChanged(); } _onPanelEditModeChanged() { if (global.settings.get_boolean(PANEL_EDIT_MODE_KEY)) { this.actor.show(); } else { this._update(); } } on_applet_clicked(event) { this.menu.toggle(); } _update() { this._contentSection.removeAll(); let mounts = Main.placesManager.getMounts(); let any = false; for (let i = 0; i < mounts.length; i++) { if (mounts[i].isRemovable()) { this._contentSection.addMenuItem(new DriveMenuItem(mounts[i], this)); any = true; } } this.actor.visible = any; } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonRemovableDrivesApplet(orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/removable-drives@cinnamon.org/metadata.json0000664000175000017500000000025415167446463031123 0ustar fabiofabio{ "uuid": "removable-drives@cinnamon.org", "name": "Removable drives", "description": "Access removable drives", "icon": "gnome-device-manager", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/scale@cinnamon.org/0000775000175000017500000000000015167446463024270 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/scale@cinnamon.org/applet.js0000664000175000017500000000251415167446463026115 0ustar fabiofabioconst Applet = imports.ui.applet; const Lang = imports.lang; const Main = imports.ui.main; const Settings = imports.ui.settings; class CinnamonScaleApplet extends Applet.IconApplet { constructor(metadata, orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); try { this.set_applet_icon_symbolic_name("cinnamon-scale"); this.set_applet_tooltip(_("Scale")); this._hover_activates = false; this.settings = new Settings.AppletSettings(this, metadata.uuid, this.instance_id); this.settings.bind("activate-on-hover", "_hover_activates"); this.actor.connect('enter-event', Lang.bind(this, this._onEntered)); } catch (e) { global.logError(e); } } on_applet_clicked(event) { if (this._hover_activates) return; this.doAction(); } _onEntered(event) { if (!this._hover_activates || global.settings.get_boolean("panel-edit-mode")) return; this.doAction(); } doAction() { if (!Main.overview.animationInProgress) Main.overview.toggle(); } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonScaleApplet(metadata, orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/scale@cinnamon.org/icons/0000775000175000017500000000000015167446463025403 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/scale@cinnamon.org/icons/cinnamon-scale-symbolic.svg0000664000175000017500000000105715167446463032635 0ustar fabiofabio cinnamon-6.6.8/files/usr/share/cinnamon/applets/scale@cinnamon.org/metadata.json0000664000175000017500000000022715167446463026744 0ustar fabiofabio{ "uuid": "scale@cinnamon.org", "name": "Scale", "description": "Click or hover to activate Scale view", "icon": "cs-overview", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/scale@cinnamon.org/settings-schema.json0000664000175000017500000000017315167446463030262 0ustar fabiofabio{ "activate-on-hover": { "type": "switch", "default" : false, "description" : "Activate scale on hover" } } cinnamon-6.6.8/files/usr/share/cinnamon/applets/separator@cinnamon.org/0000775000175000017500000000000015167446463025201 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/separator@cinnamon.org/applet.js0000664000175000017500000000327715167446463027035 0ustar fabiofabioconst Applet = imports.ui.applet; const St = imports.gi.St; const Clutter = imports.gi.Clutter; class CinnamonSeparatorApplet extends Applet.Applet { constructor(orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.actor.style_class = 'applet-separator'; this.setAllowedLayout(Applet.AllowedLayout.BOTH); this.on_orientation_changed(orientation); } on_panel_height_changed() { this.on_orientation_changed(this.orientation); } on_orientation_changed(neworientation) { this.orientation = neworientation; if (this.orientation == St.Side.TOP || this.orientation == St.Side.BOTTOM) { if (this._line) { this._line.destroy(); } this.actor.remove_style_class_name('vertical'); this._line = new St.BoxLayout({ style_class: 'applet-separator-line', reactive: false, track_hover: false}); this.actor.add(this._line, { y_align: Clutter.ActorAlign.CENTER, x_align: Clutter.ActorAlign.CENTER, y_fill: true, y_expand: true}); } else { if (this._line) { this._line.destroy(); } this.actor.add_style_class_name('vertical'); this._line = new St.BoxLayout({ style_class: 'applet-separator-line-vertical', reactive: false, track_hover: false }); this._line.set_important(true); this.actor.add(this._line, { y_align: Clutter.ActorAlign.CENTER, x_align: Clutter.ActorAlign.CENTER}); } } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonSeparatorApplet(orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/separator@cinnamon.org/metadata.json0000664000175000017500000000025715167446463027660 0ustar fabiofabio{ "uuid": "separator@cinnamon.org", "name": "Separator", "description": "A separator icon which can be added multiple times", "icon": "cs-applets", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/settings-example@cinnamon.org/0000775000175000017500000000000015167446463026472 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/settings-example@cinnamon.org/CustomWidget.py0000664000175000017500000000147515167446463031471 0ustar fabiofabio#!/usr/bin/python3 import random from JsonSettingsWidgets import * from gi.repository import Gio, Gtk class MyWidget(SettingsWidget): def __init__(self, info, key, settings): SettingsWidget.__init__(self) self.key = key self.settings = settings self.info = info self.pack_start(Gtk.Label(_(info['description']), halign=Gtk.Align.START), True, True, 0) self.entry = Gtk.Entry() self.settings.bind('custom-widget', self.entry, 'text', Gio.SettingsBindFlags.DEFAULT) self.button = Gtk.Button(_("Random")) self.button.connect('clicked', self.button_pressed) self.pack_end(self.button, False, False, 0) self.pack_end(self.entry, False, False, 0) def button_pressed(self, *args): self.entry.set_text(str(random.randint(0, 9))) cinnamon-6.6.8/files/usr/share/cinnamon/applets/settings-example@cinnamon.org/applet.js0000664000175000017500000001402115167446463030313 0ustar fabiofabioconst Applet = imports.ui.applet; const Clutter = imports.gi.Clutter; const Lang = imports.lang; const PopupMenu = imports.ui.popupMenu; const Mainloop = imports.mainloop; const Settings = imports.ui.settings; // Needed for settings API const Gio = imports.gi.Gio; const Main = imports.ui.main; class CinnamonSettingsExampleApplet extends Applet.TextIconApplet { constructor(orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.menuManager = new PopupMenu.PopupMenuManager(this); this.menu = new Applet.AppletPopupMenu(this, orientation); this.menuManager.addMenu(this.menu); /* Initialize your settings handler instance this, the uuid instance id */ this.settings = new Settings.AppletSettings(this, "settings-example@cinnamon.org", instance_id); /* Now we'll proceed with setting up individual setting bindings. */ this.settings.bind("icon-name", // The setting key, from the setting schema file "icon_name", // The property to bind the setting to - in this case it will initialize this.icon_name to the setting value this.on_settings_changed, // The method to call when this.icon_name has changed, so you can update your applet null); // Any extra information you want to pass to the callback (optional - pass null or just leave out this last argument) this.settings.bind("scale-demo", "scale_val", this.on_settings_changed); this.settings.bind("color", "bg_color", this.on_settings_changed); this.settings.bind("spinner-number", "spinner_number", this.on_settings_changed); this.settings.bind("combo-selection", "combo_choice", this.on_settings_changed); this.settings.bind("use-custom-label", "use_custom", this.on_settings_changed); this.settings.bind("custom-label", "custom_label", this.on_settings_changed); this.settings.bind("keybinding-test", "keybinding", this.on_keybinding_changed); this.settings.connect("changed::signal-test", Lang.bind(this, this.on_signal_test_fired)); /* Lets create and add our menu items - we'll set their true values after */ this.spinner_val_demo = new PopupMenu.PopupMenuItem(""); this.combo_val_demo = new PopupMenu.PopupMenuItem(""); this.slider_demo = new PopupMenu.PopupSliderMenuItem(0); this.slider_demo.connect("value-changed", Lang.bind(this, this.on_slider_changed)); this.menu.addMenuItem(this.spinner_val_demo); this.menu.addMenuItem(this.combo_val_demo); this.menu.addMenuItem(this.slider_demo); /* Let's set up our applet's initial state now that we have our setting properties defined */ this.on_keybinding_changed(); this.on_settings_changed(); } on_keybinding_changed() { Main.keybindingManager.addXletHotKey(this, "must-be-unique-id", this.keybinding, Lang.bind(this, this.on_hotkey_triggered)); } on_settings_changed() { if (this.use_custom) { this.set_applet_label(this.custom_label); } else { this.set_applet_label(_("Hi there!")); } let icon_file = Gio.File.new_for_path(this.icon_name); if (icon_file.query_exists(null)) { this.set_applet_icon_path(this.icon_name); } else { this.set_applet_icon_name(this.icon_name); } this.spinner_val_demo.label.clutter_text.set_text("Spinner value is: " + this.spinner_number); this.combo_val_demo.label.clutter_text.set_text("Combo value is: " + this.combo_choice); this.slider_demo.setValue(this.scale_val); this.actor.style = "background-color:" + this.bg_color + "; width:" + this.spinner_number + "px"; } on_signal_test_fired(setting_prov, key, oldval, newval) { global.logError("Test signal fired. Old value for key "+ key + " was " + oldval + ". New value is " + newval + "."); } on_slider_changed(slider, value) { this.scale_val = value; // This is our BIDIRECTIONAL setting - by updating this.scale_val, // Our configuration file will also be updated } /* This method is a callback that is defined by a button type in our settings file * This button will appear in the configuration dialog, and pressing it will call this method * This could useful to open a link to your web page, or just about anything you want */ on_config_button_pressed() { this.set_applet_label(_("YOU PRESSED THE BUTTON!!!")); let timeoutId = Mainloop.timeout_add(3000, Lang.bind(this, function() { this.on_settings_changed(); })); this._applet_icon.ease({ margin_left: 10, duration: 500, mode: Clutter.AnimationMode.EASE_OUT_QUAD, onComplete: () => { this._applet_icon.ease({ margin_left: 0, duration: 500, mode: Clutter.AnimationMode.EASE_OUT_QUAD }); } }); } on_hotkey_triggered() { this.set_applet_label(_("YOU USED THE HOTKEY!!!")); let timeoutId = Mainloop.timeout_add(3000, Lang.bind(this, function() { this.on_settings_changed(); })); } on_applet_clicked(event) { this.menu.toggle(); } on_applet_removed_from_panel() { this.settings.finalize(); // This is called when a user removes the applet from the panel.. we want to // Remove any connections and file listeners here, which our settings object // has a few of Main.keybindingManager.removeXletHotKey(this, "must-be-unique-id"); } } function main(metadata, orientation, panel_height, instance_id) { // Make sure you collect and pass on instanceId return new CinnamonSettingsExampleApplet(orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/settings-example@cinnamon.org/metadata.json0000664000175000017500000000037015167446463031145 0ustar fabiofabio{ "uuid": "settings-example@cinnamon.org", "name": "Settings API Demo", "description": "A sample applet for demonstrating the capabilities and usage of the applet and desklet settings API", "icon": "preferences-desktop", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/settings-example@cinnamon.org/settings-schema.json0000664000175000017500000002313715167446463032471 0ustar fabiofabio{ "layout1": { "type": "layout", "pages": ["page1", "page2", "page3", "page4", "page5"], "page1": { "type": "page", "title": "Visible settings", "sections": ["section0", "section1", "section2"] }, "page2": { "type": "page", "title": "Choosers", "sections": ["section3", "section6"] }, "page3": { "type": "page", "title": "Command settings", "sections": ["section5"] }, "page4": { "type": "page", "title": "Editable list settings", "sections": ["section7"] }, "page5": { "type": "page", "title": "Dependencies", "sections": ["section8", "section9"] }, "section0": { "type": "section", "title": "Info", "keys": ["label-info"] }, "section1": { "type": "section", "title": "Panel settings", "keys": ["icon-name", "use-custom-label", "custom-label", "color", "spinner-number"] }, "section3": { "type": "section", "title": "File choosers", "keys": ["file-select", "directory-select", "sound-select"] }, "section2": { "type": "section", "title": "Menu settings", "keys": ["combo-selection", "scale-demo"] }, "section5": { "type": "section", "title": "Command settings", "keys": ["signal-test", "keybinding-test", "demo-button", "long-text", "custom-widget"] }, "section6": { "type": "section", "title": "Other choosers", "keys": ["font-select", "date-select", "time-select"] }, "section7": { "type": "section", "title": "My list", "keys": ["tree"] }, "section8": { "type": "section", "title": "Show dependencies section", "keys": ["show-deps-section"] }, "section9": { "type": "section", "title": "Dependencies section", "dependency": "show-deps-section", "keys": ["deps-info", "dep-combo", "dep-combo-info1", "dep-combo-info2", "dep-spin", "dep-spin-info1", "dep-spin-info2"] } }, "label-info" : { "type" : "label", "description" : "Play with these widgets and see the automatic reaction in the panel applet.\n\nThis is a label, and the content can't be modified nor accessed. You may want to use a label to show additional hints or instructions, for example." }, "icon-name": { "type": "iconfilechooser", "default" : "help", "description" : "The icon to use in the panel", "tooltip" : "Select an icon file, or you can type an icon name into the entry box" }, "color" : { "type": "colorchooser", "default" : "grey", "description" : "The background color for the applet", "tooltip" : "Click the button to select a new background color for this applet" }, "spinner-number" : { "type": "spinbutton", "default" : 250, "min" : 0, "max" : 400, "step" : 5, "units" : "pixels", "description" : "Applet width in the panel", "tooltip" : "Increase or decrease this spinner value to make the applet wider or narrower in the panel" }, "combo-selection" : { "type": "combobox", "default" : "option 1", "description" : "Please pick an option", "options" : { "First Choice" : "option 1", "Second Choice" : "option 2", "Third Choice" : "option 3", "Fourth Choice" : "option 4" }, "tooltip" : "A combo selection can select between int, boolean, float, and string values" }, "scale-demo" : { "type" : "scale", "default" : 0.5, "min" : 0.0, "max" : 1.0, "step" : 0.05, "show-value" : false, "description" : "Here is a demonstration of bidirectional control", "tooltip" : "If you adjust this scale, it updates in the applet. If you adjust the scale in the applet, it updates here" }, "use-custom-label" : { "type" : "switch", "default" : false, "description": "Check this to use a custom label", "tooltip": "Checking this box allows you to set a custom label in the field below - this demonstrates setting dependencies" }, "custom-label" : { "type" : "entry", "default" : "custom", "description" : "Custom Applet Label", "dependency" : "use-custom-label", "tooltip" : "Set your custom label here. This field is unavailable unless the switch above is enabled" }, "demo-button" : { "type" : "button", "description" : "Don't Press This Button!!!", "callback" : "on_config_button_pressed", "tooltip" : "Pressing this button activates a callback method in the applet - go ahead, press it." }, "signal-test" : { "type" : "switch", "description" : "This is a test widget for individual key signal firing", "default" : false }, "keybinding-test" : { "type" : "keybinding", "description" : "Set the keybinding here to activate an action", "default" : "F8" }, "file-select" : { "type" : "filechooser", "description" : "Choose a file", "default" : "~/", "select-dir" : false }, "directory-select" : { "type" : "filechooser", "description" : "Choose a directory", "default" : "", "select-dir" : true }, "sound-select" : { "type" : "soundfilechooser", "description" : "Choose a sound", "default" : "" }, "font-select" : { "type" : "fontchooser", "description" : "Choose a font", "default" : "sans 12" }, "long-text" : { "type" : "textview", "description" : "You can type paragraphs and lists here", "default" : "", "tooltip" : "This setting type is useful for multi-line lists, and text that is too long to fit in an entry widget.\nYou can manually set the height of the text view with the 'height' property. This one is set to 150. Default is 200.", "height" : 150 }, "date-select" : { "type" : "datechooser", "description" : "Choose a Date", "default" : { "d" : 1, "m" : 1, "y" : 2000 } }, "time-select" : { "type" : "timechooser", "description" : "Choose a Time", "default" : { "h" : 12, "m" : 0, "s" : 0 } }, "tree" : { "type" : "list", "description" : "Custom tree widget", "columns" : [ {"id": "name", "title": "Name", "type": "string"}, {"id": "resident", "title": "Resident", "type": "boolean"}, {"id": "address", "title": "Address", "type": "string", "default": "none"}, {"id": "number", "title": "Id number", "type": "integer", "align": 0.5, "min": 0, "max": 100}, {"id": "icon", "title": "Icon", "type": "icon"}, {"id": "key", "title": "Shortcut key", "type": "keybinding"}, {"id": "file", "title": "File Path", "type": "file", "select-dir": false}, {"id": "color", "title": "Color", "type": "integer", "default": 5, "options": { "red": 5, "blue": 4, "green": 3 }} ], "default" : [] }, "show-deps-section" : { "type" : "switch", "default" : true, "description": "Show the dependencies section", "tooltip": "Checking this box shows the Dependencies section below. Unchecking hides it." }, "deps-info" : { "type" : "label", "description" : "You can see this section because the switch above is on. Try switching it off and see what happens." }, "dep-combo" : { "type" : "combobox", "description" : "Show info", "default" : "option1", "options" : { "Show info #1" : "option1", "Show info #2" : "option2", "Don't show info #1 or #2" : "option3" } }, "dep-combo-info1" : { "type" : "label", "description" : "Info #1: You are seeing this info because the first option is selected in the combo box above. Try selecting different options to see different information.", "dependency" : "dep-combo=option1" }, "dep-combo-info2" : { "type" : "label", "description" : "Info #2: You are seeing different text now because you selected the second option in the combo box above.", "dependency" : "dep-combo=option2" }, "dep-spin" : { "type" : "spinbutton", "description" : "Number value", "min" : 0, "max" : 10, "step" : 1, "units" : "", "default" : 0 }, "dep-spin-info1" : { "type" : "label", "description" : "The value of the spinner above is less than 5", "dependency" : "dep-spin<5" }, "dep-spin-info2" : { "type" : "label", "description" : "The value of the spinner above is greater than or equal to 5", "dependency" : "dep-spin>=5" }, "custom-widget": { "type" : "custom", "file" : "CustomWidget.py", "widget" : "MyWidget", "description" : "Try out this custom widget!", "default" : "5" } } cinnamon-6.6.8/files/usr/share/cinnamon/applets/settings@cinnamon.org/0000775000175000017500000000000015167446463025041 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/settings@cinnamon.org/applet.js0000664000175000017500000000251615167446463026670 0ustar fabiofabioconst Applet = imports.ui.applet; const St = imports.gi.St; class CinnamonSettingsApplet extends Applet.IconApplet { constructor(orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.set_applet_tooltip(_("Settings")); this.on_orientation_changed(this._orientation); } on_applet_clicked(event) { let horizontal = [St.Side.TOP, St.Side.BOTTOM].includes(this._orientation); let [x, y] = event.get_coords(); this.panel._context_menu.shiftToPosition(horizontal ? x : y); this.panel._context_menu.toggle(); } on_orientation_changed(neworientation) { let icon_name; switch (neworientation) { case St.Side.LEFT: icon_name = "xsi-go-next"; break; case St.Side.RIGHT: icon_name = "xsi-go-previous"; break; case St.Side.TOP: icon_name = "xsi-go-down"; break; case St.Side.BOTTOM: default: icon_name = "xsi-go-up"; break; } this.set_applet_icon_symbolic_name(icon_name); } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonSettingsApplet(orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/settings@cinnamon.org/metadata.json0000664000175000017500000000023415167446463027513 0ustar fabiofabio{ "uuid": "settings@cinnamon.org", "name": "Settings Applet", "description": "Cinnamon Settings", "icon": "preferences-desktop", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/show-desktop@cinnamon.org/0000775000175000017500000000000015167446463025630 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/show-desktop@cinnamon.org/applet.js0000664000175000017500000001214015167446463027451 0ustar fabiofabioconst Applet = imports.ui.applet; const { AppletSettings } = imports.ui.settings; // Needed for settings API const Mainloop = imports.mainloop; const Main = imports.ui.main; const PopupMenu = imports.ui.popupMenu; const St = imports.gi.St; const Clutter = imports.gi.Clutter; const Meta = imports.gi.Meta; const Lang = imports.lang; const SignalManager = imports.misc.signalManager; const PEEK_TRANSPARENCY_FILTER_TYPES = [ Meta.WindowType.DESKTOP, Meta.WindowType.DOCK, ]; class CinnamonShowDesktopApplet extends Applet.IconApplet { constructor(orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.settings = new AppletSettings(this, "show-desktop@cinnamon.org", instance_id); this.settings.bind("peek-at-desktop", "peek_at_desktop"); this.settings.bind("peek-delay", "peek_delay"); this.settings.bind("peek-opacity", "peek_opacity"); this.settings.bind("peek-blur", "peek_blur"); this.signals = new SignalManager.SignalManager(null); this.actor.connect('enter-event', Lang.bind(this, this._on_enter)); this.actor.connect('leave-event', Lang.bind(this, this._on_leave)); this.signals.connect(global.stage, 'notify::key-focus', this._on_leave, this); this._did_peek = false; this._peek_timeout_id = 0; this.set_applet_icon_name("user-desktop"); this.set_applet_tooltip(_("Click to show the desktop or middle-click to show the desklets")); let showDeskletsOption = new PopupMenu.PopupIconMenuItem( _('Show Desklets'), 'cs-desklets', St.IconType.SYMBOLIC ); showDeskletsOption.connect('activate', () => this.toggleShowDesklets()); this._applet_context_menu.addMenuItem(showDeskletsOption); } on_applet_removed_from_panel() { this.signals.disconnectAllSignals(); } show_all_windows(time) { let windows = global.get_window_actors(); for(let i = 0; i < windows.length; i++){ let window = windows[i].meta_window; let compositor = windows[i]; compositor.ease( { opacity: 255, transition: Clutter.AnimationMode.EASE_OUT_SINE, duration: time, } ); if (this.peek_blur && compositor.eff) { compositor.remove_effect(compositor.eff); } } } _on_enter(event) { if (this.peek_at_desktop) { if (this._peek_timeout_id > 0) { Mainloop.source_remove(this._peek_timeout_id); this._peek_timeout_id = 0; } this._peek_timeout_id = Mainloop.timeout_add(this.peek_delay, Lang.bind(this, function() { if (this.actor.hover && !this._applet_context_menu.isOpen && !global.settings.get_boolean("panel-edit-mode")) { let windows = global.get_window_actors(); for (let i = 0; i < windows.length; i++) { let window = windows[i].meta_window; let compositor = windows[i]; if (!PEEK_TRANSPARENCY_FILTER_TYPES.includes(window.get_window_type())) { if (this.peek_blur) { if (!compositor.eff) compositor.eff = new Clutter.BlurEffect(); compositor.add_effect_with_name('peek-blur', compositor.eff); } compositor.ease( { opacity: this.peek_opacity / 100 * 255, duration: 275, transition: Clutter.AnimationMode.EASE_IN_SINE, } ); } } this._did_peek = true; } this._peek_timeout_id = 0; return false; })); } } _on_leave(event) { if (this._did_peek) { this.show_all_windows(200); this._did_peek = false; } if (this._peek_timeout_id > 0) { Mainloop.source_remove(this._peek_timeout_id); this._peek_timeout_id = 0; } } on_applet_clicked(event) { global.workspace_manager.toggle_desktop(global.get_current_time()); this.show_all_windows(0); if (this._peek_timeout_id > 0) { Mainloop.source_remove(this._peek_timeout_id); this._peek_timeout_id = 0; } this._did_peek = false; } on_applet_middle_clicked(event) { Main.deskletContainer.toggle(); } toggleShowDesklets() { if (!Main.deskletContainer.isModal) { Main.deskletContainer.raise(); } } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonShowDesktopApplet(orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/show-desktop@cinnamon.org/metadata.json0000664000175000017500000000023115167446463030277 0ustar fabiofabio{ "uuid": "show-desktop@cinnamon.org", "name": "Show desktop", "description": "Minimize all windows", "icon": "user-desktop", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/show-desktop@cinnamon.org/settings-schema.json0000664000175000017500000000200315167446463031614 0ustar fabiofabio{ "head" : { "type" : "header", "description" : "Settings" }, "peek-at-desktop" : { "type" : "switch", "default" : false, "description": "Peek at the desktop on hover", "tooltip": "Peek at the desktop when hovering the applet" }, "peek-blur" : { "type" : "switch", "default" : false, "dependency" : "peek-at-desktop", "description" : "Blur effect", "tooltip" : "Blur windows when peeking at the desktop" }, "peek-delay" : { "type": "spinbutton", "default" : 400, "min" : 0, "max" : 1000, "step" : 50, "units" : "milliseconds", "dependency" : "peek-at-desktop", "description": "Hover delay", "tooltip": "Delay before Peek shows desktop" }, "peek-opacity": { "type": "scale", "default" : 5, "units": "%", "digits": 0, "min" : 0, "max" : 100, "step" : 5, "dependency" : "peek-at-desktop", "description" : "Window opacity", "tooltip" : "Change the opacity of windows when peeking at the desktop" } } cinnamon-6.6.8/files/usr/share/cinnamon/applets/slideshow@cinnamon.org/0000775000175000017500000000000015167446463025202 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/slideshow@cinnamon.org/applet.js0000664000175000017500000001350315167446463027027 0ustar fabiofabioconst Lang = imports.lang; const Gio = imports.gi.Gio; const St = imports.gi.St; const Main = imports.ui.main; const Applet = imports.ui.applet; const PopupMenu = imports.ui.popupMenu; const Util = imports.misc.util; class CinnamonSlideshowApplet extends Applet.IconApplet { constructor(metadata, orientation, panel_height, instanceId) { super(orientation, panel_height, instanceId); this._slideshowSettings = new Gio.Settings({ schema_id: "org.cinnamon.desktop.background.slideshow" }); this._backgroundSettings = new Gio.Settings({ schema_id: "org.cinnamon.desktop.background" }); if (this._slideshowSettings.get_boolean("slideshow-enabled")) { if (!this._slideshowSettings.get_boolean("slideshow-paused")) { this.set_applet_icon_symbolic_name('slideshow-play'); this.set_applet_tooltip(_("Click to pause the slideshow")); } else { this.set_applet_icon_symbolic_name('slideshow-pause'); this.set_applet_tooltip(_("Click to resume the slideshow")); } } else { this.set_applet_icon_symbolic_name('slideshow-disabled'); this.set_applet_tooltip(_("The slideshow is disabled")); } this._slideshowSettings.connect("changed::slideshow-enabled", Lang.bind(this, this._on_slideshow_enabled_changed)); this._slideshowSettings.connect("changed::slideshow-paused", Lang.bind(this, this._on_slideshow_paused_changed)); this.enable_slideshow_switch = new PopupMenu.PopupSwitchMenuItem(_("Slideshow"), this._slideshowSettings.get_boolean("slideshow-enabled")); this._applet_context_menu.addMenuItem(this.enable_slideshow_switch); this.enable_slideshow_switch.connect("toggled", Lang.bind(this, this._on_slideshow_enabled_toggled)); this._applet_context_menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this._current_background_menu = new PopupMenu.PopupMenuItem(""); this._applet_context_menu.addMenuItem(this._current_background_menu); this._update_background_name(); this._applet_context_menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.next_image_context_menu_item = new PopupMenu.PopupIconMenuItem(_("Next Background"), "xsi-media-seek-forward", St.IconType.SYMBOLIC); this.next_image_context_menu_item.connect('activate', Lang.bind(this, this.get_next_image)); this._applet_context_menu.addMenuItem(this.next_image_context_menu_item); this._applet_context_menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.open_settings_context_menu_item = new PopupMenu.PopupIconMenuItem(_("Background Settings"), "xsi-wallpaper", St.IconType.SYMBOLIC); this.open_settings_context_menu_item.connect('activate', Lang.bind(this, function() { Util.spawnCommandLine("cinnamon-settings backgrounds"); })); this._applet_context_menu.addMenuItem(this.open_settings_context_menu_item); this._applet_context_menu.connect('open-state-changed', () => this._update_background_name()); } on_applet_clicked(event) { if (this._slideshowSettings.get_boolean("slideshow-enabled")) { if (!this._slideshowSettings.get_boolean("slideshow-paused")) { this._slideshowSettings.set_boolean("slideshow-paused", true); this.set_applet_icon_symbolic_name('slideshow-pause'); this.set_applet_tooltip(_("Click to resume the slideshow")); } else { this._slideshowSettings.set_boolean("slideshow-paused", false); this.set_applet_icon_symbolic_name('slideshow-play'); this.set_applet_tooltip(_("Click to pause the slideshow")); } } } _on_slideshow_enabled_toggled() { if (this._slideshowSettings.get_boolean("slideshow-enabled")) { this._slideshowSettings.set_boolean("slideshow-enabled", false); this.set_applet_icon_symbolic_name('slideshow-disabled'); this.set_applet_tooltip(_("The slideshow is disabled")); } else { this._slideshowSettings.set_boolean("slideshow-enabled", true); this.set_applet_icon_symbolic_name('slideshow-play'); this.set_applet_tooltip(_("Click to pause the slideshow")); } } _on_slideshow_enabled_changed() { if (this._slideshowSettings.get_boolean("slideshow-enabled")) { this.enable_slideshow_switch.setToggleState(true); this.set_applet_icon_symbolic_name('slideshow-play'); this.set_applet_tooltip(_("Click to pause the slideshow")); } else { this.enable_slideshow_switch.setToggleState(false); this.set_applet_icon_symbolic_name('slideshow-disabled'); this.set_applet_tooltip(_("The slideshow is disabled")); } } _on_slideshow_paused_changed() { if (this._slideshowSettings.get_boolean("slideshow-paused")) { this.set_applet_icon_symbolic_name('slideshow-pause'); this.set_applet_tooltip(_("Click to resume the slideshow")); } else { this.set_applet_icon_symbolic_name('slideshow-play'); this.set_applet_tooltip(_("Click to pause the slideshow")); } } get_next_image() { Main.slideshowManager.getNextImage(); } _update_background_name() { const file = decodeURIComponent(this._backgroundSettings.get_string("picture-uri") || ""); const background = file.split("/").pop(); this._current_background_menu.label.set_text(_("Current background: ") + background); } } function main(metadata, orientation, panel_height, instanceId) { return new CinnamonSlideshowApplet(metadata, orientation, panel_height, instanceId); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/slideshow@cinnamon.org/icons/0000775000175000017500000000000015167446463026315 5ustar fabiofabio././@LongLink0000644000000000000000000000015500000000000011604 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/slideshow@cinnamon.org/icons/slideshow-disabled-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/slideshow@cinnamon.org/icons/slideshow-disabled-symb0000664000175000017500000000607115167446463032762 0ustar fabiofabio Gnome Symbolic Icon Theme image/svg+xml Gnome Symbolic Icon Theme ././@LongLink0000644000000000000000000000015200000000000011601 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/slideshow@cinnamon.org/icons/slideshow-pause-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/slideshow@cinnamon.org/icons/slideshow-pause-symboli0000664000175000017500000000616315167446463033036 0ustar fabiofabio Gnome Symbolic Icon Theme image/svg+xml Gnome Symbolic Icon Theme ././@LongLink0000644000000000000000000000015100000000000011600 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/slideshow@cinnamon.org/icons/slideshow-play-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/slideshow@cinnamon.org/icons/slideshow-play-symbolic0000664000175000017500000000601015167446463033020 0ustar fabiofabio Gnome Symbolic Icon Theme image/svg+xml Gnome Symbolic Icon Theme cinnamon-6.6.8/files/usr/share/cinnamon/applets/slideshow@cinnamon.org/metadata.json0000664000175000017500000000024415167446463027655 0ustar fabiofabio{ "uuid":"slideshow@cinnamon.org", "name":"Slideshow Controls", "description":"Basic controls for the Cinnamon slideshow", "icon":"preferences-desktop-wallpaper" } cinnamon-6.6.8/files/usr/share/cinnamon/applets/sound@cinnamon.org/0000775000175000017500000000000015167446463024331 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js0000664000175000017500000020356315167446463026165 0ustar fabiofabioconst Applet = imports.ui.applet; const Lang = imports.lang; const Mainloop = imports.mainloop; const Gio = imports.gi.Gio; const Interfaces = imports.misc.interfaces; const Util = imports.misc.util; const Cinnamon = imports.gi.Cinnamon; const Clutter = imports.gi.Clutter; const St = imports.gi.St; const PopupMenu = imports.ui.popupMenu; const GLib = imports.gi.GLib; const Cvc = imports.gi.Cvc; const Tooltips = imports.ui.tooltips; const Main = imports.ui.main; const Settings = imports.ui.settings; const Slider = imports.ui.slider; const Pango = imports.gi.Pango; const MEDIA_PLAYER_2_PATH = "/org/mpris/MediaPlayer2"; const MEDIA_PLAYER_2_NAME = "org.mpris.MediaPlayer2"; const MEDIA_PLAYER_2_PLAYER_NAME = "org.mpris.MediaPlayer2.Player"; // how long to show the output icon when volume is adjusted during media playback. const OUTPUT_ICON_SHOW_TIME_SECONDS = 3; /* global values */ let players_without_seek_support = ['telegram desktop', 'spotify', 'totem', 'xplayer', 'gnome-mplayer', 'pithos', 'smplayer']; let players_with_seek_support = [ 'clementine', 'banshee', 'rhythmbox', 'rhythmbox3', 'pragha', 'quodlibet', 'amarok', 'xnoise', 'gmusicbrowser', 'vlc', 'qmmp', 'deadbeef', 'audacious']; /* dummy vars for translation */ let x = _("Playing"); x = _("Paused"); x = _("Stopped"); const VOLUME_ADJUSTMENT_STEP = 0.05; /* Volume adjustment step in % */ const ICON_SIZE = 28; const CINNAMON_DESKTOP_SOUNDS = "org.cinnamon.desktop.sound"; const OVERAMPLIFICATION_KEY = "allow-amplified-volume"; class ControlButton { constructor(icon, tooltip, callback, small = false) { this.actor = new St.Bin(); this.button = new St.Button(); this.button.connect('clicked', callback); if(small) this.button.add_style_pseudo_class("small"); this.icon = new St.Icon({ icon_type: St.IconType.SYMBOLIC, icon_name: icon }); this.button.set_child(this.icon); this.actor.add_actor(this.button); this.tooltip = new Tooltips.Tooltip(this.button, tooltip); } getActor() { return this.actor; } setData(icon, tooltip) { this.icon.icon_name = icon; this.tooltip.set_text(tooltip); } setActive(status) { this.button.change_style_pseudo_class("active", status); } setEnabled(status) { this.button.change_style_pseudo_class("insensitive", !status); this.button.can_focus = status; this.button.reactive = status; } } class VolumeSlider extends PopupMenu.PopupSliderMenuItem { constructor(applet, stream, tooltip, app_icon) { super(0); this.applet = applet; if(tooltip) this.tooltipText = tooltip + ": "; else this.tooltipText = ""; this.tooltip = new Tooltips.Tooltip(this.actor, this.tooltipText); this.connect("value-changed", () => this._onValueChanged()); if (tooltip === _("Volume")) { this.connect("drag-end", () => this._onDragEnd()); } this.app_icon = app_icon; if (this.app_icon == null) { this.iconName = this.isMic ? "xsi-microphone-sensitivity-muted" : "xsi-audio-volume-muted"; this.icon = new St.Icon({icon_name: this.iconName, icon_type: St.IconType.SYMBOLIC, icon_size: 16}); } else { this.icon = new St.Icon({icon_name: this.app_icon, icon_type: St.IconType.FULLCOLOR, icon_size: 16}); } this.icon.reactive = true; this.icon.track_hover = true; this.icon.connect('button-press-event', (actor, event) => { if (this.stream && event.get_button() === 1) { this.stream.change_is_muted(!this.stream.is_muted); return Clutter.EVENT_STOP; } return Clutter.EVENT_PROPAGATE; }); this.removeActor(this._slider); this.addActor(this.icon, {span: 0}); this.addActor(this._slider, {span: -1, expand: true}); this.connectWithStream(stream); } connectWithStream(stream) { if (!stream) { this.actor.hide(); this.stream = null; } else { this.actor.show(); this.stream = stream; this.isMic = stream instanceof Cvc.MixerSource || stream instanceof Cvc.MixerSourceOutput; this.isOutputSink = stream instanceof Cvc.MixerSink; let mutedId = stream.connect("notify::is-muted", () => this._update()); let volumeId = stream.connect("notify::volume", () => this._update()); this.connect("destroy", () => { stream.disconnect(mutedId); stream.disconnect(volumeId); }); } this._update(); } _onValueChanged() { if (!this.stream) return; let muted; // Use the scaled volume max only for the main output let volume = this._value * (this.isOutputSink ? this.applet._volumeMax : this.applet._volumeNorm); if(this._value < 0.005) { volume = 0; muted = true; } else { muted = false; //100% is magnetic: if (volume != this.applet._volumeNorm && volume > this.applet._volumeNorm*(1-VOLUME_ADJUSTMENT_STEP/2) && volume < this.applet._volumeNorm*(1+VOLUME_ADJUSTMENT_STEP/2)) volume = this.applet._volumeNorm; } this.stream.volume = volume; this.stream.push_volume(); if(this.stream.is_muted !== muted) this.stream.change_is_muted(muted); if(!this._dragging) this.applet._notifyVolumeChange(this.stream); } _onDragEnd() { if (this.stream) { this.applet._notifyVolumeChange(this.stream); } } _onScrollEvent(actor, event) { let direction = event.get_scroll_direction(); if (direction == Clutter.ScrollDirection.DOWN) { this._value = Math.max(0, this._value - VOLUME_ADJUSTMENT_STEP/this.applet._volumeMax*this.applet._volumeNorm); } else if (direction == Clutter.ScrollDirection.UP) { this._value = Math.min(1, this._value + VOLUME_ADJUSTMENT_STEP/this.applet._volumeMax*this.applet._volumeNorm); } this._slider.queue_repaint(); this.tooltip.show(); this.emit('value-changed', this._value); } _onKeyPressEvent(actor, event) { const key = event.get_key_symbol(); if (key === Clutter.KEY_Right || key === Clutter.KEY_Left) { let delta = key === Clutter.KEY_Right ? VOLUME_ADJUSTMENT_STEP : -VOLUME_ADJUSTMENT_STEP; if (St.Widget.get_default_direction() === St.TextDirection.RTL) delta = -delta; this._value = Math.max(0, Math.min(this._value + delta/this.applet._volumeMax*this.applet._volumeNorm, 1)); this._slider.queue_repaint(); this.emit('value-changed', this._value); return true; } return false; } _update() { // value: percentage of volume_max (set as value in the widget) // visible_value: percentage of volume_norm (shown to the user) // these only differ for the output, and only when the user changes the maximum volume let volume = (!this.stream || this.stream.is_muted) ? 0 : this.stream.volume; let value, visible_value, delta = VOLUME_ADJUSTMENT_STEP * this.applet._volumeMax / this.applet._volumeNorm; if (this.isOutputSink) { value = volume / this.applet._volumeMax; visible_value = volume / this.applet._volumeNorm; if (visible_value != 1 && visible_value > 1 - delta/2 && visible_value < 1 + delta/2) { visible_value = 1; // 100% is magnetic value = this.applet._volumeNorm / this.applet._volumeMax; this.applet._output.volume = this.applet._volumeNorm; this.applet._output.push_volume(); } } else { visible_value = volume / this.applet._volumeNorm; value = visible_value } let percentage = Math.round(visible_value * 100) + "%"; this.tooltip.set_text(this.tooltipText + percentage); if (this._dragging) this.tooltip.show(); let iconName = this._volumeToIcon(value); if (this.app_icon == null) { this.icon.icon_name = iconName; } this.setValue(value); // send data to applet this.emit("values-changed", iconName, percentage); } _volumeToIcon(value) { let icon; if(value < 0.005) { icon = "muted"; } else { let n = Math.floor(3 * value); if(n < 1) icon = "low"; else if(n < 2) icon = "medium"; else icon = "high"; } return this.isMic? "xsi-microphone-sensitivity-" + icon : "xsi-audio-volume-" + icon; } } class Seeker extends Slider.Slider { constructor(mediaServerPlayer, props, playerName) { super(0, true); this.actor.set_direction(St.TextDirection.LTR); //Do not invert on RTL layout this.canSeek = true; this.status = 'Stopped'; this._wantedSeekValue = 0; this._currentTime = 0; this._length = 0; this._trackid = ""; this._timeoutId = 0; this._timerTicker = 0; this._mediaServerPlayer = mediaServerPlayer; this._prop = props; this._playerName = playerName; this.connect('drag-end', () => { this._setPosition() }); this.connect('value-changed', () => { if(!this._dragging) // Update on scroll events this._setPosition(); }); this._seekChangedId = mediaServerPlayer.connectSignal('Seeked', (id, sender, value) => { // Seek value sent by the player if (value > 0) { this._setPosition(value); } // Seek initiated by the position slider else if (this._wantedSeekValue > 0) { // Some broken gstreamer players (Banshee) reports always 0 // when the track is seeked so we set the position at the // value we set on the slider this._setPosition(this._wantedSeekValue); } else { // Some players send negative values (Rhythmbox). // Only positive values or zero are allowed. this._setPosition(0); } this._wantedSeekValue = 0; }); this._getCanSeek(); } play() { this.status = 'Playing'; this._getCanSeek(); } pause() { this.status = 'Paused'; this._updateTimer(); } stop() { this.status = 'Stopped'; this._updateTimer(); } setTrack(trackid, length) { this._trackid = trackid; this._length = length; this._currentTime = 0; this._updateValue(); } _updateValue() { if (!this._dragging && this.canSeek) { if (this._length > 0 && this._currentTime > 0) this.setValue(this._currentTime / this._length); else this.setValue(0); } } _timerCallback() { if (this.status === 'Playing') { if (this._timerTicker < 10) { this._currentTime += 1; this._timerTicker++; this._updateValue(); } else { // Sync every 10 ticks this._timerTicker = 0; this._getPosition(); } return GLib.SOURCE_CONTINUE; } this._timeoutId = 0; return GLib.SOURCE_REMOVE; } _updateTimer() { if (this._timeoutId > 0) { Mainloop.source_remove(this._timeoutId); this._timeoutId = 0; } if (this.status === 'Playing') { if (this.canSeek) { this._getPosition(); this._timerTicker = 0; this._timeoutId = Mainloop.timeout_add_seconds(1, this._timerCallback.bind(this)); } } else { if (this.status === 'Stopped') this._currentTime = 0; this._updateValue(); } } _getCanSeek() { // Some players say they "CanSeek" but don't actually give their position over dbus if (players_without_seek_support.indexOf(this._playerName) > -1) { this._setCanSeek(false); return; } this._prop.GetRemote(MEDIA_PLAYER_2_PLAYER_NAME, 'CanSeek', (position, error) => { if (!error) this._setCanSeek(position[0].get_boolean()); }); } _setCanSeek(seek) { let playback_rate = this._mediaServerPlayer.Rate; // Hide seek for non-standard speeds except: 0 may mean paused, Audacious returns null if (seek && (playback_rate === 1 || !playback_rate)) { this.canSeek = true; this.actor.show(); this._updateTimer(); } else { this.canSeek = false; this.actor.hide(); } } _setPosition(value) { if(value >= 0) { this._currentTime = value / 1000000; this._updateValue(); } else { let time = this._value * this._length * 1000000; this._wantedSeekValue = Math.round(time); this._mediaServerPlayer.SetPositionRemote(this._trackid, time); } } _getPosition() { this._prop.GetRemote(MEDIA_PLAYER_2_PLAYER_NAME, 'Position', (position, error) => { if (!error) this._setPosition(position[0].get_int64()); }); } destroy() { if (this._timeoutId > 0) { Mainloop.source_remove(this._timeoutId); this._timeoutId = 0; } if (this._seekChangedId) { this._mediaServerPlayer.disconnectSignal(this._seekChangedId); this._seekChangedId = 0; } this.disconnectAll(); this._mediaServerPlayer = null; this._prop = null; } } class StreamMenuSection extends PopupMenu.PopupMenuSection { constructor(applet, stream) { super(); let iconName = stream.icon_name; let name = stream.name; // capitalize the stream name if (name.length > 2) { name = name.charAt(0).toUpperCase() + name.slice(1); } // Trim stream name if(name.length > 20) { name = name.substring(0, 16) + "... "; } // Special cases if (name === "Banshee") { iconName = "banshee"; } else if (name === "Spotify") { iconName = "spotify"; } else if (name === "VBox") { name = "Virtualbox"; iconName = "virtualbox"; } else if (name === "Firefox") { iconName = "firefox"; } else if (iconName === "audio") { iconName = "audio-x-generic"; } // Prevent Muffin from spawning sound streams if (name !== "Muffin") { let slider = new VolumeSlider(applet, stream, name, iconName); slider._slider.style = "min-width: 6em;"; this.addMenuItem(slider); } } } class Player extends PopupMenu.PopupMenuSection { constructor(applet, busname, owner) { super(); this._owner = owner; this._busName = busname; this._applet = applet; // We'll update this later with a proper name this._name = this._busName; let asyncReadyCb = (proxy, error, property) => { if (error) log(error); else { this[property] = proxy; this._dbus_acquired(); } }; Interfaces.getDBusProxyWithOwnerAsync(MEDIA_PLAYER_2_NAME, this._busName, (p, e) => asyncReadyCb(p, e, '_mediaServer')); Interfaces.getDBusProxyWithOwnerAsync(MEDIA_PLAYER_2_PLAYER_NAME, this._busName, (p, e) => asyncReadyCb(p, e, '_mediaServerPlayer')); Interfaces.getDBusPropertiesAsync(this._busName, MEDIA_PLAYER_2_PATH, (p, e) => asyncReadyCb(p, e, '_prop')); } _dbus_acquired() { if (!this._prop || !this._mediaServerPlayer || !this._mediaServer) return; if (this._mediaServer.Identity) { this._name = this._mediaServer.Identity; } else { let displayName = this._busName.replace('org.mpris.MediaPlayer2.', ''); this._name = displayName.capitalize(); } let mainBox = new PopupMenu.PopupMenuSection(); this.addMenuItem(mainBox); this.vertBox = new St.BoxLayout({ style_class: "sound-player", important: true, vertical: true }); mainBox.addActor(this.vertBox, { expand: false }); // Player info this._playerBox = new St.BoxLayout(); this.playerIcon = new St.Icon({icon_type: St.IconType.SYMBOLIC, style_class: "popup-menu-icon"}); this.playerLabel = new St.Label({ y_expand: true, y_align: Clutter.ActorAlign.CENTER, x_expand: true, x_align: Clutter.ActorAlign.START }); this._playerBox.add_actor(this.playerIcon); this._playerBox.add_actor(this.playerLabel); if (this._mediaServer.CanRaise) { this._showCanRaise(); } if (this._mediaServer.CanQuit) { this._showCanQuit(); } this.vertBox.add_actor(this._playerBox); // Cover Box (art + track info) this._trackCover = new St.Bin({x_align: St.Align.MIDDLE}); this._trackCoverFile = this._trackCoverFileTmp = false; this.coverBox = new Clutter.Box(); let l = new Clutter.BinLayout({x_align: Clutter.BinAlignment.FILL, y_align: Clutter.BinAlignment.END}); this.coverBox.set_layout_manager(l); // Cover art this.cover = new St.Icon({icon_name: "media-optical", icon_size: 300, icon_type: St.IconType.FULLCOLOR}); this.coverBox.add_actor(this.cover); this._cover_load_handle = 0; this._cover_path = null; // Track info (artist + title) this._artist = _("Unknown Artist"); this._album = _("Unknown Album"); this._title = _("Unknown Title"); this.trackInfo = new St.BoxLayout({style_class: 'sound-player-overlay', important: true, vertical: true}); let artistInfo = new St.BoxLayout(); let artistIcon = new St.Icon({ icon_type: St.IconType.SYMBOLIC, icon_name: "xsi-users", style_class: 'popup-menu-icon' }); this.artistLabel = new St.Label({text:this._artist}); this.artistLabel.clutterText.line_wrap = true; this.artistLabel.clutterText.line_wrap_mode = Pango.WrapMode.WORD_CHAR; this.artistLabel.clutterText.ellipsize = Pango.EllipsizeMode.NONE; artistInfo.add_actor(artistIcon); artistInfo.add_actor(this.artistLabel); let titleInfo = new St.BoxLayout(); let titleIcon = new St.Icon({ icon_type: St.IconType.SYMBOLIC, icon_name: "xsi-audio-x-generic", style_class: 'popup-menu-icon' }); this.titleLabel = new St.Label({text:this._title}); this.titleLabel.clutterText.line_wrap = true; this.titleLabel.clutterText.line_wrap_mode = Pango.WrapMode.WORD_CHAR; this.titleLabel.clutterText.ellipsize = Pango.EllipsizeMode.NONE; titleInfo.add_actor(titleIcon); titleInfo.add_actor(this.titleLabel); this.trackInfo.add_actor(artistInfo); this.trackInfo.add_actor(titleInfo); this.coverBox.add_actor(this.trackInfo); this._trackCover.set_child(this.coverBox); this.vertBox.add_actor(this._trackCover); // Playback controls let trackControls = new St.Bin({x_align: St.Align.MIDDLE}); this._prevButton = new ControlButton("xsi-media-skip-backward", _("Previous"), () => this._mediaServerPlayer.PreviousRemote()); this._playButton = new ControlButton("xsi-media-playback-start", _("Play"), () => this._mediaServerPlayer.PlayPauseRemote()); this._stopButton = new ControlButton("xsi-media-playback-stop", _("Stop"), () => this._mediaServerPlayer.StopRemote()); this._nextButton = new ControlButton("xsi-media-skip-forward", _("Next"), () => this._mediaServerPlayer.NextRemote()); this.trackInfo.add_actor(trackControls); this.controls = new St.BoxLayout(); if(St.Widget.get_default_direction () === St.TextDirection.RTL) this.controls.set_pack_start(true) this.controls.add_actor(this._prevButton.getActor()); this.controls.add_actor(this._playButton.getActor()); this.controls.add_actor(this._stopButton.getActor()); this.controls.add_actor(this._nextButton.getActor()); trackControls.set_child(this.controls); this._loopButton = new ControlButton("xsi-media-playlist-consecutive", _("Consecutive Playing"), () => this._toggleLoopStatus()); this.controls.add_actor(this._loopButton.getActor()); this._shuffleButton = new ControlButton("xsi-media-playlist-shuffle", _("No Shuffle"), () => this._toggleShuffle()); this.controls.add_actor(this._shuffleButton.getActor()); // Position slider this._seeker = new Seeker(this._mediaServerPlayer, this._prop, this._name.toLowerCase()); this.vertBox.add_actor(this._seeker.actor); this._applet._updatePlayerMenuItems(); this._setStatus(this._mediaServerPlayer.PlaybackStatus); this._setMetadata(this._mediaServerPlayer.Metadata); this._propChangedId = this._prop.connectSignal('PropertiesChanged', (proxy, sender, [iface, props]) => { if (props.PlaybackStatus) this._setStatus(props.PlaybackStatus.unpack()); if (props.Metadata) this._setMetadata(props.Metadata.deep_unpack()); if (props.CanGoNext || props.CanGoPrevious) this._updateControls(); if (props.LoopStatus) this._setLoopStatus(props.LoopStatus.unpack()); if (props.Shuffle) this._setShuffle(props.Shuffle.unpack()); if (props.Identity) { this._name = props.Identity.unpack(); this._applet._updatePlayerMenuItems(); } if (props.CanRaise) { this._showCanRaise(); } if (props.CanQuit) { this._showCanQuit(); } if (props.DesktopEntry) { this._applet.passDesktopEntry(props.DesktopEntry.unpack()); } }); this._setLoopStatus(this._mediaServerPlayer.LoopStatus); this._setShuffle(this._mediaServerPlayer.Shuffle); if (this._mediaServer.DesktopEntry) { this._applet.passDesktopEntry(this._mediaServer.DesktopEntry); } } _showCanRaise() { let btn = new ControlButton("xsi-go-up", _("Open Player"), () => { if (this._name.toLowerCase() === "spotify") { // Spotify isn't able to raise via Dbus once its main UI is closed Util.spawn(['spotify']); } else { this._mediaServer.RaiseRemote(); } this._applet.menu.close(); }, true); this._playerBox.add_actor(btn.actor); } _showCanQuit() { let btn = new ControlButton("xsi-window-close", _("Quit Player"), () => { this._mediaServer.QuitRemote(); this._applet.menu.close(); }, true); this._playerBox.add_actor(btn.actor); } _setName(status) { this.playerLabel.set_text(this._name + " - " + _(status)); } _updateControls() { this._prop.GetRemote(MEDIA_PLAYER_2_PLAYER_NAME, 'CanGoNext', (value, error) => { let canGoNext = false; if (!error) canGoNext = value[0].unpack(); this._nextButton.setEnabled(canGoNext); }); this._prop.GetRemote(MEDIA_PLAYER_2_PLAYER_NAME, 'CanGoPrevious', (value, error) => { let canGoPrevious = false; if (!error) canGoPrevious = value[0].unpack(); this._prevButton.setEnabled(canGoPrevious); }); } _setMetadata(metadata) { if (!metadata) return; let trackid = ""; // D-Bus path: A unique identity for this track if (metadata["mpris:trackid"]) { trackid = metadata["mpris:trackid"].unpack(); } let trackLength = 0; // Track length in secs if (metadata["mpris:length"]) { trackLength = metadata["mpris:length"].unpack() / 1000000; } this._seeker.setTrack(trackid, trackLength); if (metadata["xesam:artist"]) { switch (metadata["xesam:artist"].get_type_string()) { case 's': // smplayer sends a string this._artist = metadata["xesam:artist"].unpack(); break; case 'as': // others send an array of strings this._artist = metadata["xesam:artist"].deep_unpack().join(", "); break; default: this._artist = _("Unknown Artist"); } // make sure artist isn't empty if (!this._artist) this._artist = _("Unknown Artist"); } else this._artist = _("Unknown Artist"); this.artistLabel.set_text(this._artist); if (metadata["xesam:album"]) this._album = metadata["xesam:album"].unpack(); else this._album = _("Unknown Album"); if (metadata["xesam:title"]) this._title = metadata["xesam:title"].unpack(); else this._title = _("Unknown Title"); this.titleLabel.set_text(this._title); let change = false; if (metadata["mpris:artUrl"]) { let artUrl = metadata["mpris:artUrl"].unpack(); if (this._trackCoverFile != artUrl) { this._trackCoverFile = artUrl; change = true; } } else { if (this._trackCoverFile != false) { this._trackCoverFile = false; change = true; } } if (change) { if (this._trackCoverFile) { let cover_path = ""; if (this._trackCoverFile.match(/^http/)) { if (!this._trackCoverFileTmp) this._trackCoverFileTmp = Gio.file_new_tmp('XXXXXX.mediaplayer-cover')[0]; Util.spawn_async(['wget', this._trackCoverFile, '-O', this._trackCoverFileTmp.get_path()], () => this._onDownloadedCover()); } else if (this._trackCoverFile.match(/data:image\/(png|jpeg);base64,/)) { if (!this._trackCoverFileTmp) this._trackCoverFileTmp = Gio.file_new_tmp('XXXXXX.mediaplayer-cover')[0]; const cover_base64 = this._trackCoverFile.split(',')[1]; const base64_decode = data => new Promise(resolve => resolve(GLib.base64_decode(data))); if (!cover_base64) { return; } base64_decode(cover_base64) .then(decoded => { this._trackCoverFileTmp.replace_contents( decoded, null, false, Gio.FileCreateFlags.REPLACE_DESTINATION, null ); return this._trackCoverFileTmp.get_path(); }) .then(path => this._showCover(path)); } else { cover_path = decodeURIComponent(this._trackCoverFile); cover_path = cover_path.replace("file://", ""); this._showCover(cover_path); } } else this._showCover(false); } this._applet.setAppletTextIcon(this, true); } _setStatus(status) { if (!status) return; this._playerStatus = status; if (status == "Playing") { this._playButton.setData("xsi-media-playback-pause", _("Pause")); this.playerIcon.set_icon_name("xsi-media-playback-start"); this._applet.setAppletTextIcon(this, true); this._seeker.play(); } else if (status == "Paused") { this._playButton.setData("xsi-media-playback-start", _("Play")); this.playerIcon.set_icon_name("xsi-media-playback-pause"); this._applet.setAppletTextIcon(this, false); this._seeker.pause(); } else if (status == "Stopped") { this._playButton.setData("xsi-media-playback-start", _("Play")); this.playerIcon.set_icon_name("xsi-media-playback-stop"); this._applet.setAppletTextIcon(this, false); this._seeker.stop(); } else { this._applet.setAppletTextIcon(this, false); } this._setName(status); } _toggleLoopStatus() { let mapping = { "None": "Playlist", "Playlist": "Track", "Track": "None" }; this._mediaServerPlayer.LoopStatus = mapping[this._mediaServerPlayer.LoopStatus]; this._setLoopStatus(this._mediaServerPlayer.LoopStatus); } _setLoopStatus(status) { this._loopButton.actor.visible = this._applet.extendedPlayerControl && this._mediaServerPlayer.LoopStatus; if(status === "None") this._loopButton.setData("xsi-media-playlist-consecutive-symbolic", _("Consecutive Playing")); else if(status === "Track") this._loopButton.setData("xsi-media-playlist-repeat-song", _("Repeat Single")); else if(status === "Playlist") this._loopButton.setData("xsi-media-playlist-repeat", _("Repeat All")); this._loopButton.setActive(status !== "None"); } _toggleShuffle() { this._mediaServerPlayer.Shuffle = !this._mediaServerPlayer.Shuffle; } _setShuffle(status) { this._shuffleButton.actor.visible = this._applet.extendedPlayerControl && this._mediaServerPlayer.Shuffle; this._shuffleButton.setData("xsi-media-playlist-shuffle", status? _("Shuffle") : _("No Shuffle")); this._shuffleButton.setActive(status); } _onDownloadedCover() { let cover_path = this._trackCoverFileTmp.get_path(); this._showCover(cover_path); } _showCover(cover_path) { if (! cover_path || ! GLib.file_test(cover_path, GLib.FileTest.EXISTS)) { this.cover = new St.Icon({style_class: 'sound-player-generic-coverart', important: true, icon_name: "media-optical", icon_size: 300, icon_type: St.IconType.FULLCOLOR}); this._cover_path = null; this._applet.setAppletTextIcon(this, null); } else { this._cover_path = cover_path; this._cover_load_handle = St.TextureCache.get_default().load_image_from_file_async(cover_path, 300, 300, this._on_cover_loaded.bind(this)); } } _on_cover_loaded(cache, handle, actor) { if (handle !== this._cover_load_handle) { // Maybe a cover image load stalled? Make sure our requests match the callback. return; } this.coverBox.remove_actor(this.cover); // Make sure any oddly-shaped album art doesn't affect the height of the applet popup // (and move the player controls as a result). actor.margin_bottom = 300 - actor.height; this.cover = actor; this.coverBox.add_actor(this.cover); this.coverBox.set_child_below_sibling(this.cover, this.trackInfo); this._applet.setAppletTextIcon(this, this._cover_path); } onSettingsChanged() { this._loopButton.actor.visible = this._applet.extendedPlayerControl && this._mediaServerPlayer.LoopStatus; this._shuffleButton.actor.visible = this._applet.extendedPlayerControl && this._mediaServerPlayer.Shuffle; } destroy() { this._seeker.destroy(); if (this._prop) this._prop.disconnectSignal(this._propChangedId); PopupMenu.PopupMenuSection.prototype.destroy.call(this); } } class MediaPlayerLauncher extends PopupMenu.PopupBaseMenuItem { constructor(app, menu) { super({}); this._app = app; this._menu = menu; this.label = new St.Label({ text: app.get_name() }); this.addActor(this.label); this._icon = app.create_icon_texture(ICON_SIZE); this._icon_bin = new St.Bin({ x_align: St.Align.END, child: this._icon }); this.addActor(this._icon_bin, { expand: true, span: -1, align: St.Align.END }); this.connect("activate", (event) => this._onActivate(event)); } _onActivate(event) { let _time = event.time; this._app.activate_full(-1, _time); } } class CinnamonSoundApplet extends Applet.TextIconApplet { constructor(metadata, orientation, panel_height, instanceId) { super(orientation, panel_height, instanceId); this.setAllowedLayout(Applet.AllowedLayout.BOTH); this.metadata = metadata; this.settings = new Settings.AppletSettings(this, metadata.uuid, instanceId); this.settings.bind("showtrack", "showtrack", this.on_settings_changed); this.settings.bind("middleClickAction", "middleClickAction"); this.settings.bind("middleShiftClickAction", "middleShiftClickAction"); this.settings.bind("horizontalScroll", "horizontalScroll") this.settings.bind("showalbum", "showalbum", this.on_settings_changed); this.settings.bind("truncatetext", "truncatetext", this.on_settings_changed); this.settings.bind("hideSystray", "hideSystray", function() { if (this.hideSystray) this.registerSystrayIcons(); else this.unregisterSystrayIcons(); }); this.settings.bind("playerControl", "playerControl", this.on_settings_changed); this.settings.bind("extendedPlayerControl", "extendedPlayerControl", function() { for(let i in this._players) this._players[i].onSettingsChanged(); }); this.settings.bind("_knownPlayers", "_knownPlayers"); if (this.hideSystray) this.registerSystrayIcons(); this.settings.bind("keyOpen", "keyOpen", this._setKeybinding); this.settings.bind("alwaysShowMuteInput", "alwaysShowMuteInput", this.on_settings_changed); this.settings.bind("tooltipShowVolume", "tooltipShowVolume", this.on_settings_changed); this.settings.bind("tooltipShowPlayer", "tooltipShowPlayer", this.on_settings_changed); this.settings.bind("tooltipShowArtistTitle", "tooltipShowArtistTitle", this.on_settings_changed); this.menuManager = new PopupMenu.PopupMenuManager(this); this.menu = new Applet.AppletPopupMenu(this, orientation); this.menuManager.addMenu(this.menu); this._setKeybinding(); this.set_applet_icon_symbolic_name('xsi-audio-x-generic'); this._players = {}; this._playerItems = []; this._activePlayer = null; Interfaces.getDBusAsync((proxy, error) => { if (error) { // ?? what else should we do if we fail completely here? throw error; } this._dbus = proxy; // player DBus name pattern let name_regex = /^org\.mpris\.MediaPlayer2\./; // load players this._dbus.ListNamesRemote((names) => { for (let n in names[0]) { let name = names[0][n]; if (name_regex.test(name)) this._dbus.GetNameOwnerRemote(name, (owner) => this._addPlayer(name, owner[0])); } }); // watch players this._ownerChangedId = this._dbus.connectSignal('NameOwnerChanged', (proxy, sender, [name, old_owner, new_owner]) => { if (name_regex.test(name)) { if (new_owner && !old_owner) this._addPlayer(name, new_owner); else if (old_owner && !new_owner) this._removePlayer(name, old_owner); else this._changePlayerOwner(name, old_owner, new_owner); } } ); }); this._control = new Cvc.MixerControl({ name: 'Cinnamon Volume Control' }); this._control.connect('state-changed', (...args) => this._onControlStateChanged(...args)); this._control.connect('output-added', (...args) => this._onDeviceAdded(...args, "output")); this._control.connect('output-removed', (...args) => this._onDeviceRemoved(...args, "output")); this._control.connect('active-output-update', (...args) => this._onDeviceUpdate(...args, "output")); this._control.connect('input-added', (...args) => this._onDeviceAdded(...args, "input")); this._control.connect('input-removed', (...args) => this._onDeviceRemoved(...args, "input")); this._control.connect('active-input-update', (...args) => this._onDeviceUpdate(...args, "input")); this._control.connect('stream-added', (...args) => this._onStreamAdded(...args)); this._control.connect('stream-removed', (...args) => this._onStreamRemoved(...args)); this._sound_settings = new Gio.Settings({ schema_id: CINNAMON_DESKTOP_SOUNDS }); this._volumeNorm = this._control.get_vol_max_norm(); this._volumeMax = this._volumeNorm; this._streams = []; this._devices = []; this._recordingAppsNum = 0; this._output = null; this._outputMutedId = 0; this._outputIcon = "xsi-audio-volume-muted"; this._input = null; this._inputMutedId = 0; this._icon_name = ''; this._icon_path = null; this._iconTimeoutId = 0; this.actor.connect('scroll-event', (...args) => this._onScrollEvent(...args)); this.mute_out_switch = new PopupMenu.PopupSwitchIconMenuItem(_("Mute output"), false, "xsi-audio-volume-muted", St.IconType.SYMBOLIC); this.mute_in_switch = new PopupMenu.PopupSwitchIconMenuItem(_("Mute input"), false, "xsi-microphone-sensitivity-muted", St.IconType.SYMBOLIC); this._applet_context_menu.addMenuItem(this.mute_out_switch); this._applet_context_menu.addMenuItem(this.mute_in_switch); if (this.alwaysShowMuteInput) this.mute_in_switch.actor.show(); else this.mute_in_switch.actor.hide(); this._applet_context_menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this._outputApplicationsMenu = new PopupMenu.PopupSubMenuMenuItem(_("Applications")); this._selectOutputDeviceItem = new PopupMenu.PopupSubMenuMenuItem(_("Output device")); this._applet_context_menu.addMenuItem(this._outputApplicationsMenu); this._applet_context_menu.addMenuItem(this._selectOutputDeviceItem); this._outputApplicationsMenu.actor.hide(); this._selectOutputDeviceItem.actor.hide(); this._inputSection = new PopupMenu.PopupMenuSection(); this._inputVolumeSection = new VolumeSlider(this, null, _("Microphone"), null); this._inputVolumeSection.connect("values-changed", (...args) => this._inputValuesChanged(...args)); this._selectInputDeviceItem = new PopupMenu.PopupSubMenuMenuItem(_("Input device")); this._inputSection.addMenuItem(this._inputVolumeSection); this._inputSection.addMenuItem(this._selectInputDeviceItem); this._applet_context_menu.addMenuItem(this._inputSection); this._selectInputDeviceItem.actor.hide(); this._inputSection.actor.hide(); this._applet_context_menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.mute_out_switch.connect('toggled', () => this._toggle_out_mute()); this.mute_in_switch.connect('toggled', () => this._toggle_in_mute()); this._control.open(); this._volumeControlShown = false; this._showFixedElements(); this.set_show_label_in_vertical_panels(false); this.set_applet_label(this._applet_label.get_text()); let appsys = Cinnamon.AppSystem.get_default(); appsys.connect("installed-changed", () => this._updateLaunchPlayer()); this._sound_settings.connect("changed::" + OVERAMPLIFICATION_KEY, () => this._on_overamplification_change()); this._on_overamplification_change(); } _setKeybinding() { Main.keybindingManager.addXletHotKey(this, "sound-open", this.keyOpen, Lang.bind(this, this._openMenu)); } _on_overamplification_change () { if (this._sound_settings.get_boolean(OVERAMPLIFICATION_KEY)) { this._volumeMax = 1.5 * this._volumeNorm; this._outputVolumeSection.set_mark(1/1.5); } else { this._volumeMax = this._volumeNorm; this._outputVolumeSection.set_mark(0); } this._outputVolumeSection._update(); } on_settings_changed () { if(this.playerControl && this._activePlayer) this.setAppletTextIcon(this._players[this._activePlayer], true); else this.setAppletTextIcon(); if (this.alwaysShowMuteInput) this.mute_in_switch.actor.show(); else if (this._recordingAppsNum === 0) this.mute_in_switch.actor.hide(); this._changeActivePlayer(this._activePlayer); } on_applet_removed_from_panel () { Main.keybindingManager.removeXletHotKey(this, "sound-open"); if (this.hideSystray) this.unregisterSystrayIcons(); if (this._iconTimeoutId) { Mainloop.source_remove(this._iconTimeoutId); this._iconTimeoutId = 0; } this._dbus.disconnectSignal(this._ownerChangedId); for(let i in this._players) this._players[i].destroy(); if (this._control) this._control.close(); } on_applet_clicked(event) { this._openMenu(); } _openMenu() { this.menu.toggle(); } _toggle_out_mute() { if (!this._output) return; if (this._output.is_muted) { this._output.change_is_muted(false); this.mute_out_switch.setToggleState(false); } else { this._output.change_is_muted(true); this.mute_out_switch.setToggleState(true); } } _toggle_in_mute() { if (!this._input) return; let newStatus = !this._input.is_muted; this._input.change_is_muted(newStatus); this.mute_in_switch.setToggleState(newStatus); } _onScrollEvent(actor, event) { const direction = event.get_scroll_direction(); if (direction == Clutter.ScrollDirection.SMOOTH) { return Clutter.EVENT_PROPAGATE; } let currentVolume = this._output.volume; let volumeChange = false; let player = this._players[this._activePlayer]; if (direction == Clutter.ScrollDirection.DOWN) { let prev_muted = this._output.is_muted; this._output.volume = Math.max(0, currentVolume - this._volumeNorm * VOLUME_ADJUSTMENT_STEP); if (this._output.volume < 1) { this._output.volume = 0; if (!prev_muted) this._output.change_is_muted(true); } else { // 100% is magnetic: if (this._output.volume!=this._volumeNorm && this._output.volume>this._volumeNorm*(1-VOLUME_ADJUSTMENT_STEP/2) && this._output.volumethis._volumeNorm*(1-VOLUME_ADJUSTMENT_STEP/2) && this._output.volume { this.setIcon(); }); } } else { // if we have an active player and want to change the icon, change it immediately if (this._playerIcon[1]) this.set_applet_icon_path(this._playerIcon[0]); else this.set_applet_icon_symbolic_name(this._playerIcon[0]); } } else { //if we have no active player show the output icon this.set_applet_icon_symbolic_name(this._outputIcon); } } setAppletIcon(player, path) { if (path) { if (path === true) { // Restore the icon path from the saved path. path = this._icon_path; } else { this._icon_path = path; } } else if (path === null) { // This track has no art, erase the saved path. this._icon_path = null; } if (player && (player === true || player._playerStatus == 'Playing')) { // Something is playing if (this.showalbum) { if (path) { this.setIcon(path, "player-path"); } else { this.setIcon('xsi-media-optical-cd-audio', 'player-name'); } } else { this.setIcon('xsi-audio-x-generic', 'player-name'); } } else { // Nothing is playing - clear player icon and show volume icon this._playerIcon = [null, false]; this.setIcon(this._outputIcon); } } setAppletText(player) { let title_text = ""; if (this.showtrack && player && player._playerStatus == 'Playing') { if (player._artist == "Unknown Artist") { title_text = player._title; } else { title_text = player._title + ' - ' + player._artist; } const glyphs = Util.splitByGlyph(title_text); if (glyphs.length > this.truncatetext) { title_text = glyphs.slice(0, this.truncatetext - 3).join("") + "..."; } } this.set_applet_label(title_text); } setAppletTextIcon(player, icon) { this.player = player; if (player && player._owner != this._activePlayer) return; this.setAppletIcon(player, icon); this.setAppletText(player); this.setAppletTooltip(); } setAppletTooltip() { let tooltips = []; if (this.tooltipShowVolume) { tooltips.push(_("Volume") + ": " + this.volume); } if (this.player && this.player._owner == this._activePlayer) { if (this.tooltipShowPlayer) { tooltips.push(this.player._name + " - " + _(this.player._playerStatus)); } if (this.tooltipShowArtistTitle) { if (this.player._artist != _("Unknown Artist")) { tooltips.push(this.player._artist); } if (this._title != _("Unknown Title")) { tooltips.push(this.player._title); } } } this.set_applet_tooltip(tooltips.join("\n")); } _isInstance(busName) { // MPRIS instances are in the form // org.mpris.MediaPlayer2.name.instanceXXXX // ...except for VLC, which to this day uses // org.mpris.MediaPlayer2.name-XXXX return busName.split('.').length > 4 || /^org\.mpris\.MediaPlayer2\.vlc-\d+$/.test(busName); } _addPlayer(busName, owner) { if (this._players[owner]) { let prevName = this._players[owner]._busName; // HAVE: ADDING: ACTION: // master master reject, cannot happen // master instance upgrade to instance // instance master reject, duplicate // instance instance reject, cannot happen if (this._isInstance(busName) && !this._isInstance(prevName)) this._players[owner]._busName = busName; else return; } else if (owner) { let player = new Player(this, busName, owner); // Add the player to the list of active players in GUI. // We don't have the org.mpris.MediaPlayer2 interface set up at this point, // add the player's busName as a placeholder until we can get its Identity. let item = new PopupMenu.PopupMenuItem(busName); item.activate = () => this._switchPlayer(player._owner); this._chooseActivePlayerItem.menu.addMenuItem(item); this._players[owner] = player; this._playerItems.push({ player: player, item: item }); this._changeActivePlayer(owner); this._updatePlayerMenuItems(); this.setAppletTextIcon(this._players[this._activePlayer], true); } } _switchPlayer(owner) { if(this._players[owner]) { // The player exists, switch to it this._changeActivePlayer(owner); this._updatePlayerMenuItems(); this.setAppletTextIcon(this._players[this._activePlayer], true); } else { // The player doesn't seem to exist. Remove it from the players list this._removePlayerItem(owner); this._updatePlayerMenuItems(); } } _removePlayerItem(owner) { // Remove the player from the player switching list for(let i = 0, l = this._playerItems.length; i < l; ++i) { let playerItem = this._playerItems[i]; if(playerItem.player._owner === owner) { playerItem.item.destroy(); this._playerItems.splice(i, 1); break; } } } _removePlayer(busName, owner) { if (this._players[owner] && this._players[owner]._busName == busName) { this._removePlayerItem(owner); this._players[owner].destroy(); delete this._players[owner]; if (this._activePlayer == owner) { //set _activePlayer to null if we have none now, or to the first value in the players list this._activePlayer = null; for (let i in this._players) { this._changeActivePlayer(i); break; } } this._updatePlayerMenuItems(); this.setAppletTextIcon(this._players[this._activePlayer], true); } } _changePlayerOwner(busName, oldOwner, newOwner) { if (this._players[oldOwner] && busName == this._players[oldOwner]._busName) { this._players[newOwner] = this._players[oldOwner]; this._players[newOwner]._owner = newOwner; delete this._players[oldOwner]; if (this._activePlayer == oldOwner) this._activePlayer = newOwner; } } //will be called by an instance of #Player passDesktopEntry(entry) { //do we know already this player? for (let i = 0, l = this._knownPlayers.length; i < l; ++i) { if (this._knownPlayers[i] === entry) return; } //No, save it to _knownPlayers and update player list this._knownPlayers.push(entry); this._knownPlayers.save(); this._updateLaunchPlayer(); } _showFixedElements() { // The launch player list this._launchPlayerItem = new PopupMenu.PopupSubMenuMenuItem(_("Launch player")); this.menu.addMenuItem(this._launchPlayerItem); this._updateLaunchPlayer(); // The list to use when switching between active players this._chooseActivePlayerItem = new PopupMenu.PopupSubMenuMenuItem(_("Choose player controls")); this._chooseActivePlayerItem.actor.hide(); this.menu.addMenuItem(this._chooseActivePlayerItem); //between these two separators will be the player MenuSection (position 3) this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this._outputVolumeSection = new VolumeSlider(this, null, _("Volume"), null); this._outputVolumeSection.connect("values-changed", (...args) => this._outputValuesChanged(...args)); this.menu.addMenuItem(this._outputVolumeSection); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addSettingsAction(_("Sound Settings"), 'sound'); } _updateLaunchPlayer() { let availablePlayers = []; let appsys = Cinnamon.AppSystem.get_default(); //_knownPlayers is an array containing the paths of desktop files for(let i = 0, l = this._knownPlayers.length; i < l; ++i) { let app = appsys.lookup_app(this._knownPlayers[i] + ".desktop"); if (app) availablePlayers.push(app); } this._launchPlayerItem.menu.removeAll(); if (availablePlayers.length > 0) { for (var p = 0; p < availablePlayers.length; p++) { let playerApp = availablePlayers[p]; let menuItem = new MediaPlayerLauncher(playerApp, this._launchPlayerItem.menu); this._launchPlayerItem.menu.addMenuItem(menuItem); } } if (!this.playerControl || !availablePlayers.length) { this._launchPlayerItem.actor.hide(); } } _updatePlayerMenuItems() { if (this.playerControl && this._activePlayer) { this._launchPlayerItem.actor.show(); this._chooseActivePlayerItem.actor.show(); // Show a dot on the active player in the switching menu for (let i = 0, l = this._playerItems.length; i < l; ++i) { let playerItem = this._playerItems[i]; playerItem.item.setLabel(playerItem.player._name); playerItem.item.setShowDot(playerItem.player._owner === this._activePlayer); } // Hide the switching menu if we only have at most one active player if(this._chooseActivePlayerItem.menu.numMenuItems <= 1) { this._chooseActivePlayerItem.actor.hide(); } } else { if (this.playerControl && this._launchPlayerItem.menu.numMenuItems) { this._launchPlayerItem.actor.show(); } else { this._launchPlayerItem.actor.hide(); this._chooseActivePlayerItem.actor.hide(); } } } _changeActivePlayer(player) { if (this._activePlayer) this.menu.box.remove_actor(this._players[this._activePlayer].actor); this._activePlayer = player; if (this.playerControl && this._activePlayer != null) { let menuItem = this._players[player]; this.menu.addMenuItem(menuItem, 2); this._icon_path = menuItem._cover_path || null; } else { this._icon_path = null; } this._updatePlayerMenuItems(); } _notifyVolumeChange(stream) { Main.soundManager.play('volume'); } _mutedChanged(object, param_spec, property) { if (property == "_output") { this.mute_out_switch.setToggleState(this._output.is_muted); } else if (property == "_input") { this.mute_in_switch.setToggleState(this._input.is_muted); } } _outputValuesChanged(actor, iconName, percentage) { this.setIcon(iconName, "output"); this.mute_out_switch.setIconSymbolicName(iconName); this.volume = percentage; this.setAppletTooltip(); } _inputValuesChanged(actor, iconName) { this.mute_in_switch.setIconSymbolicName(iconName); } _onControlStateChanged() { if (this._control.get_state() == Cvc.MixerControlState.READY) { this._readOutput(); this._readInput(); this.actor.show(); } else { this.actor.hide(); } } _readOutput() { if (this._outputMutedId) { this._output.disconnect(this._outputMutedId); this._outputMutedId = 0; } this._output = this._control.get_default_sink(); if (this._output) { this._outputVolumeSection.connectWithStream(this._output); this._outputMutedId = this._output.connect('notify::is-muted', (...args) => this._mutedChanged(...args, '_output')); this._mutedChanged (null, null, '_output'); } else { this.setIcon("xsi-audio-volume-muted-symbolic", "output"); } } _readInput() { if (this._inputMutedId) { this._input.disconnect(this._inputMutedId); this._inputMutedId = 0; } this._input = this._control.get_default_source(); if (this._input) { this._inputVolumeSection.connectWithStream(this._input); this._inputMutedId = this._input.connect('notify::is-muted', (...args) => this._mutedChanged(...args, '_input')); this._mutedChanged (null, null, '_input'); } else { this._inputSection.actor.hide(); } } _onDeviceAdded(control, id, type) { let device = this._control["lookup_" + type + "_id"](id); let item = new PopupMenu.PopupMenuItem(device.description); item.activate = () => this._control["change_" + type](device); let bin = new St.Bin({ x_align: St.Align.END, style_class: 'popup-inactive-menu-item' }); let label = new St.Label({ text: device.origin }); bin.add_actor(label); item.addActor(bin, { expand: true, span: -1, align: St.Align.END }); let selectItem = this["_select" + type[0].toUpperCase() + type.slice(1) + "DeviceItem"]; selectItem.menu.addMenuItem(item); //show the menu if we have more than two devices if(selectItem.menu.numMenuItems > 1) selectItem.actor.show(); this._devices.push({id: id, type: type, item: item}); } _onDeviceRemoved(control, id, type) { for (let i = 0, l = this._devices.length; i < l; ++i) { if (this._devices[i].type === type && this._devices[i].id === id) { let device = this._devices[i]; if (device.item) device.item.destroy(); //hide submenu if showing them is unnecessary let selectItem = this["_select" + type[0].toUpperCase() + type.slice(1) + "DeviceItem"]; if (selectItem.menu.numMenuItems <= 1) selectItem.actor.hide(); this._devices.splice(i, 1); break; } } } _onDeviceUpdate(control, id, type) { this["_read" + type[0].toUpperCase() + type.slice(1)](); for (let i = 0, l = this._devices.length; i < l; ++i) { if (this._devices[i].type === type) this._devices[i].item.setShowDot(id === this._devices[i].id); } } _onStreamAdded(control, id) { let stream = this._control.lookup_stream_id(id); let appId = stream.application_id; if (stream.is_virtual || appId === "org.freedesktop.libcanberra") { //sort out unwanted streams return; } if (stream instanceof Cvc.MixerSinkInput) { //for sink inputs, add a menuitem to the application submenu let item = new StreamMenuSection(this, stream); this._outputApplicationsMenu.menu.addMenuItem(item); this._outputApplicationsMenu.actor.show(); this._streams.push({id: id, type: "SinkInput", item: item}); } else if (stream instanceof Cvc.MixerSourceOutput) { //for source outputs, only show the input section this._streams.push({id: id, type: "SourceOutput"}); if (this._recordingAppsNum++ === 0) { this._inputSection.actor.show(); this.mute_in_switch.actor.show(); } } } _onStreamRemoved(control, id) { for (let i = 0, l = this._streams.length; i < l; ++i) { if(this._streams[i].id === id) { let stream = this._streams[i]; if(stream.item) stream.item.destroy(); //hide submenus or sections if showing them is unnecessary if (stream.type === "SinkInput") { if (this._outputApplicationsMenu.menu.numMenuItems === 0) this._outputApplicationsMenu.actor.hide(); } else if (stream.type === "SourceOutput") { if(--this._recordingAppsNum === 0) { this._inputSection.actor.hide(); this.mute_in_switch.actor.hide(); } if (this.alwaysShowMuteInput) this.mute_in_switch.actor.show(); } this._streams.splice(i, 1); break; } } } registerSystrayIcons() { for (let i = 0; i < players_with_seek_support.length; i++) { Main.systrayManager.registerTrayIconReplacement(players_with_seek_support[i], this.metadata.uuid); } for (let i = 0; i < players_without_seek_support.length; i++) { Main.systrayManager.registerTrayIconReplacement(players_without_seek_support[i], this.metadata.uuid); } } unregisterSystrayIcons() { Main.systrayManager.unregisterTrayIconReplacement(this.metadata.uuid); } } function main(metadata, orientation, panel_height, instanceId) { return new CinnamonSoundApplet(metadata, orientation, panel_height, instanceId); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/sound@cinnamon.org/metadata.json0000664000175000017500000000021115167446463026776 0ustar fabiofabio{ "uuid": "sound@cinnamon.org", "name": "Sound", "description": "A Cinnamon applet to control sound and music", "icon": "cs-sound" } cinnamon-6.6.8/files/usr/share/cinnamon/applets/sound@cinnamon.org/settings-schema.json0000664000175000017500000000611215167446463030322 0ustar fabiofabio{ "section1": { "type": "section", "description" : "Menu" }, "playerControl": { "type": "switch", "default": true, "description": "Control Players" }, "extendedPlayerControl": { "type": "switch", "default": false, "description": "Show Loop and Shuffle controls", "dependency": "playerControl" }, "keyOpen": { "type": "keybinding", "description": "Show menu", "default": "s", "tooltip" : "Set keybinding(s) to show the sound applet menu." }, "alwaysShowMuteInput": { "type": "switch", "description": "Always show input switch", "tooltip": "Always show the 'Mute input' switch in the context menu.", "default": false }, "_knownPlayers": { "type": "generic", "default": ["banshee", "vlc", "rhythmbox"] }, "section2": { "type": "section", "description" : "Panel" }, "showtrack": { "type": "switch", "default": false, "description": "Show song information on the panel", "dependency": "playerControl" }, "truncatetext": { "type": "spinbutton", "default": 30, "min": 5, "max": 512, "units": "characters", "step": 1, "description": "Limit song information to", "dependency": "showtrack" }, "middleClickAction": { "type": "combobox", "default": "mute", "options": { "Toggle Mute": "mute", "Toggle Mute output": "out_mute", "Toggle Mute input": "in_mute", "Toggle Play / Pause": "player" }, "description": "Action on middle click" }, "middleShiftClickAction": { "type": "combobox", "default": "in_mute", "options": { "Toggle Mute": "mute", "Toggle Mute output": "out_mute", "Toggle Mute input": "in_mute", "Toggle Play / Pause": "player" }, "description": "Action on shift+middle click" }, "horizontalScroll": { "type": "switch", "default": false, "description": "Use horizontal scrolling to move between tracks", "dependency": "playerControl" }, "showalbum": { "type": "switch", "default": false, "description": "Show album art as icon", "dependency": "playerControl" }, "hideSystray" : { "type" : "switch", "description" : "Hide system tray icons for compatible players", "default": true }, "section3": { "type": "section", "description" : "Tooltip" }, "tooltipShowVolume": { "type": "switch", "default": true, "description": "Show volume in tooltip" }, "tooltipShowPlayer": { "type": "switch", "default": false, "description": "Show player in tooltip" }, "tooltipShowArtistTitle": { "type": "switch", "default": false, "description": "Show song artist and title in tooltip" } } cinnamon-6.6.8/files/usr/share/cinnamon/applets/spacer@cinnamon.org/0000775000175000017500000000000015167446463024456 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/spacer@cinnamon.org/applet.js0000664000175000017500000000362715167446463026311 0ustar fabiofabioconst Applet = imports.ui.applet; const St = imports.gi.St; const Settings = imports.ui.settings; const Lang = imports.lang; class CinnamonSpacerApplet extends Applet.Applet { constructor(metadata, orientation, panelHeight, instance_id) { super(orientation, panelHeight, instance_id); this.actor.track_hover = false; this.setAllowedLayout(Applet.AllowedLayout.BOTH); this.actor.set_style_class_name("spacer-box"); this.bin = new St.Bin(); this.actor.add(this.bin); this.settings = new Settings.AppletSettings(this, "spacer@cinnamon.org", this.instance_id); this.settings.bind("width", "width", this.size_changed); global.settings.connect('changed::panel-edit-mode', Lang.bind(this, this.on_pane_edit_mode_changed)); this.orientation = orientation; this.size_changed(); this.on_pane_edit_mode_changed(); } on_pane_edit_mode_changed(settings, key) { if (global.settings.get_boolean("panel-edit-mode")) { this.actor.add_style_class_name("edit-mode"); } else { this.actor.remove_style_class_name("edit-mode"); } } on_orientation_changed(neworientation) { this.orientation = neworientation; this.size_changed(); } size_changed() { let scaled_width = this.width * global.ui_scale; if (this.orientation == St.Side.TOP || this.orientation == St.Side.BOTTOM) { this.bin.natural_width = scaled_width; this.bin.natural_height_set = false; } else { this.bin.natural_height = scaled_width; this.bin.natural_width_set = false } } on_applet_removed_from_panel() { this.settings.finalize(); } } function main(metadata, orientation, panelHeight, instance_id) { return new CinnamonSpacerApplet(metadata, orientation, panelHeight, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/spacer@cinnamon.org/metadata.json0000664000175000017500000000024015167446463027125 0ustar fabiofabio{ "uuid": "spacer@cinnamon.org", "name": "Spacer", "description": "Add some space between your other applets", "icon": "cs-applets", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/spacer@cinnamon.org/settings-schema.json0000664000175000017500000000035515167446463030452 0ustar fabiofabio{ "width": { "type": "scale", "default" : 10, "min" : 2, "max" : 400, "step" : 1, "description" : "Amount of space in pixels", "tooltip" : "Adjust this to increase or decrease the width of this spacer" } } cinnamon-6.6.8/files/usr/share/cinnamon/applets/systray@cinnamon.org/0000775000175000017500000000000015167446463024717 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/systray@cinnamon.org/applet.js0000664000175000017500000001567615167446463026561 0ustar fabiofabioconst Lang = imports.lang; const St = imports.gi.St; const Clutter = imports.gi.Clutter; const GLib = imports.gi.GLib; const Applet = imports.ui.applet; const PopupMenu = imports.ui.popupMenu; const Main = imports.ui.main; const Mainloop = imports.mainloop; const SignalManager = imports.misc.signalManager; const {findIndex} = imports.misc.util; const Meta = imports.gi.Meta; const NO_RESIZE_ROLES = ['shutter', 'filezilla']; class CinnamonSystrayApplet extends Applet.Applet { constructor(orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.setAllowedLayout(Applet.AllowedLayout.BOTH); this.actor.remove_style_class_name('applet-box'); this.actor.set_style_class_name('systray'); this.actor.set_important(true); // ensure we get class details from the default theme if not present this._signalManager = new SignalManager.SignalManager(null); this._scaleUpdateId = 0; this.orientation = orientation; this.icon_size = this.getPanelIconSize(St.IconType.FULLCOLOR) * global.ui_scale; this.button_box = new St.BoxLayout({ vertical: [St.Side.LEFT, St.Side.RIGHT].includes(this.orientation) }); this.actor.add_actor (this.button_box); this.button_box.show(); } on_applet_clicked(event) { } on_orientation_changed(neworientation) { if (neworientation == St.Side.TOP || neworientation == St.Side.BOTTOM) { this.button_box.set_vertical(false); } else { this.button_box.set_vertical(true); } this.update_na_tray_orientation(); } update_na_tray_orientation() { switch (this.orientation) { case St.Side.LEFT: case St.Side.RIGHT: Main.statusIconDispatcher.set_tray_orientation(Clutter.Orientation.VERTICAL); break; case St.Side.TOP: case St.Side.BOTTOM: default: Main.statusIconDispatcher.set_tray_orientation(Clutter.Orientation.HORIZONTAL); break; } } on_applet_reloaded() { global.trayReloading = true; } on_applet_removed_from_panel() { this._signalManager.disconnectAllSignals(); this._clearIcons(); } on_applet_added_to_panel() { if (!global.trayReloading) { Main.statusIconDispatcher.start(this.actor.get_parent().get_parent()); } this.update_na_tray_orientation(); this._signalManager.connect(Main.statusIconDispatcher, 'status-icon-added', this._onTrayIconAdded, this); this._signalManager.connect(Main.statusIconDispatcher, 'status-icon-removed', this._onTrayIconRemoved, this); this._signalManager.connect(Main.statusIconDispatcher, 'before-redisplay', this._onBeforeRedisplay, this); this._signalManager.connect(Main.systrayManager, "changed", Main.statusIconDispatcher.redisplay, Main.statusIconDispatcher); this._signalManager.connect(global, "scale-changed", this.uiScaleChanged, this); this._signalManager.connect(global.settings, 'changed::panel-edit-mode', this.on_panel_edit_mode_changed, this); if (global.trayReloading) { global.trayReloading = false; Main.statusIconDispatcher.redisplay(); } } _clearIcons() { this.button_box.get_children().forEach((button) => { // button.set_size(-1, -1); button.remove_actor(button.child); button.destroy(); }); } resizeIcons() { this.icon_size = this.getPanelIconSize() * global.ui_scale; Main.statusIconDispatcher.redisplay(); } on_panel_icon_size_changed(size) { this.resizeIcons(); } on_panel_edit_mode_changed() { this.resizeIcons(); } uiScaleChanged() { if (this._scaleUpdateId > 0) { Mainloop.source_remove(this._scaleUpdateId); } this._scaleUpdateId = Mainloop.timeout_add(1500, () => { this.resizeIcons(); this._scaleUpdateId = 0; return GLib.SOURCE_REMOVE; }); } _onBeforeRedisplay() { // Mark all icons as obsolete // There might still be pending delayed operations to insert/resize of them // And that would crash Cinnamon this._clearIcons(); } _onTrayIconAdded(o, icon, role) { try { let hiddenIcons = Main.systrayManager.getRoles(); if (hiddenIcons.indexOf(role.toLowerCase()) != -1 ) { // We've got an applet for that global.log("Hiding systray: " + role); return; } global.log("Adding systray: " + role + " (" + icon.get_width() + "x" + icon.get_height() + "px)"); let button = new St.Bin( { style_class: "applet-box", child: icon }) icon.set_x_align(Clutter.ActorAlign.CENTER); icon.set_y_align(Clutter.ActorAlign.FILL); button.set_y_align(Clutter.ActorAlign.FILL); icon.visible = false; icon.opacity = 0; GLib.timeout_add(GLib.PRIORITY_DEFAULT, 1000, () => { if (icon.is_finalized()) { button.destroy(); return GLib.SOURCE_REMOVE; } icon.reactive = true; icon.visible = true; icon.set_size(this.icon_size, this.icon_size); icon.ease({ opacity: 255, duration: 400, mode: Clutter.AnimationMode.EASE_OUT_QUAD, }); icon.connect("event", (actor, event) => this._onEvent(actor, event)); return GLib.SOURCE_REMOVE; }); this.button_box.insert_child_at_index(button, 0); } catch (e) { global.logError(e); } } _onEvent(icon, event) { let etype = event.type(); const button = icon.get_parent(); if (button == null) { return GLib.SOURCE_REMOVE; } if (etype === Clutter.EventType.BUTTON_PRESS) { global.begin_modal(Meta.ModalOptions.POINTER_ALREADY_GRABBED, event.time); } else if (etype === Clutter.EventType.ENTER) { button.add_style_pseudo_class("hover"); } else if (etype === Clutter.EventType.LEAVE) { button.remove_style_pseudo_class("hover"); } let ret = icon.handle_event(etype, event); if (etype === Clutter.EventType.BUTTON_PRESS) { global.end_modal(event.time); } return ret; } _onTrayIconRemoved(o, icon) { const parent = icon.get_parent(); parent.remove_actor(icon); parent.destroy() } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonSystrayApplet(orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/systray@cinnamon.org/metadata.json0000664000175000017500000000024715167446463027375 0ustar fabiofabio{ "uuid": "systray@cinnamon.org", "name": "System Tray", "icon": "cs-applets", "role": "tray", "description": "An applet which hosts all the system tray icons" } cinnamon-6.6.8/files/usr/share/cinnamon/applets/trash@cinnamon.org/0000775000175000017500000000000015167446463024322 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/trash@cinnamon.org/applet.js0000664000175000017500000001044115167446463026145 0ustar fabiofabioconst St = imports.gi.St; const ModalDialog = imports.ui.modalDialog; const Gio = imports.gi.Gio; const GLib = imports.gi.GLib; const Lang = imports.lang; const Applet = imports.ui.applet; const PopupMenu = imports.ui.popupMenu; const Mainloop = imports.mainloop; const Util = imports.misc.util; const MESSAGE = _("Are you sure you want to delete all items from the trash?") + "\n" + _("This operation cannot be undone."); class CinnamonTrashApplet extends Applet.IconApplet { constructor(orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.set_applet_icon_symbolic_name("xsi-user-trash"); this.set_applet_tooltip(_("Trash")); this.trash_changed_timeout = 0; const vfs = Gio.Vfs.get_default() if (vfs.get_supported_uri_schemes().includes("trash")) { this._initContextMenu(); this.trash_path = 'trash:///'; this.trash_directory = Gio.file_new_for_uri(this.trash_path); this._onTrashChange(); } else { this.trash_directory = null; global.logWarning("trash@cinnamon.org: No trash support, disabling.") this.actor.hide(); } } _initContextMenu() { this.empty_item = new PopupMenu.PopupIconMenuItem(_("Empty Trash"), "xsi-list-remove", St.IconType.SYMBOLIC); this.empty_item.connect('activate', Lang.bind(this, this._emptyTrash)); this._applet_context_menu.addMenuItem(this.empty_item); this.open_item = new PopupMenu.PopupIconMenuItem(_("Open Trash"), "xsi-document-open", St.IconType.SYMBOLIC); this.open_item.connect('activate', Lang.bind(this, this._openTrash)); this._applet_context_menu.addMenuItem(this.open_item); } on_applet_clicked(event) { this._openTrash(); } on_applet_added_to_panel() { if (this.trash_directory == null) { return; } this.monitor = this.trash_directory.monitor_directory(0, null); this.monitor_changed_id = this.monitor.connect('changed', Lang.bind(this, this._onTrashChange)); } on_applet_removed_from_panel() { if (this.trash_directory == null) { return; } if (this.monitor_changed_id > 0) { this.monitor.disconnect(this.monitor_changed_id); this.monitor_changed_id = 0; } this.moniitor = 0; } _openTrash() { Gio.app_info_launch_default_for_uri(this.trash_directory.get_uri(), null); } _onTrashChange() { if (this.trash_changed_timeout > 0) { Mainloop.source_remove(this.trash_changed_timeout); this.trash_changed_timeout = 0; } this.trash_changed_timeout = Mainloop.idle_add(Lang.bind(this, this._onTrashChangeTimeout), GLib.PRIORITY_LOW); } _onTrashChangeTimeout() { this.trash_changed_timeout = 0; const children = this.trash_directory.enumerate_children_async( 'standard::*', Gio.FileQueryInfoFlags.NONE, GLib.PRIORITY_LOW, null, (...args) => this._enumerateChildrenCallback(...args) ); return GLib.SOURCE_REMOVE; } _enumerateChildrenCallback(file, result) { try { const child_info = file.enumerate_children_finish(result); child_info.next_files_async( 1, GLib.PRIORITY_LOW, null, (enumerator, res) => { file = enumerator.next_files_finish(res); if (file.length > 0) { this.set_applet_icon_symbolic_name("xsi-user-trash-full"); } else { this.set_applet_icon_symbolic_name("xsi-user-trash"); } } ); } catch(e) { global.logWarning(`Could not check trash uri: ${e.message}`); } } _emptyTrash() { new ModalDialog.ConfirmDialog(MESSAGE, this._doEmptyTrash).open(); } _doEmptyTrash() { Util.spawn(['gio', 'trash', '--empty']); } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonTrashApplet(orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/trash@cinnamon.org/metadata.json0000664000175000017500000000027015167446463026774 0ustar fabiofabio{ "uuid": "trash@cinnamon.org", "name": "Trash", "description": "Control the trash from the panel", "icon": "user-trash", "localedir": "/usr/share/locale", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/user@cinnamon.org/0000775000175000017500000000000015167446463024157 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/user@cinnamon.org/applet.js0000664000175000017500000002036015167446463026003 0ustar fabiofabioconst Applet = imports.ui.applet; const Lang = imports.lang; const St = imports.gi.St; const PopupMenu = imports.ui.popupMenu; const Util = imports.misc.util; const GLib = imports.gi.GLib; const Gio = imports.gi.Gio; const AccountsService = imports.gi.AccountsService; const GnomeSession = imports.misc.gnomeSession; const ScreenSaver = imports.misc.screenSaver; const Settings = imports.ui.settings; const UserWidget = imports.ui.userWidget; const DIALOG_ICON_SIZE = 64; const USER_DEFAULT_IMG_PATH = "/usr/share/cinnamon/faces/user-generic.png"; class CinnamonUserApplet extends Applet.TextApplet { constructor(orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.setAllowedLayout(Applet.AllowedLayout.BOTH); this._panel_icon_box = new St.Bin(); // https://developer.gnome.org/st/stable/StBin.htm this._panel_icon_box.set_alignment(St.Align.MIDDLE, St.Align.MIDDLE); this.actor.insert_child_at_index(this._panel_icon_box, 0); this._panel_avatar = null; this._session = new GnomeSession.SessionManager(); this._screenSaverProxy = new ScreenSaver.ScreenSaverProxy(); this.settings = new Settings.AppletSettings(this, "user@cinnamon.org", instance_id); this.menuManager = new PopupMenu.PopupMenuManager(this); this.menu = new Applet.AppletPopupMenu(this, orientation); this.menuManager.addMenu(this.menu); this._contentSection = new PopupMenu.PopupMenuSection(); this.menu.addMenuItem(this._contentSection); this._user = AccountsService.UserManager.get_default().get_user(GLib.get_user_name()); this._userLoadedId = this._user.connect('notify::is-loaded', Lang.bind(this, this._onUserChanged)); this._userChangedId = this._user.connect('changed', Lang.bind(this, this._onUserChanged)); let userBox = new St.BoxLayout({ style_class: 'user-box', reactive: true, vertical: false }); this._userIcon = new UserWidget.Avatar(this._user, { iconSize: DIALOG_ICON_SIZE }); this.settings.bind("display-name", "disp_name", this._updateLabel); this.settings.bind("display-image", "display_image", this._updatePanelIcon); userBox.connect('button-press-event', Lang.bind(this, function() { this.menu.toggle(); Util.spawnCommandLine("cinnamon-settings user"); })); this._userIcon.hide(); userBox.add(this._userIcon, { x_fill: true, y_fill: false, x_align: St.Align.END, y_align: St.Align.START }); this.userLabel = new St.Label(({ style_class: 'user-label'})); userBox.add(this.userLabel, { x_fill: true, y_fill: false, x_align: St.Align.END, y_align: St.Align.MIDDLE }); this.menu.addActor(userBox); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); let item = new PopupMenu.PopupIconMenuItem(_("System Settings"), "xsi-preferences", St.IconType.SYMBOLIC); item.connect('activate', Lang.bind(this, function() { Util.spawnCommandLine("cinnamon-settings"); })); this.menu.addMenuItem(item); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); item = new PopupMenu.PopupIconMenuItem(_("Lock Screen"), "xsi-lock-screen", St.IconType.SYMBOLIC); item.connect('activate', Lang.bind(this, function() { let screensaver_settings = new Gio.Settings({ schema_id: "org.cinnamon.desktop.screensaver" }); let screensaver_dialog = Gio.file_new_for_path("/usr/bin/cinnamon-screensaver-command"); if (screensaver_dialog.query_exists(null)) { if (screensaver_settings.get_boolean("ask-for-away-message")) { Util.spawnCommandLine("cinnamon-screensaver-lock-dialog"); } else { Util.spawnCommandLine("cinnamon-screensaver-command --lock"); } } else { this._screenSaverProxy.LockRemote(); } })); this.menu.addMenuItem(item); let lockdown_settings = new Gio.Settings({ schema_id: 'org.cinnamon.desktop.lockdown' }); if (!lockdown_settings.get_boolean('disable-user-switching')) { if (GLib.getenv("XDG_SEAT_PATH")) { // LightDM item = new PopupMenu.PopupIconMenuItem(_("Switch User"), "xsi-switch-user", St.IconType.SYMBOLIC); item.connect('activate', Lang.bind(this, function() { Util.spawnCommandLine("cinnamon-screensaver-command --lock"); Util.spawnCommandLine("dm-tool switch-to-greeter"); })); this.menu.addMenuItem(item); } else if (GLib.file_test("/usr/bin/mdmflexiserver", GLib.FileTest.EXISTS)) { // MDM item = new PopupMenu.PopupIconMenuItem(_("Switch User"), "xsi-switch-user", St.IconType.SYMBOLIC); item.connect('activate', Lang.bind(this, function() { Util.spawnCommandLine("mdmflexiserver"); })); this.menu.addMenuItem(item); } else if (GLib.file_test("/usr/bin/gdmflexiserver", GLib.FileTest.EXISTS)) { // GDM item = new PopupMenu.PopupIconMenuItem(_("Switch User"), "xsi-switch-user", St.IconType.SYMBOLIC); item.connect('activate', Lang.bind(this, function() { Util.spawnCommandLine("cinnamon-screensaver-command --lock"); Util.spawnCommandLine("gdmflexiserver"); })); this.menu.addMenuItem(item); } } item = new PopupMenu.PopupIconMenuItem(_("Log Out..."), "xsi-log-out", St.IconType.SYMBOLIC); item.connect('activate', Lang.bind(this, function() { this._session.LogoutRemote(0); })); this.menu.addMenuItem(item); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); item = new PopupMenu.PopupIconMenuItem(_("Power Off..."), "xsi-shutdown", St.IconType.SYMBOLIC); item.connect('activate', Lang.bind(this, function() { this._session.ShutdownRemote(); })); this.menu.addMenuItem(item); this._onUserChanged(); } on_applet_clicked(event) { this.menu.toggle(); } _updateLabel() { if (this.disp_name) { this.set_applet_label(this._user.get_real_name()); this._layoutBin.show(); } else { this.set_applet_label(""); this._layoutBin.hide(); } } _onUserChanged() { if (this._user && this._user.is_loaded) { this.set_applet_tooltip(this._user.get_real_name()); this.userLabel.set_text (this._user.get_real_name()); if (this._userIcon) { this._userIcon.update(); this._userIcon.show(); } this._updatePanelIcon(); this._updateLabel(); } } _updatePanelIcon() { if (this.display_image) { if (this._panel_avatar != null) { this._panel_avatar.destroy() } this._panel_avatar = new UserWidget.Avatar(this._user, { iconSize: this.getPanelIconSize(St.IconType.FULLCOLOR) }); this._panel_icon_box.set_child(this._panel_avatar); this._panel_avatar.update(); this._panel_avatar.show(); } else { this._panel_icon = new St.Icon({ icon_name: 'xsi-avatar-default-symbolic', icon_type: St.IconType.SYMBOLIC, icon_size: this.getPanelIconSize(St.IconType.SYMBOLIC), }); this._panel_icon_box.set_child(this._panel_icon); } } on_panel_height_changed() { this._updatePanelIcon(); } on_panel_icon_size_changed() { this._updatePanelIcon(); } on_applet_removed_from_panel() { this.settings.finalize(); } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonUserApplet(orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/user@cinnamon.org/icons/0000775000175000017500000000000015167446463025272 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/user@cinnamon.org/icons/logout-symbolic.svg0000664000175000017500000000615215167446463031147 0ustar fabiofabio image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-6.6.8/files/usr/share/cinnamon/applets/user@cinnamon.org/icons/switch-user-symbolic.svg0000664000175000017500000000252015167446463032106 0ustar fabiofabio image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-6.6.8/files/usr/share/cinnamon/applets/user@cinnamon.org/metadata.json0000664000175000017500000000035315167446463026633 0ustar fabiofabio{ "description": "An applet to access your account details, switch users and quickly logout or power off the computer", "uuid": "user@cinnamon.org", "name": "User Applet", "icon": "cs-user", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/user@cinnamon.org/settings-schema.json0000664000175000017500000000037115167446463030151 0ustar fabiofabio{ "display-name" : { "type" : "switch", "default" : false, "description": "Display user name on panel" }, "display-image" : { "type" : "switch", "default" : false, "description": "Display the user image on the panel" } } cinnamon-6.6.8/files/usr/share/cinnamon/applets/user@cinnamon.org/stylesheet.css0000664000175000017500000000027415167446463027065 0ustar fabiofabio.user-box { padding: .4em 1.75em; spacing: 6px; } .user-icon { border-radius: 4px; border: 2px solid #a5a5a5; } .user-label { color: #fff; font-size: 16px; margin: 6px; } cinnamon-6.6.8/files/usr/share/cinnamon/applets/window-list@cinnamon.org/0000775000175000017500000000000015167446463025461 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js0000664000175000017500000016525115167446463027316 0ustar fabiofabio/* Window-list applet * * The applet code consists of four main object. WindowPreview, AppMenuButton, * AppMenuButtonRightClickMenu and the main applet code. * * The main applet object listens to different events and updates the window * list accordingly. Since addition/removal of windows is emitted by the * workspace, we have to listen to the changes to the number of workspaces and * update our signals accordingly as well. It also listens to the change in * window state (eg tile/maximize) since the window titles are displayed * differently in the AppMenuButton for each different state, eg minimized * windows are shown as [Title]. * * For each window the main applet object wants to show, an AppMenuButton is * created. This is created for every window in the monitors it is responsible * for, regardless of whether it is on the active workspace. Individual applet * objects are then shown/hidden according to which workspace they are in. * * The AppMenuButton is responsible for managing its own appearance using a * CinnamonGenericContainer. We manage the allocation ourselves and shrink the * label when there isn't enough space in the panel (the space available is * divided among all AppMenuButtons and each is told how much space they can * use through the "allocate" signal). It also has an onFocus function that the * main applet calls when a window is focused. * * When a window is marked urgent or demand attention ("urgent" windows are not * more important that those demanding attention. These are two unrelated * notions in different specifications that both mean approximately the same * thing), we will ask the AppMenuButton to flash. If the window is from a * separate workspace, we generate a new temporary AppMenuButton and add it to * our actor box. It stops flashing when the onFocus function is called (and if * the window is indeed focused) (destroyed in the case of temporary * AppMenuButtons). * * The AppMenuButtonRightClickMenu is, as the name suggests, the right click * menu of the AppMenuButton. The menu is generated every time the button is * right-clicked, since this rarely happens and generating all at the beginning * would be a waste of time/memory. This also saves us from having to listen to * signals for changes in workspace/monitor etc. * * Finally, the WindowPreview object is a tooltip that shows a preview of the * window. Users can opt to show a window preview (using this), or the title * (using Tooltips.PanelItemTooltip) in the tooltip. The window preview is * generated on the fly when needed instead of cached. */ const Cinnamon = imports.gi.Cinnamon; const Clutter = imports.gi.Clutter; const Cogl = imports.gi.Cogl; const GLib = imports.gi.GLib; const Gio = imports.gi.Gio; const Gdk = imports.gi.Gdk; const Lang = imports.lang; const Mainloop = imports.mainloop; const Meta = imports.gi.Meta; const St = imports.gi.St; const Applet = imports.ui.applet; const AppletManager = imports.ui.appletManager; const DND = imports.ui.dnd; const Main = imports.ui.main; const PopupMenu = imports.ui.popupMenu; const Settings = imports.ui.settings; const SignalManager = imports.misc.signalManager; const Tooltips = imports.ui.tooltips; const MessageTray = imports.ui.messageTray; const WindowUtils = imports.misc.windowUtils; const MAX_TEXT_LENGTH = 1000; const FLASH_INTERVAL = 500; const FLASH_MAX_COUNT = 4; const WINDOW_PREVIEW_WIDTH = 200; const WINDOW_PREVIEW_HEIGHT = 150; class WindowPreview extends Tooltips.TooltipBase { constructor(item, metaWindow, previewScale, showLabel) { super(item.actor); this._applet = item._applet; this.metaWindow = metaWindow; this._windowActor = null; this.uiScale = global.ui_scale; this.thumbScale = previewScale; this._sizeChangedId = 0; this.thumbnail = null; this.actor = new St.BoxLayout({ vertical: true, style_class: "window-list-preview", important: true }); this.actor.show_on_set_parent = false; Main.uiGroup.add_actor(this.actor); this.label = new St.Label(); this.labelBin = new St.Bin({ y_align: St.Align.MIDDLE }); this.labelBin.set_width(WINDOW_PREVIEW_WIDTH * this.thumbScale * this.uiScale); this.labelBin.add_actor(this.label); this.actor.add_actor(this.labelBin); if (!showLabel) { this.labelBin.hide(); } this.thumbnailBin = new St.Bin(); this.actor.add_actor(this.thumbnailBin); } get windowActor() { if (this._windowActor) { return this._windowActor; } this._windowActor = this.metaWindow.get_compositor_private(); if (this._windowActor) { return this._windowActor; } else { log("metaWindow has no actor!"); return null; } } _onEnterEvent(actor, event) { if (this._applet._tooltipShowing) this.show(); else if (!this._showTimer) this._showTimer = Mainloop.timeout_add(300, Lang.bind(this, this._onShowTimerComplete)); this.mousePosition = event.get_coords(); } _getScaledTextureSize(windowTexture) { let [width, height] = windowTexture.get_size(); let scale = this.thumbScale * this.uiScale * Math.min(WINDOW_PREVIEW_WIDTH / width, WINDOW_PREVIEW_HEIGHT / height); return [ width * scale, height * scale ]; } _hide(actor, event) { super._hide.call(this, actor, event); this._applet.erodeTooltip(); } show() { if (!this.actor || this._applet._menuOpen) return; if (this.thumbnail) { this.thumbnailBin.set_child(null); this.thumbnail.destroy(); this.thumbnail = null; } let windowTexture = this.windowActor.get_texture(); if (!windowTexture) { this.actor.hide(); return; } let [width, height] = this._getScaledTextureSize(this.windowActor); this.thumbnail = WindowUtils.getCloneOrContent(this.windowActor, width, height); this._sizeChangedId = this.windowActor.connect('notify::size', () => { if (this.thumbnail === null) { return; } let [width, height] = this._getScaledTextureSize(this.windowActor); this.thumbnail.set_size(width, height); this._set_position(); }); this.thumbnailBin.set_child(this.thumbnail); this.actor.show(); this._set_position(); this.visible = true; this._applet.cancelErodeTooltip(); this._applet._tooltipShowing = true; } hide() { if (this._sizeChangedId > 0) { this.windowActor.disconnect(this._sizeChangedId); this._sizeChangedId = 0; } if (this.thumbnail) { this.thumbnailBin.set_child(null); this.thumbnail.destroy(); this.thumbnail = null; } if (this.actor) { this.actor.hide(); } this.visible = false; } _set_position() { if (!this.actor || this.actor.is_finalized()) return; let allocation = this.actor.get_allocation_box(); let previewHeight = allocation.y2 - allocation.y1; let previewWidth = allocation.x2 - allocation.x1; let monitor = Main.layoutManager.findMonitorForActor(this.item); let previewTop; if (this._applet.orientation === St.Side.BOTTOM) { previewTop = this.item.get_transformed_position()[1] - previewHeight - 5; } else if (this._applet.orientation === St.Side.TOP) { previewTop = this.item.get_transformed_position()[1] + this.item.get_transformed_size()[1] + 5; } else { previewTop = this.item.get_transformed_position()[1]; } let previewLeft; if (this._applet.orientation === St.Side.BOTTOM || this._applet.orientation === St.Side.TOP) { // centre the applet on the window list item if window list is on the top or bottom panel previewLeft = this.item.get_transformed_position()[0] + this.item.get_transformed_size()[0]/2 - previewWidth/2; } else if (this._applet.orientation === St.Side.LEFT) { previewLeft = this.item.get_transformed_position()[0] + this.item.get_transformed_size()[0] + 5; } else { previewLeft = this.item.get_transformed_position()[0] - previewWidth - 5; } previewLeft = Math.round(previewLeft); previewLeft = Math.max(previewLeft, monitor.x); previewLeft = Math.min(previewLeft, monitor.x + monitor.width - previewWidth); previewTop = Math.round(previewTop); previewTop = Math.min(previewTop, monitor.y + monitor.height - previewHeight); this.actor.set_position(previewLeft, previewTop); } set_text(text) { this.label.set_text(text); } _destroy() { if (this._sizeChangedId > 0) { this._windowActor.disconnect(this._sizeChangedId); this.sizeChangedId = 0; } if (this.thumbnail) { this.thumbnailBin.set_child(null); this.thumbnail.destroy(); this.thumbnail = null; } if (this.actor) { Main.uiGroup.remove_actor(this.actor); this.actor.destroy(); this.actor = null; } } } class AppMenuButton { constructor(applet, metaWindow, transient) { this.actor = new Cinnamon.GenericContainer({ name: 'appMenu', style_class: 'window-list-item-box', reactive: true, can_focus: true, track_hover: true }); this._applet = applet; this.metaWindow = metaWindow; this.transient = transient; let initially_urgent = transient || metaWindow.demands_attention || metaWindow.urgent; this.drawLabel = false; this.labelVisiblePref = false; this._signals = new SignalManager.SignalManager(); this.xid = metaWindow.get_xwindow(); this._flashTimer = null; if (this._applet.orientation == St.Side.TOP) this.actor.add_style_class_name('top'); else if (this._applet.orientation == St.Side.BOTTOM) this.actor.add_style_class_name('bottom'); else if (this._applet.orientation == St.Side.LEFT) this.actor.add_style_class_name('left'); else if (this._applet.orientation == St.Side.RIGHT) this.actor.add_style_class_name('right'); this.actor._delegate = this; this._signals.connect(this.actor, 'button-release-event', Lang.bind(this, this._onButtonRelease)); this._signals.connect(this.actor, 'button-press-event', Lang.bind(this, this._onButtonPress)); this._signals.connect(this.actor, 'get-preferred-width', Lang.bind(this, this._getPreferredWidth)); this._signals.connect(this.actor, 'get-preferred-height', Lang.bind(this, this._getPreferredHeight)); this._signals.connect(this.actor, 'notify::allocation', Lang.bind(this, this.updateIconGeometry)); this._updateIconGeometryTimeoutId = 0; this._signals.connect(this.actor, 'allocate', Lang.bind(this, this._allocate)); this.progressOverlay = new St.Widget({ style_class: "progress", reactive: false, important: true }); this.actor.add_actor(this.progressOverlay); this._iconBox = new Cinnamon.Slicer({ name: 'appMenuIcon' }); this.actor.add_actor(this._iconBox); this._label = new St.Label(); this.actor.add_actor(this._label); this.notificationsBadge = new St.BoxLayout({ style_class: 'grouped-window-list-notifications-badge', important: true, x_align: St.Align.MIDDLE, y_align: St.Align.MIDDLE, show_on_set_parent: false, }); this.notificationsBadgeLabel = new St.Label({ style_class: 'grouped-window-list-notifications-badge-label', important: true, text: '' }); this.notificationsBadgeLabel.clutter_text.ellipsize = false; this.notificationsBadge.add(this.notificationsBadgeLabel, { x_align: St.Align.START, y_align: St.Align.START, }); this.actor.add_child(this.notificationsBadge); this.notificationsBadge.set_text_direction(St.TextDirection.LTR); this.notificationsBadge.show(); this.updateLabelVisible(); this._visible = true; this._progress = 0; if (this.metaWindow.progress !== undefined) { this._progress = this.metaWindow.progress; if (this._progress > 0) { this.progressOverlay.show(); } else this.progressOverlay.hide(); this._updateProgressId = this._signals.connect(this.metaWindow, "notify::progress", () => { if (this.metaWindow.progress != this._progress) { this._progress = this.metaWindow.progress; if (this._progress >0) { this.progressOverlay.show(); } else { this.progressOverlay.hide(); } this.actor.queue_relayout(); } }); } else { this.progressOverlay.hide(); } /* TODO: this._progressPulse = this.metaWindow.progress_pulse; */ this.onPreviewChanged(); if (!this.transient) { this._menuManager = new PopupMenu.PopupMenuManager(this); this.rightClickMenu = new AppMenuButtonRightClickMenu(this, this.metaWindow, this._applet.orientation); this._menuManager.addMenu(this.rightClickMenu); this._draggable = DND.makeDraggable(this.actor, null, this._applet.actor); this._signals.connect(this._draggable, 'drag-begin', Lang.bind(this, this._onDragBegin)); this._signals.connect(this._draggable, 'drag-cancelled', Lang.bind(this, this._onDragCancelled)); this._signals.connect(this._draggable, 'drag-end', Lang.bind(this, this._onDragEnd)); } this.onPanelEditModeChanged(); this._signals.connect(global.settings, 'changed::panel-edit-mode', Lang.bind(this, this.onPanelEditModeChanged)); this._windows = this._applet._windows; this.scrollConnector = null; this.onScrollModeChanged(); this._needsAttention = false; this.app = this._getApp(); this.appId = this.app ? this.app.get_id() : null; this.updateNotificationsBadge(); this.setDisplayTitle(); this.onFocus(); this.setIcon(); if (initially_urgent) this.getAttention(); this._signals.connect(this.metaWindow, 'notify::title', this.setDisplayTitle, this); this._signals.connect(this.metaWindow, "notify::minimized", this.setDisplayTitle, this); this._signals.connect(this.metaWindow, "notify::tile-mode", this.setDisplayTitle, this); this._signals.connect(this.metaWindow, "notify::icon", this.setIcon, this); this._signals.connect(this.metaWindow, "notify::appears-focused", this.onFocus, this); this._signals.connect(this.metaWindow, "unmanaged", this.onUnmanaged, this); } onUnmanaged() { this.destroy(); this._windows.splice(this._windows.indexOf(this), 1); } onPreviewChanged() { if (this._tooltip) this._tooltip.destroy(); if (this._applet.windowHover == "thumbnail") this._tooltip = new WindowPreview(this, this.metaWindow, this._applet.previewScale, this._applet.showLabel); else this._tooltip = new Tooltips.PanelItemTooltip(this, "", this._applet.orientation); this.setDisplayTitle(); } onPanelEditModeChanged() { let editMode = global.settings.get_boolean("panel-edit-mode"); if (this._draggable) this._draggable.inhibit = editMode; this.actor.reactive = !editMode; } onScrollModeChanged() { if (this._applet.scrollable) { this.scrollConnector = this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent)); } else { if (this.scrollConnector) { this.actor.disconnect(this.scrollConnector); this.scrollConnector = null; } } } _onScrollEvent(actor, event) { let direction = event.get_scroll_direction(); if (direction === Clutter.ScrollDirection.SMOOTH) { return Clutter.EVENT_STOP; } // Find the current focused window let windows = this.actor.get_parent().get_children() .filter(function(item) { return item.visible; }).map(function(item) { return item._delegate; }); windows = windows.reverse(); let i = windows.length; while (i-- && !windows[i].metaWindow.has_focus()); if (i == -1) return; // v home-made xor if ((direction == 0) != this._applet.reverseScroll) i++; else i--; if (i == windows.length) i = 0; else if (i == -1) i = windows.length - 1; Main.activateWindow(windows[i].metaWindow, global.get_current_time()); } _onDragBegin() { if (this._applet.orientation == St.Side.TOP || this._applet.orientation == St.Side.BOTTOM) { this._draggable._overrideY = this.actor.get_transformed_position()[1]; this._draggable._overrideX = null; } else { this._draggable._overrideX = this.actor.get_transformed_position()[0]; this._draggable._overrideY = null; } this._tooltip.hide(); this._tooltip.preventShow = true; } _onDragEnd() { this.actor.show(); this._applet.clearDragPlaceholder(); this._tooltip.preventShow = false; } _onDragCancelled() { this.actor.show(); this._applet.clearDragPlaceholder(); this._tooltip.preventShow = false; } getDragActor() { let clone = new Clutter.Clone({ source: this.actor }); clone.width = this.actor.width; clone.height = this.actor.height; return clone; } getDragActorSource() { return this.actor; } handleDragOver(source, actor, x, y, time) { if (this._draggable && this._draggable.inhibit) { return DND.DragMotionResult.CONTINUE; } if (source instanceof AppMenuButton) return DND.DragMotionResult.CONTINUE; /* Users can drag things from one window to another window (eg drag an * image from Firefox to LibreOffice). However, if the target window is * hidden, they will drag to the AppWindowButton of the target window, * and we will open the window for them. */ this._toggleWindow(true); return DND.DragMotionResult.NO_DROP; } acceptDrop(source, actor, x, y, time) { return false; } setDisplayTitle() { let title = this.metaWindow.get_title(); if (!title) title = this.app ? this.app.get_name() : '?'; /* Sanitize the window title to prevent dodgy window titles such as * "); DROP TABLE windows; --. Turn all whitespaces into " " because * newline characters are known to cause trouble. Also truncate the * title when necessary or else cogl might get unhappy and crash * Cinnamon. */ title = title.replace(/\s/g, " "); if (title.length > MAX_TEXT_LENGTH) title = title.substr(0, MAX_TEXT_LENGTH); if (this._tooltip && this._applet.windowHover != "nothing" && this._tooltip.set_text) this._tooltip.set_text(title); this._label.set_text(title); } _getApp() { const tracker = Cinnamon.WindowTracker.get_default(); let app = tracker.get_window_app(this.metaWindow); if (!app) { app = tracker.get_app_from_pid(this.metaWindow.get_pid()); } if (!app) { app = tracker.get_app_from_pid(this.metaWindow.get_client_pid()); } return app; } destroy() { if (this._flashTimer) { Mainloop.source_remove(this._flashTimer); this._flashTimer = null; } if (this._updateIconGeometryTimeoutId > 0) { Mainloop.source_remove(this._updateIconGeometryTimeoutId); this._updateIconGeometryTimeoutId = 0; } this._signals.disconnectAllSignals(); this._tooltip.destroy(); if (!this.transient) { this.rightClickMenu.destroy(); this._menuManager.destroy(); } this.actor.destroy(); } _hasFocus() { if (!this.metaWindow || this.metaWindow.minimized) return false; if (this.metaWindow.has_focus()) return true; if (global.display.focus_window && this.metaWindow.is_ancestor_of_transient(global.display.focus_window)) return true; return false } onFocus() { if (this._hasFocus()) { this.actor.add_style_pseudo_class('focus'); this.actor.remove_style_class_name("window-list-item-demands-attention"); this.actor.remove_style_class_name("window-list-item-demands-attention-top"); this._needsAttention = false; if (this.transient) { this.destroy(); this._windows.splice(this._windows.indexOf(this), 1); } } else { this.actor.remove_style_pseudo_class('focus'); } } _onButtonRelease(actor, event) { this._tooltip.hide(); if (this.transient) { if (event.get_button() == 1) this._toggleWindow(false); return false; } if (event.get_button() == 1) { if (this.rightClickMenu.isOpen) this.rightClickMenu.toggle(); this._toggleWindow(false); } else if (event.get_button() == 2 && this._applet.middleClickClose) { this.metaWindow.delete(global.get_current_time()); } return true; } _onButtonPress(actor, event) { this._tooltip.hide(); if (!this.transient && event.get_button() == 3) { this.rightClickMenu.mouseEvent = event; this.rightClickMenu.toggle(); if (this._hasFocus()) { this.actor.add_style_pseudo_class('focus'); } } } _toggleWindow(fromDrag){ if (!this._hasFocus()) { Main.activateWindow(this.metaWindow, global.get_current_time()); this.actor.add_style_pseudo_class('focus'); } else if (!fromDrag && this._applet.leftClickMinimize) { this.metaWindow.minimize(); this.actor.remove_style_pseudo_class('focus'); } } updateIconGeometry() { if (this._updateIconGeometryTimeoutId > 0) { Mainloop.source_remove(this._updateIconGeometryTimeoutId); } this._updateIconGeometryTimeoutId = Mainloop.timeout_add(50, Lang.bind(this, this._updateIconGeometryTimeout)); } _updateIconGeometryTimeout() { this._updateIconGeometryTimeoutId = 0; let rect = new Meta.Rectangle(); [rect.x, rect.y] = this.actor.get_transformed_position(); [rect.width, rect.height] = this.actor.get_transformed_size(); this.metaWindow.set_icon_geometry(rect); return GLib.SOURCE_REMOVE; } _getPreferredWidth(actor, forHeight, alloc) { let [minSize, naturalSize] = this._iconBox.get_preferred_width(forHeight); alloc.min_size = 1 * global.ui_scale; if (this._applet.orientation == St.Side.TOP || this._applet.orientation == St.Side.BOTTOM ) { // the 'buttons use entire space' option only makes sense on horizontal panels with labels if (this.labelVisiblePref) { if (this._applet.buttonsUseEntireSpace) { let [lminSize, lnaturalSize] = this._label.get_preferred_width(forHeight); let spacing = this.actor.get_theme_node().get_length('spacing'); alloc.natural_size = Math.max(this._applet.buttonWidth * global.ui_scale, naturalSize + spacing + lnaturalSize); } else { alloc.natural_size = this._applet.buttonWidth * global.ui_scale; } } else { alloc.natural_size = naturalSize } } else { alloc.natural_size = this._applet._panelHeight; } } _getPreferredHeight(actor, forWidth, alloc) { let [minSize1, naturalSize1] = this._iconBox.get_preferred_height(forWidth); if (this.labelVisiblePref) { let [minSize2, naturalSize2] = this._label.get_preferred_height(forWidth); alloc.min_size = Math.max(minSize1, minSize2); } else { alloc.min_size = minSize1; } if (this._applet.orientation == St.Side.TOP || this._applet.orientation == St.Side.BOTTOM ) { /* putting a container around the actor for layout management reasons affects the allocation, causing the visible border to pull in close around the contents which is not the desired (pre-existing) behaviour, so need to push the visible border back towards the panel edge. Assigning the natural size to the full panel height used to cause recursion errors but seems fine now. If this happens to avoid this you can subtract 1 or 2 pixels, but this will give an unreactive strip at the edge of the screen */ alloc.natural_size = this._applet._panelHeight; } else { alloc.natural_size = naturalSize1; } } _allocate(actor, box, flags) { let allocWidth = box.x2 - box.x1; let allocHeight = box.y2 - box.y1; const childBox = new Clutter.ActorBox(); const notifBadgeBox = new Clutter.ActorBox(); let [minWidth, minHeight, naturalWidth, naturalHeight] = this._iconBox.get_preferred_size(); let direction = this.actor.get_text_direction(); let spacing = Math.floor(this.actor.get_theme_node().get_length('spacing')); let yPadding = Math.floor(Math.max(0, allocHeight - naturalHeight) / 2); childBox.y1 = box.y1 + yPadding; childBox.y2 = childBox.y1 + Math.min(naturalHeight, allocHeight); if (allocWidth < naturalWidth) { this.labelVisible = false; } else { this.labelVisible = this.labelVisiblePref; } if (this.drawLabel) { if (direction === Clutter.TextDirection.LTR) { childBox.x1 = box.x1; } else { childBox.x1 = Math.max(box.x1, box.x2 - naturalWidth); } childBox.x2 = Math.min(childBox.x1 + naturalWidth, box.x2); } else { childBox.x1 = box.x1 + Math.floor(Math.max(0, allocWidth - naturalWidth) / 2); childBox.x2 = Math.min(childBox.x1 + naturalWidth, box.x2); } this._iconBox.allocate(childBox, flags); // Set notifications badge position const notifBadgeOffset = 3 * global.ui_scale; const notifBadgeXCenter = this._iconBox.x + this._iconBox.width - notifBadgeOffset; const notifBadgeYCenter = this._iconBox.y + notifBadgeOffset; const [nLabelMinWidth, nLabelMinHeight, nLabelNaturalWidth, nLabelNaturalHeight] = this.notificationsBadgeLabel.get_preferred_size(); const notifBadgesize = Math.max(nLabelNaturalWidth, nLabelNaturalHeight); notifBadgeBox.x2 = Math.min(notifBadgeXCenter + Math.floor(notifBadgesize / 2), box.x2); notifBadgeBox.x1 = notifBadgeBox.x2 - notifBadgesize; notifBadgeBox.y1 = Math.max(notifBadgeYCenter - Math.floor(notifBadgesize / 2), 0); notifBadgeBox.y2 = notifBadgeBox.y1 + notifBadgesize; const notifLabelPosX = Math.floor((notifBadgesize - nLabelNaturalWidth) / 2); const notifLabelPosY = Math.floor((notifBadgesize - nLabelNaturalHeight) / 2); this.notificationsBadgeLabel.set_anchor_point(-notifLabelPosX, -notifLabelPosY); this.notificationsBadge.set_size(notifBadgesize, notifBadgesize); this.notificationsBadge.allocate(notifBadgeBox, flags); if (this.drawLabel) { [minWidth, minHeight, naturalWidth, naturalHeight] = this._label.get_preferred_size(); yPadding = Math.floor(Math.max(0, allocHeight - naturalHeight) / 2); childBox.y1 = box.y1 + yPadding; childBox.y2 = childBox.y1 + Math.min(naturalHeight, allocHeight); if (direction === Clutter.TextDirection.LTR) { // Reuse the values from the previous allocation childBox.x1 = Math.min(childBox.x2 + spacing, box.x2); childBox.x2 = box.x2; } else { childBox.x2 = Math.max(childBox.x1 - spacing, box.x1); childBox.x1 = box.x1; } this._label.allocate(childBox, flags); } if (!this.progressOverlay.visible) { return; } childBox.x1 = 0; childBox.y1 = 0; childBox.x2 = this.actor.width; childBox.y2 = this.actor.height; this.progressOverlay.allocate(childBox, flags); let clip_width = Math.max((this.actor.width) * (this._progress / 100.0), 1.0); this.progressOverlay.set_clip(0, 0, clip_width, this.actor.height); } updateLabelVisible() { if (this._applet.showLabelPanel) { this._label.show(); this.labelVisiblePref = true; this.drawLabel = true; } else { this._label.hide(); this.labelVisiblePref = false; this.drawLabel = false; } } setIcon() { this.icon_size = this._applet.icon_size; let icon = this.app ? this.app.create_icon_texture_for_window(this.icon_size, this.metaWindow) : new St.Icon({ icon_name: 'application-default-icon', icon_type: St.IconType.FULLCOLOR, icon_size: this.icon_size }); let old_child = this._iconBox.get_child(); this._iconBox.set_child(icon); if (old_child) old_child.destroy(); } getAttention() { if (this._needsAttention) return false; this._needsAttention = true; this._flashButton(); return true; } _flashButton() { if (!this._needsAttention || this._flashTimer) return; let counter = 0; const sc = "window-list-item-demands-attention"; this._flashTimer = Mainloop.timeout_add(FLASH_INTERVAL, () => { if (!this._needsAttention) { this._flashTimer = null; return false; } if (this.actor.has_style_class_name(sc)) this.actor.remove_style_class_name(sc); else this.actor.add_style_class_name(sc); const continueFlashing = (counter++ < FLASH_MAX_COUNT); if (!continueFlashing) { this._flashTimer = null; } return continueFlashing; }); } updateNotificationsBadge() { const nCount = Main.notificationDaemon.getNotificationCountForApp(this.app); if (nCount > 0 && this._applet.enableNotifications) { this.notificationsBadgeLabel.text = nCount.toString(); this.notificationsBadge.show(); } else { this.notificationsBadge.hide(); } } }; class AppMenuButtonRightClickMenu extends Applet.AppletPopupMenu { constructor(launcher, metaWindow, orientation) { super(launcher, orientation); this._launcher = launcher; this._windows = launcher._applet._windows; this._signals.connect(this, 'open-state-changed', Lang.bind(this, this._onToggled)); this.orientation = orientation; this.metaWindow = metaWindow; } _populateMenu() { let mw = this.metaWindow; let item; let length; // Move to monitor if ((length = Main.layoutManager.monitors.length) == 2) { Main.layoutManager.monitors.forEach(function (monitor, index) { if (index === mw.get_monitor()) return; item = new PopupMenu.PopupMenuItem(_("Move to the other monitor")); this._signals.connect(item, 'activate', function() { mw.move_to_monitor(index); }); this.addMenuItem(item); }, this); } else if ((length = Main.layoutManager.monitors.length) > 2) { Main.layoutManager.monitors.forEach(function (monitor, index) { if (index === mw.get_monitor()) return; item = new PopupMenu.PopupMenuItem(_("Move to monitor %d").format(index + 1)); this._signals.connect(item, 'activate', function() { mw.move_to_monitor(index); }); this.addMenuItem(item); }, this); } // Move to workspace if ((length = global.workspace_manager.n_workspaces) > 1) { if (mw.is_on_all_workspaces()) { item = new PopupMenu.PopupMenuItem(_("Only on this workspace")); this._signals.connect(item, 'activate', function() { mw.unstick(); }); this.addMenuItem(item); } else { item = new PopupMenu.PopupMenuItem(_("Visible on all workspaces")); this._signals.connect(item, 'activate', function() { mw.stick(); }); this.addMenuItem(item); item = new PopupMenu.PopupSubMenuMenuItem(_("Move to another workspace")); this.addMenuItem(item); let curr_index = mw.get_workspace().index(); for (let i = 0; i < length; i++) { // Make the index a local variable to pass to function let j = i; let name = Main.workspace_names[i] ? Main.workspace_names[i] : Main._makeDefaultWorkspaceName(i); let ws = new PopupMenu.PopupMenuItem(name); if (i == curr_index) ws.setSensitive(false); this._signals.connect(ws, 'activate', function() { mw.change_workspace(global.workspace_manager.get_workspace_by_index(j)); }); item.menu.addMenuItem(ws); } } } // Preferences let subMenu = new PopupMenu.PopupSubMenuMenuItem(_("Applet preferences")); this.addMenuItem(subMenu); item = new PopupMenu.PopupIconMenuItem(_("About..."), "xsi-dialog-question", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', Lang.bind(this._launcher._applet, this._launcher._applet.openAbout)); subMenu.menu.addMenuItem(item); item = new PopupMenu.PopupIconMenuItem(_("Configure..."), "xsi-preferences", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', () => this._launcher._applet.configureApplet()); subMenu.menu.addMenuItem(item); item = new PopupMenu.PopupIconMenuItem(_("Remove 'Window list'"), "xsi-edit-delete", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', (actor, event) => this._launcher._applet.confirmRemoveApplet(event)); subMenu.menu.addMenuItem(item); this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); // Close all/others item = new PopupMenu.PopupIconMenuItem(_("Close all"), "xsi-exit", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', Lang.bind(this, function() { for (let window of this._windows) if (window.actor.visible && !window._needsAttention) window.metaWindow.delete(global.get_current_time()); })); this.addMenuItem(item); item = new PopupMenu.PopupIconMenuItem(_("Close others"), "xsi-window-close", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', Lang.bind(this, function() { for (let window of this._windows) if (window.actor.visible && window.metaWindow != this.metaWindow && !window._needsAttention) window.metaWindow.delete(global.get_current_time()); })); this.addMenuItem(item); this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); // Miscellaneous if (mw.get_compositor_private().opacity != 255) { item = new PopupMenu.PopupMenuItem(_("Restore to full opacity")); this._signals.connect(item, 'activate', function() { mw.get_compositor_private().set_opacity(255); }); this.addMenuItem(item); } if (mw.minimized) { item = new PopupMenu.PopupIconMenuItem(_("Restore"), "xsi-view-sort-descending", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', function() { Main.activateWindow(mw, global.get_current_time()); }); } else { item = new PopupMenu.PopupIconMenuItem(_("Minimize"), "xsi-view-sort-ascending", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', function() { mw.minimize(); }); } this.addMenuItem(item); if (mw.get_maximized()) { item = new PopupMenu.PopupIconMenuItem(_("Unmaximize"), "xsi-view-restore", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', function() { mw.unmaximize(Meta.MaximizeFlags.HORIZONTAL | Meta.MaximizeFlags.VERTICAL); }); } else { item = new PopupMenu.PopupIconMenuItem(_("Maximize"), "xsi-view-fullscreen", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', function() { mw.maximize(Meta.MaximizeFlags.HORIZONTAL | Meta.MaximizeFlags.VERTICAL); }); } this.addMenuItem(item); item.setSensitive(mw.can_maximize()) item = new PopupMenu.PopupIconMenuItem(_("Close"), "xsi-edit-delete", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', function() { mw.delete(global.get_current_time()); }); this.addMenuItem(item); } _onToggled(actor, isOpening){ if (this.isOpen) this._launcher._applet._menuOpen = true; else this._launcher._applet._menuOpen = false; } toggle() { if (!this.isOpen) { this.removeAll(); this._populateMenu(); } Applet.AppletPopupMenu.prototype.toggle.call(this); } } class CinnamonWindowListApplet extends Applet.Applet { constructor(orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.signals = new SignalManager.SignalManager(null); this.setAllowedLayout(Applet.AllowedLayout.BOTH); this.actor.set_track_hover(false); this.actor.set_style_class_name("window-list-box"); this.orientation = orientation; this.icon_size = this.getPanelIconSize(St.IconType.FULLCOLOR); this.appletEnabled = false; // // A layout manager is used to cater for vertical panels as well as horizontal // let manager; if (this.orientation == St.Side.TOP || this.orientation == St.Side.BOTTOM) { manager = new Clutter.BoxLayout( { orientation: Clutter.Orientation.HORIZONTAL }); } else { manager = new Clutter.BoxLayout( { orientation: Clutter.Orientation.VERTICAL }); this.actor.add_style_class_name("vertical"); } this.manager = manager; this.manager_container = new Clutter.Actor( { layout_manager: manager } ); this.actor.add_actor (this.manager_container); this.dragInProgress = false; this._tooltipShowing = false; this._tooltipErodeTimer = null; this._menuOpen = false; this._urgentSignal = null; this._windows = []; this._monitorWatchList = []; this.settings = new Settings.AppletSettings(this, "window-list@cinnamon.org", this.instance_id); this.settings.bind("show-all-workspaces", "showAllWorkspaces"); this.settings.bind("enable-alerts", "enableAlerts", this._updateAttentionGrabber); this.settings.bind("enable-scrolling", "scrollable", this._onEnableScrollChanged); this.settings.bind("reverse-scrolling", "reverseScroll"); this.settings.bind("left-click-minimize", "leftClickMinimize"); this.settings.bind("middle-click-close", "middleClickClose"); this.settings.bind("button-width", "buttonWidth", this._refreshAllItems); this.settings.bind("buttons-use-entire-space", "buttonsUseEntireSpace", this._refreshAllItems); this.settings.bind("panel-show-label", "showLabelPanel", this._updateLabels); this.settings.bind("window-hover", "windowHover", this._onPreviewChanged); this.settings.bind("window-preview-show-label", "showLabel", this._onPreviewChanged); this.settings.bind("window-preview-scale", "previewScale", this._onPreviewChanged); this.settings.bind("enable-notifications", "enableNotifications", this._updateAllNotificationBadges); this.settings.bind("last-window-order", "lastWindowOrder", null); this.signals.connect(global.display, 'window-created', this._onWindowAddedAsync, this); this.signals.connect(global.display, 'window-monitor-changed', this._onWindowMonitorChanged, this); this.signals.connect(global.display, 'window-workspace-changed', this._onWindowWorkspaceChanged, this); this.signals.connect(global.display, 'window-skip-taskbar-changed', this._onWindowSkipTaskbarChanged, this); this.signals.connect(Main.panelManager, 'monitors-changed', this._updateWatchedMonitors, this); this.signals.connect(global.window_manager, 'switch-workspace', this._refreshAllItems, this); this.signals.connect(Cinnamon.WindowTracker.get_default(), "window-app-changed", this._onWindowAppChanged, this); this.signals.connect(Main.messageTray, 'notify-applet-update', this._onNotificationReceived, this); this.signals.connect(this.actor, 'style-changed', Lang.bind(this, this._updateSpacing)); global.settings.bind("panel-edit-mode", this.actor, "reactive", Gio.SettingsBindFlags.DEFAULT); this.on_orientation_changed(orientation); this._updateAttentionGrabber(); } on_applet_added_to_panel(userEnabled) { this._updateSpacing(); this.appletEnabled = true; MessageTray.extensionsHandlingNotifications++; } on_applet_removed_from_panel() { this.signals.disconnectAllSignals(); this.settings.finalize(); MessageTray.extensionsHandlingNotifications--; } on_applet_instances_changed() { this._updateWatchedMonitors(); } on_panel_height_changed() { this.icon_size = this.getPanelIconSize(St.IconType.FULLCOLOR); this._refreshAllItems(); } on_panel_icon_size_changed(size) { this.icon_size = size; this._refreshAllItems(); } on_orientation_changed(orientation) { this.orientation = orientation; for (let window of this._windows) window.updateLabelVisible(); if (orientation == St.Side.TOP || orientation == St.Side.BOTTOM) { this.manager.set_vertical(false); this._reTitleItems(); this.actor.remove_style_class_name("vertical"); } else { this.manager.set_vertical(true); this.actor.add_style_class_name("vertical"); this.actor.set_x_align(Clutter.ActorAlign.CENTER); this.actor.set_important(true); } // Any padding/margin is removed on one side so that the AppMenuButton // boxes butt up against the edge of the screen if (orientation == St.Side.TOP) { for (let child of this.manager_container.get_children()) { child.set_style_class_name('window-list-item-box top'); child.set_style('margin-top: 0px; padding-top: 0px;'); } this.actor.set_style('margin-top: 0px; padding-top: 0px;'); } else if (orientation == St.Side.BOTTOM) { for (let child of this.manager_container.get_children()) { child.set_style_class_name('window-list-item-box bottom'); child.set_style('margin-bottom: 0px; padding-bottom: 0px;'); } this.actor.set_style('margin-bottom: 0px; padding-bottom: 0px;'); } else if (orientation == St.Side.LEFT) { for (let child of this.manager_container.get_children()) { child.set_style_class_name('window-list-item-box left'); child.set_style('margin-left 0px; padding-left: 0px; padding-right: 0px; margin-right: 0px;'); child.set_x_align(Clutter.ActorAlign.CENTER); } this.actor.set_style('margin-left: 0px; padding-left: 0px; padding-right: 0px; margin-right: 0px;'); } else if (orientation == St.Side.RIGHT) { for (let child of this.manager_container.get_children()) { child.set_style_class_name('window-list-item-box right'); child.set_style('margin-left: 0px; padding-left: 0px; padding-right: 0px; margin-right: 0px;'); child.set_x_align(Clutter.ActorAlign.CENTER); } this.actor.set_style('margin-right: 0px; padding-right: 0px; padding-left: 0px; margin-left: 0px;'); } if (this.appletEnabled) { this._updateSpacing(); } this._updateAllIconGeometry() } _updateSpacing() { let themeNode = this.actor.get_theme_node(); let spacing = themeNode.get_length('spacing'); this.manager.set_spacing(spacing * global.ui_scale); } _onWindowAddedAsync(display, metaWindow, monitor) { Mainloop.timeout_add(20, Lang.bind(this, this._onWindowAdded, display, metaWindow, monitor)); } _onWindowAdded(display, metaWindow, monitor) { if (this._shouldAdd(metaWindow)) this._addWindow(metaWindow, false); } _onWindowMonitorChanged(display, metaWindow, monitor) { if (this._shouldAdd(metaWindow)) this._addWindow(metaWindow, false); else { this.refreshing = true; this._removeWindow(metaWindow); this.refreshing = false; } } _refreshItemByMetaWindow(metaWindow) { let window = this._windows.find(win => (win.metaWindow == metaWindow)); if (window) this._refreshItem(window); } _onWindowWorkspaceChanged(display, metaWindow, metaWorkspace) { this._refreshItemByMetaWindow(metaWindow); } _onWindowAppChanged(tracker, metaWindow) { this._refreshItemByMetaWindow(metaWindow); } _onWindowSkipTaskbarChanged(display, metaWindow) { if (metaWindow && metaWindow.is_skip_taskbar()) { this._removeWindow(metaWindow); return; } this._onWindowAdded(display, metaWindow, 0); } _updateAttentionGrabber() { if (this.enableAlerts) { this.signals.connect(global.display, "window-marked-urgent", this._onWindowDemandsAttention, this); this.signals.connect(global.display, "window-demands-attention", this._onWindowDemandsAttention, this); } else { this.signals.disconnect("window-marked-urgent"); this.signals.disconnect("window-demands-attention"); } } _onEnableScrollChanged() { for (let window of this._windows) window.onScrollModeChanged(); } _onPreviewChanged() { for (let window of this._windows) window.onPreviewChanged(); } _onWindowDemandsAttention (display, window) { // Magic to look for AppMenuButton owning window let i = this._windows.length; while (i-- && this._windows[i].metaWindow != window); // Window is not in our list if (i == -1) return; // Window already has focus if (this._windows[i]._hasFocus()) return; // Asks AppMenuButton to flash. Returns false if already flashing if (!this._windows[i].getAttention()) return; if (window.get_workspace() != global.workspace_manager.get_active_workspace()) this._addWindow(window, true); } _refreshItem(window) { window.actor.visible = (window.metaWindow.get_workspace() == global.workspace_manager.get_active_workspace()) || window.metaWindow.is_on_all_workspaces() || this.showAllWorkspaces; /* The above calculates the visibility if it were the normal * AppMenuButton. If this is actually a temporary AppMenuButton for * urgent windows on other workspaces, it is shown iff the normal * one isn't shown! */ if (window.transient) window.actor.visible = !window.actor.visible; if (window.actor.visible) window.setIcon(); window.updateIconGeometry(); } _refreshAllItems() { for (let window of this._windows) { this._refreshItem(window); } } _reTitleItems() { for (let window of this._windows) { window.setDisplayTitle(); } } _updateLabels() { for (let window of this._windows) window.updateLabelVisible(); } _updateWatchedMonitors() { // this can be called after our settings are finalized (and those attributes deleted), // so lastWindowOrder won't exist anymore. This can happen when panels are removed, for // example due to monitor changes. if (this.lastWindowOrder === undefined) { return; } let n_mons = global.display.get_n_monitors(); let on_primary = this.panel.monitorIndex == Main.layoutManager.primaryIndex; let instances = Main.AppletManager.getRunningInstancesForUuid(this._uuid); /* Simple cases */ if (n_mons == 1) { this._monitorWatchList = [Main.layoutManager.primaryIndex]; } else if (instances.length > 1 && !on_primary) { this._monitorWatchList = [this.panel.monitorIndex]; } else { /* This is an instance on the primary monitor - it will be * responsible for any monitors not covered individually. First * convert the instances list into a list of the monitor indices, * and then add the monitors not present to the monitor watch list * */ this._monitorWatchList = [this.panel.monitorIndex]; instances = instances.map(function(x) { return x.panel.monitorIndex; }); for (let i = 0; i < n_mons; i++) if (instances.indexOf(i) == -1) this._monitorWatchList.push(i); } // Now track the windows in our favorite monitors let windows = global.display.list_windows(0); if (this.showAllWorkspaces) { for (let wks=0; wks (win.xid == xid)); if (found) { this.manager_container.set_child_at_index(found.actor, 0); } } this._saveOrder(); } _saveOrder() { if (this.refreshing) { return; } let new_order = []; let actors = this.manager_container.get_children(); for (let i = 0; i < actors.length; i++) { new_order.push(actors[i]._delegate.xid); } if (new_order.length === 0) { this.lastWindowOrder = ""; return; } this.lastWindowOrder = new_order.join("::"); } _updateAllIconGeometry() { for (let window of this._windows) { window.updateIconGeometry(); } } handleDragOver(source, actor, x, y, time) { if (this._inEditMode) return DND.DragMotionResult.MOVE_DROP; if (!(source instanceof AppMenuButton)) return DND.DragMotionResult.NO_DROP; let children = this.manager_container.get_children(); let isVertical = (this.orientation == St.Side.LEFT || this.orientation == St.Side.RIGHT); let axis = isVertical ? [y, 'y1'] : [x, 'x1']; this._dragPlaceholderPos = -1; let minDist = -1; for(let i = 0; i < children.length; i++) { if (!children[i].visible) continue; let dim = isVertical ? children[i].height : children[i].width; let dist = Math.abs(axis[0] - (children[i].get_allocation_box()[axis[1]] + dim / 2)); if(dist < minDist || minDist == -1) { minDist = dist; this._dragPlaceholderPos = i; } } source.actor.hide(); if (this._dragPlaceholder == undefined) { this._dragPlaceholder = new DND.GenericDragPlaceholderItem(); this._dragPlaceholder.child.set_width (source.actor.width); this._dragPlaceholder.child.set_height (source.actor.height); this.manager_container.insert_child_at_index(this._dragPlaceholder.actor, this._dragPlaceholderPos); } else { this.manager_container.set_child_at_index(this._dragPlaceholder.actor, this._dragPlaceholderPos); } return DND.DragMotionResult.MOVE_DROP; } acceptDrop(source, actor, x, y, time) { if (!(source instanceof AppMenuButton)) return false; if (this._dragPlaceholderPos == undefined) return false; this.manager_container.set_child_at_index(source.actor, this._dragPlaceholderPos); this._saveOrder(); this._updateAllIconGeometry(); return true; } clearDragPlaceholder() { if (this._dragPlaceholder) { this._dragPlaceholder.actor.destroy(); this._dragPlaceholder = undefined; this._dragPlaceholderPos = undefined; } } erodeTooltip() { if (this._tooltipErodeTimer) { Mainloop.source_remove(this._tooltipErodeTimer); this._tooltipErodeTimer = null; } this._tooltipErodeTimer = Mainloop.timeout_add(300, Lang.bind(this, function() { this._tooltipShowing = false; this._tooltipErodeTimer = null; return false; })); } cancelErodeTooltip() { if (this._tooltipErodeTimer) { Mainloop.source_remove(this._tooltipErodeTimer); this._tooltipErodeTimer = null; } } _onNotificationReceived(mtray, notification) { let appId = notification.source.app?.get_id(); if (!appId) { return; } // Add notification to all appMenuButton's with appId let notificationAdded = false; this._windows.forEach(window => { if (appId === window.appId) { notificationAdded = true; window.updateNotificationsBadge(); } }); if (notificationAdded) { notification.appId = appId; notification.connect('destroy', () => this._onNotificationDestroyed(notification)); } } _onNotificationDestroyed(notification) { this._windows.forEach(window => { if (notification.appId === window.appId) { window.updateNotificationsBadge(); } }); } _updateAllNotificationBadges() { this._windows.forEach(window => window.updateNotificationsBadge()); } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonWindowListApplet(orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/window-list@cinnamon.org/metadata.json0000664000175000017500000000027515167446463030140 0ustar fabiofabio{ "uuid": "window-list@cinnamon.org", "name": "Window list", "description": "Main Cinnamon window list", "icon": "cs-windows", "role": "windowattentionhandler", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/window-list@cinnamon.org/settings-schema.json0000664000175000017500000000517015167446463031455 0ustar fabiofabio{ "section1": { "type": "section", "description": "Behavior" }, "show-all-workspaces" : { "type" : "switch", "default" : false, "description": "Show windows from all workspaces" }, "enable-alerts" : { "type" : "switch", "default" : true, "description" : "Show an alert in the window list when a window from another workspace requires attention" }, "enable-scrolling" : { "type" : "switch", "default" : false, "description" : "Enable mouse-wheel scrolling in the window list" }, "reverse-scrolling" : { "type" : "switch", "default" : false, "description" : "Reverse the direction of mouse-wheel scrolling in the window list", "dependency" : "enable-scrolling" }, "left-click-minimize": { "type": "switch", "default": true, "description": "Left click to minimize window" }, "middle-click-close": { "type": "switch", "default": true, "description": "Middle click to close window" }, "section2": { "type": "section", "description": "Display" }, "panel-show-label": { "type": "switch", "default": true, "description": "Show window names in the panel" }, "button-width": { "type": "spinbutton", "default" : 150, "min" : 0, "max" : 1000, "step" : 5, "units" : "pixels", "description" : "Window button width in the panel", "dependency": "panel-show-label" }, "buttons-use-entire-space": { "type": "switch", "default": false, "description": "Window buttons can have different sizes and use the entire space available", "dependency": "panel-show-label" }, "window-hover": { "type": "radiogroup", "default": "thumbnail", "description": "Choose what to show when hovering over a window button", "options": { "Nothing": "nothing", "Title": "title", "Thumbnail": "thumbnail" } }, "window-preview-show-label": { "type": "switch", "default": true, "description": "Show title above thumbnail", "dependency": "window-hover=thumbnail" }, "window-preview-scale": { "type": "radiogroup", "default": 1, "description": "Thumbnail size", "options": { "Small": 0.75, "Medium": 1, "Large": 1.25, "Largest": 1.5 }, "dependency": "window-hover=thumbnail" }, "enable-notifications": { "type": "switch", "default": true, "description": "Show notification badges" }, "last-window-order": { "type": "generic", "default": "" } } cinnamon-6.6.8/files/usr/share/cinnamon/applets/windows-quick-list@cinnamon.org/0000775000175000017500000000000015167446463026756 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/windows-quick-list@cinnamon.org/applet.js0000664000175000017500000001447215167446463030611 0ustar fabiofabioconst Applet = imports.ui.applet; const Cinnamon = imports.gi.Cinnamon; const Lang = imports.lang; const PopupMenu = imports.ui.popupMenu; const St = imports.gi.St; const Main = imports.ui.main; const Pango = imports.gi.Pango; const Gtk = imports.gi.Gtk; const Clutter = imports.gi.Clutter; class WindowMenuItem extends PopupMenu.PopupBaseMenuItem { constructor(icon, label, params) { super(params); this.box = new St.BoxLayout({ style_class: 'popup-combobox-item', style: 'padding: 0px;' }); this.icon = icon; if (icon) { this.box.add(this.icon); } this.label = new St.Label({ text: label, y_align: Clutter.ActorAlign.CENTER }); this.box.add(this.label); this.addActor(this.box); } }; class CinnamonWindowsQuickListApplet extends Applet.IconApplet { constructor(metadata, orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.set_applet_icon_symbolic_name('windows-quick-list'); this.set_applet_tooltip(_('All windows')); this.items = []; this.menuManager = new PopupMenu.PopupMenuManager(this); this.menu = new Applet.AppletPopupMenu(this, orientation); this.menuManager.addMenu(this.menu); this.mainContainer = new St.BoxLayout({ vertical: true }); this.menu.addActor(this.mainContainer); this.scrollBox = new St.ScrollView({ x_fill: true, y_fill: false, y_align: St.Align.START }); this.scrollBox.set_auto_scrolling(true); this.mainContainer.add(this.scrollBox); this.windowsBox = new St.BoxLayout({ vertical:true }); this.scrollBox.add_actor(this.windowsBox); this.scrollBox.set_policy(St.PolicyType.NEVER, St.PolicyType.AUTOMATIC); } _addItem(item) { this.windowsBox.add_child(item.actor); this.items.push(item); } updateMenu() { for (let i = 0; i < this.items.length; i++) { this.items[i].destroy(); } let empty_menu = true; let tracker = Cinnamon.WindowTracker.get_default(); for (let wks = 0; wks < global.workspace_manager.n_workspaces; ++wks) { // construct a list with all windows let workspace_name = Main.getWorkspaceName(wks); let metaWorkspace = global.workspace_manager.get_workspace_by_index(wks); let windows = metaWorkspace.list_windows(); let sticky_windows = windows.filter(function(w) { return !w.is_skip_taskbar() && w.is_on_all_workspaces(); }); windows = windows.filter(function(w) { return !w.is_skip_taskbar() && !w.is_on_all_workspaces(); }); windows = windows.filter(Main.isInteresting); if (sticky_windows.length && wks == 0) { for (let i = 0; i < sticky_windows.length; ++i) { let metaWindow = sticky_windows[i]; let app = tracker.get_window_app(metaWindow); let icon = app.create_icon_texture_for_window(24, metaWindow); let item = new WindowMenuItem(icon, metaWindow.get_title()); item.label.add_style_class_name('window-sticky'); item.label.set_style("max-width:30em;"); item.connect( 'activate', Lang.bind(this, function() { this.activateWindow(metaWorkspace, metaWindow); }) ); this._addItem(item); empty_menu = false; } this._addItem(new PopupMenu.PopupSeparatorMenuItem()); } if (windows.length) { if (wks > 0) { this._addItem(new PopupMenu.PopupSeparatorMenuItem()); } if (global.workspace_manager.n_workspaces > 1) { let item = new WindowMenuItem(null, workspace_name); item.actor.reactive = false; item.actor.can_focus = false; item.label.add_style_class_name('popup-subtitle-menu-item'); if (wks == global.workspace_manager.get_active_workspace().index()) { item.setShowDot(true); } this._addItem(item); empty_menu = false; } for (let i = 0; i < windows.length; ++i) { let metaWindow = windows[i]; let app = tracker.get_window_app(metaWindow); let icon = app.create_icon_texture_for_window(24, metaWindow); let item = new WindowMenuItem(icon, metaWindow.get_title()); item.label.add_style_class_name('window-sticky'); item.label.set_style("max-width:30em;"); item.label.ellipsize = Pango.EllipsizeMode.END; item.connect( 'activate', Lang.bind(this, function() { this.activateWindow(metaWorkspace, metaWindow); }) ); this._addItem(item); empty_menu = false; } } } if (empty_menu) { let item = new PopupMenu.PopupMenuItem(_('No open windows')); item.actor.reactive = false; item.actor.can_focus = false; item.label.add_style_class_name('popup-subtitle-menu-item'); this._addItem(item); } } activateWindow(metaWorkspace, metaWindow) { if (this.menu.isOpen) { this.menu.toggle_with_options(false); } if (!metaWindow.is_on_all_workspaces()) { metaWorkspace.activate(global.get_current_time()); } metaWindow.unminimize(); metaWindow.activate(global.get_current_time()); } on_applet_clicked(event) { if (this.menu.isOpen) { this.menu.close(false); } else { this.updateMenu(); this.menu.open(true); } } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonWindowsQuickListApplet(metadata, orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/windows-quick-list@cinnamon.org/icons/0000775000175000017500000000000015167446463030071 5ustar fabiofabio././@LongLink0000644000000000000000000000016600000000000011606 Lustar rootrootcinnamon-6.6.8/files/usr/share/cinnamon/applets/windows-quick-list@cinnamon.org/icons/windows-quick-list-symbolic.svgcinnamon-6.6.8/files/usr/share/cinnamon/applets/windows-quick-list@cinnamon.org/icons/windows-quick-0000664000175000017500000000036515167446463032701 0ustar fabiofabio cinnamon-6.6.8/files/usr/share/cinnamon/applets/windows-quick-list@cinnamon.org/metadata.json0000664000175000017500000000026515167446463031434 0ustar fabiofabio{ "uuid": "windows-quick-list@cinnamon.org", "name": "Windows Quick List", "description": "Quickly access windows from all workspaces", "icon": "cs-windows", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/workspace-switcher@cinnamon.org/0000775000175000017500000000000015167446463027025 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/workspace-switcher@cinnamon.org/applet.js0000664000175000017500000005574015167446463030663 0ustar fabiofabioconst St = imports.gi.St; const Clutter = imports.gi.Clutter; const Lang = imports.lang; const Applet = imports.ui.applet; const Main = imports.ui.main; const Mainloop = imports.mainloop; const Meta = imports.gi.Meta; const PopupMenu = imports.ui.popupMenu; const SignalManager = imports.misc.signalManager; const Tooltips = imports.ui.tooltips; const Settings = imports.ui.settings; const ModalDialog = imports.ui.modalDialog; const Pango = imports.gi.Pango; const Cinnamon = imports.gi.Cinnamon; const MIN_SWITCH_INTERVAL_MS = 220; const ICON_AUTO_SIZE_RATIO = 0.55; const DEFAULT_ICON_SIZES = [8, 12, 16, 18, 22, 24, 32]; function removeWorkspaceAtIndex(index) { if (global.workspace_manager.n_workspaces <= 1 || index >= global.workspace_manager.n_workspaces) { return; } const removeAction = () => { Main._removeWorkspace(global.workspace_manager.get_workspace_by_index(index)); }; if (!Main.hasDefaultWorkspaceName(index)) { let prompt = _("Are you sure you want to remove workspace \"%s\"?\n\n").format( Main.getWorkspaceName(index) ); let confirm = new ModalDialog.ConfirmDialog(prompt, removeAction); confirm.open(); } else { removeAction(); } } class WorkspaceButton { constructor(index, applet) { this.index = index; this.applet = applet; this.workspace = global.workspace_manager.get_workspace_by_index(this.index); this.workspace_name = Main.getWorkspaceName(index); this.actor = null; // defined in subclass this.ws_signals = new SignalManager.SignalManager(null); this.ws_signals.connect(this.workspace, "window-added", this.update, this); this.ws_signals.connect(this.workspace, "window-removed", this.update, this); // Connect after Main or else we'll end up with stale names. this.ws_signals.connect_after(Main.wmSettings, "changed::workspace-names", this.updateName, this); } show() { this.actor.connect('button-release-event', Lang.bind(this, this.onClicked)); this._tooltip = new Tooltips.PanelItemTooltip(this, this.workspace_name, this.applet.orientation); if (this.index === global.workspace_manager.get_active_workspace_index()) { this.activate(true); } } updateName() { this.workspace_name = Main.getWorkspaceName(this.index); this._tooltip.set_text(this.workspace_name); } onClicked(actor, event) { if (event.get_button() == 1) { Main.wm.moveToWorkspace(this.workspace); } else if (event.get_button() == 2) { removeWorkspaceAtIndex(this.index); } } update() { // defined in subclass } activate(active) { // Defined in subclass } destroy() { this.ws_signals.disconnectAllSignals(); this._tooltip.destroy(); this.actor.destroy(); } } class SimpleButton extends WorkspaceButton { constructor(index, applet) { super(index, applet); this.actor = new St.Button({ name: 'workspaceButton', style_class: 'workspace-button', reactive: applet._draggable.inhibit }); if (applet.orientation == St.Side.TOP || applet.orientation == St.Side.BOTTOM) { this.actor.set_height(applet._panelHeight); } else { this.actor.set_width(applet._panelHeight); this.actor.add_style_class_name('vertical'); } let label = new St.Label({ text: (index + 1).toString() }); label.clutter_text.set_ellipsize(Pango.EllipsizeMode.NONE); this.actor.set_child(label); this.update(); } activate(active) { if (active) { this.actor.add_style_pseudo_class('outlined'); } else { this.actor.remove_style_pseudo_class('outlined'); } this.update(); } shade(used) { if (!used) { this.actor.add_style_pseudo_class('shaded'); } else { this.actor.remove_style_pseudo_class('shaded'); } } update() { let windows = this.workspace.list_windows(); let used = windows.some(Main.isInteresting); this.shade(used); } } class WindowGraph { constructor(workspaceGraph, metaWindow, iconSize) { this.workspaceGraph = workspaceGraph; this.metaWindow = metaWindow; this._minimize_signal_id = this.metaWindow.connect('notify::minimized', this.on_minimize.bind(this)); this._iconSize = iconSize; this._iconScaledSize = Math.round(this._iconSize * global.ui_scale); this._halvedIconScaledSize = Math.round(this._iconScaledSize * 0.5); this.drawingArea = new St.DrawingArea({ style_class: 'windows', width: this.workspaceGraph.width, height: this.workspaceGraph.height, important: true, track_hover: false, }); this.drawingArea.connect('repaint', this.onRepaint.bind(this)); this._icon = this._getWindowIcon(); const rect = this.intersectionRect(); this.updateIconState(rect); } setIconSize(size) { const sizeDiff = size - this._iconSize; this._iconSize = size; this._iconScaledSize = Math.round(this._iconSize * global.ui_scale); this._halvedIconScaledSize = Math.round(this._iconScaledSize * 0.5); // Recreate the icon actor to reflect the new size if the new size is greater // than the old one. This is needed because upscaling doesn't seem to be supported. if (sizeDiff > 0) { this._icon.destroy(); this._icon = this._getWindowIcon(); } else if (sizeDiff < 0) { this._icon.set_size(this._iconScaledSize, this._iconScaledSize); } const rect = this.intersectionRect(); this.updateIconState(rect); } calcIconPosition(rect) { const x = Math.round(rect.x + rect.width / 2 - this._halvedIconScaledSize); const y = Math.round(rect.y + rect.height / 2 - this._halvedIconScaledSize); return [x, y]; } updateIconState(rect) { const [x, y] = this.calcIconPosition(rect); this._icon.set_position(x, y); // Hide the icon if either the width or height of the rectangle // is smaller than the icon's scaled size. This prevents the icon from being // displayed when it cannot fully fit in the available space. if (rect.width < this._iconScaledSize || rect.height < this._iconScaledSize) { this._icon.set_opacity(0); } else { this._icon.set_opacity(255); } } intersectionRect() { const windowRect = this.metaWindow.get_buffer_rect(); const workspaceRect = this.workspaceGraph.workspace_size; const scaleFactor = this.workspaceGraph.scaleFactor; const scaledWindowX = (windowRect.x - workspaceRect.x) / scaleFactor; const scaledWindowY = (windowRect.y - workspaceRect.y) / scaleFactor; const scaledWindowWidth = windowRect.width / scaleFactor; const scaledWindowHeight = windowRect.height / scaleFactor; const graphWidth = this.workspaceGraph.width; const graphHeight = this.workspaceGraph.height; const intersectionX = Math.max(0, scaledWindowX); const intersectionY = Math.max(0, scaledWindowY); const intersectionRight = Math.min(graphWidth, scaledWindowX + scaledWindowWidth); const intersectionBottom = Math.min(graphHeight, scaledWindowY + scaledWindowHeight); const intersection = new Meta.Rectangle(); intersection.x = Math.round(intersectionX); intersection.y = Math.round(intersectionY); intersection.width = Math.round(intersectionRight - intersectionX); intersection.height = Math.round(intersectionBottom - intersectionY); return intersection; } onRepaint(area) { const [winBackgroundColor, winBorderColor] = this.getWinThemeColors(); const rect = this.intersectionRect(); const cr = area.get_context(); cr.setLineWidth(1); Clutter.cairo_set_source_color(cr, winBorderColor); cr.rectangle(rect.x, rect.y, rect.width, rect.height); cr.strokePreserve(); Clutter.cairo_set_source_color(cr, winBackgroundColor); cr.fill(); cr.$dispose(); this.updateIconState(rect); } getWinThemeColors() { const graphThemeNode = this.workspaceGraph.graphArea.get_theme_node(); let windowBackgroundColor, windowBorderColor; if (this.metaWindow.has_focus()) { windowBorderColor = graphThemeNode.get_color('-active-window-border'); windowBackgroundColor = graphThemeNode.get_color('-active-window-background'); } else { windowBorderColor = graphThemeNode.get_color('-inactive-window-border'); windowBackgroundColor = graphThemeNode.get_color('-inactive-window-background'); } return [windowBackgroundColor, windowBorderColor]; } _getWindowIcon() { let iconActor = null; let app = this.workspaceGraph.windowTracker.get_window_app(this.metaWindow); if (app) { iconActor = app.create_icon_texture_for_window( this._iconSize, this.metaWindow, ); } if (!iconActor) { iconActor = new St.Icon({ icon_name: 'applications-other', icon_type: St.IconType.FULLCOLOR, icon_size: this._iconSize, }); } return iconActor; } destroy() { if (this._minimize_signal_id > 0) { this.metaWindow.disconnect(this._minimize_signal_id); } this._minimize_signal_id = 0; this._icon.destroy(); this._icon = null; this.drawingArea.destroy(); this.drawingArea = null; } update() { this.drawingArea.queue_repaint(); } show() { this.workspaceGraph.graphArea.add_child(this.drawingArea); this.workspaceGraph.graphArea.add_child(this._icon); } on_minimize() { if (this.metaWindow.minimized) { // If the window is minimized, we need to trigger a repaint of the workspace graph // from here because there's an edge case where if this window is minimized out // of focus (i.e. while it isn't the focused window), the graph won't update properly // update to reflect the minimized state of other underlying windows. this.workspaceGraph.graphArea.queue_repaint(); return; } } } class WorkspaceGraph extends WorkspaceButton { constructor(index, applet) { super(index, applet); this.scaleFactor = 0; this.actor = new St.Bin({ reactive: applet._draggable.inhibit, style_class: 'workspace', y_fill: true, track_hover: false, important: true, }); this.graphArea = new St.DrawingArea({ style_class: 'windows', important: true }); this.windowTracker = Cinnamon.WindowTracker.get_default(); this.actor.add_actor(this.graphArea); this.graphArea.set_size(1, 1); this.graphArea.connect('repaint', this.onRepaint.bind(this)); this.windowGraphsMap = new Map(); this.height = 1; this.width = 1; } getSizeAdjustment(actor, vertical) { let themeNode = actor.get_theme_node(); if (vertical) { return themeNode.get_horizontal_padding() + themeNode.get_border_width(St.Side.LEFT) + themeNode.get_border_width(St.Side.RIGHT); } else { return themeNode.get_vertical_padding() + themeNode.get_border_width(St.Side.TOP) + themeNode.get_border_width(St.Side.BOTTOM); } } getIdealIconSize() { const maxAllowed = (Math.min(this.width, this.height) * ICON_AUTO_SIZE_RATIO) / global.ui_scale; for (let i = DEFAULT_ICON_SIZES.length - 1; i >= 0; i--) { if (DEFAULT_ICON_SIZES[i] <= maxAllowed) { return DEFAULT_ICON_SIZES[i]; } } return DEFAULT_ICON_SIZES[0]; } setGraphSize() { this.workspace_size = this.workspace.get_work_area_all_monitors(); if (this.applet.orientation == St.Side.LEFT || this.applet.orientation == St.Side.RIGHT) { this.width = this.applet._panelHeight - this.getSizeAdjustment(this.applet.actor, true) - this.getSizeAdjustment(this.actor, true); this.scaleFactor = this.workspace_size.width / this.width; this.height = Math.round(this.workspace_size.height / this.scaleFactor); } else { this.height = this.applet._panelHeight - this.getSizeAdjustment(this.applet.actor, false) - this.getSizeAdjustment(this.actor, false); this.scaleFactor = this.workspace_size.height / this.height; this.width = Math.round(this.workspace_size.width / this.scaleFactor); } this.graphArea.set_size(this.width, this.height); } sortWindowsByUserTime(win1, win2) { let t1 = win1.get_user_time(); let t2 = win2.get_user_time(); return (t2 < t1) ? 1 : -1; } filterWindows(win) { return Main.isInteresting(win) && !win.is_skip_taskbar(); } onRepaint(area) { // we need to set the size of the drawing area the first time, but we can't get // accurate measurements until everything is added to the stage if (this.scaleFactor === 0) this.setGraphSize(); // construct a list with all visible windows let windows = this.workspace.list_unobscured_windows(); windows = windows.filter(this.filterWindows); const iconSize = this.getIdealIconSize(); let currentGraphs = []; let windowsIds = []; for (const window of windows) { const windowId = window.get_id(); let graph; if (this.windowGraphsMap.has(windowId)) { graph = this.windowGraphsMap.get(windowId); graph.setIconSize(iconSize); // global.log("[WS] Reused graph for window ID " + windowId); } else { graph = new WindowGraph(this, window, iconSize); this.windowGraphsMap.set(windowId, graph); // global.log("[WS] Created graph for window ID " + windowId); } currentGraphs.push(graph); windowsIds.push(windowId); } for (const windowId of this.windowGraphsMap.keys()) { if (!windowsIds.includes(windowId)) { const graph = this.windowGraphsMap.get(windowId); this.windowGraphsMap.delete(windowId); graph.destroy(); // global.log("[WS] Destroyed graph for window ID " + windowId); } } this.graphArea.remove_all_children(); for (const graph of currentGraphs) { graph.show(); graph.update(); } } update() { this.graphArea.queue_repaint(); } activate(active) { if (active) this.actor.add_style_pseudo_class('active'); else this.actor.remove_style_pseudo_class('active'); } destroy() { for (const graph of this.windowGraphsMap.values()) { graph.destroy(); } this.windowGraphsMap.clear(); this.windowGraphsMap = null; this.graphArea.destroy(); this.graphArea = null; super.destroy(); } } class CinnamonWorkspaceSwitcher extends Applet.Applet { constructor(metadata, orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.setAllowedLayout(Applet.AllowedLayout.BOTH); this.orientation = orientation; this.signals = new SignalManager.SignalManager(null); this.buttons = []; this._last_switch = 0; this._last_switch_direction = 0; this.createButtonsQueued = false; this._focusWindow = null; this.settings = new Settings.AppletSettings(this, metadata.uuid, instance_id); this.settings.bind("display-type", "display_type", this.queueCreateButtons); this.settings.bind("scroll-behavior", "scroll_behavior"); this.actor.connect('scroll-event', this.hook.bind(this)); this.signals.connect(Main.layoutManager, 'monitors-changed', this.onWorkspacesUpdated, this); this.queueCreateButtons(); global.workspace_manager.connect('notify::n-workspaces', () => { this.onWorkspacesUpdated() }); global.workspace_manager.connect('workspaces-reordered', () => { this.onWorkspacesUpdated() }); global.window_manager.connect('switch-workspace', this._onWorkspaceChanged.bind(this)); global.settings.connect('changed::panel-edit-mode', Lang.bind(this, this.on_panel_edit_mode_changed)); let expoMenuItem = new PopupMenu.PopupIconMenuItem(_("Manage workspaces (Expo)"), "xsi-view-grid-symbolic", St.IconType.SYMBOLIC); expoMenuItem.connect('activate', Lang.bind(this, function() { if (!Main.expo.animationInProgress) Main.expo.toggle(); })); this._applet_context_menu.addMenuItem(expoMenuItem); let addWorkspaceMenuItem = new PopupMenu.PopupIconMenuItem (_("Add a new workspace"), "xsi-list-add", St.IconType.SYMBOLIC); addWorkspaceMenuItem.connect('activate', Lang.bind(this, function() { Main._addWorkspace(); })); this._applet_context_menu.addMenuItem(addWorkspaceMenuItem); this.removeWorkspaceMenuItem = new PopupMenu.PopupIconMenuItem (_("Remove the current workspace"), "xsi-list-remove", St.IconType.SYMBOLIC); this.removeWorkspaceMenuItem.connect('activate', this.removeCurrentWorkspace.bind(this)); this._applet_context_menu.addMenuItem(this.removeWorkspaceMenuItem); this.removeWorkspaceMenuItem.setSensitive(global.workspace_manager.n_workspaces > 1); // Avoid triggering a whole refresh on mouse hover this.actor.set_track_hover(false); } onWorkspacesUpdated() { this.removeWorkspaceMenuItem.setSensitive(global.workspace_manager.n_workspaces > 1); this._createButtons(); } removeCurrentWorkspace() { if (global.workspace_manager.n_workspaces <= 1) { return; } this.workspace_index = global.workspace_manager.get_active_workspace_index(); removeWorkspaceAtIndex(this.workspace_index); } _onWorkspaceChanged(wm, from, to) { this.buttons[from].activate(false); this.buttons[to].activate(true); } on_panel_edit_mode_changed() { let reactive = !global.settings.get_boolean('panel-edit-mode'); for (let i = 0; i < this.buttons.length; ++i) { this.buttons[i].actor.reactive = reactive; } } on_orientation_changed(neworientation) { this.orientation = neworientation; if (this.orientation == St.Side.TOP || this.orientation == St.Side.BOTTOM) this.actor.set_vertical(false); else this.actor.set_vertical(true); this.queueCreateButtons(); } on_panel_height_changed() { this.queueCreateButtons(); } hook(actor, event) { if (this.scroll_behavior == "disabled") return; let now = (new Date()).getTime(); let direction = event.get_scroll_direction(); // Avoid fast scroll directions if(direction != 0 && direction != 1) return; // Do the switch only after a elapsed time to avoid fast // consecutive switches on sensible hardware, like touchpads if ((now - this._last_switch) > MIN_SWITCH_INTERVAL_MS || direction !== this._last_switch_direction) { // XOR used to determine the effective direction if ((direction == 0) == (this.scroll_behavior == "normal")) Main.wm.actionMoveWorkspaceLeft(); else Main.wm.actionMoveWorkspaceRight(); this._last_switch = now; this._last_switch_direction = direction; } } queueCreateButtons() { if (!this.createButtonsQueued) { Mainloop.idle_add(Lang.bind(this, this._createButtons)); this.createButtonsQueued = true; } } _createButtons() { this.createButtonsQueued = false; for (let i = 0; i < this.buttons.length; ++i) { this.buttons[i].destroy(); } if (this.display_type == "visual") this.actor.set_style_class_name('workspace-graph'); else this.actor.set_style_class_name('workspace-switcher'); this.actor.set_important(true); this.buttons = []; for (let i = 0; i < global.workspace_manager.n_workspaces; ++i) { if (this.display_type == "visual") this.buttons[i] = new WorkspaceGraph(i, this); else this.buttons[i] = new SimpleButton(i, this); this.actor.add_actor(this.buttons[i].actor); this.buttons[i].show(); } this.signals.disconnect("notify::focus-window"); if (this.display_type == "visual") { // In visual mode, keep track of window events to represent them this.signals.connect(global.display, "notify::focus-window", this._onFocusChanged, this); this._onFocusChanged(); } } _onFocusChanged() { if (global.display.focus_window && this._focusWindow == global.display.focus_window) return; this.signals.disconnect("position-changed"); this.signals.disconnect("size-changed"); if (!global.display.focus_window) return; this._focusWindow = global.display.focus_window; this.signals.connect(this._focusWindow, "position-changed", this._onWindowsStateChanged, this); this.signals.connect(this._focusWindow, "size-changed", this._onWindowsStateChanged, this); this._onWindowsStateChanged(); } _onWindowsStateChanged() { if (this._focusWindow && this._focusWindow.is_on_all_workspaces()) { for (const button of this.buttons) { button.update(); } } else { let button = this.buttons[global.workspace_manager.get_active_workspace_index()]; button.update(); } } on_applet_removed_from_panel() { this.destroy(); } destroy() { for (let i = 0; i < this.buttons.length; ++i) { this.buttons[i].destroy(); } this.buttons = []; this.signals.disconnectAllSignals(); } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonWorkspaceSwitcher(metadata, orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/workspace-switcher@cinnamon.org/metadata.json0000664000175000017500000000026515167446463031503 0ustar fabiofabio{ "uuid": "workspace-switcher@cinnamon.org", "name": "Workspace switcher", "description": "Select the workspace from the panel", "icon": "cs-workspaces", "max-instances": -1 } cinnamon-6.6.8/files/usr/share/cinnamon/applets/workspace-switcher@cinnamon.org/settings-schema.json0000664000175000017500000000144015167446463033015 0ustar fabiofabio{ "display-type": { "type": "combobox", "default": "visual", "description": "Type of display", "tooltip": "Note that the visual representation will only work if your panel is large enough to display it properly, otherwise the simple style will be used.", "options": { "A visual representation of the workspaces": "visual", "Simple buttons": "buttons" } }, "scroll-behavior": { "type": "combobox", "default": "normal", "description": "Scroll wheel behavior", "tooltip": "Reverse or disable the direction of the scroll in the workspace list.", "options": { "Normal": "normal", "Reversed": "reversed", "Disabled": "disabled" } } } cinnamon-6.6.8/files/usr/share/cinnamon/applets/xapp-status@cinnamon.org/0000775000175000017500000000000015167446463025472 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/xapp-status@cinnamon.org/applet.js0000664000175000017500000005027315167446463027324 0ustar fabiofabioconst Cinnamon = imports.gi.Cinnamon; const Lang = imports.lang; const St = imports.gi.St; const Gio = imports.gi.Gio; const Clutter = imports.gi.Clutter; const Interfaces = imports.misc.interfaces; const Applet = imports.ui.applet; const Main = imports.ui.main; const Mainloop = imports.mainloop; const SignalManager = imports.misc.signalManager; const Gtk = imports.gi.Gtk; const XApp = imports.gi.XApp; const GLib = imports.gi.GLib; const Tooltips = imports.ui.tooltips; const HORIZONTAL_STYLE = 'padding-left: 2px; padding-right: 2px; padding-top: 0; padding-bottom: 0'; const VERTICAL_STYLE = 'padding-left: 0; padding-right: 0; padding-top: 2px; padding-bottom: 2px'; class RecorderIcon { constructor(applet) { this.applet = applet; this.actor = new St.BoxLayout({ style_class: "applet-box", reactive: false, visible: false, x_expand: true, y_expand: true }); this.icon_holder = new St.Bin(); this.iconSize = this.applet.getPanelIconSize(St.IconType.FULLCOLOR); this.actor.add_actor(this.icon_holder); this._indicator = new St.DrawingArea(); this._indicator.connect("repaint", (area) => this._paint(area)); this.icon_holder.add_actor(this._indicator); this._recordListenerId = Main.screenRecorder.connect("recording", () => this._recordingStateChanged()); this._recordingStateChanged(); this.refresh(); } _recordingStateChanged() { this.actor.visible = Main.screenRecorder.recording; this._indicator.queue_repaint(); } _paint(area) { let [width, height] = area.get_surface_size(); let size = Math.max(width, height); let node = area.get_theme_node(); let border = node.get_foreground_color(); let cr = area.get_context(); let color = new Clutter.Color({ red: 255, green: 0, blue: 0, alpha: 255 }); Clutter.cairo_set_source_color(cr, color); cr.arc( width / 2, height / 2, size / 4.0, 0.0, 2.0 * Math.PI ) cr.fillPreserve(); Clutter.cairo_set_source_color(cr, border); cr.stroke(); cr.$dispose(); } refresh() { this.setOrientation(this.applet.orientation); this._indicator.set_size(this.iconSize, this.iconSize); this._indicator.queue_repaint(); } setOrientation(orientation) { switch (orientation) { case St.Side.TOP: case St.Side.BOTTOM: this.actor.vertical = false; this.actor.remove_style_class_name("vertical"); break; case St.Side.LEFT: case St.Side.RIGHT: this.actor.vertical = true; this.actor.add_style_class_name("vertical"); break; } } destroy() { if (this._recordListenerId > 0) { Main.screenRecorder.disconnect(this._recordListenerId); this._recordListenerId = 0; } this.actor.destroy(); } } class XAppStatusIcon { constructor(applet, proxy) { this.name = proxy.get_name(); this.applet = applet; this.proxy = proxy; this.iconName = null; this.actor = new St.BoxLayout({ style_class: "applet-box", reactive: !global.settings.get_boolean('panel-edit-mode'), track_hover: true, // The systray use a layout manager, we need to fill the space of the actor // or otherwise the menu will be displayed inside the panel. x_expand: true, y_expand: true }); this.icon_holder = new St.Bin(); this.iconSize = this.applet.getPanelIconSize(St.IconType.FULLCOLOR); this.proxy.icon_size = this.iconSize; this.label = new St.Label({ 'y-align': St.Align.END, }); this.actor.add_actor(this.icon_holder); this.actor.add_actor(this.label); this._tooltip = new Tooltips.PanelItemTooltip(this, "", applet.orientation); this.actor.connect('button-press-event', Lang.bind(this, this.onButtonPressEvent)); this.actor.connect('button-release-event', Lang.bind(this, this.onButtonReleaseEvent)); this.actor.connect('scroll-event', (...args) => this.onScrollEvent(...args)); this.actor.connect('enter-event', Lang.bind(this, this.onEnterEvent)); this._proxy_prop_change_id = this.proxy.connect('g-properties-changed', Lang.bind(this, this.on_properties_changed)) this.refresh(); } on_properties_changed(proxy, changed_props, invalidated_props) { let prop_names = changed_props.deep_unpack(); if ('IconName' in prop_names) { this.setIconName(proxy.icon_name); } if ('TooltipText' in prop_names) { this.setTooltipText(proxy.tooltip_text); } if ('Label' in prop_names) { this.setLabel(proxy.label); } if ('Visible' in prop_names) { this.setVisible(proxy.visible); } if ('Name' in prop_names) { this.applet.sortIcons(); } if ('PrimaryMenuIsOpen' in prop_names) { if (!proxy.primary_menu_is_open) { this.actor.sync_hover(); } } if ('SecondaryMenuIsOpen' in prop_names) { if (!proxy.secondary_menu_is_open) { this.actor.sync_hover(); } } return; } refresh() { this.setIconName(this.proxy.icon_name); this.setLabel(this.proxy.label); this.setTooltipText(this.proxy.tooltip_text); this.setVisible(this.proxy.visible); this.setOrientation(this.applet.orientation); this.actor.queue_relayout(); } setOrientation(orientation) { switch (orientation) { case St.Side.TOP: case St.Side.BOTTOM: this.actor.vertical = false; this.actor.remove_style_class_name("vertical"); break; case St.Side.LEFT: case St.Side.RIGHT: this.actor.vertical = true; this.actor.add_style_class_name("vertical"); break; } } setIconName(iconName) { if (iconName) { let type, icon; if (iconName.match(/symbolic/)) { type = St.IconType.SYMBOLIC; } else { type = St.IconType.FULLCOLOR; } this.iconName = iconName; this.iconSize = this.applet.getPanelIconSize(type); this.proxy.icon_size = this.iconSize; // Assume symbolic icons would always be square/suitable for an StIcon. if (iconName.includes("/") && type != St.IconType.SYMBOLIC) { this.icon_loader_handle = St.TextureCache.get_default().load_image_from_file_async( iconName, /* If top/bottom panel, allow the image to expand horizontally, * otherwise, restrict it to a square (but keep aspect ratio.) */ this.actor.vertical ? this.iconSize : -1, this.iconSize, (...args)=>this._onImageLoaded(...args) ); return; } else { icon = new St.Icon( { "icon-type": type, "icon-size": this.iconSize, "icon-name": iconName }); this.icon_holder.show(); this.icon_holder.child = icon; } } else { this.iconName = null; this.icon_holder.hide(); } } _onImageLoaded(cache, handle, actor, data=null) { if (handle !== this.icon_loader_handle) { global.logError(`xapp-status@cinnamon.org: Icon or image seems out of sync (${this.name}`); return; } this.icon_holder.child = actor; this.icon_holder.show(); } setTooltipText(tooltipText) { if (tooltipText) { this._tooltip.preventShow = false; } else { tooltipText = ""; this._tooltip.preventShow = true; } this._tooltip.set_markup(tooltipText); // If the tooltip is currently visible, then we might need to trigger a realignment of the tooltip after changing the text length if (this._tooltip.visible) { this._tooltip.hide(); this._tooltip.show(); } } setLabel(label) { if (label) { this.label.set_text(label); } else { this.label.set_text(""); } this.show_label = (this.applet.orientation == St.Side.TOP || this.applet.orientation == St.Side.BOTTOM) && this.proxy.label.length > 0; this.label.visible = this.show_label; } setVisible(visible) { if (visible) { this.actor.show(); } else { this.actor.hide(); } } onEnterEvent(actor, event) { this._tooltip.preventShow = false; } getEventPositionInfo(actor) { let allocation = Cinnamon.util_get_transformed_allocation(actor); let x = Math.round(allocation.x1 / global.ui_scale); let y = Math.round(allocation.y1 / global.ui_scale); let w = Math.round((allocation.x2 - allocation.x1) / global.ui_scale) let h = Math.round((allocation.y2 - allocation.y1) / global.ui_scale) let final_x, final_y, final_o; switch (this.applet.orientation) { case St.Side.TOP: final_x = x; final_y = y + h; final_o = Gtk.PositionType.TOP; break; case St.Side.BOTTOM: default: final_x = x; final_y = y; final_o = Gtk.PositionType.BOTTOM; break; case St.Side.LEFT: final_x = x + w; final_y = y final_o = Gtk.PositionType.LEFT; break; case St.Side.RIGHT: final_x = x; final_y = y; final_o = Gtk.PositionType.RIGHT; break; } return [final_x, final_y, final_o]; } onButtonPressEvent(actor, event) { this._tooltip.hide(); this._tooltip.preventShow = true; if (event.get_button() == Clutter.BUTTON_SECONDARY && event.get_state() & Clutter.ModifierType.CONTROL_MASK) { return Clutter.EVENT_PROPAGATE; } let [x, y, o] = this.getEventPositionInfo(actor); this.proxy.call_button_press(x, y, event.get_button(), event.get_time(), o, null, null); return Clutter.EVENT_STOP; } onButtonReleaseEvent(actor, event) { let [x, y, o] = this.getEventPositionInfo(actor); this.proxy.call_button_release(x, y, event.get_button(), event.get_time(), o, null, null); return Clutter.EVENT_STOP; } onScrollEvent(actor, event) { let direction = event.get_scroll_direction(); if (direction != Clutter.ScrollDirection.SMOOTH) { let x_dir = XApp.ScrollDirection.UP; let delta = 0; if (direction == Clutter.ScrollDirection.UP) { x_dir = XApp.ScrollDirection.UP; delta = -1; } else if (direction == Clutter.ScrollDirection.DOWN) { x_dir = XApp.ScrollDirection.DOWN; delta = 1; } else if (direction == Clutter.ScrollDirection.LEFT) { x_dir = XApp.ScrollDirection.LEFT; delta = -1; } else if (direction == Clutter.ScrollDirection.RIGHT) { x_dir = XApp.ScrollDirection.RIGHT; delta = 1; } this.proxy.call_scroll(delta, x_dir, event.get_time(), null, null); } return Clutter.EVENT_STOP; } destroy() { this.proxy.disconnect(this._proxy_prop_change_id); this._proxy_prop_change_id = 0; this._tooltip.destroy(); } } class CinnamonXAppStatusApplet extends Applet.Applet { constructor(orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.orientation = orientation; this.setAllowedLayout(Applet.AllowedLayout.BOTH); this.actor.remove_style_class_name('applet-box'); this.actor.set_important(true); // ensure we get class details from the default theme if not present if (this.orientation == St.Side.TOP || this.orientation == St.Side.BOTTOM) { this.manager_container = new St.BoxLayout( { vertical: false, style: HORIZONTAL_STYLE }); } else { this.manager_container = new St.BoxLayout( { vertical: true, style: VERTICAL_STYLE }); } this.actor.add_actor (this.manager_container); this.manager_container.show(); this._recording_indicator = new RecorderIcon(this); this.manager_container.add_actor(this._recording_indicator.actor); this.statusIcons = {}; /* This doesn't really work 100% because applets get reloaded and we end up losing this * list. Not that big a deal in practice*/ this.ignoredProxies = {}; this.signalManager = new SignalManager.SignalManager(null); this._scaleUpdateId = 0; this.monitor = new XApp.StatusIconMonitor(); this.signalManager.connect(this.monitor, "icon-added", this.onMonitorIconAdded, this); this.signalManager.connect(this.monitor, "icon-removed", this.onMonitorIconRemoved, this); this.signalManager.connect(Gtk.IconTheme.get_default(), 'changed', this.on_icon_theme_changed, this); this.signalManager.connect(global.settings, 'changed::panel-edit-mode', this.on_panel_edit_mode_changed, this); this.signalManager.connect(Main.systrayManager, "changed", this.onSystrayRolesChanged, this); /* HACK - the built-in on_panel_icon_size_changed() call only sends if the type (symbolic, fullcolor) * of the icon size matches the last type used by the applet. Since this applet can contain both * types, listen to the panel signal directly, so we always receive the update. */ this.signalManager.connect(this.panel, "icon-size-changed", this.icon_size_changed, this); this.signalManager.connect(global, "scale-changed", this.ui_scale_changed, this); } getKey(icon_proxy) { let proxy_name = icon_proxy.get_name(); let proxy_path = icon_proxy.get_object_path() return proxy_name + proxy_path; } onMonitorIconAdded(monitor, icon_proxy) { let key = this.getKey(icon_proxy); if (this.statusIcons[key]) { return; } if (this.shouldIgnoreStatusIcon(icon_proxy)) { global.log(`Hiding XAppStatusIcon (we have an applet): ${icon_proxy.name}`); this.ignoreStatusIcon(icon_proxy); return; } global.log(`Adding XAppStatusIcon: ${icon_proxy.name} (${key})`); this.addStatusIcon(icon_proxy); } onMonitorIconRemoved(monitor, icon_proxy) { let key = this.getKey(icon_proxy); if (!this.statusIcons[key]) { if (this.ignoredProxies[key]) { delete this.ignoredProxies[key]; } return; } global.log(`Removing XAppStatusIcon: ${icon_proxy.name} (${key})`); this.removeStatusIcon(icon_proxy); } onSystrayRolesChanged() { let hiddenIcons = Main.systrayManager.getRoles(); for (let i in this.statusIcons) { let icon_proxy = this.statusIcons[i].proxy; if (this.shouldIgnoreStatusIcon(icon_proxy)) { global.log(`Hiding XAppStatusIcon (we have an applet): ${icon_proxy.name} (${i})`); this.removeStatusIcon(icon_proxy); this.ignoreStatusIcon(icon_proxy); } } for (let i in this.ignoredProxies) { let icon_proxy = this.ignoredProxies[i]; if (!this.shouldIgnoreStatusIcon(icon_proxy)) { delete this.ignoredProxies[i]; global.log(`Restoring hidden XAppStatusIcon (native applet gone): ${icon_proxy.name} (${i})`); this.addStatusIcon(icon_proxy); } } } addStatusIcon(icon_proxy) { let key = this.getKey(icon_proxy); let statusIcon = new XAppStatusIcon(this, icon_proxy); this.manager_container.insert_child_at_index(statusIcon.actor, 0); this.statusIcons[key] = statusIcon; this.sortIcons(); } removeStatusIcon(icon_proxy) { let key = this.getKey(icon_proxy); if (!this.statusIcons[key]) { return; } this.manager_container.remove_child(this.statusIcons[key].actor); this.statusIcons[key].destroy(); delete this.statusIcons[key]; this.sortIcons(); } ignoreStatusIcon(icon_proxy) { let key = this.getKey(icon_proxy); if (this.ignoredProxies[key]) { return; } this.ignoredProxies[key] = icon_proxy; } shouldIgnoreStatusIcon(icon_proxy) { let hiddenIcons = Main.systrayManager.getRoles(); let name = icon_proxy.name.toLowerCase(); if (hiddenIcons.indexOf(name) != -1 ) { return true; } return false; } _sortFunc(a, b) { let asym = a.proxy.icon_name.includes("-symbolic"); let bsym = b.proxy.icon_name.includes("-symbolic"); if (asym && !bsym) { return 1; } if (bsym && !asym) { return -1; } return GLib.utf8_collate(a.proxy.name.replace("org.x.StatusIcon.", "").toLowerCase(), b.proxy.name.replace("org.x.StatusIcon.", "").toLowerCase()); } sortIcons() { this.onSystrayRolesChanged(); let icon_list = [] for (let i in this.statusIcons) { icon_list.push(this.statusIcons[i]); } icon_list.sort(this._sortFunc); icon_list.reverse() for (let icon of icon_list) { this.manager_container.set_child_at_index(icon.actor, 0); } this.manager_container.set_child_at_index(this._recording_indicator.actor, -1); } refreshIcons() { for (let owner in this.statusIcons) { let icon = this.statusIcons[owner]; icon.refresh(); } this._recording_indicator.refresh(); } icon_size_changed() { this.refreshIcons(); } on_icon_theme_changed() { this.refreshIcons(); } ui_scale_changed() { if (this._scaleUpdateId > 0) { Mainloop.source_remove(this._scaleUpdateId); } this._scaleUpdateId = Mainloop.timeout_add(1500, () => { this.refreshIcons(); this._scaleUpdateId = 0; return GLib.SOURCE_REMOVE; }) } on_applet_removed_from_panel() { this.signalManager.disconnectAllSignals(); for (let key in this.statusIcons) { this.statusIcons[key].destroy(); delete this.statusIcons[key]; }; for (let key in this.ignoredProxies) { delete this.ignoredProxies[key]; }; this._recording_indicator.destroy(); this._recording_indicator = null; this.monitor = null; } on_panel_edit_mode_changed() { let reactive = !global.settings.get_boolean('panel-edit-mode'); for (let owner in this.statusIcons) { let icon = this.statusIcons[owner]; icon.actor.reactive = reactive; } } on_orientation_changed(newOrientation) { this.orientation = newOrientation; if (newOrientation == St.Side.TOP || newOrientation == St.Side.BOTTOM) { this.manager_container.vertical = false; this.manager_container.style = HORIZONTAL_STYLE; } else { this.manager_container.vertical = true; this.manager_container.style = VERTICAL_STYLE; } this.refreshIcons(); } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonXAppStatusApplet(orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/xapp-status@cinnamon.org/metadata.json0000664000175000017500000000040615167446463030145 0ustar fabiofabio{ "uuid": "xapp-status@cinnamon.org", "name": "XApp Status Applet", "description": "An applet which hosts all the system tray icons for applications which use XAppStatusIcons", "max-instances": -1, "icon": "cs-applets", "version": "1.0" }cinnamon-6.6.8/files/usr/share/cinnamon/applets/xrandr@cinnamon.org/0000775000175000017500000000000015167446463024477 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js0000664000175000017500000000627715167446463026336 0ustar fabiofabio/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ const Interfaces = imports.misc.interfaces; const Gdk = imports.gi.Gdk; const GLib = imports.gi.GLib; const CinnamonDesktop = imports.gi.CinnamonDesktop; const Lang = imports.lang; const Applet = imports.ui.applet; const PopupMenu = imports.ui.popupMenu; const Meta = imports.gi.Meta; const N_ = function(e) { return e; }; let ROTATIONS = [ [Meta.XrandrRotation.NORMAL, N_("Normal")], [Meta.XrandrRotation.LEFT, N_("Left")], [Meta.XrandrRotation.RIGHT, N_("Right")], [Meta.XrandrRotation.FLIPPED, N_("Upside-down")] ]; class CinnamonXrandrApplet extends Applet.IconApplet { constructor(orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.set_applet_icon_symbolic_name("xsi-display"); this.set_applet_tooltip(_("Display")); this.menuManager = new PopupMenu.PopupMenuManager(this); this.menu = new Applet.AppletPopupMenu(this, orientation); this.menuManager.addMenu(this.menu); this.monitor_manager = Meta.MonitorManager.get(); this.monitor_manager.connect("monitors-changed", () => this._monitors_changed()); this._generate_menu(); } on_applet_clicked(event) { this.menu.toggle(); } _update_visible() { this.actor.visible = global.settings.get_boolean("panel-edit-mode") || this._get_allowed_rotations().length > 0; } on_applet_added_to_panel(userEnabled) { this._update_visible(); this._generate_menu(); } _monitors_changed(manager) { this._update_visible(); this._generate_menu(); } _generate_menu() { this.menu.removeAll(); if (!this.actor.visible) { return; } const allowed_rotations = this._get_allowed_rotations(); for (let i = 0; i < allowed_rotations.length; i++) { let [rotval, name] = allowed_rotations[i]; let item = new PopupMenu.PopupMenuItem(_(name)); let [got, current] = this.monitor_manager.get_current_rotation(); if (got && current === rotval) { item.setShowDot(true); } item.connect('activate', (item, event) => { if (!this.monitor_manager.apply_temporary_rotation(rotval)) { global.logError('Unable to rotate the laptop display', e); } }); this.menu.addMenuItem(item); } this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addAction(_("Configure display settings..."), function() { GLib.spawn_command_line_async('cinnamon-settings display'); }); } _get_allowed_rotations() { let retval = []; for (let i = 0; i < ROTATIONS.length; i++) { let rotation = ROTATIONS[i]; if (this.monitor_manager.can_apply_rotation(rotation[0])) { retval.push(rotation); } } return retval; } }; function main(metadata, orientation, panel_height, instance_id) { return new CinnamonXrandrApplet(orientation, panel_height, instance_id); } cinnamon-6.6.8/files/usr/share/cinnamon/applets/xrandr@cinnamon.org/metadata.json0000664000175000017500000000024215167446463027150 0ustar fabiofabio{ "uuid": "xrandr@cinnamon.org", "name": "Display", "description": "XRandR monitor control applet", "icon": "cs-display", "localedir": "/usr/share/locale" } cinnamon-6.6.8/files/usr/share/cinnamon/applets/xrandr@cinnamon.org/stylesheet.css0000664000175000017500000000005515167446463027402 0ustar fabiofabio.display-subtitle { font-weight: bold; } cinnamon-6.6.8/files/usr/share/cinnamon/bumpmaps/0000775000175000017500000000000015167446463020744 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/bumpmaps/birdnfish.png0000664000175000017500000000705215167446463023426 0ustar fabiofabioPNG  IHDRWK IDATx^\Ɏ$Q;*@i*`%q&e^d7xNeQJ$pPp!4U]ԭ;*WԕXI%*av"Q#Q^$cQxw [pFT(*r^>BTUZd{ ؿ0ݴjDC<4 PssC 5|g;Dd*j/KyWP/ bL1- fn\s,#@9)'#^`".{pr6`$j/*ϟ&#˞r>y(T(4<>}᭺l'޽|Rq QE?R;>BsʇgVga7K[$ήppk 8\rƃEߓr;y z‡*vfשi*jD763(L/?O&@6boX]r ;*~)*ɮz|n2wX[oFA3~(aN6]C7W5qy eY§^r`d  C*f7S9Ht2fY96fS;Zr$^]W?tBRl=; w؊ێaMb3ss5DsG{6d zū'LSE:%wA ($~+#{'j? SWO  !hH?;< WʹE\H]Ԁ5"͘+P>ǀ\RA />D" .J562`*Q&iH'\2#'7pܺg%5w9W4" `g6T#+|VɌ^o`"ihkv2#P@;p_fnx7*"\?Ȟ8aѫn飕l*VHt0<&sILLs^)B#9 $vӝyGf:_& } ,X/8 ,7<DI[[B -?XZe֧y+$CyR z77^/19wZ+!i=D10T iHdV 'hdM#_{2 "'M27=d.I/!8P+`G@``D֝{I, XEmȫ'm4ڹ6(4tfiO-ҋ`_!пMD \gUnԶF˕A%98@}NmaDCIzU"٤] G/?ջV@&I+̚(a w 9d׏N^x=F3M| [hpTHڙ{WK!SIO@ug2ss+* ’S5x!!8!7rt:Őv_", (qea#FԐЂt?V6AU0=0"uj(tJK|Dy/u =ѭFnCsԪ;_Z{X2Զ^~݉GՅ\c3KCmx~s#_Od쁒ac]E[X@5>/9V9̏D Y:|$e?Xj=bC2w|*ݑgÉ''z2R5L< ${Ƭd.tԺ(Z.@84 {$LmZ3&=!8BB-'9<_\48^ ɪ M@~-i.l@-a AM. 8h́sAO٣ jU^AR (ٞ.^(  j^c۵s/"MhICE'mƝ / "E~%.;.M]/ɭ3c*bD뉁h avbg+S7r_s%)F6Q鱙ly'tRUy]p1"s4fKbp!ڹ/Bs~P ycxe4n_4.Ph7P5. [xRȕ!p/5!-y]i;Z G De=R. y%-Y7FYbHd&8|`]p#Nn[cwXG-6;񊐬CIΚH%.¦QXP,qK|@IhIˌLGLI (ŶktK<&Z)yG&$b3v\'1?#RqXB1 Ŧxj$lFt$\~;WjUp^S㐓n7%5B$EƧ$H̊:5*Oq2%\H =}Cyք*x LBb9%4Jc^tϽGje-|3"2P.8cg@ZE"^/1[ m#jF*RfdЎ|77wbh'J! Fa|XV"reOdIєlP|­TMm ${+bp$";b gDI|[>gd(@/fɉ"5-o$VLb/ă]GB>H+-cqTyӊP6P4yZVB;G@Y*`Un8J 8,'0/EA욳='@xIoRTΤuR&$&QBդJ8VΉay3{+ԍf qa^qX{FqR {8G/qRcLϑfޑ<&='oR0?=!ICvb҂_w#L'\GJL~4[4&b7b*Y"L#Á 䕶3ߤgG&)%0̄gɁPz͕0+GBg C,x#Ol9BCwnFe̎]924r:rx1_% X{&;GJq3rdy8WPzi\C,+n6>t~+fͯL k,)ɫGLI  tk?+s <-)cJ\o""_ׁҨmfOZ'TČ c("b FB =k$V1f#>ʣVI?zD;R|;6I]/L<HWuaN;`fE5̕džSl?04c+O<Г!s|c/,+]%X".)a;x-s E^dn2xOQRy$4ߟ,+۝tv GhIHLfBD9-}!5;aG0H-{lLm b-ƷՒaiR|(dm?i MV 0\isW`XBB?%V> sF5-0Չ@$)VeXqbp$wiI_ٟ_%K) $|n ?v*|nw΅ W؃g -7c5&BqlTIU.lx'y!Jfxug3Uӟp?0NLjlwg|{fS.' g3Mrl!0AKF n(覧Z>b&`#]vę+]Kцj!OC,t`8}jfQ4vBa;neL _.ѯSx[d:WZmT$ %^>Db+׆z{dDh7+; PWr+)6E|ǧb F$En3( Āϼ#J[N3lNV m4H`)ocIܿot`xnD8^|&]ԑ4M{X3s%K@meU$>)c$Xzӝ2/<0x'wwR&>YVHp߅|[ߕTx쌧0RC, &ir//<Viz;F"ȳ8~3l&916# M k0c31W<Zb.8x̞l1Ԍ 3q7Tģ'Fkca%7i(®Rao̞S&[v``&j2_Hku&)$(BF}Pf;[ʋ,ׅ8V*q"GYGIHN%=!j)E>Pcr|L]p3DkHEv\NDxf)%|%#DNq4|P0V+%ʑІwf:s3U~B G&Bւ1ްQ5q4ғ`9*5QS"~*3/y l/Y]~/B<I'Hhlָ;RT֙52>[[q+q_Xo/v];!uƏ ;ɤ_B%W~\ıaxC4!|*e85&lWc^,IgQ"aKCp[LN|̌q+6%8ȲƕsI{WΚ-af[yGU_oc,~Mlf"_ i两K6eJ|,ʇ=|f[g F%CJt G{+.=ffL1ON$^tX I9P9'aJ*8Xٳ)`10FY&OaV dWL#Y *w ̊qgYxvؿl+IvK>W>ĸ fF7/Нh$OAZ6ȪKDG,41#KFU쵝6R"p?boXeX#^+,{wc 펋1 םr 9#["̂ '4Jի%3njA˒1DjZ` FT-2+ đb"s}`;zA2_ň$̲yRuAW oYEtq ,|bN^Z / R cR߆k)| 45vB,$\>&GDZ*C%uH+5nt|I`^1Fִ",,wBr7Oj'^"J|)z,  D̍ŜU] 쵤N0V"'ĦXWr7d.eMbFfOo12(%=djޓ7d-Otf;bH;ޣw\&%p9(y-N.~Cc),O?% iI#2)B&Wۛ.q,MikQ$3kI_v$]̈p_zi7-fLؓ (3Olv#gve^cKUS:%'J7L"Y<Ó"SoI2wRgBϠZzΆx\Wm8'~`+jV̜(_3yĝ<~0G]gv Vwyaxinw;SUg]vG:X?LG'GDneX͸p1OZa fĿ(d؂芤CPjn1=RHivS@AN^\|H~cMtF1F2KvF3nh֋g'2vRʯ ^Wi9ܶ }2UZ2]!i[VޓtZaz$_Cn'Xq@tZ!6'aqɑ'eޤseda26мFonsͤȶb#o\ugw,or`JGwc)Dij%t4zI U3&0g%kv9]Tt.Gns'n^ڋIXEnɐL$~W_)QgO'AY /|V=Q2_.gqWC _0(yp3l?)'m4 ֓_v m;ҕ:X;n'͆Nd |'LqƷyS ["7yz1;])L6rnΔB{`Aׄ9qXV7R2 LF uf M.%r/⾳0YK1oLVM[EVNדtlB9-w“a 6Ћy{ktҝT%;q_!p/l51+ɳN3Yn zlkd|Lq) Kۋb6r &% >I, $µ'ˍTwdV#E6!sx' pUBOlRPH[pfD/4A8mx Ƴk/@dD,v\뷉C@aB$b ,c bV^;;a!tS`ocHA?i$4L/&ыY.QZV\.M22g2&]ư$ƙt,*GfY^$HXXwJӉ-l`I"n={F s b\I.N|ΔM%ϐg鐑q`:Ș9 so&NjG޾-m'G*MޘVKD<9zNQx-|Y^LU 2 g;n]o \t68EBa1\fSdNV*Iu"LcbĹu8˜X_uXF>UXMf2:^Tga,‰Lxml+Ơ!dDvVR|ܳ%$18r; zhM?"v㈈Y$/%qI۽t|}v ot|vbq$FC'bx6iTԥ=lEMޟ iv1Zxi{ş6 *"OQS'b;?aa;7T[oxqIt_s a,m$M&jf^`StS&Ϲ }&J#`SMrYP:fXI=A.%P(gz !2/en&a#1Osv01=U-_n 'S~~q̯ zZ5qps! n%˜"םr/Ȗ;.GfToOϷDגJ8\dIYFn34c&{#.S䴌./KE+~D3ԕ+ptuN=˃im*Hwd>%#FwUQɇyqָ]_)ox+eza5͂X XyԸqY ƪ% /AE&YIg;OJx˪>ʹ-B?fÿT2f欀/f8Vvrrs/. AlL0(ze5e(֕$eXs-#1+8-LAȍ06/2* }av>|1zONH D".qe%u0%J>U(]?U7g1G`//G?1EkAV*LҐ"OSx =/DKChh o,#)!=k-h6DC˰*0l<ɦV|.'C6Rd-wI=_3bE~a241d@m?9pCǡۣ%Jo¤֏nsp>V8K_{ZFjȲ+[x__ Mb_ _X޳RQ͆? ;EnoI1mlrC SS> +w*RΘڱ?5:O+(f[ FV5eqľfz+(oOr>2~l]#Ҩ}`<1X^r\6};hj8et2my}v Cb>҈%T} |&03%bwƑ1\;K۟dFEU:U2EW!IxT El{9QZ.8E7 ;3"tQ6 k`2,`^^ ]j3ĭ;Uaմ`z$|Ué 2ز2ETG :w o\̹r> ޙVxg*Y Bs!k[Q0pZwF/H8HRQwO:^<鸵VCxP00 MFO[MkX;åzm CD7~!dԖYW9dlr[*aS'ҵ QI3}Ի|$M'$OYuWm6INnZ'Nwִ 5ҿ$m"ȢwXzr0⼆i'9b9V#:\& {1[igp\*:GM63,ZU-̒Ojvb 'e[֕HZ{Xt/nfpHF.8cG4v.9I)CTܰI[6G+T~껈LIt~bOTϼVݱTA{^>=/ KcVΉZsܱs6 jRc&g]{[LNcK^,0QGzN?0ujL*,Q2v®ed[撯Hs sFKy/pC]E+L/`s.s0οs3MN"4ohdsMrw]xL؁bpՆMevšF[H+gi"mEq<׍,2ų,̙)`UF$*̜qEt}8\1YLٛŷ3W($&kY?:>̺{CYoEkifԫ:Ϭ;B)hExމq HwTZ8ZщaS~gd0I+ SWRk`N*>'G ?6\5[0 7*0F`t;I(ځTjXa7 Jgܷ'_C"9~H0%NwJ#3"`~2ZoxL`-]ja&|\#kuYȨQLus$i3H aH/NٝQ8l !KW(I8Yb &}tzdmR$%om*ڿܛЩEL[NoE{uϯcƠ|#+ ׹bd z!}ErT ph$)_|`>jyf;qoS:V3S]pjx,I&X1|YQC< ]&F,l7w5<>t?B~cz ӧ3cYǿp A:P47+իecAX97s(03}>U$`fq#M [6`t*=1V,~ҍRy8Ɩ+x!ܣg{7piz5c_$[cI7#o0<%hIN$hu[RN6Y*!Nck8/^KB%(w U'SKkL~iYIOTu:]UOĚ(qE<;0 OVw"m*5/Suih=àw9uЖVvo08a#m?Awǔ5o5A uϣ;NEihwPRؤwp=Fܡf3ujK ԯZ(IL*n|׶~f5Vx tJkwOzXn-YS+=53W%)Bcjܼ<:hӔ|y.lOQ9r#[2~Fm/#dWJ$2:ywl1>47}"$[Yl2əDjre`}beJ-L);~(‡&9pNK 4;7kUyOݱIxӦ=eLǃau qdh">iopNPܝ`'6zo ϊi*i•tJgm.r̪ qmQ&n#Y#NmfQn{c#*Bˌ5Ql˙ɗf⾒k'\}"<^>,}-S/{=^q;InhZe г"E~u/:uO}\M-j)LuOdy(Xk?-楈_ Vt$Blߙ,]-6q(qCsBF nT3/s3Gu+4^/[fbkA;G)|hZfEi&/Q2ATwAJ]Mrx˴92P'5wDjfE|auh/YCezKF^zXw9N4 LO*t=D,:ۭجn/>OaC2rv6=ՠ%1OI=V38q[!hDG$/}ȁ}d=Q^ Y =%~d%}ŭIΞ$cVLr*||G=O1NM=4Qt'D{jUXWѺ?*Jő4rbLuh#ɍY暨vVTFё: Lz}n3IHJ?I#wM7meX˂o}OM\ꑭ>P;5:My0`3?>^`j_.α0{ܜ&LevѬ% {4*gI{OƷ 3#UL sz.d*|tKMn\ҭ^IȌHi R "vrj2~0 OJ%FCZcMdN?:~k^'ކEdAYΜ8UgK8t }`s@9QrF.na)U;gE+Ad(ā .%X^ZDy4X0k V:\<H&˪i[ ξNĞ$&,lw>UK_holM""wbIN|W8?4Y"dk`d u1 aH6 D)]JUdZL#O-Z$T\7Q)B' Xb蒺.&X//E+ʗH--ѳNx}VE:]oNvZO +Qo5W]N8Fc2:3Y+`WIƗ'k9/zdoP΀~ܶ3n8a0.JI;ETW}YyҳjC~OIoj)WU9)~FUWxh{R$Rf:g,#܄b.yIukW%w~[M4^5sx?upE/AIENDB`cinnamon-6.6.8/files/usr/share/cinnamon/bumpmaps/hex.png0000664000175000017500000000031115167446463022231 0ustar fabiofabioPNG  IHDR RIDATxc<Wo` &!1 !21]I ":W׉E/)躯܃ J@IWr7 Dɪ_Q2~@VLy7aA0*;(/TЏ+'ln59=Pk z]9Q}mk -i?oAtvmÎnm5,ig^\^5Sh@]͞n]u4@dr(FL @(G 3doBև]VHWbJi> kIwmI;1v2W"7h2ЗL:m:,'}PN8cse7OA6IZwz/smAy=RyHܺЊ~3.)Uif_`%26SSgdXl J1ʩà\81X|{96aCA)F d= D^5ԕ|IX=.";XJcTgyjGmPr$u4> @!bG V#=rZh!JYU}"b:@z L)bE3L݅ 9q2p}$+(uIݣQ~T hj^,A̩F)3WiPMihtk #zR;#Wkޝ>`hRy⦸οH5hk92*I{ $P3E;,Q*D0h#Aҋ'x D5h'*%w$vޥphVU9CʼfRBHMjl\%b(c4ԴCr͡UBebF-FvAXNWOOr:DYdFuv>AܧRMuxkIN(W]| +Qt$=b& dH^7t=Y7̚|4 F⅙$E5OɦvsaF@oL& å.4F'\!Kqc0*}7!(92uP.vBPDCZٹTY#R-ȉ!@) tTIQ0쮲uvJ M8>V^+f*vRtQ9*I=蝂 XuBp.dKAʕ1Bt:>\of']ߋL3aJՀXǥԇJC!3ɹ}kН]d_nn ]V+V>|Ⲵ]3FE} z@ (G&ePtwM◦i)XItou"7 $IENDB`cinnamon-6.6.8/files/usr/share/cinnamon/cinnamon-desktop-editor/0000775000175000017500000000000015167446463023655 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/cinnamon-desktop-editor/cinnamon-desktop-editor.py0000775000175000017500000004627715167446463031007 0ustar fabiofabio#!/usr/bin/python3 import sys import os import gettext import glob from optparse import OptionParser import shutil import subprocess from setproctitle import setproctitle from pathlib import Path import gi gi.require_version("Gtk", "3.0") gi.require_version("CMenu", "3.0") from gi.repository import GLib, Gtk, Gio, CMenu sys.path.insert(0, '/usr/share/cinnamon/cinnamon-menu-editor') from cme import util sys.path.insert(0, '/usr/share/cinnamon/cinnamon-settings') sys.path.insert(0, '/usr/share/cinnamon/cinnamon-settings/bin') import JsonSettingsWidgets # i18n gettext.install("cinnamon", "/usr/share/locale") # i18n for menu item #_ = gettext.gettext # bug !!! _ is already defined by gettext.install! home = os.path.expanduser("~") PANEL_LAUNCHER_PATH = os.path.join(GLib.get_user_data_dir(), "cinnamon", "panel-launchers") OLD_PANEL_LAUNCHER_PATH = os.path.join(home, ".cinnamon", "panel-launchers") EXTENSIONS = (".png", ".xpm", ".svg") DEFAULT_ICON_NAME = "cinnamon-panel-launcher" def escape_space(string): return string.replace(" ", r"\ ") def ask(msg): dialog = Gtk.MessageDialog(None, Gtk.DialogFlags.DESTROY_WITH_PARENT | Gtk.DialogFlags.MODAL, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, None) dialog.set_markup(msg) dialog.show_all() response = dialog.run() dialog.destroy() return response == Gtk.ResponseType.YES DESKTOP_GROUP = GLib.KEY_FILE_DESKTOP_GROUP class ItemEditor(object): ui_file = None def __init__(self, item_path=None, callback=None, destdir=None, icon_size=24): self.builder = Gtk.Builder() self.builder.set_translation_domain('cinnamon') # let it translate! self.builder.add_from_file(self.ui_file) self.callback = callback self.destdir = destdir self.dialog = self.builder.get_object('editor') self.dialog.connect('response', self.on_response) self.starting_icon = None self.icon_chooser = self.builder.get_object('icon-chooser') self.icon_chooser.get_dialog().set_property("allow-paths", True) self.icon_size = icon_size self.icon_chooser.set_icon_size(self.get_gtk_size_for_pixels(icon_size)) self.build_ui() self.item_path = item_path self.load() self.check_custom_path() self.resync_validity() def get_gtk_size_for_pixels(self, icon_size): i = 0 while True: try: valid, width, height = Gtk.IconSize.lookup(Gtk.IconSize(i)) if height > icon_size: return Gtk.IconSize(i) except ValueError: return Gtk.IconSize.DIALOG i += 1 def build_ui(self): raise NotImplementedError() def check_custom_path(self): raise NotImplementedError() def sync_widgets(self, name_valid, exec_valid): if name_valid: self.builder.get_object('name-entry').set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, 'gtk-ok') self.builder.get_object('name-entry').set_icon_tooltip_text(Gtk.EntryIconPosition.SECONDARY, _("Valid name")) else: self.builder.get_object('name-entry').set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, 'process-stop') self.builder.get_object('name-entry').set_icon_tooltip_text(Gtk.EntryIconPosition.SECONDARY, _("The name cannot be empty.")) if exec_valid: self.builder.get_object('exec-entry').set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, 'gtk-ok') self.builder.get_object('exec-entry').set_icon_tooltip_text(Gtk.EntryIconPosition.SECONDARY, _("Valid executable")) else: self.builder.get_object('exec-entry').set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, 'process-stop') self.builder.get_object('exec-entry').set_icon_tooltip_text(Gtk.EntryIconPosition.SECONDARY, _("The executable is not valid. It cannot be empty and spaces in the path must be escaped with backslash (\\).")) self.builder.get_object('ok').set_sensitive(name_valid and exec_valid) def validate_exec_line(self, string): try: success, parsed = GLib.shell_parse_argv(string) if GLib.find_program_in_path(parsed[0]) or ((not os.path.isdir(parsed[0])) and os.access(parsed[0], os.X_OK)): return True except: pass return False def get_keyfile_edits(self): raise NotImplementedError() def set_text(self, ctl, name): try: val = self.keyfile.get_locale_string(DESKTOP_GROUP, name, None) except GLib.GError: pass else: self.builder.get_object(ctl).set_text(val) def set_check(self, ctl, name): try: val = self.keyfile.get_boolean(DESKTOP_GROUP, name) except GLib.GError: pass else: self.builder.get_object(ctl).set_active(val) def set_icon(self, name): try: val = self.keyfile.get_string(DESKTOP_GROUP, name) except GLib.GError: pass else: print(val) self.icon_chooser.set_icon(val) self.starting_icon = val print('icon:', self.icon_chooser.get_icon()) def load(self): self.keyfile = GLib.KeyFile() path = self.item_path or "" try: self.keyfile.load_from_file(path, util.KEY_FILE_FLAGS) except GLib.GError: pass def save(self): util.fillKeyFile(self.keyfile, self.get_keyfile_edits()) contents, length = self.keyfile.to_data() need_exec = False if self.destdir is not None: self.item_path = os.path.join(self.destdir, self.builder.get_object('name-entry').get_text() + ".desktop") need_exec = True try: with open(self.item_path, 'w') as f: f.write(contents) if need_exec: os.chmod(self.item_path, 0o755) subprocess.Popen(['update-desktop-database', util.getUserItemPath()], env=os.environ) except IOError as e: if ask(_("Cannot create the launcher at this location. Add to the desktop instead?")): self.destdir = GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DESKTOP) self.save() def run(self): self.dialog.present() def on_response(self, dialog, response): if response == Gtk.ResponseType.OK: self.save() self.callback(True, self.item_path) else: self.callback(False, self.item_path) class LauncherEditor(ItemEditor): ui_file = '/usr/share/cinnamon/cinnamon-desktop-editor/launcher-editor.ui' def build_ui(self): self.builder.get_object('exec-browse').connect('clicked', self.pick_exec) self.builder.get_object('name-entry').connect('changed', self.resync_validity) self.builder.get_object('exec-entry').connect('changed', self.resync_validity) def resync_validity(self, *args): name_text = self.builder.get_object('name-entry').get_text().strip() exec_text = self.builder.get_object('exec-entry').get_text().strip() name_valid = name_text != "" exec_valid = self.validate_exec_line(exec_text) self.sync_widgets(name_valid, exec_valid) def load(self): super(LauncherEditor, self).load() self.set_text('name-entry', "Name") self.set_text('exec-entry', "Exec") self.set_text('comment-entry', "Comment") self.set_check('terminal-check', "Terminal") self.set_check('offload-gpu-check', "PrefersNonDefaultGPU") self.set_icon("Icon") def get_keyfile_edits(self): return dict(Name=self.builder.get_object('name-entry').get_text(), Exec=self.builder.get_object('exec-entry').get_text(), Comment=self.builder.get_object('comment-entry').get_text(), Terminal=self.builder.get_object('terminal-check').get_active(), PrefersNonDefaultGPU=self.builder.get_object("offload-gpu-check").get_active(), Icon=self.icon_chooser.get_icon(), Type="Application") def pick_exec(self, button): chooser = Gtk.FileChooserDialog(title=_("Choose a command"), parent=self.dialog, buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT, Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT)) response = chooser.run() if response == Gtk.ResponseType.ACCEPT: self.builder.get_object('exec-entry').set_text(escape_space(chooser.get_filename())) chooser.destroy() def check_custom_path(self): if self.item_path: self.item_path = os.path.join(util.getUserItemPath(), os.path.split(self.item_path)[1]) class DirectoryEditor(ItemEditor): ui_file = '/usr/share/cinnamon/cinnamon-desktop-editor/directory-editor.ui' def build_ui(self): self.builder.get_object('name-entry').connect('changed', self.resync_validity) def resync_validity(self, *args): name_text = self.builder.get_object('name-entry').get_text().strip() valid = (name_text != "") self.builder.get_object('ok').set_sensitive(valid) def load(self): super(DirectoryEditor, self).load() self.set_text('name-entry', "Name") self.set_text('comment-entry', "Comment") self.set_icon("Icon") def get_keyfile_edits(self): return dict(Name=self.builder.get_object('name-entry').get_text(), Comment=self.builder.get_object('comment-entry').get_text(), Icon=self.icon_chooser.get_icon(), Type="Directory") def check_custom_path(self): self.item_path = os.path.join(util.getUserDirectoryPath(), os.path.split(self.item_path)[1]) class CinnamonLauncherEditor(ItemEditor): ui_file = '/usr/share/cinnamon/cinnamon-desktop-editor/launcher-editor.ui' def build_ui(self): self.builder.get_object('exec-browse').connect('clicked', self.pick_exec) self.builder.get_object('name-entry').connect('changed', self.resync_validity) self.builder.get_object('exec-entry').connect('changed', self.resync_validity) def check_custom_path(self): dir = Gio.file_new_for_path(PANEL_LAUNCHER_PATH) if not dir.query_exists(None): dir.make_directory_with_parents(None) if self.item_path is None or "cinnamon-custom-launcher" not in self.item_path: i = 1 while True: name = os.path.join(PANEL_LAUNCHER_PATH, 'cinnamon-custom-launcher-' + str(i) + '.desktop') old_name = os.path.join(OLD_PANEL_LAUNCHER_PATH, 'cinnamon-custom-launcher-' + str(i) + '.desktop') file = Gio.file_parse_name(name) old_file = Gio.file_parse_name(old_name) if not file.query_exists(None) and not old_file.query_exists(None): break i += 1 self.item_path = name def resync_validity(self, *args): name_text = self.builder.get_object('name-entry').get_text().strip() exec_text = self.builder.get_object('exec-entry').get_text().strip() name_valid = name_text != "" exec_valid = self.validate_exec_line(exec_text) self.sync_widgets(name_valid, exec_valid) def load(self): super(CinnamonLauncherEditor, self).load() self.set_text('name-entry', "Name") self.set_text('exec-entry', "Exec") self.set_text('comment-entry', "Comment") self.set_check('terminal-check', "Terminal") self.set_check('offload-gpu-check', "PrefersNonDefaultGPU") self.set_icon("Icon") def get_keyfile_edits(self): icon_theme = Gtk.IconTheme.get_default() icon = self.icon_chooser.get_icon() if icon != self.starting_icon: info = icon_theme.lookup_icon(icon, self.icon_size, 0) if info: filename = info.get_filename() if not self.in_hicolor(filename): icon = filename return dict(Name=self.builder.get_object('name-entry').get_text(), Exec=self.builder.get_object('exec-entry').get_text(), Comment=self.builder.get_object('comment-entry').get_text(), Terminal=self.builder.get_object('terminal-check').get_active(), PrefersNonDefaultGPU=self.builder.get_object("offload-gpu-check").get_active(), Icon=icon, Type="Application") def in_hicolor(self, path): datadirs = GLib.get_system_data_dirs() for datadir in datadirs: hicolor_folder = Path(os.path.join(datadir, "icons", "hicolor")) icon_path = Path(path) try: if icon_path.relative_to(hicolor_folder) is not None: return True except ValueError: pass return False def pick_exec(self, button): chooser = Gtk.FileChooserDialog(title=_("Choose a command"), parent=self.dialog, buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT, Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT)) response = chooser.run() if response == Gtk.ResponseType.ACCEPT: self.builder.get_object('exec-entry').set_text(escape_space(chooser.get_filename())) chooser.destroy() class Main: def __init__(self): parser = OptionParser() parser.add_option("-o", "--original", dest="original_desktop_file", help="Path of original .desktop file", metavar="ORIG_FILE") parser.add_option("-d", "--directory", dest="destination_directory", help="Destination directory of the new launcher", metavar="DEST_DIR") parser.add_option("-f", "--file", dest="desktop_file", help="Name of desktop file (i.e. gnome-terminal.desktop)", metavar="DESKTOP_NAME") parser.add_option("-m", "--mode", dest="mode", default=None, help="Mode to run in: launcher, directory, panel-launcher or nemo-launcher") parser.add_option("-i", "--icon-size", dest="icon_size", type=int, default=24, help="Size to set the icon picker for (panel-launcher only)") (options, args) = parser.parse_args() if not options.mode: parser.error("You must select a mode to run in") if options.mode in ("directory", "launcher") and not options.original_desktop_file: parser.error("directory and launcher modes must be accompanied by the -o argument") if options.mode == "nemo-launcher" and not options.destination_directory: parser.error("nemo-launcher mode must be accompanied by the -d argument") if options.mode == "cinnamon-launcher" and len(args) < 1: parser.error("cinnamon-launcher mode must have the following syntax:\n" "cinnamon-desktop-editor -mcinnamon-launcher [-ffoo.desktop] ") self.tree = CMenu.Tree.new("cinnamon-applications.menu", CMenu.TreeFlags.INCLUDE_NODISPLAY) if not self.tree.load_sync(): raise ValueError("can not load menu tree") self.mode = options.mode self.orig_file = options.original_desktop_file self.desktop_file = options.desktop_file self.dest_dir = options.destination_directory if options.mode == "cinnamon-launcher": self.json_path = args[0] self.icon_size = options.icon_size if self.desktop_file is not None: self.get_desktop_path() if self.mode == "directory": editor = DirectoryEditor(self.orig_file, self.directory_cb) editor.dialog.show_all() elif self.mode == "launcher": editor = LauncherEditor(self.orig_file, self.launcher_cb) editor.dialog.show_all() elif self.mode == "cinnamon-launcher": editor = CinnamonLauncherEditor(self.orig_file, self.panel_launcher_cb, icon_size=self.icon_size) editor.dialog.show_all() elif self.mode == "nemo-launcher": editor = LauncherEditor(self.orig_file, self.nemo_launcher_cb, self.dest_dir) editor.dialog.show_all() else: print("Invalid args") def directory_cb(self, success, dest_path): self.end() def launcher_cb(self, success, dest_path): self.end() def panel_launcher_cb(self, success, dest_path): if success: settings = JsonSettingsWidgets.JSONSettingsHandler(self.json_path) launchers = settings.get_value("launcherList") if self.desktop_file is None: launchers.append(os.path.split(dest_path)[1]) else: i = launchers.index(self.desktop_file) if i >= 0: del launchers[i] launchers.insert(i, os.path.split(dest_path)[1]) settings.save_settings() if self.desktop_file is None: self.ask_menu_launcher(dest_path) self.end() def nemo_launcher_cb(self, success, dest_path): if success: self.ask_menu_launcher(dest_path) self.end() def ask_menu_launcher(self, dest_path): if ask(_("Would you like to add this launcher to the menu also? It will be placed in the Other category initially.")): new_file_path = os.path.join(util.getUserItemPath(), os.path.split(dest_path)[1]) shutil.copy(dest_path, new_file_path) def get_desktop_path(self): self.search_menu_sys() if self.orig_file is None: panel_launchers = glob.glob(os.path.join(PANEL_LAUNCHER_PATH, "*.desktop")) old_panel_launchers = glob.glob(os.path.join(OLD_PANEL_LAUNCHER_PATH, "*.desktop")) for launcher in (panel_launchers + old_panel_launchers): if os.path.split(launcher)[1] == self.desktop_file: self.orig_file = launcher def search_menu_sys(self, parent=None): if parent is None: parent = self.tree.get_root_directory() item_iter = parent.iter() item_type = item_iter.next() while item_type != CMenu.TreeItemType.INVALID: if item_type == CMenu.TreeItemType.DIRECTORY: item = item_iter.get_directory() self.search_menu_sys(item) elif item_type == CMenu.TreeItemType.ENTRY: item = item_iter.get_entry() if item.get_desktop_file_id() == self.desktop_file: self.orig_file = item.get_desktop_file_path() item_type = item_iter.next() def end(self): Gtk.main_quit() if __name__ == "__main__": setproctitle("cinnamon-desktop-editor") Gtk.Window.set_default_icon_name(DEFAULT_ICON_NAME) Main() Gtk.main() cinnamon-6.6.8/files/usr/share/cinnamon/cinnamon-desktop-editor/directory-editor.ui0000664000175000017500000001751315167446463027513 0ustar fabiofabio False 4 Directory Properties dialog False vertical 4 False end gtk-cancel True True True True False True 0 gtk-ok True True True True False True 1 False True end 0 True False 10 True False 1 0 0 True True True center center dialog cinnamon-panel-launcher False True 0 True False 6 10 True False 1 Name: 0 0 1 1 True False 1 Comment: 0 1 1 1 True True True True 1 0 1 1 True True True 1 1 1 1 True True end 1 True True 1 cancel ok cinnamon-6.6.8/files/usr/share/cinnamon/cinnamon-desktop-editor/launcher-editor.ui0000664000175000017500000002774415167446463027317 0ustar fabiofabio False 4 Launcher Properties dialog False vertical 4 False end gtk-cancel True True True True False True 0 gtk-ok True True True True False True 1 False True end 0 True False 10 True False 1 0 0 True True True center center dialog cinnamon-panel-launcher False True 0 True False 6 10 True False Name: 1 0 0 True False Command: 1 0 1 True False Comment: 1 0 2 True True True True 1 0 True False 10 True True True True True 0 Browse True True True False True 1 1 1 True True True 1 2 Launch in Terminal? True True False start True 1 3 Use dedicated GPU if available True True False start True 1 4 True True end 1 True True 1 cancel ok cinnamon-6.6.8/files/usr/share/cinnamon/cinnamon-looking-glass/0000775000175000017500000000000015167446463023471 5ustar fabiofabiocinnamon-6.6.8/files/usr/share/cinnamon/cinnamon-looking-glass/cinnamon-looking-glass.py0000775000175000017500000005332315167446463030425 0ustar fabiofabio#!/usr/bin/python3 # Todo: # - TextTag.invisible does not work nicely with scrollheight, find out why # - (Sometimes scrollbars think there is more or less to scroll than there actually is after # showing/hiding entries in page_log.py) # - Add insert button to "simple types" inspect dialog ? is there actual use for these types # inserted as results ? # - Load all enabled log categories and window height from gsettings # - Make CommandLine entry & history work more like a normal terminal # - When navigating through history and modifying a line # - When pressing ctrl + r, search history # - auto-completion ? import os import signal import sys import pyinotify import gi gi.require_version('Gtk', '3.0') from gi.repository import Gio, Gtk, GObject, Gdk, GLib from setproctitle import setproctitle import pageutils from lookingglass_proxy import LookingGlassProxy signal.signal(signal.SIGINT, signal.SIG_DFL) MELANGE_DBUS_NAME = "org.Cinnamon.Melange" MELANGE_DBUS_PATH = "/org/Cinnamon/Melange" melange_xml = """ """ interface_node_info = Gio.DBusNodeInfo.new_for_xml(melange_xml) class MenuButton(Gtk.Button): def __init__(self, text): Gtk.Button.__init__(self, text) self.menu = None self.connect("clicked", self.on_clicked) def set_popup(self, menu): self.menu = menu def on_clicked(self, widget): x, y, w, h = self.get_screen_coordinates() self.menu.popup(None, None, lambda menu, data: (x, y+h, True), None, 1, 0) def get_screen_coordinates(self): parent = self.get_parent_window() x, y = parent.get_root_origin() w = parent.get_width() h = parent.get_height() extents = parent.get_frame_extents() allocation = self.get_allocation() return (x + (extents.width-w)//2 + allocation.x, y + (extents.height-h)-(extents.width-w)//2 + allocation.y, allocation.width, allocation.height) class CommandLine(Gtk.Entry): def __init__(self, exec_cb): Gtk.Entry.__init__(self) self.exec_cb = exec_cb self.settings = Gio.Settings.new("org.cinnamon") self.history = self.settings.get_strv("looking-glass-history") self.history_position = -1 self.last_text = "" self.connect('key-press-event', self.on_key_press) self.connect("populate-popup", self.populate_popup) def populate_popup(self, view, menu): menu.append(Gtk.SeparatorMenuItem()) clear = Gtk.MenuItem("Clear History") clear.connect('activate', self.history_clear) menu.append(clear) menu.show_all() return False def on_key_press(self, widget, event): if event.keyval == Gdk.KEY_Up: self.history_prev() return True if event.keyval == Gdk.KEY_Down: self.history_next() return True if event.keyval == Gdk.KEY_Return or event.keyval == Gdk.KEY_KP_Enter: self.execute() return True def history_clear(self, menu_item): self.history = [] self.history_position = -1 self.last_text = "" self.settings.set_strv("looking-glass-history", self.history) def history_prev(self): num = len(self.history) if self.history_position == 0 or num == 0: return if self.history_position == -1: self.history_position = num - 1 self.last_text = self.get_text() else: self.history_position -= 1 self.set_text(self.history[self.history_position]) self.select_region(-1, -1) def history_next(self): if self.history_position == -1: return num = len(self.history) if self.history_position == num-1: self.history_position = -1 self.set_text(self.last_text) else: self.history_position += 1 self.set_text(self.history[self.history_position]) self.select_region(-1, -1) def execute(self): self.history_position = -1 command = self.get_text() if command != "": num = len(self.history) if num == 0 or self.history[num-1] != command: self.history.append(command) self.set_text("") self.settings.set_strv("looking-glass-history", self.history) self.exec_cb(command) class NewLogDialog(Gtk.Dialog): def __init__(self, parent): Gtk.Dialog.__init__(self, "Add a new file watcher", parent, 0, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OK, Gtk.ResponseType.OK)) self.set_default_size(150, 100) label = Gtk.Label("") label.set_markup("Add File Watch:\n\n" + "Please select a file to watch and a name for the tab\n") box = self.get_content_area() box.add(label) self.store = Gtk.ListStore(str, str) self.store.append(["custom", "