pax_global_header00006660000000000000000000000064136050511520014510gustar00rootroot0000000000000052 comment=b643f08067fa60deaec13fa18471bc29a8ef6363 cinnamon-4.4.8/000077500000000000000000000000001360505115200133275ustar00rootroot00000000000000cinnamon-4.4.8/.circleci/000077500000000000000000000000001360505115200151625ustar00rootroot00000000000000cinnamon-4.4.8/.circleci/config.yml000066400000000000000000000071111360505115200171520ustar00rootroot00000000000000version: 2.0 shared: &shared steps: - checkout - run: name: Prepare environment command: | apt-get update apt-get install --yes locales echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen locale-gen - run: name: Install dependencies command: | wget https://github.com/linuxmint/xapps/releases/download/master.${CIRCLE_JOB}/packages.tar.gz -O xapps.tar.gz wget https://github.com/linuxmint/cjs/releases/download/master.${CIRCLE_JOB}/packages.tar.gz -O cjs.tar.gz wget https://github.com/linuxmint/cinnamon-translations/releases/download/master.${CIRCLE_JOB}/packages.tar.gz -O cinnamon-translations.tar.gz wget https://github.com/linuxmint/cinnamon-desktop/releases/download/master.${CIRCLE_JOB}/packages.tar.gz -O cinnamon-desktop.tar.gz wget https://github.com/linuxmint/cinnamon-menus/releases/download/master.${CIRCLE_JOB}/packages.tar.gz -O cinnamon-menus.tar.gz wget https://github.com/linuxmint/cinnamon-session/releases/download/master.${CIRCLE_JOB}/packages.tar.gz -O cinnamon-session.tar.gz wget https://github.com/linuxmint/cinnamon-settings-daemon/releases/download/master.${CIRCLE_JOB}/packages.tar.gz -O cinnamon-settings-daemon.tar.gz wget https://github.com/linuxmint/cinnamon-control-center/releases/download/master.${CIRCLE_JOB}/packages.tar.gz -O cinnamon-control-center.tar.gz wget https://github.com/linuxmint/cinnamon-screensaver/releases/download/master.${CIRCLE_JOB}/packages.tar.gz -O cinnamon-screensaver.tar.gz wget https://github.com/linuxmint/muffin/releases/download/master.${CIRCLE_JOB}/packages.tar.gz -O muffin.tar.gz wget https://github.com/linuxmint/nemo/releases/download/master.${CIRCLE_JOB}/packages.tar.gz -O nemo.tar.gz ls *.tar.gz | xargs -i tar zxvf {} echo "APT::Cache-start 200000000;" > /etc/apt/apt.conf.d/00fixaptsegfaults apt install --yes --allow-downgrades ./packages/*.deb rm -rf packages - run: name: Build project command: LC_ALL=en_US.UTF-8 mint-build -i - run: name: Prepare packages command: | if [ -z $CI_PULL_REQUEST ]; then mkdir /packages mv /root/*.deb /packages/ git log > /packages/git.log cd / tar zcvf packages.tar.gz packages fi - run: name: Deploy packages to Github command: | if [ -z $CI_PULL_REQUEST ]; then wget https://github.com/tcnksm/ghr/releases/download/v0.5.4/ghr_v0.5.4_linux_amd64.zip apt-get install --yes unzip unzip ghr_v0.5.4_linux_amd64.zip TAG="master".$CIRCLE_JOB ./ghr -t $GITHUB_TOKEN -u $CIRCLE_PROJECT_USERNAME -r $CIRCLE_PROJECT_REPONAME -replace $TAG /packages.tar.gz ./ghr -t $GITHUB_TOKEN -u $CIRCLE_PROJECT_USERNAME -r $CIRCLE_PROJECT_REPONAME -recreate -b "Latest unstable packages" $TAG /packages.tar.gz fi jobs: "mint19": <<: *shared docker: - image: linuxmintd/mint19-amd64 "lmde3": <<: *shared docker: - image: linuxmintd/lmde3-amd64 workflows: version: 2 build: jobs: - "mint19" - "lmde3" cinnamon-4.4.8/.eslintrc.json000066400000000000000000000150751360505115200161330ustar00rootroot00000000000000{ "env": { "browser": true, "commonjs": false, "es6": true, "node": true }, "extends": "eslint:recommended", "parser": "babel-eslint", "parserOptions": { "ecmaFeatures": { "classes": true, "ecmaVersion": "2015", "experimentalObjectRestSpread": true }, "sourceType": "script" }, "globals": { "imports": false, "log": false, "print": false, "_": false, "C_": false, "ngettext": false, "send_results": false, "get_locale_string": false, "__dirname": false, "__filename": false, "__meta": false }, "rules": { "comma-dangle": 0, "no-cond-assign": 0, "no-console": 0, "no-constant-condition": 0, "no-control-regex": 0, "no-debugger": 0, "no-dupe-args": 1, "no-dupe-keys": 2, "no-duplicate-case": 1, "no-empty-character-class": 0, "no-empty": 0, "no-ex-assign": 0, "no-extra-boolean-cast": 1, "no-extra-parens": 0, "no-extra-semi": 0, "no-func-assign": 1, "no-inner-declarations": 0, "no-invalid-regexp": 2, "no-irregular-whitespace": 1, "no-negated-in-lhs": 1, "no-obj-calls": 1, "no-regex-spaces": 0, "no-sparse-arrays": 1, "no-unreachable": 2, "use-isnan": 2, "valid-jsdoc": 0, "valid-typeof": 2, "no-unexpected-multiline": 1, "accessor-pairs": 0, "block-scoped-var": 0, "complexity": 0, "consistent-return": 0, "curly": 0, "default-case": 0, "dot-notation": 0, "dot-location": 0, "eqeqeq": 0, "guard-for-in": 0, "no-alert": 0, "no-caller": 0, "no-div-regex": 0, "no-else-return": 0, "no-empty-label": 0, "no-eq-null": 0, "no-eval": 0, "no-extend-native": 0, "no-extra-bind": 1, "no-fallthrough": 0, "no-floating-decimal": 0, "no-implicit-coercion": 0, "no-implied-eval": 1, "no-invalid-this": 0, "no-iterator": 0, "no-labels": 0, "no-lone-blocks": 1, "no-loop-func": 1, "no-multi-spaces": 0, "no-multi-str": 0, "no-native-reassign": 0, "no-new-func": 0, "no-new-wrappers": 1, "no-new": 0, "no-octal-escape": 0, "no-octal": 2, "no-param-reassign": 0, "no-process-env": 0, "no-proto": 0, "no-redeclare": [2, {"builtinGlobals": true}], "no-return-assign": 0, "no-script-url": 0, "no-self-compare": 1, "no-sequences": 0, "no-throw-literal": 2, "no-unused-expressions": 0, "no-useless-call": 0, "no-void": 1, "no-warning-comments": 0, "no-with": 2, "radix": 0, "vars-on-top": 0, "wrap-iife": 0, "yoda": [1, "never", {"exceptRange": true, "onlyEquality": true}], "strict": 0, "init-declarations": 0, "no-catch-shadow": 0, "no-delete-var": 2, "no-label-var": 0, "no-shadow-restricted-names": 0, "no-shadow": 0, "no-undef-init": 0, "no-undef": 2, "no-undefined": 0, "no-unused-vars": [1, { "args": "none", "ignoreRestSiblings": true, "vars": "local", "varsIgnorePattern": "^main|^x|^y|^mask|[iI]d$|[A-Z_0-9]|^applets|^desklets|^extensions|^init|^start|^success|^mod|^mods|^timeout|^expires|^height|^rtl|^min|^map|^find|^each|^filter|^throttle|^unref" }], "no-use-before-define": [2, {"functions": false}], "callback-return": 0, "handle-callback-err": 0, "no-mixed-requires": 0, "no-new-require": 0, "no-path-concat": 0, "no-process-exit": 0, "no-restricted-modules": 0, "no-sync": 0, "array-bracket-spacing": 0, "brace-style": 0, "camelcase": 0, "comma-spacing": [1, {"before": false, "after": true}], "comma-style": 0, "computed-property-spacing": 0, "consistent-this": 0, "eol-last": 0, "func-names": 0, "func-style": 0, "id-length": 0, "indent": [1, 4, { "ArrayExpression": "off", "ObjectExpression": "off", "ignoreComments": true, "SwitchCase": 1, "CallExpression": {"arguments": "off"}, "flatTernaryExpressions": false, "FunctionExpression": {"parameters": "off"}, "MemberExpression": 0 }], "key-spacing": 0, "lines-around-comment": 0, "linebreak-style": 0, "max-nested-callbacks": 0, "new-cap": 0, "new-parens": 0, "newline-after-var": 0, "no-array-constructor": 1, "no-continue": 0, "no-inline-comments": 0, "no-lonely-if": 0, "no-mixed-spaces-and-tabs": 2, "no-multiple-empty-lines": [1, {"max": 4}], "no-nested-ternary": 2, "no-new-object": 1, "no-spaced-func": 0, "no-ternary": 0, "no-trailing-spaces": 0, "no-underscore-dangle": 0, "no-unneeded-ternary": 2, "object-curly-spacing": 0, "one-var": 0, "operator-assignment": 0, "operator-linebreak": 0, "padded-blocks": 0, "quote-props": 0, "quotes": 0, "id-match": 0, "semi-spacing": 0, "semi": 0, "sort-vars": 0, "space-after-keywords": 0, "space-before-blocks": 0, "space-before-function-paren": 0, "space-in-parens": 0, "space-infix-ops": 0, "space-return-throw-case": 0, "space-unary-ops": 0, "spaced-comment": 0, "wrap-regex": 0, "arrow-parens": 0, "arrow-spacing": 0, "constructor-super": 1, "generator-star-spacing": 0, "no-class-assign": 0, "no-const-assign": 0, "no-this-before-super": 0, "no-var": 0, "object-shorthand": 0, "prefer-const": 0, "prefer-spread": 0, "prefer-reflect": 0, "require-await": 0, "require-yield": 0, "max-depth": 0, "max-len": 0, "max-params": 0, "max-statements": 0, "no-bitwise": 0, "no-plusplus": 0, "multiline-ternary": 0, "keyword-spacing": 0, "block-spacing": 0, "func-call-spacing": 0, "no-case-declarations": 0 } } cinnamon-4.4.8/.github/000077500000000000000000000000001360505115200146675ustar00rootroot00000000000000cinnamon-4.4.8/.github/ISSUE_TEMPLATE.md000066400000000000000000000016411360505115200173760ustar00rootroot00000000000000 ``` * Cinnamon version (cinnamon --version) - Please specify if you are using the daily builds PPA (https://launchpad.net/~linuxmint-daily-build-team/+archive/ubuntu/daily-builds). * Distribution - (Mint 17.2, Arch, Fedora 25, etc...) * Graphics hardware *and* driver used * 32 or 64 bit * Attach /home//.xsession-errors, or /var/log/syslog ``` **Issue** **Steps to reproduce** **Expected behaviour** **Other information** **Configuration info, if applicable** If this bug report is related to an Applet, Desklet or Extension, please paste (or use a pastebin service) the offending extension's settings, if it has any. You can obtain this by opening its configuration, clicking the 'hamburger' button in the upper-right corner of the window, and selecting "Export to a file". **Please be sure to review the contents and remove any personal data it may contain.** ``` Please paste here ```cinnamon-4.4.8/.gitignore000066400000000000000000000051501360505115200153200ustar00rootroot00000000000000.pc ABOUT-NLS Makefile Makefile.in aclocal.m4 autom4te.cache/ browser-plugin/* config.h config.h.in config.log config.status config/ configure data/Makefile data/Makefile.in data/cinnamon.desktop data/gschemas.compiled data/icons/Makefile data/org.cinnamon.gschema.valid data/org.cinnamon.gschema.xml data/theme/gdm.css docs/Makefile docs/reference/*/*-docs.sgml docs/reference/*/*.args docs/reference/*/*.hierarchy docs/reference/*/*.interfaces docs/reference/*/*.prerequisites docs/reference/*/*.signals docs/reference/*/*.stamp docs/reference/*/*.txt docs/reference/*/*.types docs/reference/*/.libs/ docs/reference/*/Makefile docs/reference/*/html/ docs/reference/*/xml/ docs/reference/Makefile docs/reference/cinnamon-js/__pycache__/ docs/reference/cinnamon-js/misc/ docs/reference/cinnamon-js/ui/ files/Makefile !files/Makefile.in files/usr/share/cinnamon-session/sessions/cinnamon.session files/usr/share/cinnamon-session/sessions/cinnamon2d.session gtk-doc.make js/Makefile js/Makefile.in js/gdm/* js/misc/config.js libtool m4/ man/Makefile man/Makefile.in node_modules/ po/Makefile po/Makefile.in.in po/Makevars.template po/POTFILES po/Rules-quot po/boldquot.sed po/en@boldquot.header po/en@quot.header po/insert-header.sin po/quot.sed po/remove-potcdate.sin po/stamp-it src/*.gir src/*.la src/*.lo src/*.o src/*.typelib src/.deps/ src/.libs/ src/Makefile src/Makefile.in src/cinnamon src/cinnamon-enum-types.c src/cinnamon-enum-types.h src/cinnamon-hotplug-sniffer src/cinnamon-marshal.c src/cinnamon-marshal.h src/cinnamon-perf-helper src/cinnamon-real src/cinnamon_perf_helper-cinnamon-perf-helper.o src/cinnamon_real-main.o src/gvc/*.lo src/gvc/.deps/ src/gvc/.dirstamp src/gvc/.libs/ src/hotplug-sniffer/*.o src/hotplug-sniffer/.deps/ src/hotplug-sniffer/.dirstamp src/hotplug-sniffer/org.Cinnamon.HotplugSniffer.service src/na-marshal.c src/na-marshal.h src/run-js-test src/run_js_test-run-js-test.o src/st-enum-types.c src/st-enum-types.h src/st-marshal.c src/st-marshal.h src/st.h src/st/*.lo src/st/.deps/ src/st/.dirstamp src/st/.libs/ src/st/test_theme-test-theme.o src/stamp-cinnamon-enum-types.h src/stamp-cinnamon-marshal.h src/stamp-na-marshal.h src/stamp-st-enum-types.h src/stamp-st-marshal.h src/stamp-st.h src/test-recorder src/test-theme src/tray/*.lo src/tray/.deps/ src/tray/.dirstamp src/tray/.libs/ stamp-h1 tests/Makefile tests/Makefile.in tests/run-test.sh /.vscode/ /config.h.in~ /debian/.debhelper/ /debian/autoreconf.after /debian/autoreconf.before /debian/*.log /debian/*.substvars /debian/cinnamon-common/ /debian/cinnamon-dbg/ /debian/cinnamon-doc/ /debian/cinnamon/ /debian/files /debian/debhelper-build-stamp /debian/tmp/ cinnamon-4.4.8/.project000066400000000000000000000016401360505115200147770ustar00rootroot00000000000000 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-4.4.8/.pylintrc000066400000000000000000000376721360505115200152130ustar00rootroot00000000000000[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-4.4.8/.settings/000077500000000000000000000000001360505115200152455ustar00rootroot00000000000000cinnamon-4.4.8/.settings/.jsdtscope000066400000000000000000000006731360505115200172520ustar00rootroot00000000000000 cinnamon-4.4.8/.settings/org.eclipse.cdt.core.prefs000066400000000000000000000277611360505115200222350ustar00rootroot00000000000000#Fri Nov 28 14:33:30 EST 2008 eclipse.preferences.version=1 org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation=16 org.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration=80 org.eclipse.cdt.core.formatter.alignment_for_compact_if=0 org.eclipse.cdt.core.formatter.alignment_for_conditional_expression=80 org.eclipse.cdt.core.formatter.alignment_for_declarator_list=16 org.eclipse.cdt.core.formatter.alignment_for_enumerator_list=48 org.eclipse.cdt.core.formatter.alignment_for_expression_list=0 org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer=16 org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration=16 org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 org.eclipse.cdt.core.formatter.brace_position_for_array_initializer=next_line_shifted org.eclipse.cdt.core.formatter.brace_position_for_block=next_line_shifted org.eclipse.cdt.core.formatter.brace_position_for_block_in_case=next_line_shifted org.eclipse.cdt.core.formatter.brace_position_for_method_declaration=next_line org.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration=next_line org.eclipse.cdt.core.formatter.brace_position_for_switch=next_line_shifted org.eclipse.cdt.core.formatter.brace_position_for_type_declaration=next_line org.eclipse.cdt.core.formatter.compact_else_if=true org.eclipse.cdt.core.formatter.continuation_indentation=2 org.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer=2 org.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line=false org.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header=false org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier=true org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header=true org.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases=true org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header=true org.eclipse.cdt.core.formatter.indent_empty_lines=false org.eclipse.cdt.core.formatter.indent_statements_compare_to_block=true org.eclipse.cdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.cdt.core.formatter.indentation.size=8 org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration=insert org.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert org.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert org.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement=insert org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration=insert org.eclipse.cdt.core.formatter.insert_new_line_before_while_in_do_statement=insert org.eclipse.cdt.core.formatter.insert_new_line_in_empty_block=insert org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator=insert org.eclipse.cdt.core.formatter.insert_space_after_binary_operator=insert org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_arguments=insert org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_parameters=insert org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block=insert org.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast=insert org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause=insert org.eclipse.cdt.core.formatter.insert_space_after_colon_in_case=insert org.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional=insert org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer=insert org.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types=insert org.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list=insert org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert org.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list=insert org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments=insert org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters=insert org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_arguments=do not insert org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters=do not insert org.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket=do not insert org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator=do not insert org.eclipse.cdt.core.formatter.insert_space_after_prefix_operator=do not insert org.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional=insert org.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for=insert org.eclipse.cdt.core.formatter.insert_space_after_unary_operator=do not insert org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator=insert org.eclipse.cdt.core.formatter.insert_space_before_binary_operator=insert org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments=do not insert org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters=do not insert org.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert org.eclipse.cdt.core.formatter.insert_space_before_closing_bracket=do not insert org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert org.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause=insert org.eclipse.cdt.core.formatter.insert_space_before_colon_in_case=do not insert org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional=insert org.eclipse.cdt.core.formatter.insert_space_before_colon_in_default=do not insert org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert org.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert org.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types=do not insert org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list=do not insert org.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list=do not insert org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments=do not insert org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters=do not insert org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments=do not insert org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters=do not insert org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block=insert org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_namespace_declaration=insert org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch=insert org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert org.eclipse.cdt.core.formatter.insert_space_before_opening_bracket=do not insert org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch=insert org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_for=insert org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if=insert org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch=insert org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while=insert org.eclipse.cdt.core.formatter.insert_space_before_postfix_operator=do not insert org.eclipse.cdt.core.formatter.insert_space_before_prefix_operator=do not insert org.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional=insert org.eclipse.cdt.core.formatter.insert_space_before_semicolon=do not insert org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for=do not insert org.eclipse.cdt.core.formatter.insert_space_before_unary_operator=do not insert org.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert org.eclipse.cdt.core.formatter.insert_space_between_empty_brackets=do not insert org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line=false org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line=false org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line=false org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line=false org.eclipse.cdt.core.formatter.lineSplit=80 org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve=1 org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line=true org.eclipse.cdt.core.formatter.tabulation.char=space org.eclipse.cdt.core.formatter.tabulation.size=2 org.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations=false cinnamon-4.4.8/.settings/org.eclipse.cdt.ui.prefs000066400000000000000000000002221360505115200217010ustar00rootroot00000000000000#Fri Nov 28 14:33:30 EST 2008 eclipse.preferences.version=1 formatter_profile=org.eclipse.cdt.ui.default.gnu_profile formatter_settings_version=1 cinnamon-4.4.8/.settings/org.eclipse.wst.jsdt.core.prefs000066400000000000000000000646641360505115200232460ustar00rootroot00000000000000#Fri Nov 28 14:43:43 EST 2008 eclipse.preferences.version=1 org.eclipse.wst.jsdt.core.codeComplete.argumentPrefixes= org.eclipse.wst.jsdt.core.codeComplete.argumentSuffixes= org.eclipse.wst.jsdt.core.codeComplete.fieldPrefixes= org.eclipse.wst.jsdt.core.codeComplete.fieldSuffixes= org.eclipse.wst.jsdt.core.codeComplete.localPrefixes= org.eclipse.wst.jsdt.core.codeComplete.localSuffixes= org.eclipse.wst.jsdt.core.codeComplete.staticFieldPrefixes= org.eclipse.wst.jsdt.core.codeComplete.staticFieldSuffixes= org.eclipse.wst.jsdt.core.compiler.codegen.inlineJsrBytecode=disabled org.eclipse.wst.jsdt.core.compiler.codegen.targetPlatform=1.2 org.eclipse.wst.jsdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.wst.jsdt.core.compiler.compliance=1.4 org.eclipse.wst.jsdt.core.compiler.debug.lineNumber=generate org.eclipse.wst.jsdt.core.compiler.debug.localVariable=generate org.eclipse.wst.jsdt.core.compiler.debug.sourceFile=generate org.eclipse.wst.jsdt.core.compiler.problem.assertIdentifier=warning org.eclipse.wst.jsdt.core.compiler.problem.deprecation=warning org.eclipse.wst.jsdt.core.compiler.problem.deprecationInDeprecatedCode=disabled org.eclipse.wst.jsdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.wst.jsdt.core.compiler.problem.discouragedReference=warning org.eclipse.wst.jsdt.core.compiler.problem.emptyStatement=ignore org.eclipse.wst.jsdt.core.compiler.problem.enumIdentifier=warning org.eclipse.wst.jsdt.core.compiler.problem.fallthroughCase=ignore org.eclipse.wst.jsdt.core.compiler.problem.fieldHiding=ignore org.eclipse.wst.jsdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning org.eclipse.wst.jsdt.core.compiler.problem.forbiddenReference=ignore org.eclipse.wst.jsdt.core.compiler.problem.hiddenCatchBlock=warning org.eclipse.wst.jsdt.core.compiler.problem.indirectStaticAccess=ignore org.eclipse.wst.jsdt.core.compiler.problem.localVariableHiding=ignore org.eclipse.wst.jsdt.core.compiler.problem.looseVarDecleration=warning org.eclipse.wst.jsdt.core.compiler.problem.missingDeprecatedAnnotation=ignore org.eclipse.wst.jsdt.core.compiler.problem.noEffectAssignment=warning org.eclipse.wst.jsdt.core.compiler.problem.nonExternalizedStringLiteral=ignore org.eclipse.wst.jsdt.core.compiler.problem.nullReference=ignore org.eclipse.wst.jsdt.core.compiler.problem.optionalSemicolon=warning org.eclipse.wst.jsdt.core.compiler.problem.parameterAssignment=ignore org.eclipse.wst.jsdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore org.eclipse.wst.jsdt.core.compiler.problem.potentialNullReference=ignore org.eclipse.wst.jsdt.core.compiler.problem.redundantNullCheck=ignore org.eclipse.wst.jsdt.core.compiler.problem.undefinedField=warning org.eclipse.wst.jsdt.core.compiler.problem.undocumentedEmptyBlock=ignore org.eclipse.wst.jsdt.core.compiler.problem.unnecessaryElse=ignore org.eclipse.wst.jsdt.core.compiler.problem.unresolvedFieldReference=ignore org.eclipse.wst.jsdt.core.compiler.problem.unresolvedMethodReference=ignore org.eclipse.wst.jsdt.core.compiler.problem.unresolvedTypeReference=ignore org.eclipse.wst.jsdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled org.eclipse.wst.jsdt.core.compiler.problem.unusedLabel=warning org.eclipse.wst.jsdt.core.compiler.problem.unusedLocal=warning org.eclipse.wst.jsdt.core.compiler.problem.unusedParameter=ignore org.eclipse.wst.jsdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled org.eclipse.wst.jsdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled org.eclipse.wst.jsdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.wst.jsdt.core.compiler.source=1.3 org.eclipse.wst.jsdt.core.formatter.align_type_members_on_columns=false org.eclipse.wst.jsdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.wst.jsdt.core.formatter.alignment_for_arguments_in_enum_constant=16 org.eclipse.wst.jsdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16 org.eclipse.wst.jsdt.core.formatter.alignment_for_arguments_in_method_invocation=16 org.eclipse.wst.jsdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16 org.eclipse.wst.jsdt.core.formatter.alignment_for_assignment=0 org.eclipse.wst.jsdt.core.formatter.alignment_for_binary_expression=16 org.eclipse.wst.jsdt.core.formatter.alignment_for_compact_if=16 org.eclipse.wst.jsdt.core.formatter.alignment_for_conditional_expression=80 org.eclipse.wst.jsdt.core.formatter.alignment_for_enum_constants=0 org.eclipse.wst.jsdt.core.formatter.alignment_for_expressions_in_array_initializer=16 org.eclipse.wst.jsdt.core.formatter.alignment_for_multiple_fields=16 org.eclipse.wst.jsdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16 org.eclipse.wst.jsdt.core.formatter.alignment_for_parameters_in_method_declaration=16 org.eclipse.wst.jsdt.core.formatter.alignment_for_selector_in_method_invocation=16 org.eclipse.wst.jsdt.core.formatter.alignment_for_superclass_in_type_declaration=16 org.eclipse.wst.jsdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16 org.eclipse.wst.jsdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16 org.eclipse.wst.jsdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16 org.eclipse.wst.jsdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16 org.eclipse.wst.jsdt.core.formatter.blank_lines_after_imports=1 org.eclipse.wst.jsdt.core.formatter.blank_lines_after_package=1 org.eclipse.wst.jsdt.core.formatter.blank_lines_before_field=0 org.eclipse.wst.jsdt.core.formatter.blank_lines_before_first_class_body_declaration=0 org.eclipse.wst.jsdt.core.formatter.blank_lines_before_imports=1 org.eclipse.wst.jsdt.core.formatter.blank_lines_before_member_type=1 org.eclipse.wst.jsdt.core.formatter.blank_lines_before_method=1 org.eclipse.wst.jsdt.core.formatter.blank_lines_before_new_chunk=1 org.eclipse.wst.jsdt.core.formatter.blank_lines_before_package=0 org.eclipse.wst.jsdt.core.formatter.blank_lines_between_import_groups=1 org.eclipse.wst.jsdt.core.formatter.blank_lines_between_type_declarations=0 org.eclipse.wst.jsdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line org.eclipse.wst.jsdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line org.eclipse.wst.jsdt.core.formatter.brace_position_for_array_initializer=end_of_line org.eclipse.wst.jsdt.core.formatter.brace_position_for_block=end_of_line org.eclipse.wst.jsdt.core.formatter.brace_position_for_block_in_case=end_of_line org.eclipse.wst.jsdt.core.formatter.brace_position_for_constructor_declaration=end_of_line org.eclipse.wst.jsdt.core.formatter.brace_position_for_enum_constant=end_of_line org.eclipse.wst.jsdt.core.formatter.brace_position_for_enum_declaration=end_of_line org.eclipse.wst.jsdt.core.formatter.brace_position_for_method_declaration=end_of_line org.eclipse.wst.jsdt.core.formatter.brace_position_for_objlit_initializer=end_of_line org.eclipse.wst.jsdt.core.formatter.brace_position_for_switch=end_of_line org.eclipse.wst.jsdt.core.formatter.brace_position_for_type_declaration=end_of_line org.eclipse.wst.jsdt.core.formatter.comment.clear_blank_lines_in_block_comment=false org.eclipse.wst.jsdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false org.eclipse.wst.jsdt.core.formatter.comment.format_block_comments=true org.eclipse.wst.jsdt.core.formatter.comment.format_header=false org.eclipse.wst.jsdt.core.formatter.comment.format_html=true org.eclipse.wst.jsdt.core.formatter.comment.format_javadoc_comments=true org.eclipse.wst.jsdt.core.formatter.comment.format_line_comments=true org.eclipse.wst.jsdt.core.formatter.comment.format_source_code=true org.eclipse.wst.jsdt.core.formatter.comment.indent_parameter_description=true org.eclipse.wst.jsdt.core.formatter.comment.indent_root_tags=true org.eclipse.wst.jsdt.core.formatter.comment.insert_new_line_before_root_tags=insert org.eclipse.wst.jsdt.core.formatter.comment.insert_new_line_for_parameter=insert org.eclipse.wst.jsdt.core.formatter.comment.line_length=80 org.eclipse.wst.jsdt.core.formatter.compact_else_if=true org.eclipse.wst.jsdt.core.formatter.continuation_indentation=2 org.eclipse.wst.jsdt.core.formatter.continuation_indentation_for_array_initializer=2 org.eclipse.wst.jsdt.core.formatter.continuation_indentation_for_objlit_initializer=1 org.eclipse.wst.jsdt.core.formatter.format_guardian_clause_on_one_line=false org.eclipse.wst.jsdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true org.eclipse.wst.jsdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true org.eclipse.wst.jsdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true org.eclipse.wst.jsdt.core.formatter.indent_body_declarations_compare_to_type_header=true org.eclipse.wst.jsdt.core.formatter.indent_breaks_compare_to_cases=true org.eclipse.wst.jsdt.core.formatter.indent_empty_lines=false org.eclipse.wst.jsdt.core.formatter.indent_statements_compare_to_block=true org.eclipse.wst.jsdt.core.formatter.indent_statements_compare_to_body=true org.eclipse.wst.jsdt.core.formatter.indent_switchstatements_compare_to_cases=true org.eclipse.wst.jsdt.core.formatter.indent_switchstatements_compare_to_switch=false org.eclipse.wst.jsdt.core.formatter.indentation.size=4 org.eclipse.wst.jsdt.core.formatter.insert_new_line_after_annotation=insert org.eclipse.wst.jsdt.core.formatter.insert_new_line_after_comma_in_objlit_initializer=insert org.eclipse.wst.jsdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert org.eclipse.wst.jsdt.core.formatter.insert_new_line_after_opening_brace_in_objlit_initializer=insert org.eclipse.wst.jsdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert org.eclipse.wst.jsdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert org.eclipse.wst.jsdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert org.eclipse.wst.jsdt.core.formatter.insert_new_line_before_closing_brace_in_objlit_initializer=insert org.eclipse.wst.jsdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert org.eclipse.wst.jsdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert org.eclipse.wst.jsdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert org.eclipse.wst.jsdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert org.eclipse.wst.jsdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert org.eclipse.wst.jsdt.core.formatter.insert_new_line_in_empty_block=insert org.eclipse.wst.jsdt.core.formatter.insert_new_line_in_empty_enum_constant=insert org.eclipse.wst.jsdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert org.eclipse.wst.jsdt.core.formatter.insert_new_line_in_empty_method_body=insert org.eclipse.wst.jsdt.core.formatter.insert_new_line_in_empty_type_declaration=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_and_in_type_parameter=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_assignment_operator=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_at_in_annotation=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_binary_operator=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_closing_brace_in_block=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_closing_paren_in_cast=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_colon_in_assert=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_colon_in_case=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_colon_in_conditional=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_colon_in_for=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_annotation=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_array_initializer=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_for_increments=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_for_inits=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_type_arguments=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_comma_in_type_parameters=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_ellipsis=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_postfix_operator=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_prefix_operator=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_question_in_conditional=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_question_in_wildcard=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_semicolon_in_for=insert org.eclipse.wst.jsdt.core.formatter.insert_space_after_unary_operator=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_and_in_type_parameter=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_assignment_operator=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_binary_operator=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_colon_in_assert=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_colon_in_case=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_colon_in_conditional=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_colon_in_default=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_colon_in_for=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_annotation=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_ellipsis=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_block=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_switch=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_catch=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_for=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_if=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_switch=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_opening_paren_in_while=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_postfix_operator=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_prefix_operator=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_question_in_conditional=insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_question_in_wildcard=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_semicolon=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_semicolon_in_for=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_before_unary_operator=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert org.eclipse.wst.jsdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert org.eclipse.wst.jsdt.core.formatter.keep_else_statement_on_same_line=false org.eclipse.wst.jsdt.core.formatter.keep_empty_array_initializer_on_one_line=false org.eclipse.wst.jsdt.core.formatter.keep_empty_objlit_initializer_on_one_line=false org.eclipse.wst.jsdt.core.formatter.keep_imple_if_on_one_line=false org.eclipse.wst.jsdt.core.formatter.keep_then_statement_on_same_line=false org.eclipse.wst.jsdt.core.formatter.lineSplit=80 org.eclipse.wst.jsdt.core.formatter.never_indent_block_comments_on_first_column=false org.eclipse.wst.jsdt.core.formatter.never_indent_line_comments_on_first_column=false org.eclipse.wst.jsdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 org.eclipse.wst.jsdt.core.formatter.number_of_empty_lines_to_preserve=1 org.eclipse.wst.jsdt.core.formatter.put_empty_statement_on_new_line=true org.eclipse.wst.jsdt.core.formatter.tabulation.char=space org.eclipse.wst.jsdt.core.formatter.tabulation.size=4 org.eclipse.wst.jsdt.core.formatter.use_tabs_only_for_leading_indentations=false org.eclipse.wst.jsdt.core.formatter.wrap_before_binary_operator=true cinnamon-4.4.8/.settings/org.eclipse.wst.jsdt.ui.prefs000066400000000000000000000007041360505115200227140ustar00rootroot00000000000000#Fri Nov 28 14:39:12 EST 2008 eclipse.preferences.version=1 formatter_profile=_gjs formatter_settings_version=11 org.eclipse.wst.jsdt.ui.exception.name=e org.eclipse.wst.jsdt.ui.gettersetter.use.is=true org.eclipse.wst.jsdt.ui.javadoc=false org.eclipse.wst.jsdt.ui.keywordthis=false org.eclipse.wst.jsdt.ui.overrideannotation=true org.eclipse.wst.jsdt.ui.text.custom_code_templates= cinnamon-4.4.8/.settings/org.eclipse.wst.jsdt.ui.superType.container000066400000000000000000000000611360505115200255520ustar00rootroot00000000000000org.eclipse.wst.jsdt.launching.baseBrowserLibrarycinnamon-4.4.8/.settings/org.eclipse.wst.jsdt.ui.superType.name000066400000000000000000000000061360505115200245070ustar00rootroot00000000000000Windowcinnamon-4.4.8/AUTHORS000066400000000000000000000000721360505115200143760ustar00rootroot00000000000000https://github.com/linuxmint/Cinnamon/graphs/contributors cinnamon-4.4.8/COPYING000066400000000000000000000431071360505115200143670ustar00rootroot00000000000000 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-4.4.8/Makefile.am000066400000000000000000000010501360505115200153570ustar00rootroot00000000000000# Point to our macro directory and pick up user flags from the environment ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} SUBDIRS = data js src tests po man files docs EXTRA_DIST = \ .project \ .settings \ autogen.sh \ tools/check-for-missing.py # These are files checked into Git that we don't want to distribute DIST_EXCLUDE = \ .gitignore \ cinnamon.doap \ MAINTAINERS \ tools/build/* distcheck-hook: @echo "Checking disted files against files in git" @$(srcdir)/tools/check-for-missing.py $(srcdir) $(distdir) $(DIST_EXCLUDE) cinnamon-4.4.8/README.rst000066400000000000000000000013061360505115200150160ustar00rootroot00000000000000Cinnamon is a Linux desktop which provides advanced innovative features and a traditional user experience. The desktop layout is similar to Gnome 2 with underlying technology forked from 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 issue may not be with Cinnamon itself. For a list of related components, please see http://developer.linuxmint.com/projects.html and file in the appropriate repo. License ======= Cinnamon is distributed under the terms of the GNU General Public License, version 2 or later. See the COPYING file for details. cinnamon-4.4.8/autogen.sh000077500000000000000000000020611360505115200153270ustar00rootroot00000000000000#!/bin/sh # Run this to generate all the initial makefiles, etc. test -n "$srcdir" || srcdir=$(dirname "$0") test -n "$srcdir" || srcdir=. olddir=$(pwd) cd $srcdir (test -f configure.ac) || { echo "*** ERROR: Directory '$srcdir' does not look like the top-level project directory ***" exit 1 } # shellcheck disable=SC2016 PKG_NAME=$(autoconf --trace 'AC_INIT:$1' configure.ac) if [ "$#" = 0 -a "x$NOCONFIGURE" = "x" ]; then echo "*** WARNING: I am going to run 'configure' with no arguments." >&2 echo "*** If you wish to pass any to it, please specify them on the" >&2 echo "*** '$0' command line." >&2 echo "" >&2 fi mkdir -p m4 glib-gettextize --force --copy || exit 1 gtkdocize --copy || exit 1 intltoolize --force --copy --automake || exit 1 autoreconf --verbose --force --install || exit 1 cd "$olddir" if [ "$NOCONFIGURE" = "" ]; then $srcdir/configure "$@" || exit 1 if [ "$1" = "--help" ]; then exit 0 else echo "Now type 'make' to compile $PKG_NAME" || exit 1 fi else echo "Skipping configure process." fi cinnamon-4.4.8/cinnamon.pot000066400000000000000000006751211360505115200156710ustar00rootroot00000000000000# 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: 2020-01-05 10:38+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=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: src/cinnamon-app.c:298 src/cinnamon-app.c:307 #: js/ui/notificationDaemon.js:572 #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:65 #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:94 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:788 msgid "Unknown" msgstr "" #: src/cinnamon-app.c:583 #, c-format msgid "Failed to launch '%s'" msgstr "" #: src/cinnamon-util.c:93 msgid "Home" msgstr "" #: src/cinnamon-util.c:103 msgid "File System" msgstr "" #: src/cinnamon-util.c:250 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:292 #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:369 #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:726 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:175 msgid "Search" msgstr "" #: src/cinnamon-util.c:300 #, c-format msgid "%1$s: %2$s" msgstr "" #: src/main.c:240 msgid "Print version" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-online-accounts-info.ui.h:1 msgid "" "GNOME Online Accounts is a service which runs in the background and which " "you can authorize to access your online accounts. Applications can then use " "this service to interact with your online accounts." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-online-accounts-info.ui.h:2 msgid "The following accounts are supported in Cinnamon:" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-online-accounts-info.ui.h:3 msgid "Allows Nemo to connect to Google Drive" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-online-accounts-info.ui.h:4 msgid "Allows Nemo to connect to an OwnCloud server" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-online-accounts-info.ui.h:5 msgid "The following accounts are supported in GNOME applications:" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/launcher-editor.ui.h:1 msgid "Launcher Properties" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/launcher-editor.ui.h:2 #: files/usr/share/cinnamon/cinnamon-desktop-editor/directory-editor.ui.h:2 #: files/usr/share/cinnamon/desklets/launcher@cinnamon.org/editorDialog.ui.h:3 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:757 msgid "Name:" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/launcher-editor.ui.h:3 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:758 msgid "Command:" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/launcher-editor.ui.h:4 #: files/usr/share/cinnamon/cinnamon-desktop-editor/directory-editor.ui.h:3 msgid "Comment:" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/launcher-editor.ui.h:5 msgid "Browse" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/launcher-editor.ui.h:6 msgid "Launch in Terminal?" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/directory-editor.ui.h:1 msgid "Directory Properties" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cinnamon-menu-editor.ui.h:1 msgid "Main Menu" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cinnamon-menu-editor.ui.h:2 msgid "Restore the default menu layout" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cinnamon-menu-editor.ui.h:3 msgid "Restore System Configuration" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cinnamon-menu-editor.ui.h:4 msgid "_New Menu" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cinnamon-menu-editor.ui.h:5 msgid "Ne_w Item" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.ui.h:1 #: files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js:46 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:390 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:54 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:76 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:748 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:421 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:769 msgid "Add" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.ui.h:2 msgid "Delete" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.ui.h:3 #: files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js:50 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:427 msgid "Edit" msgstr "" #: files/usr/share/cinnamon/desklets/launcher@cinnamon.org/editorDialog.ui.h:1 msgid "Add/Edit Launcher" msgstr "" #: files/usr/share/cinnamon/desklets/launcher@cinnamon.org/editorDialog.ui.h:2 msgid "Type:" msgstr "" #: files/usr/share/cinnamon/desklets/launcher@cinnamon.org/editorDialog.ui.h:4 msgid "Title:" msgstr "" #: files/usr/share/cinnamon/desklets/launcher@cinnamon.org/editorDialog.ui.h:5 msgid "Program:" msgstr "" #: files/usr/share/cinnamon/desklets/launcher@cinnamon.org/editorDialog.ui.h:6 msgid "Icon Name" msgstr "" #: files/usr/share/cinnamon/desklets/launcher@cinnamon.org/editorDialog.ui.h:7 msgid "Application" msgstr "" #: files/usr/share/cinnamon/desklets/launcher@cinnamon.org/editorDialog.ui.h:8 msgid "Custom Application" msgstr "" #: js/misc/util.js:243 #, javascript-format msgid "Execution of '%s' failed:" msgstr "" #: js/ui/applet.js:560 js/ui/desklet.js:244 #, javascript-format msgid "Are you sure you want to remove %s?" msgstr "" #: js/ui/applet.js:573 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:168 #: files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js:71 #, javascript-format msgid "Remove '%s'" msgstr "" #: js/ui/applet.js:581 js/ui/desklet.js:228 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:160 #: files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js:63 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:878 msgid "About..." msgstr "" #: js/ui/applet.js:598 js/ui/desklet.js:233 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:164 #: files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js:67 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:882 msgid "Configure..." msgstr "" #: js/ui/appletManager.js:431 msgid "" "This applet does not support panels of that type. This can cause visual " "glitches in the panel." msgstr "" #: js/ui/appletManager.js:432 msgid "" "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:441 msgid "Leave it" msgstr "" #: js/ui/appletManager.js:448 msgid "Remove it" msgstr "" #: js/ui/appletManager.js:455 msgid "Move to another panel" msgstr "" #: js/ui/appletManager.js:514 msgid "" "A suitable panel could not be found. The applet has been removed instead." msgstr "" #: js/ui/appletManager.js:770 msgid "" "Certain applets do not allow multiple instances or were at their max number " "of instances so were not copied" msgstr "" #: js/ui/cinnamonEntry.js:31 msgid "Copy" msgstr "" #: js/ui/cinnamonEntry.js:36 msgid "Paste" msgstr "" #: js/ui/cinnamonEntry.js:86 msgid "Show Text" msgstr "" #: js/ui/cinnamonEntry.js:88 msgid "Hide Text" msgstr "" #: js/ui/cinnamonMountOperation.js:286 msgid "Wrong password, please try again" msgstr "" #: js/ui/desklet.js:238 msgid "Remove this desklet" msgstr "" #: js/ui/expoThumbnail.js:900 #: files/usr/share/cinnamon/applets/workspace-switcher@cinnamon.org/applet.js:318 #, javascript-format msgid "" "Are you sure you want to remove workspace \"%s\"?\n" "\n" msgstr "" #: js/ui/hotCorner.js:41 msgid "Invalid overview options: Incorrect number of corners" msgstr "" #: js/ui/lookingGlass.js:588 msgid "Execution time (ms): " msgstr "" #: js/ui/lookingGlass.js:673 msgid "Loaded successfully" msgstr "" #: js/ui/main.js:522 msgid "Check your video drivers" msgstr "" #: js/ui/main.js:523 msgid "Your system is currently running without video hardware acceleration." msgstr "" #: js/ui/main.js:525 msgid "You may experience poor performance and high CPU usage." msgstr "" #: js/ui/main.js:529 msgid "Launch Driver Manager" msgstr "" #: js/ui/main.js:538 msgid "Problems during Cinnamon startup" msgstr "" #: js/ui/main.js:539 msgid "" "Cinnamon started successfully, but one or more applets, desklets or extensions failed to load.\n" "\n" msgstr "" #: js/ui/main.js:540 msgid "" "Check your system log and the Cinnamon LookingGlass log for any issues. " msgstr "" #: js/ui/main.js:541 msgid "" "You can disable the offending extension(s) in Cinnamon Settings to prevent " "this message from recurring. " msgstr "" #: js/ui/main.js:542 msgid "Please contact the developer." msgstr "" #: js/ui/main.js:592 msgid "Workspace" msgstr "" #: js/ui/messageTray.js:1281 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:648 msgid "Open" msgstr "" #: js/ui/messageTray.js:1288 js/ui/panel.js:1594 #: files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js:54 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:55 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:77 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:434 msgid "Remove" msgstr "" #: js/ui/messageTray.js:1912 msgid "System Information" msgstr "" #: js/ui/modalDialog.js:456 #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:949 #: files/usr/bin/cinnamon-launcher:35 msgid "No" msgstr "" #: js/ui/modalDialog.js:460 #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:948 #: files/usr/bin/cinnamon-launcher:36 msgid "Yes" msgstr "" #: js/ui/modalDialog.js:499 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:79 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:443 msgid "OK" msgstr "" #: js/ui/panel.js:308 msgid "Select position of new panel. Esc to cancel." msgstr "" #: js/ui/panel.js:309 msgid "Select new position of panel. Esc to cancel." msgstr "" #: js/ui/panel.js:885 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:1563 msgid "Panel settings" msgstr "" #: js/ui/panel.js:1566 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:33 msgid "Applets" msgstr "" #: js/ui/panel.js:1575 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:201 msgid "Panel edit mode" msgstr "" #: js/ui/panel.js:1587 #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:19 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:53 msgid "Move" msgstr "" #: js/ui/panel.js:1600 msgid "Add a new panel" msgstr "" #: js/ui/panel.js:1642 msgid "Troubleshoot" msgstr "" #: js/ui/panel.js:1643 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:146 msgid "Restart Cinnamon" msgstr "" #: js/ui/panel.js:1647 msgid "Looking Glass" msgstr "" #: js/ui/panel.js:1651 msgid "Restore all settings to default" msgstr "" #: js/ui/panel.js:1652 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:1663 #: files/usr/share/cinnamon/applets/user@cinnamon.org/applet.js:59 #: generate_additional_files.py:25 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:48 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:374 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:695 msgid "System Settings" msgstr "" #: js/ui/placesManager.js:122 #, javascript-format msgid "Failed to unmount '%s'" msgstr "" #: js/ui/placesManager.js:129 msgid "Retry" msgstr "" #: js/ui/placesManager.js:172 msgid "Connect to..." msgstr "" #: js/ui/runDialog.js:163 msgid "Please enter a command:" msgstr "" #: js/ui/windowManager.js:994 msgid "Hold to enter snap mode" msgstr "" #: js/ui/windowManager.js:996 msgid "Hold to enter snap mode" msgstr "" #: js/ui/windowManager.js:998 msgid "Hold to enter snap mode" msgstr "" #: js/ui/windowManager.js:1000 msgid "Hold to enter snap mode" msgstr "" #: js/ui/windowManager.js:1001 msgid "Use the arrow or numeric keys to switch workspaces while dragging" msgstr "" #: js/ui/workspace.js:536 #: files/usr/share/cinnamon/applets/windows-quick-list@cinnamon.org/applet.js:103 msgid "No open windows" msgstr "" #: js/ui/workspace.js:1168 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:372 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:949 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:408 msgid "Close" msgstr "" #: js/ui/workspace.js:1172 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:320 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:924 msgid "Restore" msgstr "" #: js/ui/workspace.js:1174 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:325 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:929 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:49 msgid "Minimize" msgstr "" #: js/ui/workspace.js:1177 js/ui/workspace.js:1250 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:338 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:942 msgid "Maximize" msgstr "" #: js/ui/workspace.js:1180 msgid "Move to left workspace" msgstr "" #: js/ui/workspace.js:1183 msgid "Move to right workspace" msgstr "" #: js/ui/workspace.js:1186 js/ui/workspace.js:1235 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:122 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:846 msgid "Visible on all workspaces" msgstr "" #: js/ui/workspace.js:1189 msgid "Move to a new workspace" msgstr "" #: js/ui/workspace.js:1199 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:829 #, javascript-format msgid "Move to monitor %d" msgstr "" #: js/ui/workspace.js:1233 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:112 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:840 msgid "Only on this workspace" msgstr "" #: js/ui/workspace.js:1248 #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:331 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:937 msgid "Unmaximize" msgstr "" #. a11y@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:42 #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:136 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:31 msgid "Accessibility" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:51 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:41 msgid "Zoom" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:59 msgid "Screen Reader" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:64 msgid "Screen Keyboard" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:68 msgid "Sticky Keys" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:71 msgid "Slow Keys" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:74 msgid "Bounce Keys" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:77 msgid "Mouse Keys" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:81 msgid "Universal Access Settings" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:173 msgid "High Contrast" msgstr "" #: files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js:218 msgid "Large Text" msgstr "" #: files/usr/share/cinnamon/applets/calendar@cinnamon.org/applet.js:61 #: files/usr/share/cinnamon/desklets/clock@cinnamon.org/desklet.js:24 msgid "Date and Time Settings" msgstr "" #. expo@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/expo@cinnamon.org/applet.js:12 msgid "Expo" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:102 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:819 msgid "Move to the other monitor" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:103 msgid "Move to monitor " msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:129 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:852 msgid "Move to another workspace" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:157 #: files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js:60 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:875 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:65 msgid "Preferences" msgstr "" #. grouped-window-list@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:168 msgid "Grouped window list" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:177 #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2126 msgid "Places" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:209 msgid "Recent" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:269 msgid "New Window" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:286 msgid "Unpin from Panel" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:289 msgid "Pin to Panel" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:296 msgid "Remove from Autostart" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:296 msgid "Add to Autostart" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:303 msgid "Create Shortcut" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:314 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:916 msgid "Restore to full opacity" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:349 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:902 msgid "Close others" msgstr "" #: files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js:362 #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:893 msgid "Close all" msgstr "" #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:17 msgid "Power management" msgstr "" #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:77 msgid "Power management: inhibited" msgstr "" #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:80 msgid "Power management: active" msgstr "" #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:84 msgid "Power management is already inhibited by another program" msgstr "" #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:85 msgid "Power management: inhibited by another program" msgstr "" #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:204 msgid "Apps inhibiting power management:" msgstr "" #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:355 msgid "Inhibit applet" msgstr "" #. notifications@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js:358 #: files/usr/share/cinnamon/applets/notifications@cinnamon.org/applet.js:46 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:40 msgid "Notifications" msgstr "" #: files/usr/share/cinnamon/applets/keyboard@cinnamon.org/applet.js:145 msgid "Show Keyboard Layout" msgstr "" #: files/usr/share/cinnamon/applets/keyboard@cinnamon.org/applet.js:149 msgid "Show Character Table" msgstr "" #: files/usr/share/cinnamon/applets/keyboard@cinnamon.org/applet.js:153 msgid "Keyboard Settings" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:430 msgid "Add to panel" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:434 msgid "Add to desktop" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:439 msgid "Remove from favorites" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:442 msgid "Add to favorites" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:447 #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:778 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:56 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:78 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_extensions.py:56 msgid "Uninstall" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:452 msgid "Run with NVIDIA GPU" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:681 msgid "This file is no longer available" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:695 msgid "Open with" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:741 msgid "Other application..." msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:756 msgid "All Applications" msgstr "" #. menu@cinnamon.org->metadata.json->name #. menu@cinnamon.org->settings-schema.json->menu->title #. sound@cinnamon.org->settings-schema.json->section1->description #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:1001 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:49 msgid "Menu" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2165 msgid "Recent Files" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2180 #: files/usr/share/cinnamon/applets/recent@cinnamon.org/applet.js:121 msgid "Clear list" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2321 msgid "Logout" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2322 msgid "Leave the session" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2333 msgid "Quit" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2334 msgid "Shutdown the computer" msgstr "" #: files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js:2393 msgid "Type to search..." msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:68 msgid "" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:286 msgid "disabled" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:493 msgid "unmanaged" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:495 msgid "disconnecting..." msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:501 msgid "connecting..." msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:504 msgid "authentication required" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:514 msgid "firmware missing" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:521 msgid "cable unplugged" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:526 msgid "unavailable" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:528 msgid "connection failed" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:592 #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1605 msgid "More" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:628 #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1524 msgid "Connected (private)" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:688 msgid "Ethernet" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:689 msgid "Wifi" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:690 msgid "Modem" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:691 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:92 msgid "Bluetooth" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:721 msgid "Auto Ethernet" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:803 msgid "Auto broadband" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:806 msgid "Auto dial-up" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:928 #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1536 #, javascript-format msgid "Auto %s" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:930 msgid "Auto bluetooth" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1538 msgid "Auto wireless" msgstr "" #. network@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1642 msgid "Network Manager" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1688 msgid "Enable networking" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1700 msgid "Wired" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1711 msgid "Wireless" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1721 msgid "Mobile broadband" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1731 msgid "VPN Connections" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1743 msgid "Network Settings" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1744 msgid "Network Connections" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1915 msgid "Connection failed" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:1916 msgid "Activation of network connection failed" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2182 msgid "Networking is disabled" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2200 msgid "No connection" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2206 msgid "Connecting to the cellular network..." msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2210 msgid "Connecting to the wireless network..." msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2214 msgid "Connecting to the wired network..." msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2218 msgid "Connecting to the VPN..." msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2224 msgid "Connecting to the network..." msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2240 msgid "Connected to the wireless network" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2243 msgid "Wireless connection" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2251 msgid "Connected to the wired network" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2262 #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2267 msgid "Connected to the cellular network" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2271 msgid "Connected to the VPN" msgstr "" #: files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js:2277 msgid "Connected to the network" msgstr "" #: files/usr/share/cinnamon/applets/notifications@cinnamon.org/applet.js:61 msgid "Clear notifications" msgstr "" #: files/usr/share/cinnamon/applets/notifications@cinnamon.org/applet.js:96 msgid "Notification Settings" msgstr "" #: files/usr/share/cinnamon/applets/notifications@cinnamon.org/applet.js:275 msgid "No notifications" msgstr "" #: files/usr/share/cinnamon/applets/notifications@cinnamon.org/applet.js:277 #, javascript-format msgid "%d notification" msgid_plural "%d notifications" msgstr[0] "" msgstr[1] "" #: files/usr/share/cinnamon/applets/notifications@cinnamon.org/applet.js:294 msgid "just now" msgstr "" #: files/usr/share/cinnamon/applets/notifications@cinnamon.org/applet.js:297 #, 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:301 #, 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:21 msgid "Click to toggle the on-screen keyboard" msgstr "" #: files/usr/share/cinnamon/applets/on-screen-keyboard@cinnamon.org/applet.js:24 msgid "Click to enable the on-screen keyboard" msgstr "" #: files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js:42 msgid "Launch" msgstr "" #. panel-launchers@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js:71 msgid "Panel launchers" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:55 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:542 msgid "Battery full" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:57 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:544 msgid "Battery almost full" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:59 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:546 msgid "Battery good" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:61 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:548 msgid "Low battery" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:63 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:550 msgid "Critically low battery" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:72 msgid "AC adapter" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:74 msgid "Laptop battery" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:76 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:355 msgid "UPS" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:78 msgid "Monitor" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:80 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:328 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:78 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:78 msgid "Mouse" msgstr "" #. keyboard@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:82 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:141 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:212 msgid "Keyboard" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:84 msgid "PDA" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:86 msgid "Cell phone" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:88 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:455 msgid "Media player" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:90 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:154 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:446 msgid "Tablet" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:92 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:458 msgid "Computer" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:337 #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:642 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:231 msgid "Brightness" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:338 #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:648 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:257 msgid "Keyboard backlight" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:344 msgid "Power Settings" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:416 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:386 msgid "Charging" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:420 #, javascript-format msgid "Charging - %d hour until fully charged" msgid_plural "Charging - %d hours until fully charged" msgstr[0] "" msgstr[1] "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:424 #, javascript-format msgid "Charging - %d %s %d %s until fully charged" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:425 #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:446 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:84 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:92 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:95 msgid "hour" msgid_plural "hours" msgstr[0] "" msgstr[1] "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:425 #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:446 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:74 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:92 msgid "minute" msgid_plural "minutes" msgstr[0] "" msgstr[1] "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:429 #, 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:433 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:408 msgid "Fully charged" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:437 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:388 msgid "Using battery power" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:441 #, javascript-format msgid "Using battery power - %d hour remaining" msgid_plural "Using battery power - %d hours remaining" msgstr[0] "" msgstr[1] "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:445 #, javascript-format msgid "Using battery power - %d %s %d %s remaining" msgstr "" #: files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js:450 #, javascript-format msgid "Using battery power - %d minute remaining" msgid_plural "Using battery power - %d minutes remaining" msgstr[0] "" msgstr[1] "" #. 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:131 #: files/usr/share/cinnamon/applets/printers@cinnamon.org/applet.js:245 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:79 msgid "Printers" msgstr "" #: files/usr/share/cinnamon/applets/printers@cinnamon.org/applet.js:166 msgid "Cancel all jobs" msgstr "" #: files/usr/share/cinnamon/applets/printers@cinnamon.org/applet.js:196 #, javascript-format msgid "'%s' on %s" msgstr "" #: files/usr/share/cinnamon/applets/printers@cinnamon.org/applet.js:213 msgid "Send to front" msgstr "" #. recent@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/recent@cinnamon.org/applet.js:35 msgid "Recent documents" msgstr "" #: files/usr/share/cinnamon/applets/recent@cinnamon.org/applet.js:126 msgid "No recent documents" msgstr "" #. removable-drives@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/removable-drives@cinnamon.org/applet.js:43 msgid "Removable drives" msgstr "" #: files/usr/share/cinnamon/applets/removable-drives@cinnamon.org/applet.js:57 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 #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:16 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:49 msgid "Scale" msgstr "" #. show-desktop@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:290 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:36 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:37 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:73 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:631 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:89 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:73 msgid "Settings" msgstr "" #: files/usr/share/cinnamon/applets/settings-example@cinnamon.org/applet.js:64 msgid "Hi there!" msgstr "" #: files/usr/share/cinnamon/applets/settings-example@cinnamon.org/applet.js:97 msgid "YOU PRESSED THE BUTTON!!!" msgstr "" #: files/usr/share/cinnamon/applets/settings-example@cinnamon.org/applet.js:120 msgid "YOU USED THE HOTKEY!!!" msgstr "" #: files/usr/share/cinnamon/applets/show-desktop@cinnamon.org/applet.js:32 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:35 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:57 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:286 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:31 msgid "Playing" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:32 msgid "Paused" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:33 msgid "Stopped" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:506 msgid "Open Player" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:519 msgid "Quit Player" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:540 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:672 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:676 msgid "Unknown Artist" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:541 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:683 msgid "Unknown Album" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:542 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:688 msgid "Unknown Title" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:564 msgid "Previous" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:567 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:741 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:747 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:181 msgid "Play" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:570 msgid "Stop" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:573 msgid "Next" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:583 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:771 msgid "Consecutive Playing" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:590 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:785 msgid "No Shuffle" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:735 msgid "Pause" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:773 msgid "Repeat Single" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:775 msgid "Repeat All" msgstr "" #. photoframe@cinnamon.org->settings-schema.json->shuffle->description #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:785 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:190 msgid "Shuffle" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:952 msgid "Mute output" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:953 msgid "Mute input" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:959 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:608 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:614 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:902 msgid "Applications" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:960 msgid "Output device" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:967 msgid "Microphone" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:969 msgid "Input device" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:1313 msgid "Choose player controls" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:1318 msgid "Launch player" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:1324 #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:1411 msgid "Volume" msgstr "" #: files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js:1330 msgid "Sound Settings" msgstr "" #: files/usr/share/cinnamon/applets/trash@cinnamon.org/applet.js:10 msgid "Are you sure you want to delete all items from the trash?" msgstr "" #: files/usr/share/cinnamon/applets/trash@cinnamon.org/applet.js:10 msgid "This operation cannot be undone." msgstr "" #. trash@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/applets/trash@cinnamon.org/applet.js:17 msgid "Trash" msgstr "" #: files/usr/share/cinnamon/applets/trash@cinnamon.org/applet.js:33 msgid "Empty Trash" msgstr "" #: files/usr/share/cinnamon/applets/trash@cinnamon.org/applet.js:39 msgid "Open Trash" msgstr "" #: files/usr/share/cinnamon/applets/user@cinnamon.org/applet.js:67 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:611 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:616 msgid "Lock Screen" msgstr "" #: files/usr/share/cinnamon/applets/user@cinnamon.org/applet.js:89 #: files/usr/share/cinnamon/applets/user@cinnamon.org/applet.js:98 #: files/usr/share/cinnamon/applets/user@cinnamon.org/applet.js:106 msgid "Switch User" msgstr "" #: files/usr/share/cinnamon/applets/user@cinnamon.org/applet.js:115 msgid "Log Out..." msgstr "" #: files/usr/share/cinnamon/applets/user@cinnamon.org/applet.js:123 msgid "Power Off..." msgstr "" #: files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js:886 msgid "Remove 'Window list'" msgstr "" #: files/usr/share/cinnamon/applets/windows-quick-list@cinnamon.org/applet.js:14 msgid "All windows" msgstr "" #: files/usr/share/cinnamon/applets/workspace-switcher@cinnamon.org/applet.js:283 msgid "Manage workspaces (Expo)" msgstr "" #: files/usr/share/cinnamon/applets/workspace-switcher@cinnamon.org/applet.js:290 msgid "Add a new workspace" msgstr "" #: files/usr/share/cinnamon/applets/workspace-switcher@cinnamon.org/applet.js:296 msgid "Remove the current workspace" msgstr "" #: files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js:21 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:39 msgid "Normal" msgstr "" #: files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js:22 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:274 msgid "Left" msgstr "" #: files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js:23 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:275 msgid "Right" msgstr "" #: files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js:24 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:32 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:13 msgid "Display" msgstr "" #: files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js:73 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:27 msgid "Add new launcher" msgstr "" #: files/usr/share/cinnamon/desklets/launcher@cinnamon.org/desklet.js:31 msgid "Edit launcher" msgstr "" #: files/usr/share/cinnamon/desklets/photoframe@cinnamon.org/desklet.js:32 msgid "Photo Frame" msgstr "" #: generate_additional_files.py:25 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:49 msgid "Control Center" msgstr "" #: generate_additional_files.py:38 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:91 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:464 msgid "Users and Groups" msgstr "" #: generate_additional_files.py:38 msgid "Add or remove users and groups" msgstr "" #. Virtual keyboard #: generate_additional_files.py:50 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:145 msgid "Virtual keyboard" msgstr "" #: generate_additional_files.py:50 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:199 msgid "Turn on-screen keyboard on or off" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/cinnamon-desktop-editor.py:90 msgid "Valid name" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/cinnamon-desktop-editor.py:94 msgid "The name cannot be empty." msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/cinnamon-desktop-editor.py:99 msgid "Valid executable" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/cinnamon-desktop-editor.py:103 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:169 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:218 #: files/usr/share/cinnamon/cinnamon-desktop-editor/cinnamon-desktop-editor.py:305 msgid "Choose a command" msgstr "" #: files/usr/share/cinnamon/cinnamon-desktop-editor/cinnamon-desktop-editor.py:392 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 "" #. Display name ID Show it? Always False #. to start Icon #. menu@cinnamon.org->settings-schema.json->panel-appear->title #. printers@cinnamon.org->settings-schema.json->section1->description #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:64 msgid "Appearance" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:66 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:42 msgid "Hardware" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:67 msgid "Administration" msgstr "" #. Label Module ID Icon #. Category Keywords for filter #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:72 msgid "Network" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:72 msgid "network, wireless, wifi, ethernet, broadband, internet" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->tree->columns->title #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:73 msgid "Color" 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 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:81 msgid "Firewall" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:80 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:81 msgid "firewall, block, filter, programs" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:82 msgid "Languages" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:82 msgid "language, install, foreign" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:83 msgid "Input Method" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:83 msgid "" "language, install, foreign, input, method, chinese, korean, japanese, typing" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:84 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:85 msgid "Login Window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:84 msgid "login, lightdm, mdm, gdm, manager, user, password, startup, switch" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:85 msgid "login, lightdm, manager, settings, editor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:86 msgid "Driver Manager" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:86 msgid "" "video, driver, wifi, card, hardware, proprietary, nvidia, radeon, nouveau, " "fglrx" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:87 msgid "Nvidia Settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:87 msgid "video, driver, proprietary, nvidia, settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:88 msgid "Software Sources" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:88 msgid "ppa, repository, package, source, download" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:89 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:90 msgid "Package Management" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:89 #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:90 msgid "update, install, repository, package, source, download" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:91 msgid "user, users, account, accounts, group, groups, password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:92 msgid "bluetooth, dongle, transfer, mobile" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:93 msgid "Manage Services and Units" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:93 msgid "systemd, units, services, systemctl, init" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:94 msgid "Disks" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py:94 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:285 msgid "Back to all settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:79 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:240 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:390 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:443 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:648 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:753 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:765 msgid "Cancel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:89 msgid "The group name cannot contain upper-case or space characters" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:196 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:244 msgid "Change Password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:199 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:255 msgid "New password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:199 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:259 msgid "Confirm password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:203 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:270 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:271 msgid "Generate a password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:209 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:215 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:277 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:283 msgid "Your new password needs to be at least 8 characters long" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:223 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:291 msgid "Show password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:235 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:303 msgid "An error occurred. Your password was not changed." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:240 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:308 msgid "Change" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:325 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:436 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:437 msgid "Passwords do not match" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:329 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:442 msgid "Too short" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:332 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:445 msgid "Weak" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:335 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:448 msgid "Fair" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:338 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:451 msgid "Good" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:341 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:454 msgid "Strong" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:366 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:553 msgid "Standard" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:367 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:554 msgid "Administrator" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:377 msgid "" "The username must consist of only:\n" " - lower case letters (a-z)\n" " - numerals (0-9)\n" " - '.', '-', and '_' characters" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:380 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:583 msgid "Account Type" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:380 msgid "Full Name" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:380 msgid "Username" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:402 msgid "Invalid username" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:465 msgid "Users" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:466 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:583 msgid "Groups" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:518 msgid "Click to change the picture" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:523 #: 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:559 msgid "Click to change the name" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:566 msgid "Click to change the password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:576 msgid "Click to change the groups" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:583 #: 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:583 #: files/usr/share/cinnamon/cinnamon-menu-editor/cme/MainWindow.py:155 #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:715 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:786 #: 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:583 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:93 msgid "Password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:650 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:203 #: 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:795 msgid "No password set" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:797 msgid "Set at login" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:842 msgid "This user is currently logged in" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:849 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:859 #, 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:917 #, python-format msgid "This group is set as %s's primary group" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:929 #, python-format msgid "Are you sure you want to permanently delete %s?" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:944 #: files/usr/share/cinnamon/cinnamon-settings-users/cinnamon-settings-users.py:955 msgid "Group Name" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:204 msgid "Previous instance" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:208 msgid "Next instance" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:217 msgid "More options" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:223 msgid "Import from a file" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:228 msgid "Export to a file" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:233 msgid "Reset to defaults" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:242 #, python-format msgid "Reload %s" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:412 #, python-format msgid "Settings for %s" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:504 msgid "Select or enter file to export to" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:512 #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:533 msgid "JSON files" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/xlet-settings.py:526 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:168 msgid "Show" msgstr "" #: files/usr/share/cinnamon/cinnamon-menu-editor/cme/MainWindow.py:176 msgid "Item" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->title- #. display->options #. 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->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/bin/ChooserButtonWidgets.py:15 #: 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_general.py:28 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:49 msgid "None" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->launcher-animation- #. effect->options #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:17 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:51 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:277 msgid "Fade" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:18 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:52 msgid "Blend" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:20 msgid "Fly up" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:21 msgid "Fly down" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:22 msgid "Traditional" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:265 msgid "Select a date" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:277 msgid "Today" 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/cinnamon-settings/bin/ChooserButtonWidgets.py:331 msgid "%A, %B %-e, %Y" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:407 msgid "%R:%S" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:409 msgid "%R" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:412 msgid "%l:%M:%S %p" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:414 msgid "%l:%M %p" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:420 msgid "Select a time" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:436 msgid "Hour" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:438 msgid "Minute" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ChooserButtonWidgets.py:444 msgid "Second" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:239 msgid "Configure" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:246 msgid "This is a system applet. It cannot be removed." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:248 msgid "This is a system desklet. It cannot be removed." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:250 msgid "This is a system extension. It cannot be removed." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:301 msgid "This applet is currently enabled" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:303 msgid "This desklet is currently enabled" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:305 msgid "This extension is currently enabled" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:344 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:346 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:348 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:457 msgid "About" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:513 #, python-format msgid "" "Extension %s is not compatible with current version of cinnamon. Using it " "may break your system. Load anyway?" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:527 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:535 #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:880 #, python-format msgid "Are you sure you want to completely remove %s?" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:543 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:545 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:547 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:580 #, 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:655 msgid "Install" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:661 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:746 msgid "Update" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:664 #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:718 msgid "Installed" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:705 msgid "Sort by" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:716 msgid "Popularity" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:717 msgid "Date" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:719 msgid "Upgradable" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:771 msgid "More info" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:791 msgid "Refresh" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:910 msgid "Update all" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:910 #, python-format msgid "%d update available" msgid_plural "%d updates available" msgstr[0] "" msgstr[1] "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:912 msgid "No updates available" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/ExtensionCore.py:942 msgid "Your cache is out of date. Would you like to update it now?" 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 "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingWidgets.py:145 msgid "Click to set a new accelerator key." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingWidgets.py:146 msgid "Press Escape or click again to cancel the operation." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingWidgets.py:147 msgid "Press Backspace to clear the existing keybinding." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingWidgets.py:180 msgid "unassigned" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingWidgets.py:203 msgid "Pick an accelerator" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingWidgets.py:305 #, python-format msgid "" "\n" "This key combination, '%s' cannot be used because it would become impossible to type using this key.\n" "\n" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/KeybindingWidgets.py:306 msgid "" "Please try again with a modifier key such as Control, Alt or Super (Windows " "key) at the same time.\n" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/SettingsWidgets.py:175 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:372 msgid "Checking dependencies" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/SettingsWidgets.py:176 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:373 #, python-format msgid "Please install: %s" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/SettingsWidgets.py:391 msgid "_Cancel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/SettingsWidgets.py:392 msgid "_Open" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/SettingsWidgets.py:405 msgid "Sound files" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py:301 msgid "Downloading images:" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py:371 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:505 msgid "" "Something went wrong with the spices download. Please try refreshing the " "list again." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py:520 msgid "Refreshing the cache" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py:601 #, python-format msgid "Installing %s" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py:626 #, 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:688 #, python-format msgid "Uninstalling %s" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py:709 #, python-format msgid "A problem occurred while removing %s." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/Spices.py:731 #, python-format msgid "" "\n" "\n" "Details: %s" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/TreeListWidgets.py:177 #: files/usr/share/cinnamon/cinnamon-settings/bin/TreeListWidgets.py:265 msgid "Add new entry" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/TreeListWidgets.py:181 msgid "Remove selected entry" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/TreeListWidgets.py:186 msgid "Edit selected entry" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/TreeListWidgets.py:191 msgid "Move selected entry up" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/TreeListWidgets.py:196 msgid "Move selected entry down" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/bin/TreeListWidgets.py:267 msgid "Edit entry" 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 "" #. Desktop Zoom #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:80 msgid "Desktop Zoom" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:82 msgid "Enable zoom" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:85 msgid "Magnification" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:88 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:26 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_tiling.py:33 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:111 msgid "Disabled" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:89 msgid "Mouse wheel modifier" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:90 msgid "" "While this modifier is pressed, mouse scrolling will increase or decrease " "zoom." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:93 msgid "Scroll at screen edges" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:96 msgid "Keep cursor centered" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:97 msgid "Cursor moves with contents" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:98 msgid "Cursor pushes contents around" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:100 msgid "Mouse tracking mode" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:103 msgid "Lens mode" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:109 msgid "Square" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:110 msgid "Horizontal strip" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:111 msgid "Vertical strip" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:113 msgid "Lens shape" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:116 msgid "Full screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:117 msgid "Top half" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:118 msgid "Bottom half" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:119 msgid "Left half" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:120 msgid "Right half" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:122 msgid "Screen position" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:147 msgid "Enable the on-screen keyboard" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:155 msgid "Touch" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:156 msgid "Full scale" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:157 msgid "Scanning" msgstr "" #. keyboard@cinnamon.org->metadata.json->description #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:159 msgid "Keyboard layout" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:162 msgid "At the bottom of the screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:163 msgid "At the top of the screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:164 msgid "Keyboard position" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:167 msgid "A quarter of the screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:168 msgid "A third of the screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:169 msgid "Half of the screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:171 msgid "Keyboard size" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:174 msgid "Show the keyboard any time something expects input" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:175 msgid "Show keyboard only when the user activates it" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:177 msgid "Activation mode" msgstr "" #. Keyboard indicators #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:182 msgid "Keyboard indicators" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:184 msgid "Use visual indicator on Caps and Num Lock" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:190 msgid "Use audio indicator on Caps and Num Lock" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:196 msgid "Sound to use Caps or Num Lock on" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:201 msgid "Sound to use Caps or Num Lock off" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:206 msgid "Event feedback (required for typing assistance alerts)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:208 msgid "Enable visual alerts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:213 msgid "Flash the entire monitor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:214 msgid "Flash the active window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:216 msgid "Visual style" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:219 msgid "Enable audio alerts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:224 msgid "Sound to use for window alerts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:232 msgid "Typing assistance" msgstr "" #. Stickykeys #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:236 msgid "Sticky keys" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:238 msgid "Treat a sequence of modifier keys as a combination" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:245 msgid "Disable if two modifiers are pressed together" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:252 msgid "Alert when a modifier key is pressed" msgstr "" #. Slowkeys #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:261 msgid "Slow keys" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:263 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:270 msgid "Alert when a key is pressed" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:277 msgid "Alert when a key is accepted" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:284 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:310 msgid "Alert when a key is rejected" 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:396 msgid "Acceptance delay" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:294 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:320 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:419 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:233 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:69 msgid "Short" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:294 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:320 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:419 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:233 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:69 msgid "Long" msgstr "" #. Bouncekeys #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:301 msgid "Bounce keys" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:303 msgid "Ignore fast duplicate keypresses" msgstr "" #. Mousekeys #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:332 msgid "Mouse keys" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:334 msgid "Control the pointer using the keypad" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:341 msgid "Initial delay" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:344 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:352 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:399 msgid "Shorter" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:344 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:352 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:399 msgid "Longer" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:349 msgid "Acceleration time" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:357 msgid "Maximum speed" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:360 msgid "Slower" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:360 msgid "Faster" msgstr "" #. Dependency Checker #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:367 msgid "Simulated secondary click and hover click" msgstr "" #. Secondary click #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:386 msgid "Simulated secondary click" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:389 msgid "Trigger a secondary click by holding down the primary button" msgstr "" #. Hover Click #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:406 msgid "Hover click" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:409 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:416 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:295 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:711 msgid "Delay" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_accessibility.py:424 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:427 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:27 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:427 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:29 msgid "Large" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:12 msgid "Manage Cinnamon applets" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:31 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:33 msgid "applet" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:45 #: 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_applets.py:48 #: 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_applets.py:53 msgid "Installed applets" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:57 msgid "Reset all" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:72 msgid "Previous Panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_applets.py:76 msgid "Next Panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:30 msgid "Solid color" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:31 msgid "Horizontal gradient" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:32 msgid "Vertical gradient" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:36 msgid "No picture" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:37 msgid "Mosaic" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:38 msgid "Centered" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:39 msgid "Scaled" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:40 msgid "Stretched" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:42 msgid "Spanned" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:141 msgid "Background color" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:165 msgid "Change your desktop's background" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:168 msgid "background, picture, screenshot, slideshow" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:169 msgid "Backgrounds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:183 msgid "Add Folder" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:222 msgid "Add new folder" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:226 msgid "Remove selected folder" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:292 msgid "Play backgrounds as a slideshow" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:295 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:76 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:95 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:98 msgid "minutes" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:298 msgid "Play images in random order" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_backgrounds.py:301 msgid "Picture aspect" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:15 msgid "Manage date and time settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:19 msgid "time, date, calendar, format, network, sync" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:20 msgid "Date & Time" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:29 #: 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:39 msgid "Network time" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:45 msgid "Manually set date and time" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:53 msgid "Format" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:54 msgid "Use 24h clock" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:55 msgid "Display the date" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:56 msgid "Display seconds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:57 msgid "Use locale default" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:57 msgid "Sunday" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:57 msgid "Monday" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:58 msgid "First day of week" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:205 msgid "Region" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_calendar.py:208 msgid "City" msgstr "" #. 1st mimetype is to let us find apps #. 2nd mimetype is to set default handler for (so we handle all of that type, #. not just a specific format) #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:33 msgid "File Manager" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:34 msgid "_Web" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:35 msgid "_Mail" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:36 msgid "Documents" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:37 msgid "Plain Text" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:38 msgid "M_usic" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:39 msgid "_Video" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:40 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:142 msgid "_Photos" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:41 msgid "Source Code" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:42 msgid "PDF" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:139 msgid "CD _audio" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:139 msgid "Select an application for audio CDs" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:140 msgid "_DVD video" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:140 msgid "Select an application for video DVDs" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:141 msgid "_Music player" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:141 msgid "Select an application to run when a music player is connected" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:142 msgid "Select an application to run when a camera is connected" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:143 msgid "_Software" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:143 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:151 msgid "audio DVD" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:152 msgid "blank Blu-ray disc" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:153 msgid "blank CD disc" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:154 msgid "blank DVD disc" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:155 msgid "blank HD DVD disc" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:156 msgid "Blu-ray video disc" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:157 msgid "e-book reader" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:158 msgid "HD DVD video disc" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:159 msgid "Picture CD" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:160 msgid "Super Video CD" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:161 msgid "Video CD" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:162 msgid "Windows software" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:163 msgid "Software" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:342 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:16 msgid "Ask what to do" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:344 msgid "Open folder" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:346 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:17 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:612 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:621 #: 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:404 msgid "Other Media" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:431 msgid "_Type:" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:434 msgid "Select how other media should be handled" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:507 msgid "_Action:" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:512 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:516 msgid "Preferred Applications" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:515 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:532 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:535 msgid "Preferred applications" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:554 msgid "Te_rminal" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:563 msgid "_Calculator" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:572 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:579 msgid "Removable media" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:575 msgid "Prompt or start programs on media insertion" msgstr "" #. FIXMEEEEEEEE?? #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_default.py:595 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:75 msgid "Installed desklets" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desklets.py:79 msgid "Remove all" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desktop.py:24 msgid "Manage your desktop icons" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desktop.py:27 msgid "desktop, home, button, trash" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_desktop.py:28 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:82 msgid "Desktop" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:8 msgid "Manage display settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:12 msgid "display, screen, monitor, layout, resolution, dual, lcd" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:23 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:26 msgid "Layout" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:39 msgid "Auto" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:39 msgid "Double (Hi-DPI)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:40 msgid "User interface scaling:" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:43 msgid "Disable automatic screen rotation" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_display.py:44 msgid "" "Select this option to disable automatic screen rotation on hardware equipped" " with supported accelerometers." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:48 msgid "Cinnamon" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:50 msgid "Fancy Scale" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:54 msgid "Fly up, down" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:55 msgid "Fly down, up" msgstr "" #. for previous versions #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:57 msgid "Default" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:95 msgid "Control Cinnamon visual effects." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:98 msgid "effects, fancy, window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:99 msgid "Effects" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:117 msgid "Enable effects" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:119 msgid "Enable Effects" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:121 msgid "Window effects" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:124 msgid "Effects on dialog boxes" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:127 msgid "Effects on menus" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:130 msgid "Effects style" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:134 msgid "Fade effect on Cinnamon scrollboxes (like the Menu application list)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:137 msgid "Session startup animation" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:145 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:61 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:99 msgid "Customize" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:149 msgid "Customize settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:160 msgid "Effect" msgstr "" #. MAPPING WINDOWS #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:168 msgid "Mapping windows" msgstr "" #. CLOSING WINDOWS #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:172 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:22 msgid "Closing windows" msgstr "" #. MINIMIZING WINDOWS #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:176 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:23 msgid "Minimizing windows" msgstr "" #. MAXIMIZING WINDOWS #. effects = ["none", _("None")], ["scale", _("Scale")]] #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:181 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:24 msgid "Maximizing windows" msgstr "" #. UNMAXIMIZING WINDOWS #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:185 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:25 msgid "Unmaximizing windows" msgstr "" #. TILING WINDOWS #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_effects.py:189 #: 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_effects.py:206 msgid "ms" 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:54 msgid "Enable" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_extensions.py:55 msgid "Disable" 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 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:28 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:9 msgid "Miscellaneous Cinnamon preferences" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:13 msgid "logging, click" msgstr "" #. Label id parent #. (child)Label id parent #. grouped-window-list@cinnamon.org->settings-schema.json->generalPage->title #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:14 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:32 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:32 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:92 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:143 msgid "General" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:24 msgid "Compositor Options" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:29 msgid "VSync method" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:32 msgid "Disable compositing for full-screen windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:33 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:36 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:53 msgid "Miscellaneous Options" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:38 msgid "Enable timer when logging out or shutting down" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:41 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:41 msgid "seconds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_general.py:44 msgid "Enable support for indicators (Requires Cinnamon restart)" 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:192 msgid "Show all workspaces" msgstr "" #. Expo #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_hotcorner.py:193 msgid "Show all windows" msgstr "" #. Scale #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_hotcorner.py:194 msgid "Show the desktop" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_hotcorner.py:195 msgid "Run a command" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_hotcorner.py:198 msgid "Enable this corner" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_hotcorner.py:209 msgid "Type a command..." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_hotcorner.py:214 msgid "Activation delay (ms)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:98 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:102 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:106 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:111 msgid "Operating System" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:113 msgid "Cinnamon Version" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:114 msgid "Linux Kernel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:115 msgid "Processor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:117 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:119 msgid "Memory" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:117 msgid "GiB" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:123 msgid "Hard Drives" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:125 msgid "Hard Drive" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:126 msgid "GB" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:130 msgid "Graphics Card" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:138 msgid "Display system information" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:141 msgid "system, information, details, graphic, sound, kernel, version" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:142 msgid "System Info" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:154 msgid "System info" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:172 msgid "Upload system information" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_info.py:173 msgid "No personal information included" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:33 msgid "Troubleshooting" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:34 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:18 msgid "Windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:35 msgid "Positioning" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:36 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_tiling.py:29 msgid "Tiling and Snapping" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:37 msgid "Inter-workspace" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:38 msgid "Inter-monitor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:39 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:14 msgid "Workspaces" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:40 msgid "Direct Navigation" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:41 msgid "System" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:43 msgid "Screenshots and Recording" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:44 msgid "Launchers" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:45 msgid "Sound and Media" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:46 msgid "Quiet Keys" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:47 msgid "Universal Access" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:48 msgid "Custom Shortcuts" msgstr "" #. KB Label Schema Key name #. Array? Category #. General #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:54 msgid "Show the window selection screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:55 msgid "Show the workspace selection screen" msgstr "" #. show-desktop@cinnamon.org->metadata.json->name #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:56 msgid "Show desktop" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:58 msgid "Cycle through open windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:59 msgid "Cycle backwards through open windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:60 msgid "Cycle through open windows of the same application" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:61 msgid "Cycle backwards through open windows of the same application" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:62 msgid "Run dialog" msgstr "" #. General - Troubleshooting #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:64 msgid "Toggle Looking Glass" msgstr "" #. Windows #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:66 msgid "Maximize window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:67 msgid "Unmaximize window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:68 msgid "Minimize window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:69 msgid "Close window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:70 msgid "Activate window menu" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:71 msgid "Raise window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:72 msgid "Lower window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:73 msgid "Toggle maximization state" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:74 msgid "Toggle fullscreen state" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:75 msgid "Toggle shaded state" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:76 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:48 msgid "Toggle always on top" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:77 msgid "Toggle showing window on all workspaces" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:78 msgid "Increase opacity" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:79 msgid "Decrease opacity" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:80 msgid "Toggle vertical maximization" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:81 msgid "Toggle horizontal maximization" msgstr "" #. Windows - Positioning #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:83 msgid "Resize window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:84 msgid "Move window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:85 msgid "Center window in screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:86 msgid "Move window to upper-right" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:87 msgid "Move window to upper-left" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:88 msgid "Move window to lower-right" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:89 msgid "Move window to lower-left" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:90 msgid "Move window to right edge" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:91 msgid "Move window to top edge" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:92 msgid "Move window to bottom edge" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:93 msgid "Move window to left edge" msgstr "" #. Windows - Tiling and Snapping #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:95 msgid "Push tile left" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:96 msgid "Push tile right" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:97 msgid "Push tile up" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:98 msgid "Push tile down" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:99 msgid "Push snap left" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:100 msgid "Push snap right" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:101 msgid "Push snap up" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:102 msgid "Push snap down" msgstr "" #. Windows - Workspace-related #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:104 msgid "Move window to new workspace" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:105 msgid "Move window to left workspace" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:106 msgid "Move window to right workspace" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:107 msgid "Move window to workspace 1" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:108 msgid "Move window to workspace 2" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:109 msgid "Move window to workspace 3" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:110 msgid "Move window to workspace 4" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:111 msgid "Move window to workspace 5" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:112 msgid "Move window to workspace 6" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:113 msgid "Move window to workspace 7" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:114 msgid "Move window to workspace 8" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:115 msgid "Move window to workspace 9" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:116 msgid "Move window to workspace 10" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:117 msgid "Move window to workspace 11" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:118 msgid "Move window to workspace 12" msgstr "" #. Windows - Monitor-related #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:120 msgid "Move window to left monitor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:121 msgid "Move window to right monitor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:122 msgid "Move window to up monitor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:123 msgid "Move window to down monitor" msgstr "" #. Workspaces #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:125 msgid "Switch to left workspace" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:126 msgid "Switch to right workspace" msgstr "" #. Workspaces - Direct Nav #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:128 msgid "Switch to workspace 1" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:129 msgid "Switch to workspace 2" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:130 msgid "Switch to workspace 3" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:131 msgid "Switch to workspace 4" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:132 msgid "Switch to workspace 5" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:133 msgid "Switch to workspace 6" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:134 msgid "Switch to workspace 7" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:135 msgid "Switch to workspace 8" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:136 msgid "Switch to workspace 9" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:137 msgid "Switch to workspace 10" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:138 msgid "Switch to workspace 11" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:139 msgid "Switch to workspace 12" msgstr "" #. System #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:141 msgid "Log out" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:142 msgid "Shut down" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:143 msgid "Lock screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:144 #: 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 msgid "Suspend" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:145 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:15 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:610 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:619 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:626 msgid "Hibernate" msgstr "" #. System - Screenshots #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:148 msgid "Take a screenshot of an area" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:149 msgid "Copy a screenshot of an area to clipboard" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:150 msgid "Take a screenshot" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:151 msgid "Copy a screenshot to clipboard" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:152 msgid "Take a screenshot of a window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:153 msgid "Copy a screenshot of a window to clipboard" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:154 msgid "Toggle recording desktop (must restart Cinnamon)" msgstr "" #. System - Hardware #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:156 msgid "Re-detect display devices" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:157 msgid "Rotate display" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:158 msgid "Orientation Lock" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:159 msgid "Increase screen brightness" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:160 msgid "Decrease screen brightness" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:161 msgid "Toggle keyboard backlight" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:162 msgid "Increase keyboard backlight level" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:163 msgid "Decrease keyboard backlight level" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:164 msgid "Toggle touchpad state" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:165 msgid "Turn touchpad on" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:166 msgid "Turn touchpad off" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:167 msgid "Show power statistics" msgstr "" #. Launchers #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:169 msgid "Launch terminal" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:170 msgid "Launch help browser" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:171 msgid "Launch calculator" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:172 msgid "Launch email client" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:173 msgid "Launch web browser" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:174 msgid "Home folder" msgstr "" #. Sound and Media #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:177 msgid "Volume mute" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:178 msgid "Volume down" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:179 msgid "Volume up" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:180 msgid "Launch media player" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:182 msgid "Pause playback" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:183 msgid "Stop playback" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:184 msgid "Previous track" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:185 msgid "Next track" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:186 msgid "Eject" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:187 msgid "Rewind" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:188 msgid "Fast-forward" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:189 msgid "Repeat" msgstr "" #. Sound and Media Quiet #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:192 msgid "Volume mute (Quiet)" msgstr "" #. Not sure this is even necessary #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:193 msgid "Volume down (Quiet)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:194 msgid "Volume up (Quiet)" msgstr "" #. Universal Access #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:196 msgid "Zoom in" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:197 msgid "Zoom out" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:198 msgid "Turn screen reader on or off" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:200 msgid "Increase text size" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:201 msgid "Decrease text size" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:202 msgid "High contrast on or off" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:206 msgid "Manage keyboard settings and shortcuts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:211 msgid "keyboard, shortcut, hotkey" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:226 msgid "Key repeat" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:228 msgid "Typing" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:230 msgid "Enable key repeat" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:233 msgid "Repeat delay:" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:236 msgid "Repeat speed:" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:236 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:244 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:58 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:127 msgid "Slow" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:236 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:244 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:58 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:127 msgid "Fast" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:239 msgid "Text cursor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:241 msgid "Text cursor blinks" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:244 msgid "Blink speed:" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:253 msgid "Shortcuts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:258 msgid "" "To edit a keyboard binding, click it and press the new keys, or press " "backspace to clear it." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:303 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:749 msgid "Add custom shortcut" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:305 msgid "Remove custom shortcut" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:327 msgid "Categories" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:342 msgid "Keyboard shortcuts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:353 msgid "Keyboard bindings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:399 msgid "Layouts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:481 #, python-format msgid "" "This key combination, %(combination)s is currently in use by " "%(old)s. " msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:482 #, python-format msgid "" "If you continue, the combination will be reassigned to %(new)s.\n" "\n" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:483 msgid "Do you want to continue with this operation?" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:636 msgid "Reset to default" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_keyboard.py:766 msgid "Select a file" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:12 msgid "Control mouse and touchpad settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:17 msgid "mouse, touchpad, synaptic, double-click" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:18 msgid "Mouse and Touchpad" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:34 msgid "Left handed (mouse buttons inverted)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:37 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:112 msgid "Reverse scrolling direction" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:40 msgid "Show position of pointer when the Control key is pressed" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:43 msgid "Emulate middle click by clicking both left and right buttons" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:46 msgid "Drag-and-drop threshold" msgstr "" #. 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:46 msgid "pixels" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:49 msgid "Pointer size and speed" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:51 msgid "Size" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:51 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:64 msgid "Smaller" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:51 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:64 msgid "Larger" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:55 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:124 msgid "Custom Acceleration" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:58 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:127 msgid "Acceleration" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:61 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:130 msgid "Custom Sensitivity" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:64 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:133 msgid "Sensitivity" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:64 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:133 msgid "Low" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:64 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:133 msgid "High" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:67 msgid "Double-Click timeout" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:69 msgid "Timeout" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:73 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:145 msgid "Double-click test" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:85 msgid "Enable touchpad" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:95 msgid "Tap to click" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:98 msgid "Disable touchpad when a mouse is attached" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:101 msgid "Disable touchpad while typing" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:104 msgid "Left click only" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:104 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:115 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:107 msgid "Automatic" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:104 msgid "Emulate mouse buttons" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:104 msgid "Use multiple fingers for right and middle click" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:106 msgid "Click actions" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:109 msgid "Scrolling" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:115 msgid "No scrolling" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:115 msgid "Two-finger scrolling" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:115 msgid "Edge scrolling" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:116 msgid "Scrolling method" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:118 msgid "Horizontal scrolling" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:121 msgid "Pointer speed" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:136 msgid "Touchpad" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_mouse.py:140 msgid "Success!" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:35 msgid "Notification preferences" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:39 msgid "notifications" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:54 msgid "Notification settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:56 msgid "Enable notifications" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:59 msgid "Remove notifications after their timeout is reached" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:62 msgid "Show notifications on the bottom side of the screen" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:65 msgid "Display a test notification" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:68 msgid "Media keys OSD" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_notifications.py:70 msgid "Media keys OSD size" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_online_accounts.py:8 msgid "Connect to your online accounts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_online_accounts.py:12 msgid "" "google, facebook, twitter, yahoo, web, online, chat, calendar, mail, " "contact, owncloud, kerberos, imap, smtp, pocket, readitlater, account" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_online_accounts.py:13 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_online_accounts.py:45 msgid "Online Accounts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_online_accounts.py:24 msgid "Information about GNOME Online Accounts" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:30 msgid "Center Zone" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:33 msgid "Panel height:" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:34 msgid "Left Zone" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:35 msgid "Right Zone" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:37 msgid "Panel width:" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:38 msgid "Top Zone" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:39 msgid "Bottom Zone" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:46 msgid "Panel Visibility" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:51 msgid "Auto hide panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:51 msgid "Always show panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:51 msgid "Intelligently hide panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:52 msgid "Auto-hide panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:55 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 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:55 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:58 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:148 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:38 msgid "milliseconds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:58 msgid "Hide delay" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:68 msgid "Panel appearance" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:111 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:119 msgid "Font size" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:125 msgid "Scale to panel size exactly" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:126 msgid "Scale to panel size optimally" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:134 msgid "Colored icon size" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:139 msgid "Symbolic icon size" msgstr "" #. menu@cinnamon.org->settings-schema.json->favbox-min-height->units #. clock@cinnamon.org->settings-schema.json->font-size->units #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:141 msgid "px" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:149 msgid "Manage Cinnamon panel settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:152 msgid "panel, height, bottom, top, autohide, size, layout" msgstr "" #. menu@cinnamon.org->settings-schema.json->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:153 msgid "Panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:171 msgid "Previous panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:172 msgid "Next panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:195 msgid "General Panel Options" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:198 msgid "Add new panel" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_panel.py:207 msgid "Allow the pointer to pass through the edges of panels" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:12 msgid "Lock the screen" msgstr "" #: 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:625 msgid "Shutdown immediately" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:21 msgid "5%" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:22 msgid "10%" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:23 msgid "30%" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:24 msgid "50%" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:25 msgid "75%" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:29 #: 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:30 msgid "60 seconds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:31 msgid "90 seconds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:32 #: 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:33 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:38 #: 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:34 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:39 #: 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:40 #: 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:41 #: 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:42 #: 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:43 #: 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:44 msgid "2 hours" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:45 msgid "3 hours" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:46 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_screensaver.py:29 msgid "Never" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:69 msgid "Unknown time" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:87 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:98 msgid "hours" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:108 msgid "Manage power settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:111 msgid "power, suspend, hibernate, laptop, desktop, brightness, screensaver" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:112 msgid "Power Management" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:144 msgid "Power Options" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:153 msgid "On A/C power" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:156 msgid "On battery power" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:163 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:171 msgid "Turn off the screen when inactive for" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:165 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:173 msgid "Suspend when inactive for" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:168 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:176 msgid "When the lid is closed" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:178 msgid "Extra options" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:182 msgid "When the power button is pressed" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:185 msgid "Perform lid-closed action even with external monitors attached" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:188 msgid "When the battery is critically low" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:191 msgid "Enable Hybrid Sleep" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:192 msgid "Replaces Suspend with Hybrid Sleep" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:220 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:226 msgid "Power" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:221 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:228 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:297 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:305 msgid "Batteries" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:235 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:236 msgid "Screen brightness" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:238 msgid "On battery, dim screen when inactive" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:240 msgid "Brightness level when inactive" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:242 msgid "Dim screen after inactive for" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:258 msgid "Backlight brightness" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:315 msgid "Devices" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:341 #, python-format msgid "Caution low UPS, %s remaining" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:343 #, python-format msgid "Using UPS power - %s remaining" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:349 msgid "Caution low UPS" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:351 msgid "Using UPS power" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:376 #, python-format msgid "Charging - %s until fully charged" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:379 #, python-format msgid "Caution low battery, %s remaining" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:381 #, python-format msgid "Using battery power - %s remaining" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:390 msgid "Charging - fully charged" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:392 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:410 msgid "Empty" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:396 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:461 msgid "Battery" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:416 msgid "Secondary battery" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:437 msgid "Uninterruptible power supply" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:440 msgid "Wireless mouse" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:443 msgid "Wireless Keyboard" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:449 msgid "Personal digital assistant" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:452 msgid "Cellphone" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_power.py:620 msgid "Ask" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:26 msgid "Cinnamon privacy settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:30 msgid "privacy, recent, gtk, private" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:31 msgid "Privacy" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:43 msgid "Remember recently accessed files" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:47 msgid "Recent files" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:49 msgid "Never forget old files" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:54 msgid "Number of days to remember old files" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:85 msgid "Internet connectivity" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:86 msgid "Check connectivity" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_privacy.py:90 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:16 msgid "Lock immediately" 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: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" 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:566 msgid "Device settings" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:555 msgid "Input" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:586 msgid "No inputs sources are currently available." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:594 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:600 msgid "Sounds" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:596 msgid "Sounds Volume" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:624 msgid "No application is currently playing or recording audio." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:633 msgid "Amplification" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:634 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:642 #, python-format msgid "Maximum volume: %d" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:634 msgid "Reduced" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_sound.py:634 msgid "Amplified" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:51 msgid "Manage your startup applications" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:55 msgid "startup, programs, boot, init, session, autostart, apps" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:56 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:69 msgid "Startup Applications" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:141 msgid "Unavailable" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:142 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:313 msgid "No description" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:311 msgid "No name" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:441 msgid "Run now" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:482 #, python-format msgid "" "Could not execute '%s'\n" "%s" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:503 msgid "Custom command" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:508 msgid "Choose application" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:714 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:742 #, python-format msgid "%s s" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:768 msgid "Add Startup Program" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:771 msgid "Edit Startup Program" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:772 msgid "Save" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:796 msgid "Command" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:809 msgid "Browse..." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:814 msgid "Comment" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:824 msgid "Startup delay" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:847 msgid "The startup command cannot be empty" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:855 msgid "The startup command is not valid" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:886 msgid "Select Command" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:907 msgid "Search Applications..." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:941 msgid "_Close" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_startup.py:942 msgid "Add Application" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:33 msgid "Manage themes to change how your desktop looks" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:38 msgid "themes, style" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:41 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:66 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:68 msgid "Themes" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:70 msgid "Window borders" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:73 msgid "Icons" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:76 msgid "Controls" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:79 msgid "Mouse Pointer" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:86 msgid "Add/Remove" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:91 msgid "Miscellaneous options" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:93 msgid "Show icons in menus" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:96 msgid "Show icons on buttons" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:99 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:104 msgid "Jump to position when clicking in a trough" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:107 msgid "Use overlay scroll bars" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:112 msgid "Override the current theme's scrollbar width" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:116 msgid "Scrollbar width" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_themes.py:137 msgid "" "Changes will take effect the next time you log in and may not affect all " "applications." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_tiling.py:9 msgid "Manage window tiling preferences" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_tiling.py:13 msgid "window, tile, flip, tiling, snap, snapping" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_tiling.py:14 msgid "Window Tiling" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_tiling.py:26 msgid "Enable Window Tiling and Snapping" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_tiling.py:31 msgid "Tiling HUD visibility threshold" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_tiling.py:31 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:116 msgid "Pixels" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_tiling.py:33 msgid "Super (Windows)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_tiling.py:33 msgid "Alt" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_tiling.py:33 msgid "Shift" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_tiling.py:33 msgid "Control" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_tiling.py:34 msgid "Modifier to use for toggling between tile and snap mode" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_tiling.py:36 msgid "Maximize, instead of tile, when dragging a window to the top edge" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_tiling.py:38 msgid "Show snap on-screen-display" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_tiling.py:40 msgid "Show tile heads-up-display" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_tiling.py:42 msgid "Legacy window snapping (hold while dragging a window)" 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:38 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:52 msgid "Account details" 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:251 msgid "Current password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:384 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:385 msgid "Wrong password" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:389 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_user.py:390 msgid "Internal Error" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:14 msgid "Manage window preferences" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:17 msgid "windows, titlebar, edge, switcher, window list, attention, focus" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:31 msgid "Titlebar" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:35 msgid "Buttons" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:38 msgid "Traditional style (Right)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:39 msgid "Mac style (Left)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:41 msgid "Buttons layout" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:44 msgid "Actions" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:46 msgid "Toggle Shade" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:46 msgid "Toggle Maximize" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:47 msgid "Toggle Maximize Horizontally" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:47 msgid "Toggle Maximize Vertically" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:48 msgid "Toggle on all workspaces" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:49 msgid "Lower" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:51 msgid "Action on title bar double-click" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:54 msgid "Action on title bar middle-click" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:57 msgid "Action on title bar right-click" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:60 msgid "Nothing" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:60 msgid "Shade and unshade" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:60 msgid "Adjust opacity" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:62 msgid "Action on title bar with mouse scroll" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:65 msgid "Minimum opacity" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:65 msgid "%" msgstr "" #. menu@cinnamon.org->settings-schema.json->panel-behave->title #. menu@cinnamon.org->settings-schema.json->menu-behave->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:74 msgid "Behavior" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:76 msgid "Window Focus" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:78 msgid "Click" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:78 msgid "Sloppy" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:79 msgid "Window focus mode" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:80 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:83 msgid "Automatically raise focused windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:89 msgid "Bring windows which require attention to the current workspace" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:92 msgid "Prevent windows which require attention from stealing focus" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:95 msgid "Smart" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:95 msgid "Strict" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:96 msgid "Focus mode for new windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:97 msgid "" "This option provides additional control over how newly created windows get " "focus. It has two possible values; 'smart' applies the user's normal focus " "mode, and 'strict' results in windows started from a terminal not being " "given focus." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:100 msgid "Attach dialog windows to the parent window" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:103 msgid "Moving and Resizing Windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:107 msgid "Cursor" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:107 msgid "Manual" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:107 msgid "Center" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:108 msgid "Location of newly opened windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:112 msgid "Special key to move and resize windows" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:113 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:116 msgid "Window drag/resize threshold" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:119 msgid "Edge resistance with other windows and monitor boundaries" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:120 msgid "" "Make window borders stick when moved or resized near other windows or " "monitor edges." msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:126 #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:128 msgid "Alt-Tab" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:131 msgid "Icons only" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:132 msgid "Thumbnails only" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:133 msgid "Icons and thumbnails" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:134 msgid "Icons and window preview" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:135 msgid "Window preview (no icons)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:136 msgid "Coverflow (3D)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:137 msgid "Timeline (3D)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:139 msgid "Alt-Tab switcher style" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:142 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:145 msgid "Move minimized windows to the end of the alt-tab switcher" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_windows.py:148 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:151 msgid "Show windows from all workspaces" 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:32 msgid "Enable workspace OSD" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:36 msgid "On-Screen Display (OSD)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:38 msgid "Workspace OSD duration" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:41 msgid "Workspace OSD horizontal position" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:41 msgid "percent of the monitor's width" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:44 msgid "Workspace OSD vertical position" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:44 msgid "percent of the monitor's height" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:47 msgid "OSD" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:55 msgid "Allow cycling through workspaces" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:58 msgid "Only use workspaces on primary monitor (requires Cinnamon restart)" msgstr "" #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:61 msgid "Display Expo view as a grid" msgstr "" #. Edge Flip doesn't work well, so it's there in gsettings, but we don't show #. it to users yet #. switch = GSettingsSwitch(_("Enable Edge Flip"), "org.cinnamon", "enable- #. edge-flip") #. settings.add_row(switch) #. spin = GSettingsSpinButton(_("Edge Flip delay"), "org.cinnamon", "edge- #. flip-delay", mini=1, maxi=3000, units=_("ms")) #. settings.add_reveal_row(spin, "org.cinnamon", "enable-edge-flip") #: files/usr/share/cinnamon/cinnamon-settings/modules/cs_workspaces.py:70 msgid "" "Invert the left and right arrow key directions used to shift workspaces " "during a window drag" msgstr "" #: files/usr/bin/cinnamon-launcher:39 msgid "Cinnamon just crashed" msgstr "" #: files/usr/bin/cinnamon-launcher:41 msgid "Disable downloaded applets, desklets and extensions" msgstr "" #: files/usr/bin/cinnamon-launcher:44 msgid "You are currently running in fallback mode." msgstr "" #: files/usr/bin/cinnamon-launcher:45 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:46 msgid "Do you want to restart Cinnamon?" msgstr "" #. menu@cinnamon.org->metadata.json->description msgid "Main Cinnamon menu" msgstr "" #. menu@cinnamon.org->settings-schema.json->menu-layout->title msgid "Layout and content" 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-custom->tooltip msgid "Check this to specify 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->tooltip msgid "Select an icon to show in the panel." msgstr "" #. menu@cinnamon.org->settings-schema.json->menu-label->description msgid "Text" msgstr "" #. menu@cinnamon.org->settings-schema.json->menu-label->tooltip msgid "Enter custom text to show in the panel." msgstr "" #. menu@cinnamon.org->settings-schema.json->favbox-min-height->description msgid "Minimum height of the favorites section" msgstr "" #. menu@cinnamon.org->settings-schema.json->favbox-min-height->tooltip msgid "" "The minimum size allocated for the favorites section (this has an impact on " "the overall height of the menu)." msgstr "" #. menu@cinnamon.org->settings-schema.json->show-category-icons->description msgid "Show category icons" msgstr "" #. menu@cinnamon.org->settings-schema.json->show-category-icons->tooltip msgid "Choose whether or not to show icons on categories." msgstr "" #. menu@cinnamon.org->settings-schema.json->show-application- #. icons->description msgid "Show application icons" msgstr "" #. menu@cinnamon.org->settings-schema.json->show-application-icons->tooltip msgid "Choose whether or not to show icons on applications." msgstr "" #. menu@cinnamon.org->settings-schema.json->favbox-show->description msgid "Show favorites and session buttons" msgstr "" #. menu@cinnamon.org->settings-schema.json->favbox-show->tooltip msgid "Choose whether or not to show the left pane of the menu." msgstr "" #. menu@cinnamon.org->settings-schema.json->show-places->description msgid "Show bookmarks and places" msgstr "" #. menu@cinnamon.org->settings-schema.json->show-places->tooltip msgid "Choose whether or not to show bookmarks and places in the menu." msgstr "" #. menu@cinnamon.org->settings-schema.json->show-recents->description msgid "Show recents" msgstr "" #. menu@cinnamon.org->settings-schema.json->show-recents->tooltip msgid "Choose whether or not to show recents in the menu." msgstr "" #. menu@cinnamon.org->settings-schema.json->enable-autoscroll->description msgid "Enable autoscrolling in application list" msgstr "" #. menu@cinnamon.org->settings-schema.json->enable-autoscroll->tooltip msgid "" "Choose whether or not to enable smooth autoscrolling in the application " "list." msgstr "" #. menu@cinnamon.org->settings-schema.json->search-filesystem->description msgid "Enable filesystem path entry in search box" msgstr "" #. menu@cinnamon.org->settings-schema.json->search-filesystem->tooltip msgid "Allows path entry in the menu search box." 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 "" #. 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->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 msgid "Toggle Mute" msgstr "" #. sound@cinnamon.org->settings-schema.json->middleClickAction->options msgid "Toggle Mute output" msgstr "" #. sound@cinnamon.org->settings-schema.json->middleClickAction->options msgid "Toggle Mute input" msgstr "" #. sound@cinnamon.org->settings-schema.json->middleClickAction->options msgid "Toggle Play / Pause" msgstr "" #. sound@cinnamon.org->settings-schema.json->middleClickAction->description msgid "Action on 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->keepAlbumAspectRatio->description msgid "Keep album art aspect ratio" msgstr "" #. sound@cinnamon.org->settings-schema.json->hideSystray->description msgid "Hide system tray icons for compatible players" 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->appButtonsSection->title msgid "Application Buttons" msgstr "" #. grouped-window-list@cinnamon.org->settings- #. schema.json->hotKeysSection->title msgid "Hot Keys" msgstr "" #. grouped-window-list@cinnamon.org->settings- #. schema.json->hoverPeekSection->title msgid "Hover Peek" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->number- #. display->description msgid "Show window count numbers" 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->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 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->group- #. apps->description msgid "Group windows by application" 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->launcher-animation- #. effect->description msgid "Launcher animation" 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->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->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->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->launch-new- #. instance-menu-item->description msgid "Show new window option" msgstr "" #. grouped-window-list@cinnamon.org->settings-schema.json->launch-new- #. instance-menu-item->tooltip msgid "" "Shows the \"New Window\" option in an app's context menu if it doesn't " "already have one from the app's own action menu items." 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 "" #. 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 msgid "Window opacity" msgstr "" #. network@cinnamon.org->metadata.json->description msgid "Network manager applet" 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 "" #. show-desktop@cinnamon.org->metadata.json->description msgid "Minimize all windows" msgstr "" #. show-desktop@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 msgid "Peek at the desktop when hovering the applet" msgstr "" #. show-desktop@cinnamon.org->settings-schema.json->peek-blur->description msgid "Blur effect" msgstr "" #. show-desktop@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 msgid "Hover delay" msgstr "" #. show-desktop@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 msgid "Change the opacity of windows when peeking at the desktop" 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 "" #. 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->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-preview->description msgid "Show window thumbnails on hover" 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->section4->title msgid "Animation 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 aditional 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->tween- #. function->description msgid "Animation type" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->tween- #. function->tooltip msgid "" "A tween chooser has as value a string, which you can pass as transition to " "Tweener.addTween()" msgstr "" #. settings-example@cinnamon.org->settings-schema.json->effect- #. style->description msgid "Effect type" 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 "" #. 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 "" #. 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 "" #. 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-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->format-button->tooltip msgid "Click this button to know more about the syntax for date formats." msgstr "" #. xrandr@cinnamon.org->metadata.json->description msgid "XRandR monitor control applet" 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-4.4.8/configure.ac000066400000000000000000000162771360505115200156320ustar00rootroot00000000000000AC_PREREQ(2.63) AC_INIT([cinnamon],[4.4.8],[https://github.com/linuxmint/Cinnamon/issues],[cinnamon]) AC_CONFIG_HEADERS([config.h]) AC_CONFIG_SRCDIR([src/cinnamon-global.c]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_AUX_DIR([config]) m4_ifdef([AX_IS_RELEASE], [AX_IS_RELEASE([always])]) AC_SUBST([PACKAGE_NAME], ["$PACKAGE_NAME"]) AC_SUBST([PACKAGE_VERSION], ["$PACKAGE_VERSION"]) AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz tar-ustar foreign subdir-objects]) AM_MAINTAINER_MODE([enable]) m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) m4_divert_text([DEFAULTS], [: "${ARFLAGS=cr} ${AR_FLAGS=cr}"]) # Checks for programs. AC_PROG_CC AC_PROG_CXX # Needed for per-target cflags, like in cinnamon-taskpanel AM_PROG_CC_C_O # Initialize libtool LT_PREREQ([2.2.6]) LT_INIT([disable-static]) # i18n IT_PROG_INTLTOOL([0.40]) GETTEXT_PACKAGE=cinnamon AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [The prefix for our gettext translation domains.]) PKG_PROG_PKG_CONFIG([0.22]) GLIB_GSETTINGS # We need at least this, since gst_plugin_register_static() was added # in 0.10.16, but nothing older than 0.10.21 has been tested. GSTREAMER_MIN_VERSION=0.11.92 recorder_modules= build_recorder=false AC_MSG_CHECKING([for GStreamer (needed for recording functionality)]) if $PKG_CONFIG --exists gstreamer-1.0 '>=' $GSTREAMER_MIN_VERSION ; then AC_MSG_RESULT(yes) build_recorder=true recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11" PKG_CHECK_MODULES(TEST_CINNAMON_RECORDER, $recorder_modules muffin-clutter-0 xfixes) else AC_MSG_RESULT(no) fi AM_CONDITIONAL(BUILD_RECORDER, $build_recorder) CLUTTER_MIN_VERSION=0 GOBJECT_INTROSPECTION_MIN_VERSION=0.9.2 GJS_MIN_VERSION=3.2.0 MUFFIN_MIN_VERSION=4.0.3 GTK_MIN_VERSION=3.12.0 GIO_MIN_VERSION=2.35.0 POLKIT_MIN_VERSION=0.100 STARTUP_NOTIFICATION_MIN_VERSION=0.11 # Collect more than 20 libraries for a prize! PKG_CHECK_MODULES(CINNAMON, gio-2.0 >= $GIO_MIN_VERSION gio-unix-2.0 dbus-glib-1 libxml-2.0 gtk+-3.0 >= $GTK_MIN_VERSION libmuffin >= $MUFFIN_MIN_VERSION cjs-1.0 >= $GJS_MIN_VERSION libcinnamon-menu-3.0 $recorder_modules gdk-x11-3.0 libsoup-2.4 gl muffin-cogl-pango-0 muffin-cogl-path-0 muffin-cogl-0 muffin-clutter-0 libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_MIN_VERSION gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes atk-bridge-2.0) AC_ARG_ENABLE(networkmanager, AC_HELP_STRING([--disable-networkmanager], [Disable integration with NetworkManager and nm-applet]),, enable_networkmanager=yes) HAVE_NETWORKMANAGER=false if test "x$enable_networkmanager" = xyes; then PKG_CHECK_MODULES(CINNAMON_NM_APPLET, libnm) HAVE_NETWORKMANAGER=true fi AM_CONDITIONAL(HAVE_NETWORKMANAGER, [test x$enable_networkmanager = xyes]) AC_SUBST([HAVE_NETWORKMANAGER], ["$HAVE_NETWORKMANAGER"]) PKG_CHECK_MODULES(CINNAMON_PERF_HELPER, gtk+-3.0 gio-2.0) PKG_CHECK_MODULES(CINNAMON_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0) GJS_VERSION=`$PKG_CONFIG --modversion cjs-1.0` AC_DEFINE_UNQUOTED([GJS_VERSION], ["$GJS_VERSION"], [The version of GJS we're linking to]) dnl ' AC_SUBST([GJS_VERSION], ["$GJS_VERSION"]) GOBJECT_INTROSPECTION_CHECK([$GOBJECT_INTROSPECTION_MIN_VERSION]) saved_CFLAGS=$CFLAGS saved_LIBS=$LIBS CFLAGS=$CINNAMON_CFLAGS LIBS=$CINNAMON_LIBS AC_CHECK_FUNCS(XFixesCreatePointerBarrier) CFLAGS=$saved_CFLAGS LIBS=$saved_LIBS PKG_CHECK_MODULES(ST, muffin-cogl-path-0 muffin-clutter-0 gtk+-3.0 libcroco-0.6 >= 0.6.2 cinnamon-desktop >= 2.4.0 x11) PKG_CHECK_MODULES(GDMUSER, dbus-glib-1 gtk+-3.0) PKG_CHECK_MODULES(TRAY, muffin-clutter-0 gtk+-3.0) PKG_CHECK_MODULES(DESKTOP_SCHEMAS, cinnamon-desktop >= 2.4.0) MUFFIN_GIR_DIR=`$PKG_CONFIG --variable=girdir libmuffin` MUFFIN_TYPELIB_DIR=`$PKG_CONFIG --variable=typelibdir libmuffin` AC_SUBST(MUFFIN_GIR_DIR) AC_SUBST(MUFFIN_TYPELIB_DIR) GJS_CONSOLE=`$PKG_CONFIG --variable=cjs_console cjs-1.0` AC_SUBST(GJS_CONSOLE) AC_CHECK_FUNCS(fdwalk) AC_CHECK_FUNCS(mallinfo) AC_CHECK_HEADERS([sys/resource.h]) # _NL_TIME_FIRST_WEEKDAY is an enum and not a define AC_MSG_CHECKING([for _NL_TIME_FIRST_WEEKDAY]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[nl_langinfo(_NL_TIME_FIRST_WEEKDAY);]])], [langinfo_ok=yes], [langinfo_ok=no]) AC_MSG_RESULT($langinfo_ok) if test "$langinfo_ok" = "yes"; then AC_DEFINE([HAVE__NL_TIME_FIRST_WEEKDAY], [1], [Define if _NL_TIME_FIRST_WEEKDAY is available]) fi # Sets GLIB_GENMARSHAL and GLIB_MKENUMS AM_PATH_GLIB_2_0() G_IR_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0` AC_SUBST(G_IR_SCANNER) G_IR_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0` AC_SUBST(G_IR_COMPILER) G_IR_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0` AC_SUBST(G_IR_GENERATE) GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0` AC_SUBST(GIRDIR) TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)" AC_SUBST(TYPELIBDIR) m4_ifdef([AX_COMPILER_FLAGS], [AX_COMPILER_FLAGS([WARN_CFLAGS],[WARN_LDFLAGS])]) AC_ARG_ENABLE([gtk-doc], AC_HELP_STRING([--enable-gtk-doc], [use gtk-doc to build documentation [[default=yes]]]),, enable_gtk_doc=yes) AC_MSG_CHECKING([location of system Certificate Authority list]) AC_ARG_WITH(ca-certificates, [AC_HELP_STRING([--with-ca-certificates=@<:@path@:>@], [path to system Certificate Authority list])]) if test "$with_ca_certificates" = "no"; then AC_MSG_RESULT([disabled]) else if test -z "$with_ca_certificates"; then for f in /etc/pki/tls/certs/ca-bundle.crt \ /etc/ssl/certs/ca-certificates.crt; do if test -f "$f"; then with_ca_certificates="$f" fi done if test -z "$with_ca_certificates"; then AC_MSG_ERROR([could not find. Use --with-ca-certificates=path to set, or --without-ca-certificates to disable]) fi fi AC_MSG_RESULT($with_ca_certificates) AC_DEFINE_UNQUOTED(CINNAMON_SYSTEM_CA_FILE, ["$with_ca_certificates"], [The system TLS CA list]) fi AC_SUBST(CINNAMON_SYSTEM_CA_FILE,["$with_ca_certificates"]) GTK_DOC_CHECK([1.15], [--flavour no-tmpl]) AC_CONFIG_FILES([ Makefile data/Makefile data/icons/Makefile docs/Makefile docs/reference/Makefile docs/reference/cinnamon/Makefile docs/reference/cinnamon/cinnamon-docs.sgml docs/reference/cinnamon-js/Makefile docs/reference/cinnamon-tutorials/Makefile docs/reference/cinnamon-tutorials/cinnamon-tutorials-docs.sgml docs/reference/st/Makefile docs/reference/st/cinnamon-st-docs.sgml js/Makefile js/misc/config.js src/Makefile tests/Makefile po/Makefile.in man/Makefile files/Makefile ]) AC_OUTPUT cinnamon-4.4.8/data/000077500000000000000000000000001360505115200142405ustar00rootroot00000000000000cinnamon-4.4.8/data/Makefile.am000066400000000000000000000041331360505115200162750ustar00rootroot00000000000000desktopdir=$(datadir)/applications desktop_DATA = cinnamon.desktop # We substitute in bindir so it works as an autostart # file when built in a non-system prefix %.desktop.in:%.desktop.in.in $(AM_V_GEN) sed -e "s|@bindir[@]|$(bindir)|" \ -e "s|@VERSION[@]|$(VERSION)|" \ $< > $@ || rm $@ # Placeholder until we add intltool %.desktop:%.desktop.in $(AM_V_GEN) sed s/^_// < $< > $@ || rm $@ searchprovidersdir = $(pkgdatadir)/search_providers dist_searchproviders_DATA = \ search_providers/google.xml \ search_providers/wikipedia.xml themedir = $(pkgdatadir)/theme dist_theme_DATA = \ theme/add-workspace-hover.png \ theme/add-workspace.png \ theme/calendar-arrow-left.svg \ theme/calendar-arrow-right.svg \ theme/calendar-today.svg \ theme/checkbox-off.svg \ theme/checkbox.svg \ theme/cinnamon.css \ theme/close.svg \ theme/close-window.svg \ theme/close-window-hover.svg \ theme/corner-ripple.png \ theme/menu-symbolic.svg \ theme/overview-hover.png \ theme/overview.png \ theme/process-working.svg \ theme/radiobutton-off.svg \ theme/radiobutton.svg \ theme/scroll-hhandle.svg \ theme/scroll-vhandle.svg \ theme/thumbnail-generic.png \ theme/thumbnail.png \ theme/toggle-off-intl.svg \ theme/toggle-off-us.svg \ theme/toggle-on-intl.svg \ theme/toggle-on-us.svg \ theme/trash-icon.png gsettings_SCHEMAS = org.cinnamon.gschema.xml @INTLTOOL_XML_NOMERGE_RULE@ @GSETTINGS_RULES@ # We need to compile schemas at make time # to run from source tree gschemas.compiled: $(gsettings_SCHEMAS:.xml=.valid) $(AM_V_GEN) $(GLIB_COMPILE_SCHEMAS) --targetdir=. . all-local: gschemas.compiled EXTRA_DIST = \ cinnamon.desktop.in.in \ $(menu_DATA) \ org.cinnamon.gschema.xml.in CLEANFILES = \ cinnamon.desktop.in \ $(desktop_DATA) \ $(gsettings_SCHEMAS) \ gschemas.compiled SUBDIRS = \ icons \ $(NULL) cinnamon-4.4.8/data/cinnamon.desktop.in.in000066400000000000000000000007241360505115200204520ustar00rootroot00000000000000[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=GNOME; NoDisplay=true X-GNOME-Autostart-Phase=WindowManager X-GNOME-Provides=panel;windowmanager; X-GNOME-Autostart-Notify=true X-GNOME-AutoRestart=false cinnamon-4.4.8/data/icons/000077500000000000000000000000001360505115200153535ustar00rootroot00000000000000cinnamon-4.4.8/data/icons/Makefile.am000066400000000000000000000136011360505115200174100ustar00rootroot00000000000000NULL = public_icons_themes = \ hicolor \ $(NULL) public_icons = \ hicolor_actions_scalable_pan-down-symbolic.svg \ hicolor_actions_scalable_pan-end-symbolic.svg \ hicolor_actions_scalable_pan-end-symbolic-rtl.svg \ hicolor_actions_scalable_pan-start-symbolic.svg \ hicolor_actions_scalable_pan-start-symbolic-rtl.svg \ hicolor_actions_scalable_pan-up-symbolic.svg \ hicolor_actions_scalable_caps-lock-symbolic.svg \ hicolor_actions_scalable_caps-lock-off-symbolic.svg \ hicolor_actions_scalable_list-edit-symbolic.svg \ hicolor_actions_scalable_num-lock-symbolic.svg \ hicolor_actions_scalable_num-lock-off-symbolic.svg \ hicolor_apps_scalable_cinnamon-panel-launcher.svg \ hicolor_apps_scalable_removable-drives.svg \ hicolor_categories_scalable_cs-applets.svg \ hicolor_categories_scalable_cs-backgrounds.svg \ hicolor_categories_scalable_cs-backgrounds-symbolic.svg \ hicolor_categories_scalable_cs-bluetooth.svg \ hicolor_categories_scalable_cs-cat-admin.svg \ hicolor_categories_scalable_cs-cat-appearance.svg \ hicolor_categories_scalable_cs-cat-hardware.svg \ hicolor_categories_scalable_cs-cat-prefs.svg \ hicolor_categories_scalable_cs-color.svg \ hicolor_categories_scalable_cs-date-time.svg \ hicolor_categories_scalable_cs-default-applications.svg \ hicolor_categories_scalable_cs-desklets.svg \ hicolor_categories_scalable_cs-desklets-symbolic.svg \ hicolor_categories_scalable_cs-desktop-effects.svg \ hicolor_categories_scalable_cs-desktop.svg \ hicolor_categories_scalable_cs-details.svg \ hicolor_categories_scalable_cs-display.svg \ hicolor_categories_scalable_cs-drivers.svg \ hicolor_categories_scalable_cs-extensions.svg \ hicolor_categories_scalable_cs-firewall.svg \ hicolor_categories_scalable_cs-fonts.svg \ hicolor_categories_scalable_cs-general.svg \ hicolor_categories_scalable_cs-input-method.svg \ hicolor_categories_scalable_cs-keyboard.svg \ hicolor_categories_scalable_cs-language.svg \ hicolor_categories_scalable_cs-login.svg \ hicolor_categories_scalable_cs-mouse.svg \ hicolor_categories_scalable_cs-network.svg \ hicolor_categories_scalable_cs-notifications.svg \ hicolor_categories_scalable_cs-overview.svg \ hicolor_categories_scalable_cs-online-accounts.svg \ hicolor_categories_scalable_cs-panel.svg \ hicolor_categories_scalable_cs-power.svg \ hicolor_categories_scalable_cs-printer.svg \ hicolor_categories_scalable_cs-privacy.svg \ hicolor_categories_scalable_cs-region.svg \ hicolor_categories_scalable_cs-screensaver.svg \ hicolor_categories_scalable_cs-screen.svg \ hicolor_categories_scalable_cs-sound.svg \ hicolor_categories_scalable_cs-sources.svg \ hicolor_categories_scalable_cs-startup-programs.svg \ hicolor_categories_scalable_cs-tablet.svg \ hicolor_categories_scalable_cs-themes.svg \ hicolor_categories_scalable_cs-tiling.svg \ hicolor_categories_scalable_cs-universal-access.svg \ hicolor_categories_scalable_cs-user-accounts.svg \ hicolor_categories_scalable_cs-user.svg \ hicolor_categories_scalable_cs-windows.svg \ hicolor_categories_scalable_cs-workspaces.svg \ hicolor_emblems_scalable_cs-xlet-error.svg \ hicolor_emblems_scalable_cs-xlet-installed.svg \ hicolor_emblems_scalable_cs-xlet-running.svg \ hicolor_emblems_scalable_cs-xlet-system.svg \ hicolor_emblems_scalable_cs-xlet-update.svg \ hicolor_emblems_scalable_cs-xlet-danger.svg \ hicolor_devices_scalable_audio-speaker-left.svg \ hicolor_devices_scalable_audio-speaker-center.svg \ hicolor_devices_scalable_audio-speaker-right.svg \ hicolor_devices_scalable_audio-speaker-left-back.svg \ hicolor_devices_scalable_audio-speaker-center-back.svg \ hicolor_devices_scalable_audio-speaker-right-back.svg \ hicolor_devices_scalable_audio-speaker-left-side.svg \ hicolor_devices_scalable_audio-speaker-right-side.svg \ hicolor_devices_scalable_audio-subwoofer.svg \ hicolor_devices_scalable_bluetooth.svg \ hicolor_devices_scalable_cpu-symbolic.svg \ $(NULL) EXTRA_DIST = \ $(public_icons) \ $(NULL) ############################################################################### gtk_update_icon_cache = gtk-update-icon-cache -f -t update-icon-cache: @-if test -z "$(DESTDIR)"; then \ echo "Updating Gtk icon cache."; \ for theme in $(public_icons_themes); do \ $(gtk_update_icon_cache) $(datadir)/icons/$$theme; \ done; \ else \ echo "*** Icon cache not updated. After (un)install, run this:"; \ for theme in $(public_icons_themes); do \ echo "*** $(gtk_update_icon_cache) $(datadir)/icons/$$theme"; \ done; \ fi install-icons: for icon in $(public_icons); do \ THEME=`echo $$icon | cut -d_ -f1`; \ CONTEXT=`echo $$icon | cut -d_ -f2`; \ SIZE=`echo $$icon | cut -d_ -f3`; \ ICONFILE=`echo $$icon | cut -d_ -f4`; \ mkdir -p $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT; \ $(INSTALL_DATA) $(srcdir)/$$icon $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \ done; \ for icon in $(private_icons); do \ THEME=`echo $$icon | cut -d_ -f1`; \ CONTEXT=`echo $$icon | cut -d_ -f2`; \ SIZE=`echo $$icon | cut -d_ -f3`; \ ICONFILE=`echo $$icon | cut -d_ -f4`; \ mkdir -p $(DESTDIR)$(pkgdatadir)/icons/$$THEME/$$SIZE/$$CONTEXT; \ $(INSTALL_DATA) $(srcdir)/$$icon $(DESTDIR)$(pkgdatadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \ done uninstall-icons: -for icon in $(public_icons); do \ THEME=`echo $$icon | cut -d_ -f1`; \ CONTEXT=`echo $$icon | cut -d_ -f2`; \ SIZE=`echo $$icon | cut -d_ -f3`; \ ICONFILE=`echo $$icon | cut -d_ -f4`; \ rm -f $(DESTDIR)$(datadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \ done; \ for icon in $(private_icons); do \ THEME=`echo $$icon | cut -d_ -f1`; \ CONTEXT=`echo $$icon | cut -d_ -f2`; \ SIZE=`echo $$icon | cut -d_ -f3`; \ ICONFILE=`echo $$icon | cut -d_ -f4`; \ rm -f $(DESTDIR)$(pkgdatadir)/icons/$$THEME/$$SIZE/$$CONTEXT/$$ICONFILE; \ done install-data-local: install-icons update-icon-cache uninstall-local: uninstall-icons update-icon-cache cinnamon-4.4.8/data/icons/hicolor_actions_scalable_caps-lock-off-symbolic.svg000066400000000000000000000052731360505115200274330ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-4.4.8/data/icons/hicolor_actions_scalable_caps-lock-symbolic.svg000066400000000000000000000052071360505115200266600ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-4.4.8/data/icons/hicolor_actions_scalable_list-edit-symbolic.svg000066400000000000000000000062041360505115200267000ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-4.4.8/data/icons/hicolor_actions_scalable_num-lock-off-symbolic.svg000066400000000000000000000052501360505115200272770ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-4.4.8/data/icons/hicolor_actions_scalable_num-lock-symbolic.svg000066400000000000000000000051601360505115200265270ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-4.4.8/data/icons/hicolor_actions_scalable_pan-down-symbolic.svg000066400000000000000000000070011360505115200265210ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-4.4.8/data/icons/hicolor_actions_scalable_pan-end-symbolic-rtl.svg000066400000000000000000000067001360505115200271240ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-4.4.8/data/icons/hicolor_actions_scalable_pan-end-symbolic.svg000066400000000000000000000066761360505115200263410ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-4.4.8/data/icons/hicolor_actions_scalable_pan-start-symbolic-rtl.svg000066400000000000000000000066761360505115200275270ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-4.4.8/data/icons/hicolor_actions_scalable_pan-start-symbolic.svg000066400000000000000000000067001360505115200267140ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-4.4.8/data/icons/hicolor_actions_scalable_pan-up-symbolic.svg000066400000000000000000000067741360505115200262160ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-4.4.8/data/icons/hicolor_apps_scalable_cinnamon-panel-launcher.svg000066400000000000000000001146341360505115200271730ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_apps_scalable_removable-drives.svg000066400000000000000000000511671360505115200257440ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-applets.svg000066400000000000000000001720241360505115200257270ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-backgrounds-symbolic.svg000066400000000000000000000055451360505115200304030ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-backgrounds.svg000066400000000000000000001205501360505115200265560ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-bluetooth.svg000066400000000000000000000237631360505115200262710ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-cat-admin.svg000066400000000000000000000466751360505115200261300ustar00rootroot00000000000000 image/svg+xml $ cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-cat-appearance.svg000066400000000000000000000241561360505115200271250ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-cat-hardware.svg000066400000000000000000000773031360505115200266250ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-cat-prefs.svg000066400000000000000000000347171360505115200261510ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-color.svg000066400000000000000000000466411360505115200254020ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-date-time.svg000066400000000000000000001277601360505115200261370ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-default-applications.svg000066400000000000000000001144051360505115200303660ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-desklets-symbolic.svg000066400000000000000000000041521360505115200277100ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-desklets.svg000066400000000000000000000447031360505115200260770ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-desktop-effects.svg000066400000000000000000000722001360505115200273400ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-desktop.svg000066400000000000000000000102341360505115200257220ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-details.svg000066400000000000000000001324511360505115200257040ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-display.svg000066400000000000000000000243601360505115200257230ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-drivers.svg000066400000000000000000001146641360505115200257430ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-extensions.svg000066400000000000000000000407341360505115200264600ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-firewall.svg000066400000000000000000001546701360505115200260730ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-fonts.svg000066400000000000000000000203601360505115200254030ustar00rootroot00000000000000 A cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-general.svg000066400000000000000000000433001360505115200256660ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-input-method.svg000066400000000000000000002232731360505115200266770ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-keyboard.svg000066400000000000000000001103051360505115200260510ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-language.svg000066400000000000000000001626701360505115200260500ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-login.svg000066400000000000000000000551341360505115200253710ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-mouse.svg000066400000000000000000000277701360505115200254160ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-network.svg000066400000000000000000000272111360505115200257450ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-notifications.svg000066400000000000000000002153751360505115200271370ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-online-accounts.svg000066400000000000000000000704171360505115200273630ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-overview.svg000066400000000000000000000415551360505115200261310ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-panel.svg000066400000000000000000000110741360505115200253530ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-power.svg000066400000000000000000000304511360505115200254100ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-printer.svg000066400000000000000000006574471360505115200257630ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-privacy.svg000066400000000000000000002351251360505115200257360ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-region.svg000066400000000000000000002114601360505115200255400ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-screen.svg000066400000000000000000000057511360505115200255400ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-screensaver.svg000066400000000000000000000660531360505115200266030ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-sound.svg000066400000000000000000000353551360505115200254140ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-sources.svg000066400000000000000000000541301360505115200257370ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-startup-programs.svg000066400000000000000000005077351360505115200276240ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-tablet.svg000066400000000000000000002213751360505115200255360ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-themes.svg000066400000000000000000001254301360505115200255430ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-tiling.svg000066400000000000000000000377271360505115200255570ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-universal-access.svg000066400000000000000000000247511360505115200275310ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-user-accounts.svg000066400000000000000000001034101360505115200270430ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-user.svg000066400000000000000000000667241360505115200252460ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-windows.svg000066400000000000000000001145701360505115200257530ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_categories_scalable_cs-workspaces.svg000066400000000000000000000331541360505115200264400ustar00rootroot00000000000000 cinnamon-4.4.8/data/icons/hicolor_devices_scalable_audio-speaker-center-back.svg000066400000000000000000000451401360505115200300540ustar00rootroot00000000000000 image/svg+xml audio device speaker output center audio-speaker-center Evangeline McGlynn cinnamon-4.4.8/data/icons/hicolor_devices_scalable_audio-speaker-center.svg000066400000000000000000000465111360505115200271610ustar00rootroot00000000000000 image/svg+xml audio device speaker output center audio-speaker-center Evangeline McGlynn cinnamon-4.4.8/data/icons/hicolor_devices_scalable_audio-speaker-left-back.svg000066400000000000000000000465651360505115200275420ustar00rootroot00000000000000 image/svg+xml audio device speaker output left-back audio-speaker-left-back Evangeline McGlynn cinnamon-4.4.8/data/icons/hicolor_devices_scalable_audio-speaker-left-side.svg000066400000000000000000000465331360505115200275610ustar00rootroot00000000000000 image/svg+xml audio device speaker output left-side audio-speaker-left-side Evangeline McGlynn cinnamon-4.4.8/data/icons/hicolor_devices_scalable_audio-speaker-left.svg000066400000000000000000000465461360505115200266430ustar00rootroot00000000000000 image/svg+xml audio device speaker output left audio-speaker-left Evangeline McGlynn cinnamon-4.4.8/data/icons/hicolor_devices_scalable_audio-speaker-right-back.svg000066400000000000000000000465751360505115200277260ustar00rootroot00000000000000 image/svg+xml audio device speaker output right-back audio-speaker-right-back Evangeline McGlynn cinnamon-4.4.8/data/icons/hicolor_devices_scalable_audio-speaker-right-side.svg000066400000000000000000000465351360505115200277460ustar00rootroot00000000000000 image/svg+xml audio device speaker output right-side audio-speaker-right-side Evangeline McGlynn cinnamon-4.4.8/data/icons/hicolor_devices_scalable_audio-speaker-right.svg000066400000000000000000000465431360505115200270230ustar00rootroot00000000000000 image/svg+xml audio device speaker output right audio-speaker-right Evangeline McGlynn cinnamon-4.4.8/data/icons/hicolor_devices_scalable_audio-subwoofer.svg000066400000000000000000000335311360505115200262620ustar00rootroot00000000000000 image/svg+xml audio device subwoofer output audio-subwoofer Evangeline McGlynn cinnamon-4.4.8/data/icons/hicolor_devices_scalable_bluetooth.svg000066400000000000000000000345311360505115200251560ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_devices_scalable_cpu-symbolic.svg000066400000000000000000000121351360505115200255530ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-4.4.8/data/icons/hicolor_emblems_scalable_cs-xlet-danger.svg000066400000000000000000000434651360505115200257760ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_emblems_scalable_cs-xlet-error.svg000066400000000000000000000316001360505115200256530ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_emblems_scalable_cs-xlet-installed.svg000066400000000000000000000376611360505115200265160ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_emblems_scalable_cs-xlet-running.svg000066400000000000000000000315301360505115200262040ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_emblems_scalable_cs-xlet-system.svg000066400000000000000000000456631360505115200260640ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/icons/hicolor_emblems_scalable_cs-xlet-update.svg000066400000000000000000000361541360505115200260150ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/org.cinnamon.gschema.xml.in000066400000000000000000001122521360505115200213700ustar00rootroot00000000000000 true <_summary> Enable internal tools useful for developers and testers from Alt-F2 <_description> Allows access to internal debugging and monitoring tools using the Alt-F2 dialog. [] <_summary>Uuids of extensions to enable <_description> 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 Timestamp of last cache refresh The timestamp of the last time the index cache was updated from the spices website ['panel1:left:0:menu@cinnamon.org', 'panel1:left:1:show-desktop@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:network@cinnamon.org', 'panel1:right:7:sound@cinnamon.org', 'panel1:right:8:power@cinnamon.org', 'panel1:right:9:calendar@cinnamon.org'] <_summary>Uuids of applets to enable <_description> Cinnamon applets have a uuid property; this key lists applets which should be loaded. Append ! in front of uuid to override version check. 0 Timestamp of last cache refresh The timestamp of the last time the index cache was updated from the spices website 0 The next applet id to give the next added applet Do not change manually. 0 <_summary>The next desklet id to give the next added desklet <_description>Do not change manually. [] <_summary>Uuids of desklets to enable <_description> 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 Timestamp of last cache refresh The timestamp of the last time the index cache was updated from the spices website [] <_summary>Uuids of search providers to enable <_description> Cinnamon search providers have a uuid property; this key lists search providers which should be loaded. true <_summary> Whether desklets "snap" to a grid position <_description> Enabling this allows desklets' position to be snapped into a regular grid 25 <_summary>The interval between each possible grid position when desklets "snap" <_description>If desklet-snap is enabled, the possible positions of desklets will be all integer multiples of the value of "desklet-snap-size" ['1:0:bottom'] <_summary>List of panels used <_description> 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'] <_summary>Auto-hide panel <_description> 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'] <_summary>Panel size <_description> 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}]' <_summary>Per-zone fullcolor icon-size configuration <_description> Panel zone configuration objects for fullcolor icon size. '[{"panelId": 1, "left": 28, "center": 28, "right": 16}]' <_summary>Per-zone symbolic icon-size configuration <_description> 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}]' <_summary>Per-zone text-size configuration, values in point <_description> Panel zone configuration objects for text, values are expressed as points. Setting to 0.0 will give control to the theme. false <_summary>(Deprecated) Scale panel applet text and icons <_description> (Deprecated) Retained to avoid applets who read the property from crashing Cinnamon true <_summary>Enable desktop effects <_description> Whether to enable desktop effects and window animations. true <_summary>Enable desktop effects on dialog boxes <_description> Whether to enable desktop effects on dialog boxes. true <_summary>Enable desktop effects on Gtk menus <_description> Whether to enable desktop effects on Gtk menus. "cinnamon" <_summary>The style of desktop effects <_description> An overall style used for desktop effects. This key should not be edited directly. "traditional" <_summary>Effect used when closing windows <_description> An effect: scale, fade, traditional, none "easeOutQuad" <_summary>Transition used when closing windows <_description> A Tweener transition 120 <_summary>Duration of the effect (in milliseconds) <_description> Duration of the effect (in milliseconds) "traditional" <_summary>Effect used when mapping windows <_description> An effect: scale, fade, traditional, none "easeOutQuad" <_summary>Transition used when mapping windows <_description> A Tweener transition 100 <_summary>Duration of the effect (in milliseconds) <_description> Duration of the effect (in milliseconds) "traditional" <_summary>Effect used when minimizing windows <_description> An effect: traditional, scale, fade, traditional, none "easeInQuad" <_summary>Transition used when minimizing windows <_description> A Tweener transition 160 <_summary>Duration of the effect (in milliseconds) <_description> Duration of the effect (in milliseconds) "none" <_summary>Effect used when maximizing windows <_description> An effect: none "easeInExpo" <_summary>Transition used when maximizing windows <_description> A Tweener transition 100 <_summary>Duration of the effect (in milliseconds) <_description> Duration of the effect (in milliseconds) "none" <_summary>Effect used when unmaximizing windows <_description> An effect: none "easeNone" <_summary>Transition used when unmaximizing windows <_description> A Tweener transition 100 <_summary>Duration of the effect (in milliseconds) <_description> Duration of the effect (in milliseconds) "none" <_summary>Effect used when maximizing windows <_description> An effect: none "easeInQuad" <_summary>Transition used when maximizing windows <_description> A Tweener transition 100 <_summary>Duration of the effect (in milliseconds) <_description> Duration of the effect (in milliseconds) true <_summary>Whether the startup animation is enabled <_description> Whether the startup animation is enabled [] <_summary>Aliases given to battery powered fardware devices <_description> "" <_summary>(Deprecated) Layout style <_description> (Deprecated) Layout styles - pre-2.6 "YYYY-MM-DD" <_summary>Date format <_description> Format used for dates. 0 <_summary>(Deprecated) Number of workspaces <_description>(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"] <_summary>Obsolete - unused <_description>Obsolete - unused ['expo:false:0', 'scale:false:0', 'scale:false:0', 'desktop:false:0'] <_summary>Properties of hotcorners <_description>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. ["DEPRECATED"] <_summary>Obsolete - unused <_description>Obsolete - unused true <_summary>Whether to collect stats about applications usage <_description> 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. [ 'firefox.desktop', 'mintinstall.desktop', 'cinnamon-settings.desktop', 'hexchat.desktop', 'org.gnome.Terminal.desktop', 'nemo.desktop' ] <_summary>List of desktop file IDs for favorite applications <_description> The applications corresponding to these identifiers will be displayed in the favorites area. ['DEPRECATED'] <_summary>(Deprecated) List of non-default workspace names <_description> (Deprecated) The user-set names of the workspaces. Deprecated since 2.6. Use org.cinnamon.desktop.wm.preferences workspace-names instead. 400 <_summary>Duration of Workspace OSD (in milliseconds) <_description> Duration of the OSD (in milliseconds) 50 <_summary>Workspace horizontal position (in percent of the monitor's width) <_description> Workspace horizontal position (in percent of the monitor's width) 50 <_summary>Workspace vertical position (in percent of the monitor's height) <_description> Workspace vertical position (in percent of the monitor's height) true <_summary>Enable or disable the workspace OSD <_description> 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. [] <_summary>disabled OpenSearch providers [] <_summary>History for command (Alt-F2) dialog [] <_summary>History for the looking glass dialog 1 <_summary> 0 <_summary> false <_summary>Whether to omit pointer barriers between adjacent panels. false <_summary>Panel edit mode <_description>A mode for the user to drag and drop applets and modify the look of the desktop true <_summary>Obsolete "icons+thumbnails" <_summary>ALT-tab switcher style <_description> Controls the style of the ALT-tab window switcher. Can be any combination of "icons", "preview" and "thumbnails", separated by "+". false <_summary>Enforce displaying the alt-tab switcher on the primary monitor instead of the active one false Move minimized windows to the end of the appSwitcher 100 <_summary>Duration of the effect (in milliseconds) <_description>Duration of the effect (in milliseconds) false <_summary>Show all windows from all workspaces false Brings windows requiring attention to the current workspace When enabled, if a window requires attention, it is brought to the current workspace. false Prevents windows that request user attention from stealing focus When enabled, even if a window requires attention, it is not activated. 1 <_summary>The decoration level of the desklets <_description>The amount of decoration desklets must have. 0 = None; 1 = Borders; 2 = Borders and header; false <_summary>Whether edge flip is enabled 1000 Duration of the delay before switching the workspace Duration of the delay (in milliseconds) false <_summary>Whether advanced mode is enabled in cinnamon-settings true <_summary>Whether or not to show possible completions in the run dialog (Alt-F2) [] <_summary>Aliases for the Alt-F2 dialog <_description>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. "medium" <_summary>Whether the media keys osd is disabled or its relative display size <_description> Allows setting of the default size of the media keys osd or disables it completely. Possible values are "small", "medium", "large", or "disabled". "" <_summary>The logo to use in the startup animation <_description> 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. true <_summary>Enable the fade effect in Cinnamon scrollviews <_description> Whether the vfade effect is enabled or not true <_summary>Show the tile/snap OSD <_description> Hide the snap OSD. true <_summary>Show the tile HUD <_description> Hide the tile HUD. 1 Utility read-only setting used by st library Current scale factor false <_summary>Enable support for indicators <_description> Whether to support indicators ["skype", "viber", "quassel", "retroshare", "psi-plus", "kadu", "pidgin"] <_summary>WM class names to skip processing for in windowAttentionHandler.js "cinnamon-symbolic" <_summary>The default icon name of the application menu <_description> Controls the default icon name used by the application menu. "" <_summary>The default label of the application menu <_description> Controls the default label used by the application menu. "" <_summary>Theme name <_description> The name of the theme 0 Timestamp of last cache refresh The timestamp of the last time the index cache was updated from the spices website 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' <_summary>Which keyboard to use <_description> The type of keyboard to use. 'on-demand' <_summary>How the keyboard becomes activated <_description> 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 <_summary>The size of the keyboard. Set this value to X for the keyboard to take 1/x of the screen. <_description> The size of the keyboard. Set this value to X for the keyboard to take 1/x of the screen. 'top' <_summary>Keyboard position <_description> Keyboard position. 15 <_summary>Framerate used for recording screencasts. <_description> The framerate of the resulting screencast recordered by Cinnamon's screencast recorder in frames-per-second. '' <_summary>The gstreamer pipeline used to encode the screencast <_description> 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' <_summary>File extension used for storing the screencast <_description> 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. [] <_summary>Desktop files of the applications to be shown on desktop <_description> 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. [] <_summary>deprecated - moved to org.cinnamon.desktop.keybindings '' <_summary>deprecated - moved to org.cinnamon.desktop.keybindings '' <_summary>deprecated - moved to org.cinnamon.desktop.keybindings '' <_summary>deprecated - moved to org.cinnamon.desktop.keybindings cinnamon-4.4.8/data/search_providers/000077500000000000000000000000001360505115200176025ustar00rootroot00000000000000cinnamon-4.4.8/data/search_providers/google.xml000066400000000000000000000025151360505115200216030ustar00rootroot00000000000000 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-4.4.8/data/search_providers/wikipedia.xml000066400000000000000000000044111360505115200222720ustar00rootroot00000000000000 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-4.4.8/data/theme/000077500000000000000000000000001360505115200153425ustar00rootroot00000000000000cinnamon-4.4.8/data/theme/add-workspace-hover.png000066400000000000000000000007321360505115200217170ustar00rootroot00000000000000PNG  IHDR#SIDATx^۱JAYL4ca/ b`6Z+v Inw# Df⃟c ZA)8@8/m&b&BY`E0cAu[D X# ‹h<a _f-3W3w.: F1bؐi0 #F1bhI#F1b _i@N0 ~qf(ꑱ!`F&&m7)wmcD1ick\1I6T9O:PRU1E>ceb}J1bĈ#FeĈ#F1ӯs.my{FQ|&hƿSQkcΧ֟n\f2MIENDB`cinnamon-4.4.8/data/theme/calendar-arrow-left.svg000066400000000000000000000003631360505115200217160ustar00rootroot00000000000000 cinnamon-4.4.8/data/theme/calendar-arrow-right.svg000066400000000000000000000003601360505115200220760ustar00rootroot00000000000000 cinnamon-4.4.8/data/theme/calendar-today.svg000066400000000000000000000012131360505115200207470ustar00rootroot00000000000000 cinnamon-4.4.8/data/theme/checkbox-off.svg000066400000000000000000000054061360505115200204260ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/theme/checkbox.svg000066400000000000000000000061461360505115200176600ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/theme/cinnamon.css000066400000000000000000001347151360505115200176710ustar00rootroot00000000000000/* ################################################################### * Section common with Gnome Shell * ... contains a few cinnamon specific styles (rare occurrences) * ###################################################################*/ stage { font-family: sans, sans-serif; } .cinnamon-link { color: #0000ff; text-decoration: underline; } .cinnamon-link:hover { color: #0000e0; } .label-shadow { color: rgba(0,0,0,0.5); } StScrollBar { padding: 0px; } StScrollView.vfade { -st-vfade-offset: 68px; } StScrollView StScrollBar { min-width: 16px; min-height: 16px; } StScrollBar StBin#trough { background-color: rgba(0,0,0,0); border: 1px solid #555555; border-radius: 4px; } StScrollBar StButton#vhandle { background-image: url("scroll-vhandle.svg"); background-color: rgba(204,204,204,0.3); border: 1px solid #555555; border-radius: 4px; } StScrollBar StButton#hhandle { background-image: url("scroll-hhandle.svg"); background-color: rgba(204,204,204,0.3); border: 1px solid #555555; border-radius: 4px; } StScrollBar StButton#hhandle:hover, StScrollBar StButton#vhandle:hover { background-color: rgba(204,204,204,0.5); } .separator { -gradient-height: 2px; -gradient-start: rgba(85,85,85,1); -gradient-end: #555555; -margin-horizontal: 1.5em; height: 1em; } .slider { height: 1em; min-width: 15em; -slider-height: 0.3em; -slider-background-color: #666666; -slider-border-color: #555555; -slider-active-background-color: #CCCCCC; -slider-active-border-color: #DDDDDD; -slider-border-width: 1px; -slider-handle-radius: 0.5em; } #Tooltip { border: 1px solid rgba(212,185,67,1.0); border-radius: 4px; padding: 2px 12px; background-gradient-end: rgba(251,234,159,0.9); background-gradient-start: rgba(254,245,198,0.9); background-gradient-direction: vertical; color: #000000; font-size: 8.5pt; font-weight: normal; text-align: center; } /* =================================================================== * Shared button properties * ===================================================================*/ .notification-button, .notification-icon-button, .modal-dialog-button, .sound-player-overlay StButton { color: white; border: 1px solid #8b8b8b; background-gradient-direction: vertical; background-gradient-start: rgba(255, 255, 255, 0.2); background-gradient-end: rgba(255, 255, 255, 0); } .notification-button:hover, .notification-icon-button:hover, .modal-dialog-button:hover, .sound-player-overlay StButton:hover { background-gradient-start: rgba(255, 255, 255, 0.3); background-gradient-end: rgba(255, 255, 255, 0.1); } .notification-button:focus, .notification-icon-button:focus, .modal-dialog-button:focus, .sound-player-overlay StButton:focus { border: 2px solid #8b8b8b; } .notification-button:active, .notification-icon-button:active, .modal-dialog-button:active, .modal-dialog-button:pressed, .sound-player-overlay StButton:active { background-gradient-start: rgba(255, 255, 255, 0); background-gradient-end: rgba(255, 255, 255, 0.2); } /* =================================================================== * PopupMenu (popupMenu.js) * ===================================================================*/ /* .popup-menu-boxpointer and .popup-menu are kept for compatibility with cinnamon version under 3.2. Use .menu in version 3.2 and above */ .popup-menu-boxpointer { -arrow-border-radius: 8px; -arrow-background-color: rgba(80,80,80,0.9); -arrow-border-width: 2px; -arrow-border-color: #a5a5a5; -arrow-base: 24px; -arrow-rise: 11px; } .popup-menu { color: #ffffff; font-size: 9.5pt; min-width: 100px; } .menu { border-radius: 8px; background-color: rgba(80,80,80,0.9); border-width: 2px; border-color: #a5a5a5; color: #ffffff; font-size: 9.5pt; min-width: 100px; } .popup-menu-arrow { icon-size: 1.14em; } .popup-submenu-menu-item:open { background-color: #4c4c4c; } .popup-sub-menu { background-gradient-start: rgba(80,80,80,0.3); background-gradient-end: rgba(80,80,80,0.7); background-gradient-direction: vertical; } .popup-sub-menu .popup-menu-item:ltr { padding-right: 1.75em; } .popup-sub-menu .popup-menu-item:rtl { padding-left: 1.75em; } .popup-sub-menu StScrollBar { padding: 4px; } .popup-sub-menu StScrollBar StBin#trough { border-width: 0px; } .popup-sub-menu StScrollBar StBin#vhandle { background-color: #4c4c4c; border-width: 0px; } .popup-combo-menu { background-color: rgba(0,0,0,0.9); padding: 1em 0em; color: #ffffff; font-size: 10.5pt; border: 1px solid #5f5f5f; border-radius: 9px; } /* The remaining popup-menu sizing is all done in ems, so that if you * override .popup-menu.font-size, everything else will scale with it. */ .popup-menu-content { padding: 1em 0em; } .popup-menu-item { padding: .4em 1.75em; spacing: 1em; } .popup-menu-item:active { background-color: #4c4c4c; } .popup-menu-item:insensitive { color: #9f9f9f; } .popup-image-menu-item { } .popup-combobox-item { spacing: 1em; } .popup-separator-menu-item { -gradient-height: 2px; -gradient-start: rgba(85,85,85,1); -gradient-end: #555555; -margin-horizontal: 1.5em; height: 1em; } .popup-alternating-menu-item:alternate { font-weight: bold; } .popup-slider-menu-item { height: 1em; min-width: 15em; -slider-height: 0.3em; -slider-background-color: #666666; -slider-border-color: #555555; -slider-active-background-color: #CCCCCC; -slider-active-border-color: #DDDDDD; -slider-border-width: 1px; -slider-handle-radius: 0.5em; } .popup-device-menu-item { spacing: .5em; } .popup-inactive-menu-item { font-weight: normal; color: #999; } .popup-subtitle-menu-item { font-weight: bold; } .popup-menu-icon { icon-size: 1.14em; } /* Switches (to be used in menus) */ .toggle-switch { width: 64px; height: 22px; } .toggle-switch-us { background-image: url("toggle-off-us.svg"); } .toggle-switch-us:checked { background-image: url("toggle-on-us.svg"); } .toggle-switch-intl { background-image: url("toggle-off-intl.svg"); } .toggle-switch-intl:checked { background-image: url("toggle-on-intl.svg"); } .nm-menu-item-icons { spacing: .5em; } /* =================================================================== * Panel (panel.js) * ===================================================================*/ #panel { color: #ffffff; background-color: #555555; font-size: 8.5pt; font-weight: normal; height: 26px; width: 32px; } #panel:highlight { background-color: #aa5555; } .panel-dummy { background-color: rgba(50, 50, 50, 0.4); } .panel-dummy:entered { background-color: rgba(255, 35, 35, 0.4); } .panelLeft { spacing: 4px; } .panelCenter { spacing: 4px; } .panelRight { spacing: 4px; } .panelLeft:dnd { background-gradient-direction: vertical; background-gradient-start: rgba(255,0,0,0.05); background-gradient-end: rgba(255,0,0,0.2); } .panelCenter:dnd { background-gradient-direction: vertical; background-gradient-start: rgba(0,255,0,0.05); background-gradient-end: rgba(0,255,0,0.2); } .panelRight:dnd { background-gradient-direction: vertical; background-gradient-start: rgba(0,0,255,0.05); background-gradient-end: rgba(0,0,255,0.2); } .panelLeft:ltr { padding-right: 4px; } .panelLeft:rtl { padding-left: 4px; } .panelRight:ltr { padding-left: 0px; spacing: 0px; } .panelRight:rtl { padding-right: 0px; spacing: 0px; } .panelLeft.vertical { padding: 0px; } .panelRight.vertical { padding: 0px; } .panelCenter.vertical { padding-left: 0px; padding-right: 0px; } .panelLeft.vertical:dnd { } .panelCenter.vertical:dnd { } .panelRight.vertical:dnd { } .panel-top { } .panel-bottom { } .panel-left { } .panel-right { } .panel-status-button { border: 0px solid #8b8b8b; -natural-hpadding: 3px; -minimum-hpadding: 3px; font-weight: bold; color: #ccc; height: 22px; } .panel-status-button:hover { color: white; } .system-status-icon { padding-left: 0px; padding-right: 0px; spacing: 0px; margin: 0px; } .system-status-icon.warning { color: #e5e887; } .system-status-icon.error { color: #fb5858; } .panel-corner { -panel-corner-radius: 0px; -panel-corner-background-color: black; -panel-corner-inner-border-width: 2px; -panel-corner-inner-border-color: transparent; -panel-corner-outer-border-width: 1px; -panel-corner-outer-border-color: #536272; } .panel-corner:active, .panel-corner:overview, .panel-corner:focus { -panel-corner-inner-border-color: rgba(255,255,255,0.8); } .panel-button #appMenuIcon { app-icon-bottom-clip: 1px; } .panel-button:active #appMenuIcon, .panel-button:checked #appMenuIcon, .panel-button:focus #appMenuIcon { app-icon-bottom-clip: 2px; } .panel-button { -natural-hpadding: 6px; -minimum-hpadding: 2px; font-weight: bold; color: #ccc; transition-duration: 100; } .panel-button:hover { color: white; text-shadow: black 0px 2px 2px; } .panel-button:active, .panel-button:overview, .panel-button:focus { } .panel-button:active > .system-status-icon, .panel-button:checked > .system-status-icon, .panel-button:focus > .system-status-icon { icon-shadow: black 0px 2px 2px; } .panel-menu { -boxpointer-gap: 4px; } .popup-menu-item-dot { } .system-status-icon { icon-size: 1.14em; } /* =================================================================== * Overview * ===================================================================*/ #overview { spacing: 12px; } .workspace-controls { visible-height: 32px; /* Amount visible before hovering */ } .workspace-thumbnails-background { border: 1px solid rgba(128, 128, 128, 0.4); border-right: 0px; border-radius: 9px 9px 0px 0px; background-color: rgba(0, 0, 0, 0.5); padding: 8px; } .workspace-thumbnails-background:rtl { border-right: 1px; border-left: 0px; border-radius: 9px 9px 0px 0px; } .workspace-thumbnails { spacing: 14px; } .workspace-add-button { background-image: url("add-workspace.png"); height: 200px; width: 35px; transition-duration: 300; } .workspace-add-button:hover { background-image: url("add-workspace-hover.png"); transition-duration: 300; } .workspace-close-button { background-image: url("close-window.svg"); height: 34px; width: 34px; -cinnamon-close-overlap: 20px; } .workspace-thumbnail-indicator { outline: 2px solid white; border: 1px solid #888; } .window-caption { background: rgba(85,85,85,0.8); border: 2px solid #a5a5a5; border-radius: 4px; padding: .5em; spacing: .5em; -cinnamon-caption-spacing: 8px; font-size: 10pt; color: #ccc; max-width: 20em; } .window-caption:focus { color: #fff; } .window-border { border: 3px #a5a5a5; border-radius: 4px; background-color: rgba(255,255,255,.05); /* Cover rounded corners and some bad adjustment gaps */ box-shadow: 0 0 0 1px #a5a5a5 inset; } .window-close { background-image: url("close-window.svg"); height: 28px; width: 28px; -cinnamon-close-overlap: 13px; } .window-close:hover { background-image: url("close-window-hover.svg"); } .window-close-area { background-image: url("trash-icon.png"); background-size: 100px; background-color: rgba(60, 60, 60, 0.8); border: 4px solid rgba(128,128,128,0.8); border-bottom-width: 0px; border-radius: 20px 20px 0px 0px; height: 120px; width: 400px; } .overview-icon { border-radius: 4px; padding: 3px; border: 1px rgba(0,0,0,0); font-size: 7.5pt; color: white; transition-duration: 100; text-align: center; } .overview-empty-placeholder { color: #ffffff; font-size: 2em; } .expo-background { background-gradient-start: #000; background-gradient-end: #AAA; background-gradient-direction: vertical; } .workspace-overview-background-shade { background-color: rgba(0,0,0,0.4); } .expo-workspace-thumbnail-frame { border: 1px, rgba(64,64,64,0.9); background-color: rgba(64,64,64,0.9); } .expo-workspace-thumbnail-frame#active { border: 2px, rgba(32,32,32,0.9); background-color: rgba(32,32,32,0.9); } /* =================================================================== * Looking Glass * ===================================================================*/ #LookingGlassDialog { background-color: rgba(85,85,85,0.85); spacing: 4px; padding: 4px; border: 2px solid grey; border-radius: 4px; color: #CCCCCC; } /* =================================================================== * Date applet * ===================================================================*/ /*calendar-background allows the date applet calendar to be themed separately from other applet menus*/ .calendar-background { } .calendar { padding: .4em 1.75em; spacing-rows: 0px; spacing-columns: 0px; } .calendar-month-label { color: #cccccc; font-size: 7.5pt; padding-bottom: 8px; padding-top: 8px; font-weight: bold; } .calendar-change-month-back { width: 18px; height: 12px; background-image: url("calendar-arrow-left.svg"); border-radius: 4px; } .calendar-change-month-back:rtl { background-image: url("calendar-arrow-right.svg"); } .calendar-change-month-back:hover { background-color: #999999; } .calendar-change-month-back:active { background-color: #aaaaaa; } .calendar-change-month-forward { width: 18px; height: 12px; background-image: url("calendar-arrow-right.svg"); border-radius: 4px; } .calendar-change-month-forward:rtl { background-image: url("calendar-arrow-left.svg"); } .calendar-change-month-forward:hover { background-color: #999999; } .calendar-change-month-forward:active { background-color: #aaaaaa; } .datemenu-date-label { padding: .4em 1.75em; font-size: 10.5pt; color: #cccccc; font-weight: bold; } .calendar-day-base { font-size: 7.5pt; text-align: center; width: 2.4em; height: 2.4em; } .calendar-day-base:hover { background-color: #777777; color: #fff; } .calendar-day-base:active { background-color: #555555; } .calendar-day-heading { color: #cccccc; padding-top: 1em; } .calendar-week-number { color: #cccccc; font-weight: bold; } /* Hack used in lieu of border-collapse - see calendar.js */ .calendar-day:ltr { border: 1px solid #333333; color: #cccccc; border-top-width: 0; border-left-width: 0; } .calendar-day-top:ltr { border-top-width: 1px; } .calendar-day-left:ltr { border-left-width: 1px; } .calendar-day:rtl { border: 1px solid #333333; color: #cccccc; border-top-width: 0; border-right-width: 0; } .calendar-day-top:rtl { border-top-width: 1px; } .calendar-day-left:rtl { border-right-width: 1px; } .calendar-work-day { } .calendar-nonwork-day { background-color: rgba(128, 128, 128, 0.1); } .calendar-today { background-image: url("calendar-today.svg"); text-shadow: black 0px 2px 2px; color: #ffffff; font-weight: bold; } .calendar-other-month-day { color: #888888; background-color: rgba(64, 64, 64, 0.5); } .calendar-day-with-events { font-weight: bold; color: #cccccc; } /* =================================================================== * Notifications * ===================================================================*/ #notification { font-size: 8.5pt; border-radius: 8px 8px 8px 8px; border: 2px solid #a5a5a5; background-gradient-direction: vertical; background-gradient-start: rgba(85,85,85,0.8); background-gradient-end: rgba(85,85,85,0.8); padding: 8px 8px 8px 8px; spacing-rows: 10px; spacing-columns: 10px; margin-from-right-edge-of-screen: 20px; width: 34em; color: white; } #notification.multi-line-notification { padding-bottom: 8px; color: white; } /* 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 */ .notification-with-image { min-height: 159px; color: white; } #notification-scrollview { max-height: 10em; } #notification-scrollview > .top-shadow, #notification-scrollview > .bottom-shadow { height: 1em; } #notification-scrollview:ltr > StScrollBar { padding-left: 6px; } #notification-scrollview:rtl > StScrollBar { padding-right: 6px; } #notification-body { spacing: 5px; } #notification-actions { spacing: 10px; } .notification-button { border-radius: 5px; padding: 4px 8px 5px; } .notification-button:focus { padding: 3px 8px 4px; } .notification-icon-button { border-radius: 5px; padding: 5px; } .notification-icon-button:focus { padding: 4px; } .notification-icon-button > StIcon { icon-size: 36px; } #notification StEntry { padding: 4px; border-radius: 4px; color: #a8a8a8; selected-color: black; border: 1px solid rgba(245,245,245,0.2); background-gradient-direction: vertical; background-gradient-start: rgb(200,200,200); background-gradient-end: white; transition-duration: 300; box-shadow: inset 0px 2px 4px rgba(0,0,0,0.6); caret-color: #a8a8a8; caret-size: 1px; } #notification StEntry:focus { border: 1px solid #8b8b8b; color: #333333; background-gradient-direction: vertical; background-gradient-start: rgb(200,200,200); background-gradient-end: white; caret-color: #545454; selection-background-color: #808080; } /* =================================================================== * Alt Tab * ===================================================================*/ #altTabPopup { padding: 8px; spacing: 16px; } .switcher-list { background: rgba(80,80,80,0.8); border: 2px solid #a5a5a5; border-radius: 8px; padding: 20px; font-size: 9pt; color: white; text-shadow: black 0px 0px 2px; } .switcher-list-item-container { spacing: 8px; } .thumbnail-scroll-gradient-left { background-gradient-direction: horizontal; background-gradient-start: rgba(51, 51, 51, 1.0); background-gradient-end: rgba(51, 51, 51, 0); border-radius: 24px; border-radius-topright: 0px; border-radius-bottomright: 0px; width: 60px; } .thumbnail-scroll-gradient-right { background-gradient-direction: horizontal; background-gradient-start: rgba(51, 51, 51, 0); background-gradient-end: rgba(51, 51, 51, 1.0); border-radius: 24px; border-radius-topleft: 0px; border-radius-bottomleft: 0px; width: 60px; } .switcher-list .item-box { padding: 8px; border-radius: 8px; } .switcher-list .item-box:outlined { padding: 6px; border: 2px solid rgba(85,85,85,1.0); } .switcher-list .item-box:selected { background: rgba(255,255,255,0.33); } .switcher-list .thumbnail-box { padding: 2px; spacing: 4px; } .switcher-list .thumbnail { width: 256px; } .switcher-list .separator { width: 1px; background: rgba(255,255,255,0.33); } .ripple-box { width: 104px; height: 104px; background-image: url("corner-ripple.png"); } .ripple-box:rtl { background-image: url("corner-ripple.png"); } .switcher-arrow { border-color: rgba(0,0,0,0); color: #808080; } .switcher-arrow:highlighted { border-color: rgba(0,0,0,0); color: white; } .switcher-preview-backdrop { background-color: rgba(25,25,25,0.65); } /* =================================================================== * Modal dialogs * ===================================================================*/ .modal-dialog { font-size: 12pt; border-radius: 24px; background-color: rgba(85, 85, 85, 0.9); border: 2px solid #868686; color: #babdb6; padding-right: 42px; padding-left: 42px; padding-bottom: 30px; padding-top: 30px; } .modal-dialog-button-box { spacing: 21px; padding-top: 21px; } .modal-dialog-button { border-radius: 18px; font-size: 11pt; color: white; margin-left: 10px; margin-right: 10px; padding: 4px 32px 5px; } .modal-dialog-button:disabled { color: rgb(60, 60, 60); } .modal-dialog-button:focus { padding: 3px 31px 4px; } /* Info OSD popup */ .info-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; } /* =================================================================== * Run dialog * ===================================================================*/ .run-dialog-label { font-size: 9pt; color: white; padding-bottom: 15px; } .run-dialog-error-label { font-size: 9pt; color: white; } .run-dialog-error-box { padding-top: 15px; spacing: 5px; } .run-dialog-completion-box { padding-left: 15px; font-size: 10px; } .run-dialog-entry { font-size: 10.5pt; font-weight: bold; width: 23em; color: white; selection-background-color: white; selected-color: black; } .run-dialog { border-radius: 16px; padding-right: 21px; padding-left: 21px; padding-bottom: 0; padding-top: 15px; } .lightbox { background-color: rgba(0, 0, 0, 0.4); } /* CinnamonMountOperation Dialogs */ .cinnamon-mount-operation-icon { icon-size: 48px; } .mount-password-reask { color: red; } .show-processes-dialog, .mount-question-dialog { spacing: 24px; } .show-processes-dialog-subject, .mount-question-dialog-subject { font-size: 12pt; font-weight: bold; color: #666666; padding-top: 10px; padding-left: 17px; padding-bottom: 6px; } .show-processes-dialog-subject:rtl, .mount-question-dialog-subject:rtl { padding-left: 0px; padding-right: 17px; } .show-processes-dialog-description, .mount-question-dialog-description { font-size: 10pt; color: white; padding-left: 17px; width: 28em; } .show-processes-dialog-description:rtl, .mount-question-dialog-description:rtl { padding-right: 17px; } .show-processes-dialog-app-list { font-size: 10pt; max-height: 200px; padding-top: 24px; padding-left: 49px; padding-right: 32px; } .show-processes-dialog-app-list:rtl { padding-right: 49px; padding-left: 32px; } .show-processes-dialog-app-list-item { color: #ccc; } .show-processes-dialog-app-list-item:hover { color: white; } .show-processes-dialog-app-list-item:ltr { padding-right: 1em; } .show-processes-dialog-app-list-item:rtl { padding-left: 1em; } .show-processes-dialog-app-list-item-icon:ltr { padding-right: 17px; } .show-processes-dialog-app-list-item-icon:rtl { padding-left: 17px; } .show-processes-dialog-app-list-item-name { font-size: 10pt; } /* =================================================================== * Magnifier * ===================================================================*/ .magnifier-zoom-region { border: 2px solid rgba(128, 0, 0, 1); } .magnifier-zoom-region.full-screen { border-width: 0px; } /* =================================================================== * On screen keyboard * ===================================================================*/ #keyboard { background-color: #555555; } .keyboard-layout { spacing: 10px; padding: 10px; } .keyboard-row { spacing: 15px; } .keyboard-key { min-height: 30px; min-width: 30px; background-gradient-start: rgba(255,245,245,0.4); background-gradient-end: rgba(105,105,105,0.1); background-gradient-direction: vertical; font-size: 14pt; font-weight: bold; border-radius: 10px; border: 2px solid #a0a0a0; color: white; } .keyboard-key:grayed { color: #808080; border-color: #808080; } .keyboard-key:checked, .keyboard-key:hover { background: #303030; border: 3px solid white; } .keyboard-key:active { background: #808080; } .keyboard-subkeys { color: white; padding: 5px; -arrow-border-radius: 10px; -arrow-background-color: #090909; -arrow-border-width: 2px; -arrow-border-color: white; -arrow-base: 20px; -arrow-rise: 10px; -boxpointer-gap: 5px; } /* ################################################################### * Cinnamon Specific Section * ###################################################################*/ /* =================================================================== * Menu (menu.js) * ===================================================================*/ /* Main menu title */ /* menu-background allows the menu applet to be themed separately from other applet menus */ .menu-background { } .menu-favorites-box { padding: 0.8em; border: 1px solid #666; border-radius: 8px; background-gradient-direction: vertical; background-gradient-start: rgba(85,85,85,0.8); background-gradient-end: rgba(85,85,85,0.2); transition-duration: 300; } .menu-favorites-button { padding: 0.8em; } .menu-favorites-button:hover { color: white; background-gradient-direction: vertical; background-gradient-start: rgba(255,255,255,0.2); background-gradient-end: rgba(255,255,255,0.08); box-shadow: inset 0px 0px 1px 1px rgba(255,255,255,0.06); border-radius: 4px; } .menu-categories-box { padding-top: 10px; padding-left: 30px; padding-right: 30px; padding-bottom: 10px; } .menu-applications-inner-box { padding-top: 10px; padding-left: 10px; padding-right: 10px; padding-bottom: 0px; } .menu-applications-outer-box { padding-top: 10px; padding-left: 10px; padding-right: 10px; padding-bottom: 0px; } .menu-application-button { padding-top: 7px; padding-left: 7px; padding-right: 7px; padding-bottom: 7px; } .menu-application-button:highlighted { /* This style is used in menu application buttons for applications which were newly installed */ font-weight: bold; } .menu-application-button-selected { padding-top: 7px; padding-left: 7px; padding-right: 7px; padding-bottom: 7px; color: white; background-gradient-direction: vertical; background-gradient-start: rgba(255,255,255,0.2); background-gradient-end: rgba(255,255,255,0.08); box-shadow: inset 0px 0px 1px 1px rgba(255,255,255,0.06); border-radius: 4px; } .menu-application-button-selected:highlighted { /* This style is used in menu application buttons for applications which were newly installed */ font-weight: bold; } .menu-application-button-label:ltr { padding-left: 5px; } .menu-application-button-label:rtl { padding-right: 5px; } .menu-category-button { padding-top: 7px; padding-left: 7px; padding-right: 7px; padding-bottom: 7px; } .menu-category-button-greyed { padding-top: 7px; padding-left: 7px; padding-right: 7px; padding-bottom: 7px; color: #9C9C9C; font-style: italic; } .menu-category-button-greyed StIcon { opacity: 0.5; } .menu-category-button-selected { padding-top: 7px; padding-left: 7px; padding-right: 7px; padding-bottom: 7px; color: white; background-gradient-direction: vertical; background-gradient-start: rgba(255,255,255,0.2); background-gradient-end: rgba(255,255,255,0.08); box-shadow: inset 0px 0px 1px 1px rgba(255,255,255,0.06); border-radius: 4px; } .menu-category-button-label:ltr { padding-left: 5px; } .menu-category-button-label:rtl { padding-right: 5px; } .menu-category-button-selected:hover { } /* Name and description of the currently hovered item in the menu * This appears on the bottom right hand corner of the menu*/ .menu-selected-app-box { padding-right: 30px; padding-left: 28px; text-align: right; height: 30px; } .menu-selected-app-box:rtl { padding-top: 10px; height: 30px; } .menu-selected-app-title { font-weight: bold; } .menu-selected-app-description { max-width: 150px; } .menu-top-box { spacing: 10px; } .menu-systembuttons-box { } .menu-search-box:ltr { padding-left: 30px; } .menu-search-box:rtl { padding-right: 30px; } #menu-search-entry { padding: 5px; border-radius: 4px; color: rgb(128, 128, 128); border: 2px solid rgba(245,245,245,0.2); background-gradient-start: rgba(5,5,6,0.1); background-gradient-end: rgba(254,254,254,0.1); background-gradient-direction: vertical; selected-color: black; caret-color: rgb(128, 128, 128); caret-size: 1px; width: 250px; height: 15px; transition-duration: 300; box-shadow: inset 0px 2px 4px rgba(0,0,0,0.6); } #menu-search-entry:focus, #menu-search-entry:hover { border: 2px solid rgb(136,138,133); background-gradient-start: rgb(200,200,200); background-gradient-end: white; background-gradient-direction: vertical; } #menu-search-entry:hover { transition-duration: 300; } #menu-search-entry:focus { color: rgb(64, 64, 64); font-weight: bold; transition-duration: 0; } .menu-search-entry-icon { icon-size: 1em; color: #8d8f8a; } /* Context menu (at the moment only for favorites) */ .menu-context-menu { } /* =================================================================== * Window list (windowList.js) * ===================================================================*/ .window-list-box { spacing: 2px; padding-left: 10px; padding-top: 0px; } .window-list-box.vertical { spacing: 3px; padding-left: 0px; padding-right: 0px; padding-top: 10px; padding-bottom: 10px; } .window-list-box.vertical #appMenuIcon { padding-top: 3px; } .window-list-item-box { color: rgba(255,255,255,1.0); background-gradient-direction: vertical; background-gradient-start: rgba(255,255,255,0.05); background-gradient-end: rgba(255,255,255,0.2); box-shadow: inset 0px 0px 1px 1px rgba(170,170,170,0.5); border-radius: 2px 2px 0px 0px; transition-duration: 100; spacing: 0.5em; } .window-list-item-box.top { border-radius: 0px 0px 2px 2px; } .window-list-item-box.left { border-radius: 0px 2px 2px 0px; } .window-list-item-box.right { border-radius: 2px 0px 0px 2px; } .window-list-item-box.top, .window-list-item-box.bottom { padding: 0 0.5em; } .window-list-item-box:active, .window-list-item-box:checked, .window-list-item-box:focus, .window-list-item-box:running { background-gradient-direction: vertical; background-gradient-start: rgba(226,226,226,0.5); background-gradient-end: rgba(122,122,122,0.5); box-shadow: inset 0px 0px 1px 1px rgba(170,170,170,0.5); } .window-list-item-box:hover { box-shadow: inset 0px 0px 1px 1px rgba(170,170,170,1.0); } .window-list-item-demands-attention { background-gradient-start: rgba(255,52,52,0.5); background-gradient-end: rgba(255,144,144,0.5); } .window-list-item-box .progress { background-gradient-direction: vertical; background-gradient-start: rgba(255,255,255,0.6); background-gradient-end: rgba(255,255,255,0.3); border-radius: 2px 2px 0px 0px; box-shadow: inset 0px 0px 1px 1px rgba(170,170,170,0.5); } .panel-top .window-list-item-box .progress { border-radius: 0px 0px 2px 2px; } .panel-left .window-list-item-box .progress { border-radius: 0px 2px 2px 0px; } .panel-right .window-list-item-box .progress { border-radius: 2px 0px 0px 2px; } .window-list-preview { background: rgba(80,80,80,0.8); border: 2px solid #a5a5a5; border-radius: 8px; font-size: 9pt; color: white; text-shadow: black 0px 0px 2px; padding: 8px; spacing: 4px; } /* =================================================================== * Grouped window list (grouped-window-list@cinnamon.org) * ===================================================================*/ .grouped-window-list-thumbnail-label { padding-left: 4px; } .grouped-window-list-number-label { z-index: 99; text-shadow: black 1px 0px 2px; font-size: 10px; color:#fff; padding: 0; } .grouped-window-list-badge { border-radius: 256px; background-color: #000000; } .grouped-window-list-button-label { padding-left: 4px; } .grouped-window-list-thumbnail-alert { background: rgba(255,52,52,0.3); } .grouped-window-list-item-box { color: rgba(255,255,255,1.0); background-gradient-direction: vertical; background-gradient-start: rgba(255,255,255,0); background-gradient-end: rgba(255,255,255,0); box-shadow: inset 0px 0px 1px 1px rgba(170,170,170,0); border-radius: 2px 2px 0px 0px; transition-duration: 100; spacing: 0.5em; } .grouped-window-list-item-box.top { border-radius: 0px 0px 2px 2px; } .grouped-window-list-item-box.left { border-radius: 0px 2px 2px 0px; } .grouped-window-list-item-box.right { border-radius: 2px 0px 0px 2px; } .grouped-window-list-item-box.top, .grouped-window-list-item-box.bottom { padding: 0 0.5em; } .grouped-window-list-item-box:checked, .grouped-window-list-item-box:active:hover { background-gradient-direction: vertical; background-gradient-start: rgba(226,226,226,0.5); background-gradient-end: rgba(122,122,122,0.5); box-shadow: inset 0px 0px 1px 1px rgba(170,170,170,0.8); } .grouped-window-list-item-box:focus { background-gradient-direction: vertical; background-gradient-start: rgba(226,226,226,0.5); background-gradient-end: rgba(122,122,122,0.3); box-shadow: inset 0px 0px 1px 1px rgba(170,170,170,0.9); } .grouped-window-list-item-box:active:focus:hover, .grouped-window-list-item-box:focus:hover { background-gradient-direction: vertical; background-gradient-start: rgba(226,226,226,0.3); background-gradient-end: rgba(122,122,122,0.3); box-shadow: inset 0px 0px 1px 1px rgba(170,170,170,1.0); } .grouped-window-list-item-box:hover { box-shadow: inset 0px 0px 1px 1px rgba(170,170,170,0.5); } .grouped-window-list-item-box:active { box-shadow: inset 0px 0px 1px 1px rgba(170,170,170,0.3); } .grouped-window-list-item-demands-attention { background-gradient-start: rgba(255,52,52,0.5); background-gradient-end: rgba(255,144,144,0.5); } .grouped-window-list-item-box .progress { background-gradient-direction: vertical; background-gradient-start: rgba(255,255,255,0.6); background-gradient-end: rgba(255,255,255,0.3); border-radius: 2px 2px 0px 0px; box-shadow: inset 0px 0px 1px 1px rgba(170,170,170,0.5); } .panel-top .grouped-window-list-item-box .progress { border-radius: 0px 0px 2px 2px; } .panel-left .grouped-window-list-item-box .progress { border-radius: 0px 2px 2px 0px; } .panel-right .grouped-window-list-item-box .progress { border-radius: 2px 0px 0px 2px; } .grouped-window-list-thumbnail-menu { } .grouped-window-list-thumbnail-menu .item-box { padding: 10px; border-radius: 8px; spacing: 4px; } .grouped-window-list-thumbnail-menu .item-box:outlined { padding: 6px; border: 2px solid rgba(165, 165, 165, 0.7) } .grouped-window-list-thumbnail-menu .item-box:selected { background: rgba(255,255,255,0.33); } .grouped-window-list-thumbnail-menu .thumbnail { width: 256px; } .grouped-window-list-thumbnail-menu .separator { width: 1px; background: rgba(255,255,255,0.33); } /* =================================================================== * Sound Applet (sound@cinnamon.org) * ===================================================================*/ .sound-player StButton { width: 18px; height: 18px; padding: 5px; color: #aaa; } .sound-player StButton:small { width: 16px; height: 16px; } .sound-player StButton:small StIcon { icon-size: 1.2em; } .sound-player StButton StIcon { icon-size: 1.5em; } .sound-player StButton:hover, .sound-player StButton:active { color: #fff; } .sound-player .slider { height: 0.5em; -slider-height: 0.5em; -slider-background-color: #3c3c3c; -slider-border-color: rgba(0,0,0,0); -slider-active-background-color: #a5a5a5; -slider-active-border-color: rgba(0,0,0,0); -slider-border-width: 0px; -slider-handle-radius: 0px; } .sound-player StBoxLayout { spacing: 0.5em; } .sound-player>StBoxLayout { padding: 0 16px 8px; } .sound-player-overlay { width: 300px; padding: 12px 16px; spacing: 0.5em; background-color: rgba(80,80,80,0.9); color: #ffffff; border-top: 2px solid #a5a5a5; } .sound-player-overlay StButton { border-radius: 5px; padding: 8px; } .sound-player-overlay StButton > StIcon { icon-size: 16px; } .sound-player-overlay StBoxLayout { padding-top: 2px; } .sound-player-generic-coverart { background: rgba(0,0,0,0.2); } /* =================================================================== * Spacer applet * ===================================================================*/ .spacer-box { border-radius: 1px; border: 1px solid transparent; } .spacer-box:highlight { background-color: #aa5555; } .spacer-box.vertical { } .spacer-box.edit-mode { border-radius: 1px; border: 1px symbolic; } /* =================================================================== * Workspace Switcher applet (workspaceSwitcher.js) * ===================================================================*/ /* Controls the styling when using the "Simple buttons" option */ .panel-top .workspace-switcher, .panel-bottom .workspace-switcher { padding: 0 3px; } .panel-left .workspace-switcher, .panel-right .workspace-switcher { padding: 3px; } .workspace-button { color: #cccccc; border: 1px; border-color: #a6a6a6; padding: 0 8px; transition-duration: 300; } .vertical .workspace-button { padding: 4px 0; } .workspace-button:outlined { background: #cccccc; color: #555555; box-shadow: inset 0px 0px 8px 1px rgba(255,255,255, 0.7); } .workspace-button:shaded { color: #13191c; } /* Controls the style when using the "Visual representation" option */ .workspace-graph { padding: 3px; spacing: 3px; } .workspace-graph .workspace { border: 1px solid #666; background-gradient-direction: vertical; background-gradient-start: #222; background-gradient-end: #4d4d4d; } .workspace-graph .workspace:active { border: 1px solid #ccc; background-gradient-direction: vertical; background-gradient-start: #111; background-gradient-end: #3d3d3d; } .workspace-graph .workspace .windows { -active-window-background: rgba(140, 140, 140, 1.0); -active-window-border: rgba(0, 0, 0, 0.7); -inactive-window-background: rgba(140, 140, 140, 1.0); -inactive-window-border: rgba(0, 0, 0, 0.7); } .workspace-graph .workspace:active .windows { -active-window-background: rgba(255, 255, 255, 1.0); -active-window-border: rgba(0, 0, 0, 0.9); -inactive-window-background: rgba(140, 140, 140, 1.0); -inactive-window-border: rgba(0, 0, 0, 0.7); } /* =================================================================== * Panel Launchers Applet (panelLaunchers.js) * ===================================================================*/ .panel-launchers { padding-left: 7px; spacing: 2px; } .panel-launchers.vertical { padding-top: 2px; padding-bottom: 2px; padding-left: 0px; padding-right: 0px; spacing: 3px; } .launcher { padding-left: 1px; padding-right: 1px; border-bottom-width: 1px; transition-duration: 300; } .launcher .icon-box { padding-top: 2px; } .panel-launchers.vertical .launcher .icon-box { padding-top: 0; } .panel-launchers .launcher:hover { background-gradient-direction: vertical; background-gradient-start: rgba(255,255,255,0.0); background-gradient-end: rgba(255,255,255,0.2); border: 0px solid rgba(255,255,255,0.5); border-bottom-width: 1px; } /* =================================================================== * Overview corner * ===================================================================*/ #overview-corner { background-image: url("overview.png"); } #overview-corner:hover { background-image: url("overview-hover.png"); } /* =================================================================== * Applets (applet.js) * ===================================================================*/ .applet-separator { padding: 5px 4px; } .applet-separator-line { width: 2px; background: rgba(255,255,255,0.5); } .applet-separator-line-vertical { border: 0px solid rgba(255,255,255,0.5); border-bottom-width: 2px; } .applet-box { padding-left: 3px; padding-right: 3px; color: #ccc; text-shadow: black 0px 0px 2px; transition-duration: 300; } .panel-top .applet-box, .panel-bottom .applet-box { spacing: 3px; } .applet-box:checked, .applet-box:hover { color: #fff; } .applet-box.vertical { padding-left: 0px; padding-right: 0px; padding-top: 3px; padding-bottom: 3px; } .applet-box.vertical:hover { } .applet-box:highlight { background-color: #aa5555; } .applet-label { font-weight: bold; color: #ccc; } .applet-box:checked > .applet-label, .applet-box:hover > .applet-label { color: #fff; text-shadow: white 0px 0px 5px; } .applet-box.vertical:hover > .applet-label { } .applet-icon { /* symbolic icons will use system-status-icon instead */ color: #ccc; icon-size: 22px; } .applet-box:checked .applet-icon, .applet-box:hover .applet-icon { color: #fff; icon-shadow: white 0px 0px 3px; } .applet-box.vertical:hover .applet-icon { } /* =================================================================== * Desklets (desklet.js) * ===================================================================*/ .desklet { color: #fff; } .desklet:highlight, .desklet:highlight-with-borders, .desklet:highlight-with-borders-and-header { background-color: #aa5555; } .desklet-with-borders { border: 2px solid #a5a5a5; background-color: rgba(80, 80, 80, 0.8); color: #fff; border-radius-bottomleft: 12px; border-radius-bottomright: 12px; border-radius-topleft: 12px; border-radius-topright: 12px; } .desklet-with-borders-and-header { border: 2px solid #a5a5a5; background-color: rgba(80, 80, 80, 0.8); color: #fff; border-top: 1px; border-radius-bottomleft: 12px; border-radius-bottomright: 12px; } .desklet-header { border-radius-topleft: 12px; border-radius-topright: 12px; font-size: 10.5pt; border: 2px solid #a5a5a5; border-bottom: 0px; background-color: rgba(80, 80, 80, 0.8); color: #fff; padding: 6px; } .desklet-drag-placeholder { border: 2px solid #6daa00; background-color: rgba(109,170, 0, 0.3); } /* =================================================================== * Clock Desklet (desklet.js) * ===================================================================*/ .clock-desklet-label { } /* =================================================================== * Workspace OSD * ===================================================================*/ .workspace-osd { color: #ffffff; text-shadow: black 5px 5px 5px; font-weight: bold; font-size: 48pt; } .expo-workspaces-name-entry { padding: 5px; border-radius: 4px; color: rgb(200, 200, 200); border: 2px solid rgb(136,138,133); background-gradient-start: rgb(128,128,128); background-gradient-end: rgb(85,85,85); background-gradient-direction: vertical; selected-color: black; caret-color: rgb(128, 128, 128); caret-size: 1px; width: 250px; height: 1em; box-shadow: inset 0px 2px 4px rgba(0,0,0,0.6); text-align: center; } .expo-workspaces-name-entry#selected { background-gradient-start: rgb(200,200,200); background-gradient-end: white; font-weight: bold; color: rgb(0, 0, 0); } .expo-workspaces-name-entry:focus { color: rgb(0, 0, 0); font-weight: bold; font-style: italic; transition-duration: 300; } /* =================================================================== * Notification Applet * ===================================================================*/ .notification-applet-padding { padding: .5em 1em; } .notification-applet-container { max-height: 100px; } /* Check Boxes */ .check-box CinnamonGenericContainer { spacing: .2em; } .check-box StBin, .check-box:focus StBin { width: 16px; height: 16px; background-image: url("checkbox-off.svg"); } .check-box:checked StBin, .check-box:focus:checked StBin { background-image: url("checkbox.svg"); } .check-box StLabel { font-weight: normal; } .radiobutton CinnamonGenericContainer { spacing: .2em; height: 18px; padding-top: 2px; } .radiobutton StBin, .radiobutton:focus StBin { width: 16px; height: 16px; background-image: url("radiobutton-off.svg"); border-radius: 15px; } .radiobutton:checked StBin, .radiobutton:focus:checked StBin { background-image: url("radiobutton.svg"); } .radiobutton StLabel { padding-top: 4px; font-size: 0.9em; box-shadow: none; } .flashspot { background-color: white; } /* Media keys OSD popup */ .osd-window { background: rgba(80,80,80,0.8); border: 2px solid #a5a5a5; border-radius: 8px; padding: 20px; color: white; spacing: 1em; } .osd-window .level { height: 0.7em; border-radius: 0.3em; background-color: rgba(190,190,190,0.2); } .osd-window .level-bar { border-radius: 0.3em; background-color: rgba(190,190,190,0.8); } .tile-preview, .tile-hud { background-color: rgba(85, 85, 85, 0.5); border: 2px solid rgba(134, 134, 134, 0.8); } .tile-preview.snap, .tile-hud.snap { background-color: rgba(134, 134, 170, 0.5); border: 2px solid rgba(85, 85, 85, 0.8); } .tile-hud:top { border-top-width: 0px; border-radius: 0px 0px 8px 8px; } .tile-hud:bottom { border-bottom-width: 0px; border-radius: 8px 8px 0px 0px; } .tile-hud:left { border-left-width: 0px; border-radius: 0px 8px 8px 0px; } .tile-hud:right { border-right-width: 0px; border-radius: 8px 0px 0px 8px; } .tile-hud:top-left { border-top-width: 0px; border-left-width: 0px; border-radius: 0px 0px 8px 0px; } .tile-hud:top-right { border-top-width: 0px; border-right-width: 0px; border-radius: 0px 0px 0px 8px; } .tile-hud:bottom-left { border-bottom-width: 0px; border-left-width: 0px; border-radius: 0px 8px 0px 0px; } .tile-hud:bottom-right { border-bottom-width: 0px; border-right-width: 0px; border-radius: 8px 0px 0px 0px; } /* =================================================================== * Systray Applet * * .systray is for theming to be applied to the systray as a whole * .applet-box is used for indicators (not tray icons) within the systray * tray icons are not themed * ===================================================================*/ .systray { spacing: 5px; } cinnamon-4.4.8/data/theme/close-window-hover.svg000066400000000000000000000102751360505115200216230ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/theme/close-window.svg000066400000000000000000000105161360505115200205000ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/theme/close.svg000066400000000000000000000010721360505115200171700ustar00rootroot00000000000000 cinnamon-4.4.8/data/theme/corner-ripple.png000066400000000000000000000115651360505115200206410ustar00rootroot00000000000000PNG  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-4.4.8/data/theme/menu-symbolic.svg000066400000000000000000000115571360505115200206570ustar00rootroot00000000000000 image/svg+xmlcinnamon-4.4.8/data/theme/overview-hover.png000066400000000000000000000015061360505115200210410ustar00rootroot00000000000000PNG  IHDR s IDATxTkG}s2I 6 CRRUBBkRXvuVA B~*yc~{y3?#PXeO+b"SP00P(b;)z 䐐D @'0a@E'C$K&Iin'fFhdea#s310Qy-DQDBw\C^f*HMA!Cv$@Žo-#S^|Rw!B[9?.ooM>Zvxat~(~/W7򋍴*wDǓyU5$O͞t}c0<Α"3e5D`%eQ n=H'ꨥ7j+)V=Ȩ&PqOuat=x>h٤0P!a,&;c ~ >ʰf1! B,M}(Padn] Ұ:%2xOg?GM}Åv/|BdGks}6=[{5mNgNrwm׬hDž&w /;4oj/^eGPm 7 uDh&jPS>jiD7Ҟ r1^(Tiy;T3N+%JY1IENDB`cinnamon-4.4.8/data/theme/process-working.svg000066400000000000000000000040651360505115200212240ustar00rootroot00000000000000 cinnamon-4.4.8/data/theme/radiobutton-off.svg000066400000000000000000000050771360505115200211760ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/theme/radiobutton.svg000066400000000000000000000054741360505115200204270ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/data/theme/scroll-hhandle.svg000066400000000000000000000005411360505115200207620ustar00rootroot00000000000000 cinnamon-4.4.8/data/theme/scroll-vhandle.svg000066400000000000000000000005411360505115200210000ustar00rootroot00000000000000 cinnamon-4.4.8/data/theme/theme-changelog.txt000066400000000000000000000011321360505115200211270ustar00rootroot00000000000000Since 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-4.4.8/data/theme/thumbnail-generic.png000066400000000000000000001707611360505115200214610ustar00rootroot00000000000000PNG  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-4.4.8/data/theme/thumbnail.png000066400000000000000000001067151360505115200200450ustar00rootroot00000000000000PNG  IHDRp{i= pHYs  tIME  .tEXtCommentCreated with GIMPW IDATxy|uW}ɾ ,+.-ڶmw߹}g33===3mۋҊ ( Bd $!E%9 G@qN|[wߪc """"""ݟEM """""'"""""" p"""""" p""""""'"""""" p"""""" p""""""'"""""" p"""""" p""""""365\jjj^-/P(L0Typ8m$'ZZZmt]F]]ZTDDD.:---S`6441DK%%%1vlzDDDDJmm#;vY8>VRRBMM ~_#p"r9n7iii ?%%I8|l޼ Bw^"FDfcȑdffb۹ҩ9!&"""rQٳ' BTTT&"]*Oee%P_NDDD. ٻw/iQD˙I~~>P:jkQ9MYYJJJjH$Bqq1?S9M]]UUUj s~\4~_!"1zʹINDDD$,I$8BNDDDDDDNDDDDDDDDDDDDDDDDDDDNDDDDDDDDDDDDDDDDDDDNDDDDDDDDDDDDDDDDDDDNDDDDDDDDDDDD. 65HlesnKh!ȯyxnU5?gC6K.~ p""""1);_-_>IPc&bOɳ52!ꫣYS쌠:lh{P]b1"֋}etN&wS6_~=980tGj_g7.o=FDDDD:Aӿc/.|]7x=uʹ$ts'ނqt =ހW;}_淚8wJo/OK+zncxW+ )Y K2VOkn [Z2{6W a{,DOpFƴy8 vid7~ʶ'Okox_.hĊi@F-izm7~p#)1ܽHENEyԒJ\l(- mlqx]G{̳71ctfA v,J5~!joǿO>m]XJz3{"Ho[)u~~\=~cYU+1=SēiU酿?rRK9\ `Op75BF<)?Nj!j%Yo:M1.M[x?VJ峫B0fZi<ǻ?1gK[*Sh;A9m0Y.a]q 3ƶ4'"""MAJ^++jGkѝܑH_PsZ;5RrVTZm3'Dwx X0)/?m0wg=|RDV;kˋi%vwv=])0dϻL`8Uoi0k 4] Dj )ݿ- [%_ŝ#uٲw׭ܒ0)᭵_ǚ{ xh3~>s2~gNu/ožFnw0qno=,ZA?aג לJpOd] cTp fFqfgaGSQ }o-)H]yۗ{2H&Dw l=7G:)"qGz%۵! 8n"|5/U1 ja{ܹ^+]0]'26{'[8IC3PGپ;X1>ϏFĵRƒZHuEDJ8#H*2ћt$}Yv};~_:/ִd )Cɢpwh38NĚ]8Ї)/R+gkp;B$|f7QʢɲX_KM.#TNH"xׯ~57\f+^c[|[/a;Xl_f z2빮w=.6>]ǧmN9Z3n;H)|?A7V*tF @<>2q{e32 Nه,~m֍|q;t$3h;11B8j{4zmK[yp4¸ ײPz4.@2񒣸 ?`Sh:9.eHq@{B s3Q][D\d\{'S7p#]sċh,Nu~1+L\`3L<hi`|]tg%amò:UmiyxHYÚlofz#΂qmkVS5~L̢ >wDrnr+7+Lji_S]ĞNVt'>42pLώH/*22$!F0?#Ks!rl7Ɔ`drXUϙ=w6J(8@Ms4|"PDGMu(&,֬gNKycli짬6c7^saE=PNQ"q7ַQ1 %AdT#Mj9_`}u^.ٚF߄Otx'wnݺ.;{^-dzޭ(tTLWCn69ˌ^?lGBk"(+I K0?fT%ܧĵ%fڝioO/۟\VS5r:Up,q #>Vw2F̞AU 2r3aO>Gf2(|wgİQ8ei{)G?aЁ'UCh<8E$Z[!{^s~ & vaK<Ã-xpOePk,+J9e=q5+xJ}1qӻ?dmyeA;_9~O4Q㏞xWJ}ޫ6Hi`g7Wp 71jȺ"֛^4>f1/oR<^"6 Nbzi7ַ^AZ"dR='%5CB|{l0gnoHOVRiױǰD~l֎q=k)3:#\]fek}}PDDD. W1֮]2n|~֒^8{=HٵO>#Uw:Ig؆3; ޻WrWrs`t`h t7p(VGō"#)Rx;DDDDS.3}1H%-[_eYiy|tgކY©Pχwb_I @7}(ס((((((|)ۭF\.|)\UC\`ƏOjjEDDDD.0l&M Ç3a a3>J6Brfر$%%u7 '1Y\ =x)\&''%YIhʎ=!\ݛD~̚fabňFfwx^N'F+}&pmXe51הS~vg1ڡ\ʎ=Lf MԾ)["%g3Nϕ؆DDDD.0aEvv6 C(޾\Eپդ>`x0G/) 7PjVut|4ld&[dRZ3Y =1?uip =yCY՘v7%3#u\ŤRB[Wu7ZhȦ׷xeF>>fq$k˙Yɯ>X,$&&2qD<oͫ,_$lmawoRm{iwSQӘg#[ )}mnNd`ǃvilobZN""""w8|p&OСCcAgvFolpМHeL2Yi J.k;ִd?}R FROl]W紮C*HeT>CtdKNl\{4#bƘKNN'Nd=a iqI+PЁ%Յ4F&츓|0ٽ޹j=8HNDDDe9r$oakx+qMHZ.du1/ec'ޟzm>:P̡OQ x;i.pA m紮cf6ީL(#6}RB1`M|:gFrٶO>,6eMع[EVV iݩπ5̽7Z?dݚ:ʣ}_ɗpo{IqE{>5M$H>=ddܴyIpc>h uZ<ß18H8~nb18Oqu% dFDZh 04`;jg' RTTDqq1i>c-i |ljvm# Xذ!_,N®L}?֤aC<}_l1HNDDDٷoMMM 6}pK" J[=X`VS;qk;#+W7Lh- `|a 9cRxu5WPo0}h0Yյv'>{rAjjjzL'e4SS$2z&ӢUT:@A&.ayL{0G4`nacy{h 47@ iFMFFcX8r{X}"G]MNDDDFvvv[ 8}>6TQ88Q88Q88Q88Q88Q8¦&:kBnm5>F,+:~pf˳M/6]VG(D Nj7j8a᠙Jߌ?3b&;}Ѷ-OK>o\mشKaPFi#^8(L&!TM}X[K8E[LEAӤ?wqM4T@#6u|"Wec^h@2d4aʃl蛎~&SIvUqd;mlR6MgJDzeYLM^$/=3)twXiKqIw8J뗼'ru)Ri4)؟t>.o?&wX.϶9Znc6o> 's},̚/Z|KK) #q?cfL\3zZR~ܒ$֥;ϰ.Zg4:!&pe'@|9b[M.M X.BGҖ%^-ncp,"TϒA17-akEjNDDDD΅=CK } fxǯ/ 5;6VH<ϡsn+2t']F3ӯ bdYsk*>#H1$ j#\f?/붆KW- {ىWO0&K?7@ )eTEF Bo IDAT73ӷq^kA:\ ʁi6t>wJDf6fW#ү2\r `I %Q1Ve*+2rjo&Qà*ƉGta9`YCG;v;5cZ~L;k:y[gl#yz}Dg|A78pqlLqgX"-FQpG;EQhxM;k?_^i<[q?5""""](8Mid86bm5tk5,{TĶ{ [7=R^±d&|ő.k+Y^v0-}|+KV ,d]8p]5i[c?"!bE߁~}%Nܭ4Fy15=f["m Gnt5Y81G*6 mc{!d uQMOٹNݾu칝ﺌaKy6Ծ+টp?a2\: 8`ԛqX#o` >94yEo۹ r}~]ܿbُ˱ 9pA-[m/L⊒û=>8kLkת1D[3g=B)"""""C(((((ȅ&9?"8 U~Eǎ6E|ZrssE-yyy)""""""=((|+ ;0;rYR%DQJVS K<w3=U=d.啗(XcFmә:g,أv.g0M嵄9]8 A,+Y5f}(bHۿ/^LYԈA?Ǹ{JK !Ѻ bw06Q#eK)y:NNDDDDk-[M \|/w9R^>&{fr屽\6?әr۝T'^ r[0VBr7~SKyo8DM|l'9mZ1Q7 W_u%oia.PĈaij5afhWP30cT[Ci5~K̶"e_yi`oϮT]fD,6in-n&7}u{u8I$|i` RƬ4'"""Ca8.>S$z.qQŸ2;75LJOV#kג?Sky>A:Z/>Ro` YC)z<̓<9_lJ0qٻȲWl.N_PǂH7`"5i n*Wy{bXlm( o\N}3Z-]ZﯿSa N_ZE +˟WlS&=ԈQkDqdci ((((|="oرcݦ|բZzd-yyy:(tnsmjQ-_tu7B)"""""C(((ȷZob^ FFևI]^i$`|1q |f/2Vn^Ӈ%}4yr`YKy2 #VBۀxE2}-u\יk9򮮥-~:St{,%2{e,_ZIaJȞg0=!ay?$l 8n[:k{>᷍dQ{LjbQ_s%f~Wh H7Kz4c}[ڰ 08~|-FLj$!.mvReݵ4VS`-ֳօ%RB-1˖wu-+0 ՔJ+4Pf=7afhX{A#p""""݊$2QIIl{;#Nҏ= 1Z_Lq}G `nEx؝NJb6 uğ2;7B.I)2?S=]5'"""ҍÙg{ ǨO,X4Zj^gY2o߿eê|'ݾ3a^in`/vM+OԳy.{9INDDDDtfW̪hK3ց0[|_xg|*1S65u ,Q`T n*Wy{vBcU6-(;*2cwfo9Fi%0-eثC14$$ miWpà:)O꼂,Pk?_˭E!W_x@9Dz&fb:j]kq]m_ፍΘdw,JRMh{< 38m @MP^7|~yǨ.Z_M<0 B$G3Zq=9{p2f#ep \ b1 K{-EDD䢰z`ڵ|rssg#''[ԒZT3g=B)"""""C(((t65mjW-Gҝ#8 Xnnn6@wZ Ut㨻JBNDDDDDDNDDDDDDDDDDDDDDDDDDS(EDDDDz 0Ni&?ENDDDD:Ae 7|XˆEIN~k>Ν<1A!u)TFaJ1q^ŕBu#^ks=ga Qr^Z|) Y7mQb/ VG?aqڢ|[o`I}BO==XF,GitiFIr>,͝XG[t&Ĵ(h=]+X#JiJ%Ы,8D]'֢'"""r \{ iQ0.%u3.?mKײ5K3bZ2Iw9'ߴlO#pŤO ya(F9#.a1K);H/AhI'3q5oGxƕ\~;8;mTLҒ~3?K=2> sK8n4\EO 8c~xM3N"#l5}bM#\d>+,r/ jb۱lXݎn'u=9y7-: a?ݎjw:k}1ũS$dk _e\5^tRU4E-@ p""""r~ *#Z[yI]^Ǝݯ96VBI{`U ?J%k$*x%^_M3K=p6DDDDk~y}Y~Oz lI-agr`F|Bl8F'a omsv7I *wt㾷{xr8H :|9!m =x UN:`- n];w eڏ9X!x|~[W0%-A#ji9=RDDD${p2ffTɳx03Ӷ4a8aV=/(!&6  'kGW+\cQ-q]9\k8S]4x3ڃ|m╌#cskb+ǘK{iݵM)lL$D".o0qWȢ4?`!eO X&rZ'~wt7?Ȧ5?~KXVF]]Μ"""rQXz vNY~~>呓-jW-ge_@?'Nv<0_m&HO(" O(,,Vr1Gs`4<8nb1 c4ϓkF']ǿ;F߬V+Hz(t=8n#uwr;a&'N2iZF'^{kDNDDDDDeo:FN_(y p>M '%ϴ>QN`'< wn_>M=p"""""=,ԝ>q?F¡8n`ь5˶w^ =FDDDDDDz}\4⋼E¢/v::[բZN-8n4RDDDDDPQ88QoE_# """#mә4{4Ӣأv`Ŏ(MAe 7|Xˆk:g,أv.g0Uq3θ4Z. KᕬPEIt|u o?xzY3eѮo:{.+-- GF6A[L%e\;-\Dy:ˏ,XЋ``0#INDDDD>YOhS,%7'sU<7XU0k/vY-ObEftv'7Zϼʸ.[ϳ>v|7_MaRmGg~!j-1Gԃ#)ۖek%gGCIw9'ߴlO#p8zuϵ&lF27t G^>0 v7 XVCU kW%`[)tWcQaiAbÎ5&ơnp Qj'LfNzm3 ZjG|3ZϖFw?ohNDDD%_ƭq\y-M՞sZޕx &XH'(I-L&oF> 9&0;Ùe*ig%EFy?ފB>k8bD""=\8 3j/6y-%_kwkx< w iI-pfe}D0:H+geYb.VBI{JqBy]_G`1Lg'fޕ2"""0~ vgϞM߾}u1c{EYfϞ,ڏ6cС v6uFS(EDDDDD~$DDDDDDDDDDDDDNDDDDDDNDDDDDDDDDDDDDNDDDDDDNDDDDDD6Ȯ3cƌ,gVYTeYHNDDDdַo߽\\\,ڵ+ʲb GPPH(((N4H`<'Zg]*8Q=0I[&盰堡'8MMPI6 ҽ:W՞4X͏JYp 'K[3s0)Jn,:?Egx,J4xH,P>`~箧jӌ=-^ :xI`qy/߳n(4[O|<ƥ*mGΈ@DFI Y1Zj39y_7ObӕSgԲx|u& }晴~, _KT>ūםh#4[>aG̻cyY<;wA8f ϐtZM)!0ˣąֳfqY#Q Erɨt)#Lf>}<<1ysժ(MБmHwlq](>hv /ddwhQ_\WnMZv p"""" :V;ǩ9i$v%+=-k6r^zO deIőnNL6tTS,Ɨ#9(?kѱ{9 dqt9CS 3:iibNzv-7KY7m cWS ~z>8fRz%H3Ԓ6~Zbi}7&kjۜ̅6WpN%wYG2-c)u^Hۭe{ #}saʇi{oȌ[0gϬp~{؝9*-hS(Fw2]ͯ;+pۂ=^'O;2^553>້Q^^ """? ǿL0a,wX3fP\\We{UYڵ;ԭXBeewݡC0lرtNMPQ88Q88k""""Ό3̞=[eiŠ+TENDDDD]v{MXeQYT}/Hj ȏ((}^ aWhob]KC9XʲgU=^hќ{n']:̿Ydv.  3寘Ykzg $c>3X:?Egx,JIS95s≉r5]?'"""";{䨯YjنcSoI+,e }oA |Y>sg΃oImK2N?|Y"mN㪾_1ϙt9ryxEhgyf6!zsi/e]+8 ܽ(˲4RDDDD̰xu-cm;6GpXl"Vu00Օ&ܶ[u߳eݲլ3<os~ȤRFbfd#,e?fK$88Yú)/T)qIN~בw︢A`ƿ9oךY)q'jO.~N澹S|)%'>u>Y밓V@nd U 8Q>{mgſc#7ʿ,`΀K0q:]OhL:yO<ЍC:c\D3!s,gw :R33=WߓVU)axuTV${vt>E^axYuɴ&[YD5!QtWO䫪@Ȗ}Q10~ESK ɏ=wrofmۘiH''$FvԹnc)L ]D铻 $23{5*(c6_Wov:[=^Ns'x~ozWUN;s.=<ߪxaBųZjY\*YȢaܺ=;:Yp?8=Μ~un3n}_śO.6SY}(//S)"""? ǿL{zݳgϦ]v{źXBeQYT]PC`ذcixYS(EDDDDD~$DDDDDDDDDDDDDNDDDDDDNDDDDDDDDDDDDDNDDDDDDNDDDDDD6Ȯb EeQY(죊DdJ8QQ8QQ8QQ8QQ8٘M """";)OQQ DDDDDDDNDDDDDDDDDDDDDDDDDDDNDDDDDDDDDDDDDDDDDDDNDDDDDDDDDDDDDDDDDDDNDDDDDDDDDDDDDDDDDDDNDDDDDDDDDDDDDDDDDDDNDDDD]m۸cvoØ~UvWKN6ȮSt/wr g}ćoGklmXcg7Ǝ™{:G3O{NdPry>%==T*D8#8!8KXReݟ>=^'""""[p6Q&m_qɿyh_ыq(ume`x >HG2cﻖ(Cfaw۔ў\/8ËUQ&o9;םіWo+\2N==- ?zu Aڅ`z Lg_GgaΨՄg>˓~վM{tΞ:SFZ>gr?`k3S/=;ag4o\xnqqxgy {:k?Yr\;ssos+iIn_'خOWh>_MwU!`=K>%P඼>K?Mk+۵p$g\zV;v!po'-W-(VSֵ5O( ٟkUD=kMaVA\i=r+.{>WlڝK||$://f(q3 RfOFrNG c_ߞĈ974w#t$i. I.U/+~uSvi/wLUZߺ)Lɉ%+, [۞˛ {ǚ[ܮ}8'0ױ"{î9"]E!?U~܌ڑ=& t1J'}q/4ov 6'sf/yY|[gb3Oye6F[uK)kh o{*/1aǴO*(wxspoIχE_zW|<|U\=G]tK۵ / {`zN݊6Z:b,a oҠnkn<0"qM0 _ B|ҁiqړb荏rxrff]ȃo-9Dj`#a#gz_2bBSctq797ԕRlx/FoyۿU9_>9_>n=m^{.^7L2vMkM^t2kax[<q#C>}In$ p""""{ku`̏ZԵ:?A+\y}<& USL^lecKn5r}. Ҍk{cft9{'Жq[YgQ@;ZMmWë{ySpm)8_vjv$""""aaY6V0s2z2pK))  XFhAYmd|K申z3l.tPD+Pؚ7yF@1~a$mGci9xlrF~ b6SV>^FߊVG"HFc戞Y.F1\>%)~1~߳|<`uHQhw1`]5ѪL 9+Yza("Aqq1><'"""҄➆uK#q"G|>CV|s$eڊ"""R^ӿ~0YleeeTWW㺮6RiE~~>:tm~?;QNDDDd+̙3++[!';;f[8٧2eT/P[[˴iSD[}]0` ͺ. p""""" |4p8Ө0` `trrr8uP q>}WVV8̜92Q˖-ݻ7eѢE kXה_NDDDDD~R\of{V۵kG"`ڵq'Nl\l,86SZZJ$Q'Eu)//}|ylr|P({K( p p@0C%++k,5kVﺆ˃˾Sb>ᶼ\~K,ZѪ ((Ja%dګf-v/ܐ ;0ӿTa￿Q4=zt{F?81Dbqr;:β'xd]S({C(-)[z{ÿfoΦ*I7 DR,*++2;JII a+Kv]evf-_F<ǵ}Yb ڄBx'CA;1=o-KObԑ.;ə`S3 ͬY<9)\g;e}(y}0fLvvcp9m0ӷ:6J֑3q#77wkcY q.ӳgO}֭[ǜ9sXnݏk.)?}ǶΖeQPPڵkI$۽3x`ҶH$̌3vY=Pv#cjkkSS7wql& mS}mOԹsg Cu1~͞hv.>YLO=Nڶt/ԵkW ^|wۼ GM8fҥ[|n-2ds%t̠A6]}`ONNDQjjj6ۯI,˲m;u|IMZ0 \%H4:%py O*7Igri;TVVn6Om5UUUѢE ~?ڵk4WF%LvЂ @ p88~B;͡K.du_U30LˬM´,,4-LHҿ.%SC,\p@<0(Gfotlہ0TP.9!j+jEq_Ix^P}ogU71 g69q~?}f999tqfN:b1{zh,.R>Lf̘A(q0>3e2.{Mu26Ɇ( vi<8CKwhD8{p˹}&1+ȘqM9Ɵϖ燐_|7xh4Jn(((`ŬXq] >|8<~J"ՄFgx< <D'L-@`bN%uuua;2;#>tܻDD6qsS99~rǰyyy >QJOOO˖Bixb~mSTTiX"5{nذaݛP(}ӢE  |ԩSm۶Mh,#F`&o6ݻwC̝;w'KߦiN,'T%W2h%py@ uòԉ6ɾP3d;3i|gL4i뺔[$4322(((H]vmu]0|+3*fz=/ԏˍ9\_6wnCi8r֞07L*H #Ķl,Cr6iaֆd>l IDATxK^^&]"l2 _0Hf,buXtE95ar)hK;'#6 : HoffyxضM*&s13e}@vꃆyB!|A9$>]rA)D3-.g$rFrͣ3h3ˉq<|Q\l5F) sp:RrKN)M$מCགྷFl_mK.S]]kFFF{,zbݺut֍^{щs;Iqw]Pkκh8榭4 ϒnmY ⎺mnkdD" gkْyx4۲L pMCz]on6ljf)/v6YqH$GiͫsMmN:1eʔZnN/~A(Jx /^eիÆ K՛/j_?h =P|I#HЭ[7tڵkiժTTTldmؿ;>[l_\u/S.i ϴr1ha~@]y(Mg2H)p^C1ҙ?'CRVVV2k֬&INN[n4hQ'::v옚>}gb ^ӆrxZɡ͈H5ZhP(D<'RH$D"$FHϗ|}ib1D-X<q6l6iXQ06 %:`Z]vuQX 淰3d ՐNa螺x-9m ˲1 9c}q:L88v\|,+HLq"HΈeF6t58?i-.ϨQIM_?~- SӴ=3vqgbw`xtqh&T?a;MO&v%G \M5&1 yr Yk3Y?ƖnCL5 1bNQxipk׎`0~헪ӣFe˖}RhoֶdCҪU+֬Yd.k֬}j* lKkYs<6./?D_?ZP_>(Gvч|L$3[O_YBQ#;F'MGvlkۚ;C<%8x -7 7ɳ9x ;'5Liضm~>0dUrzңKnMIxt?~t?K1:-*Yʟ.p-7>u3cDQw/n9}GS1(?w!?i@|xdNQQ?}\U۵#p0ݡCԒqa6k׮~ۗX,~ǚ5kFD" ;l+Gk@gC pL0 K:+.{{V9-pU^?<RFzl+ߺ>am_88w{rbT' kC}t*V5%k薴͊1xU{#p.LpRyw*NIߺMڠ繸IeiCSAsõanWkе{MM'rLZ~GUgsal6jg/…'sU#9sjӞ>:uSڵ&3ʶFBGuT' /^LQQ]ve޼yݛ 6Xkowfϸ;{U?! ܗwxkqp/b^xw}Ѻ~`>ʌɝNgfL <痌8Ow#66N4vڥ6-ZвeF𵵛<~?;v<֮]KYY6vpesGГ*VBݰ7*'\uf9Tv瘣0iv\%>GLr˹qMM^kD/ݰqnD"9i4che5RifۆS?"+\J9֕%ɣCkV~bV01Ρ0EsQ^o0X(I>,Ӧm!O<=1a{D"uDQ $H$DcHΦ4F"s&6kC3ST,M_ kKsW8$'^qI?9;y)t)_ʥ^S#׊;o~{'%vf(݆#ϟ.>?No'rqQr?L=?cZ1x\Yu;osW1L?W|ΌRQ/Ћ:_뷹dG˗xbϟO<礓N"++P(ī… ômۖ-ZDD"떓Y&] =2Q7K9jf#\ɵ7fYqgs~V+ 1n7¿ug!꼮M.능gry"OV~HOm#խK֩/?~YzKm4Ϳ.ވ/nS-d=g5d SJ65SkkSF-ݯ俷0^K׷ ٕVa{t{뗜2un+͵T$uHHOldZk y_:ѯTSU|5wߜwii8`6ǰNOHmlѢE;̆Ae˖Ѷm[ gݻӣGyNՏmAYI^_ˢa>s7v$kckkb$jEUUsthg-®mr \rH}O~X[kWx)deo~lgk]<?QI`4 D.*֭[ SSSMeU%nvn^8uFrFљq-S1 iK<p* 咑^ ceCvd[d9&[ɧitAojT5o^eL-q02VLo+jYC<_5ZF5r[Z?[_ﯛINZp!SLaٲer!I2e ֭-[jժ6^^ՒyV,Zg,`d0RUUEiα >-wGSJ<_iOQE6|9}?p5PkAY3ٕvj*~vOS-۝V7|c⛏e,v,l6h`n-Յ'qZ+<["ӥ*u5?!k|?,,Hщ`ēT&EÑ0Fl($){X99--ߐt]lfh4J `̘ r ,x;f6͍ѩs} 5s[O;vqGPvvVofY=-{ܹK|6>`*eR#FPXX믿θqXdv/_~ >N:qꩧ[o1||.'wL)6~Th黎QFcxc][b.tLiu&G@ftoô8/2b[nií=[ ӴKTJ';7gfp[;h$,?@9Qm_Ƚwh$:#FvLV{g%^zv:,Ųa8U_pBI܁xE;aݨC砖Z_+nR_'&taxZddXh;|QdZÛlnq1 5kprWsEqI'QRRBff&۷g%-k3S,fPrOECjeJ>`k1*A kwL` /&xt %#/9m-z_ّ6AtmiٺK6da{u3g>,˖-b1}?F駩kWYY&MCIГN:^{møm۶ 2$U7 2d/v Mկ>}rWUTTо}-!sA=9+@3WK~vTɋڟϨpI|H8 J,'y8F  93F̴n\Zھ sbtx!ϸߔ6 Kw F]VWWIbfv|C| -zx}x#p[zFf׾-gnLp> F#f&.Mۖ^\v󟳢|\ģ"ѕ!۰жLL^.Nߦxk;׳pBSk܍ugg׭rǙj6Kl]#'+CasOj\]~ܮQSL ӡlx&Dܳ4,cEFA{ZRGoS?E9O^6/3>N! d ><>><^x83뺻:>ht<։f8T!`N QUG[Tw: XtSVUGKªfg7]_IK)ؘi%uȨ%&6O;z K`30apzۛ4 <^u3+x!i!h T1xRii?pV.:[bi+3ơ>}'k3 |VX=->;.u@a&!kXq(Z؉2?NQTdYA$1R| 3ׁ2o[Nl$S(( J@Nq7,.'|~+mʵ ĩ"ʒ]-c뵣G~o.%R|Vd5+?Q ghZ0\Q@AˀSF`'s]В1t+ţyQT'yU gy.Xh(E75˹c6B0e-Ekw q- <ű,cSN\4V"\Ab^p8Ν;ٺu+lZ~?p.ZZZ8ꨣ s R³wр+,N-W?nSq f}^8ײ,#> ;9_aiu)d'9A,u\n LJE@GdL+UQ3|Ωng[DBVOŃbF?$z~_~!cTyjE},q?|*or#W ?}-JY8špJeCojF~pޫ,|a=]vaʢw鮹f*v]i_|VuCot%M{;>k%dHdDv>њtr2irҋ%S+VZ[[mz躞3,$eLo:LW/%k(1rJ6O5d!Dc)rWГo^xKi#ūȒMXB)YӬ]=wbIk= IDATu JcvqFCƄqIhO UZ8-o E<"e$<Ț9cVy~ r -0ϩ2ߝGT#&JH漱"ԳiFLrC=hnT3VSnpbonV{Dɭ(IxDsAAUPU^uSmy\Ӳ *:9$G%?.Nۑl6OoՅi] Rv '%PD|u]GN(c"2e+K{eʿ<[I mᅕh=Mr-dt|1UVb*6 dgqyjƉYOY9BsC3TINWxE,w_ޭ4;*~|9^,+++}D?~{Ye Kӵj1>?NgER^͋LMUJtwQY٢x]iu4^/>ii1^=X|w ӯkf/GxI6fΜoǁnB `̚5 LQZ-[ڵk8͉6D"uY:SOe̙Xv ?"Ru6oLKK D~=|L:iL {F:jagdRDQↁkí}+t(*LѠkj%wqu|Gn?a/NL&el}G}:$/W˭bرi:::,:[إi0$QWW6s c8MӴs͝Hi4"hy&>˲4as7gL;u}sN a8n*}}CqD-\}6TIȈdR .lgaDgym2'ѽ`YxjvfLG!FwLa^c?JGGa! ^݋5+Ѽh$i#E*$N˃uuw}F:Cum=a='"s9sB%O۹++UQCzqzq{OSOQ__O& s/? 7 ΀bf?bf7 Gt "8giV0Q>Cyŵž4M>&T<&y]`̘1|H$'-nٲS؈i̚5;M6 6KFͦM?>ׯg|]m'}9驘W;r"q1>l9_,'C\o ,[l|qΝâqٴl#2Čxse)Sb^a;e2{фT*EϤ\̃.MBIRS<Ι ʉ{)g)d3^8MӴ+|~<⁠rHuK ̛7w0Xf ˗/'p-\t:=`䪪 ]y3Q>˗J († ٝBN;@"#*9g/-~իDd y'fL9ij#"4`Ibĉmf+ºX | FLtMJ~~d8ۤ w+W;\U{}тx(t&E. 2f3ٔ1%3pc^71)N HBu4i!UвctnNI4ne,$㡩*Hrit% 鬁a$BU4GڝK0 )fdC?F` ƍ9sxsIU E0|Ȥes=7(eeeiz " Ybz/^|nXq}:#9g2r8F4|>dKA\ӦMc͚5,]Vx뭷Bx^ƏϸqXn555]( "yt~&^ g$Xӓ NZZbHs!]@|q(! 1vtFKxH[|N߰Dm}:t|g61Gsub_8= 'HFQR:w~./%LFy}|F%\B zq'3i$y~#͜vii}~L0+V|-߳ٳ>7'qvN'`>p)gvqiq_)aٳ3Fca]]]Cn&3(β^{23'4A3E_S/T#(t$2,01s;K;ssN`1J$X%tt`fe{\}/X<SJ=H}uz衃V*5ocǎA=g4sM p;"kR17gB@p"]^lƢgJdDl҉J}#ǰxIT?xu,D%$UC`A̲;$=x&gG5祷T$ ;655`Ǝk{{S;4-{׮]455lLE[Gٍਪ%K*7]gTUU\HJup|Chb֍7_-*O.ePNx'a`ye}n#Āsq,ھd`1>Z_`I#cǨ:'RscAKA!Dd6١륶^#A?SnZGfʕ9s>#J\uGG:_t:*nG _t0؏`G>TM+0FjcA{tC]j%0P  C}ӡ8F8oq 8.\ وsP 2׀sq(Q._t… ׀s5J.NG,+4U] >E#_t⛌ cinnamon-4.4.8/data/theme/toggle-off-us.svg000066400000000000000000000171431360505115200205470ustar00rootroot00000000000000 cinnamon-4.4.8/data/theme/toggle-on-intl.svg000066400000000000000000000114531360505115200207260ustar00rootroot00000000000000 cinnamon-4.4.8/data/theme/toggle-on-us.svg000066400000000000000000000164671360505115200204210ustar00rootroot00000000000000 cinnamon-4.4.8/data/theme/trash-icon.png000066400000000000000000000054361360505115200201270ustar00rootroot00000000000000PNG  IHDR{` IDATx}uwkm!%i`  Ph bJ *FlDCH+4*(@"'Wwޕf|^sM=[͡HǙP!10 >LNgGM7Fz!=|ezLnd!q(yKJ+**FsK9 ksv0wHG̓|ͦF20qm׳;wqbbz-$F@AjEU ,b ]vC.guC@|avʼnIWAG=K='bč߷'y0yo{MsfL3Sfs>DE>\ĝq5(|˯"Ng0 ܿW9>ϴǵā1` 瑧 of3; |EZA*p"6p8I}P?h< <1^IiF{yN}SȤ@T%DZr:0 L/a_]Sn4tħj~Oxg.{H-d+a0|>]=pI,@7x@2 d8e* g׺)7d @(QDlbe6La3[(a$fv͛[ ~̵\7u1or?x@Ӝ<\U\}X7C<s2 @bvr6-߶i&ж%mVM: #Gi`[x870lk+ũD @(QD @(QD @(QD @ @(QD @(QD @(QD @(QD @(QD `)QD @(QD @(QD @(QD @\ 6nh"Alr00!4˛(v!΀r!G:1Ût cRf50&*v8SwHMɧރ ogh<2en1܏Ns\NKqg x6hc672˫Y,"e1G38%#")YTymg1ee#&bxlng%&%nMN n>ͭ<9WyMts4HrNBB:YrTQ;-1;\sA4y ;3@%snc}~)8>hqZSǰ>">Vk>$ȓ~  *!"$`ZDH:ψ 19 ߉5-fgL:NH28{RPBHҘI#u&P}Ear38! p(QI}ōiԗ487ì]D\ꣶDBHDbB Z-M)Qf@LDePӜu3vh:6rDlBbBr^ZD$DiVgVN*͘Dõ %r]n h{OkK6AiYF\pH.g%?(s/Y#^@/;$uF&0xG2}cfe%vK51.=!A 3}?|-Xq"? 8g(~ Ŝ̸ JPD<$Qİ:wx@rLdq1ѭld=kJ0 < /l2IENDB`cinnamon-4.4.8/debian/000077500000000000000000000000001360505115200145515ustar00rootroot00000000000000cinnamon-4.4.8/debian/README.Debian000066400000000000000000000026441360505115200166200ustar00rootroot00000000000000Cinnamon for Debian ====================== 1. Running There are two main ways of running Cinnamon: replacing your current GNOME window manager and panel components, or inside a Xephyr window, as a way to quickly try it out without compromising your environment. At this stage one of the options may work better than the other, depending on various factors, including your drivers. To run Cinnamon under Xephyr you first need to install the xserver-xephyr package, and then run Cinnamon with the --xephyr parameter: $ cinnamon --xephyr 2. It's SLOW as hell! To run Cinnamon you need to have proper DRI, and a video driver that Clutter likes. In some Intel cards, Kernel-Mode Setting (KMS) may help. In case Cinnamon runs but is extremely slow you can try enabling KMS or running it with CLUTTER_VBLANK=none in its environment. See http://bugzilla.openedhand.com/show_bug.cgi?id=1730. 3. If you have enough corage... Cinnamon installs a .desktop file which makes it possible to make it the default for your session, replacing metacity/gnome-panel. To make it the default all you need to do is set the following gconf key to 'cinnamon': /desktop/gnome/session/required_components/windowmanager Here's the gconftool command, if you're feeling lazy: $ gconftool-2 -t string -s /desktop/gnome/session/required_components/windowmanager cinnamon -- Gustavo Noronha Silva , Tue, 20 Oct 2009 14:50:12 -0200 cinnamon-4.4.8/debian/changelog000066400000000000000000006576501360505115200164460ustar00rootroot00000000000000cinnamon (4.4.8) tricia; urgency=medium * Calendar applet: Fix clock format msgid -- Clement Lefebvre Tue, 07 Jan 2020 09:41:42 +0000 cinnamon (4.4.7) tricia; urgency=medium [ Michael Webster ] * window-list applet: thumbnails - only fetch the window actor once, instead of each time it's used. * cs_themes.py: theme_path is not guaranteed to be non-null so it needs to be checked before using os.path.exists() (which isn't null-safe). * runDialog.js: Don't test a null string when attempting absolute path execution. * runDialog.js: Restore implicit home folder location when the entry starts with neither a ~ or /. [ Clement Lefebvre ] * l10n: Adjust date format -- Clement Lefebvre Mon, 06 Jan 2020 10:26:35 +0000 cinnamon (4.4.6) tricia; urgency=medium [ Michael Webster ] * grouped-window-list: Add listener for workspace changes that do not precede the MetaDisplay's 'window-created' signal. * cs_info.py: Show a busy indicator on the Upload button while the upload-system-info script is running. * runDialog.js: allow navigating completions using the arrow keys. * runDialog.js: When the completion list is open and enter is hit, only execute the line immediately if the path is to a folder, otherwise close the completion list while leaving the last selected completion appended to the original entry contents. This allows arguments to be added by the user. * runDialog.js: Expand ~ to the home path when tabbing for completions, and when executing the command line, expand ~ always. * cs_themes.py: Change how the gtk3 css override file is handled. * issue template: Add a section to attach xlet configuration if relevant. [ JosephMcc ] * cs_sound.py: Allow previewing the sound even when disabled [ Clement Lefebvre ] * Revert "GWL: Remove hotkeys" -- Clement Lefebvre Sat, 28 Dec 2019 12:01:06 +0000 cinnamon (4.4.5) tricia; urgency=medium [ Michael Webster ] * launchers, window list applets: Use the same applet removal confirmation that other applets use. * menu applet: Override the default key-press-handler for the popup menu so pressing escape to close the menu doesn't animate. [ Stephen Collins ] * Settings: add missing widget import (#9016) [ Clement Lefebvre ] * Panel: Raise text size upper limit to 16pt -- Clement Lefebvre Thu, 12 Dec 2019 11:46:55 +0000 cinnamon (4.4.4) tricia; urgency=medium [ James Ross ] * menu-applet: fix order of places [ Michael Webster ] * cinnamonEntry.js: Fixes for the copy/paste popup. * runDialog.js: Don't do anything if enter is pressed with an entry that is empty (or has only whitespace). -- Clement Lefebvre Tue, 10 Dec 2019 10:17:37 +0000 cinnamon (4.4.3) tricia; urgency=medium [ Michael Webster ] * grouped-window-list@cinnamon.org: Listen to MetaDisplay's window-created signal for adding new windows. * grouped-window-list@cinnamon.org: Simplify updating when the pinned apps list changes. * grouped-window-list@cinnamon-org: Apply title-display pref changes to all workspaces. * cs_startup.py: Make certain that icons are the correct size - when an icon doesn't exist except as a larger size, it can sometimes ignore the GtkIconSize request. * cs_startup.py: Scroll to and select the new row when an entry is added. * cinnamon-settings: Use the 'gnome-disks' icon for the Disks utility. * i18n: run generate_additional_files.py to update a couple of desktop file translations. [ Ellis Hoag ] * cinnamon-settings: Fix missing backgrounds issue (#8996) [ Michael Webster ] * xapp-status@cinnamon.org: Switch to a themeable container and give (#8997) -- Clement Lefebvre Wed, 04 Dec 2019 16:22:09 +0000 cinnamon (4.4.2) tricia; urgency=medium [ Michael Webster ] * settings@cinnamon.org: Fix applet, Panel.populateSettingsMenu was removed during work on the panel menu. * window-list@cinnamon.org: Don't fetch the metaWindow's actor until it's needed, it isn't always there initially. This also allows recovery on subsequent attempts if null is returned once. [ Stephen Collins ] * SettingsWidgets.py: remove duplicate IconChooser widget [ Clement Lefebvre ] * cs_backgrounds: Use symbolic icons in sidebar [ Stephen Collins ] * GWL: fix focus stealing when the previews are showing (#8984) -- Clement Lefebvre Thu, 28 Nov 2019 20:07:50 +0000 cinnamon (4.4.1) tricia; urgency=medium [ Michael Webster ] * startup: Change the startup effect, and allow a logo icon name or path to be displayed based on a settings key. -- Clement Lefebvre Mon, 25 Nov 2019 16:22:07 +0000 cinnamon (4.4.0) tricia; urgency=medium [ Steve M ] * Stock theme - improve modal and run dialog layout (#8740) [ Clement Lefebvre ] * l10n: Update files * menu: Don't show hidden files in recents [ James Ross ] * menu applet: if all recents are hidden act like there are none (#8780) * menu applet: fix typo in system box nav fix (#8781) [ Michael Webster ] * CinnamonGtkSettings.py: Fix a runtime warning. [ Clement Lefebvre ] * Settings: Fix picture chooser in HiDPI [ Simon Brown ] * remove some error_trap deprecations (#8643) [ Stephen Collins ] * Change xlet about dialog to external python/gtk in it's own process (#8734) [ James Ross ] * Fix some compile warnings. (#8722) [ Clement Lefebvre ] * Window settings: Simply layout settings [ Eric Larson ] * Update cs_windows.py: Add setting for new window focus (#8798) [ Clement Lefebvre ] * Window settings: Rephrase new option and reorder focus stealing combo options [ Michael Webster ] * panel.js: Simplify the initial panel context menu. (#8803) [ James Ross ] * Partially revert "cinnamon-global.c: fix repaint function signatures" [ Michael Webster ] * cinnamon-window-tracker.c: remove 'tracked-windows-changed' signal. * window-list@cinnamon.org: Restore async window-added signal handler. [ Clement Lefebvre ] * Add an XAppStatus applet (#8823) * Applets: Hide tooltip when set to an empty string * XappStatus applet: Hide tooltip on click events [ Michael Webster ] * search_provider.py: port search provider example to python3 [ Clement Lefebvre ] * Fix cs_privacy in LMDE3 [ JosephMcc ] * Add a display settings python module (#8829) [ Sander Steenhuis ] * cin-debug: Fix time code (#8812) [ claudiux ] * xlet-settings.py - Adding option to reload the xlet in the burger menu of its configuration screen (#8818) [ Germán Franco ] * Notifications: add support for silent notifications (#8825) * Enable management of system-wide extensions through the spices settings UI (#8827) * Spices.py: don't try to load themes twice (#8828) [ Clement Lefebvre ] * Panel: Rework context menu * Remove unecessary npm/gulp files [ Simon Brown ] * panel: minor corrections after context menu change (#8840) [ Stephen Collins ] * cs_default.py: fix missing declaration causing crash when desc not found (#8855) [ Clement Lefebvre ] * Panel context menu: Re-add system settings [ Michael Webster ] * xapp-status applet: Update to utilize XAppStatusIconMonitor. * system tray: Keep the _NET_SYSTEM_TRAY_ORIENTATION window property in sync with the orientation of the panel our systray applet resides on. * xapp-status applet: Hide icon labels in a vertical panel. * xapp-status applet: Display icons in a consistent order. * xapp-status applet: sort symbolic after color icons. [ claudiux ] * Fix translation issues (#8739) [ Simon Brown ] * Workspace switcher : remove arbitrary cutover to buttons (#8757) [ itzexor ] * menu applet: break out app loading into its own file [ James Ross ] * menu applet: remove some pointless state tracking * menu applet: code cleanup * menu applet: always reuse vectorBox actor * menu applet: SimpleMenuItem docs/helper funcs * menu applet: finish adding SMI type strings * menu applet: small searching optimizations * menu applet: don't close context menu when deleting favorite * menu applet: refreshless and more consistent icon settings * menu applet: rework refreshing * menu applet: allow turning off recent category [ itzexor ] * window-list: use SignalManager more * panel-launchers: add destroy() to launcher object [ Pyroxar ] * System Settings: Add gnome-disks (#8839) [ Germán Franco ] * Calc search provider example: copy result on activate (#8847) [ James Ross ] * main.js: remove dead code and style cleanup (#8848) [ Clement Lefebvre ] * GWL: Remove list-monitor-windows * GWL: Remove show-pinned * GWL: Remove system favorites * GWL: Remove show-alert * GWL: Remove icon spacing * GWL: Remove hotkeys [ Michael Webster ] * xapp-status applet: Refactor/optimize for better readability. [ dutta64 ] * Fix window closing for windows quick list applet. Truncate titles. (#8844) [ Michael Webster ] * cs_mouse: Expose disable-with-external-mouse touchpad setting. * popupMenu.js: Update the position of a menu even when not animating. [ Stephen Collins ] * Expose new features in the XAppIconChooserDialog to the settings widget (#8885) [ Clement Lefebvre ] * SettingsWidgets: Rename custom to icon_categories * SettingsWidgets: Add a default_category for icon_chooser widgets * Calendar applet: Fix date format [ Michael Webster ] * xapp-status@cinnamon.org: Add proper style classes to the default theme, Fix some spacing issues in horizontal and vertical orientations, fix icon sizing, some general refactoring. * xapp-status@cinnamon.org: Use applet-box style class for individual icons. [ Clement Lefebvre ] * Configuration: Remove bluetooth@cinnamon.org from enabled-applets [ James Ross ] * window-list: fixups (#8894) [ Steve M ] * cs_info: Wrap labels (#8869) [ Michael Webster ] * xapp-status@cinnamon.org: clean up leftover style class (removed in 5c87fd7f8d). [ claudiux ] * ExtensionCore.py: Add a sort by available update (#8902) [ Norbert Preining ] * cinnamon-launcher: Allow to disable user spices (#8873) [ Clement Lefebvre ] * cinnamon-launcher: Beautify dialog and msgids * GWL: Switch launch animation to scale [ claudiux ] * cinnamon-settings: add 'update' to --sort option available values (#8927) [ James Ross ] * dnd.js: add animation done callback support to placeholder (#8868) * extension.js: fix variable scope regression (#8930) [ Stephen Collins ] * settings.js: allow distributions to override individual settings keys (#8919) [ Michael Webster ] * network applet: Remove the rescan button, instead trigger a scan when the menu is opened. [ James Ross ] * menu-applet: don't show user-hidden categories * window-list: don't flash focused windows [ itzexor ] * util: add escapeRegExp utility function [ James Ross ] * menu-applet: escape user input before using in RegExp [ Lars Mueller ] * Fix: Handle GFileIcon file changes This monitors file changes for GFileIcon and updates the StIcon accordingly [ Michael Webster ] * cinnamon-global: Notify muffin when the ui_scale changes, so window decorations and pointer size can be updated properly. * xapp-status applet: Remove an invalid comment argument. * js: Use global.ui_scale instead of checking the theme context for the scale factor. [ hipoloco ] * Apply HighContrast theme in WM (#8939) [ itzexor ] * panel-launchers: add support for add/move without reload * dnd/applets: don't use two names for one thing * panel-launchers: rework DND [ Eli Schwartz ] * Cinnamon-0.1.typelib: do not link to libnm typelib [ Michael Webster ] * panel-launcher applet: Add a slight transition effect for dragging items. [ Stephen Collins ] * cs_calendar.py Port the remaining date/time settings to python [ Michael Webster ] * accessibility settings: Add some padding around dependency labels. [ Clement Lefebvre ] * Python: Switch cgi.escape to html.escape [ hipoloco ] * a11y applet: don't display "Screen reader" button when gnome-orca is not installed (#8954) [ OneQuid ] * Dialog: Treat Escape key as Gtk.Response.NO (#8960) [ Clement Lefebvre ] * l10n: Update POT * l10n: Generate files [ Michael Webster ] * messageTray.js: remove an old hack that was messing up notification timeout accounting. * window-list applet: Remove window-actor check during window-monitor- changed. * messageTray.js: Cancel a timeout instead of just zeroing out the id, this can cause the callback to issue well after the notification has been destroyed. [ James Ross ] * window-list: proper fix for incorrect flashing (#8968) [ Stephen Collins ] * cs_themes.py: speed up loading of the icon for the icon theme widget [ Garry Filakhtov ] * Make the libnm library optional (#8617) [ Michael Webster ] * Panel: Configurable size per zone for text and symbolic icons (#8971) [ okaestne ] * cinnamon-settings.py: fix ctrl+c * cinnamon-settings.py: remove unused vars and formatting * ExtensionCore.py: replace GtkDialog with GtkInfoBar for outdated cache * ExtensionCore.py: generate download spices tab on demand [ Eli Schwartz ] * Revert the incorrect and problematic addition of overlinking in Cinnamon-0.1.gir (#8972) [ James Ross ] * sound-applet: don't error when missing input or output * sound-applet: dbus fixes * sound-applet: clean up callbacks * sound-applet: default next/previous controls to unsupported * sound-applet: consume event properly on button press [ Michael Webster ] * sound applet: Remove call to nonexistent method. [ Stephen Collins ] * cinnamon-settings: migrate to using python-xapp widgets and remove dups [ Michael Webster ] * control: Add python3-xapp dependency. * SettingsWidgets.py: Re-apply 9cc821bd9793 due to refactoring from python-xapp move (be7fd9da917322). * cs_calendar.py: Use python3.5-compatible api for localizing time for lmde3. [ Eli Schwartz ] * fix regression in ExtensionCore not working when updates are available (#8964) [ Clement Lefebvre ] * l10n: Update POT -- Clement Lefebvre Fri, 22 Nov 2019 21:18:09 +0000 cinnamon (4.2.3) tina; urgency=medium [ Clement Lefebvre ] * l10n: Generate files [ Michael Webster ] * cinnamon-app-system.c: Fix a leak, nothing was freeing the GPtrArrays for collecting apps with duplicate names. On the other hand, the arrays don't need to free their elements (CinnamonApps). [ dependabot[bot] ] * build(deps): bump lodash from 4.17.11 to 4.17.14 (#8713) [ Clement Lefebvre ] * Privacy settings: Add missing import * Sound settings: Make the module slightly taller [ James Ross ] * menu applet: only update label on orientation change (#8731) [ Clement Lefebvre ] * Revert "IndicatorManager: Clean up (#8004)" [ Michael Webster ] * cinnamon-window-tracker: Add a window-app-changed signal to notify the window list when a window<->app association changes. -- Clement Lefebvre Thu, 25 Jul 2019 10:24:56 +0200 cinnamon (4.2.2) tina; urgency=medium [ Clement Lefebvre ] * Main: Don't warn about 2D in live mode * Main: Rephrase 2D warning and link to driver manager * l10n: Update POT [ Germán Franco ] * Stop using deprecated function Settings.prototpe.bindProperty (#8705) -- Clement Lefebvre Thu, 11 Jul 2019 15:55:44 +0200 cinnamon (4.2.1) tina; urgency=medium [ Clement Lefebvre ] * l10n: Don't translate vsync methods [ Michael Webster ] * cs_themes: Set a more realistic lower and upper limits for the scrollbar size slider, and fix its page size to 2 (it defaulted to 10, which is too course). * cs_power.py: Create UPower.DeviceLevel if it doesn't exist (needed for upower < 0.99.0). * cs_themes.py: Reword scrollbar click behavior setting slightly. [ Clement Lefebvre ] * l10n: Update POT [ Simon Brown ] * grouped-window-list: setStyleOptions still getting called if labels on (#8689) [ Clement Lefebvre ] * Privacy settings: Add support for connectivity checking (#8693) * l10n: Update POT * Privacy settings: Specify GI version [ Germán Franco ] * sound applet: show seekbar for Audacious (#8696) [ Noam ] * Fixed checking whether device is already set. (#8679) -- Clement Lefebvre Wed, 10 Jul 2019 11:49:55 +0200 cinnamon (4.2.0) tina; urgency=medium [ NikoKrause ] * Add printers applet (#8485) [ Simon Brown ] * cinnamon-app: initialise a variable (#8486) * cinnamon-doc-system: tidyup of recents (#8487) * st-texture-cache: use a slightly more efficient linked list method (#8488) [ Eli Schwartz ] * PIL: remove unnnecessary version check and code fork (#8496) [ Jason Hicks ] * Make the sync method configurable (#8481) * cinnamon-doc-system: Switch back to GSList (#8502) [ Simon Brown ] * st-icon: quiet a build warning (#8501) [ Jason Hicks ] * Replace some GLib wrappers (#8443) * Improve property access performance (#8245) * Reduce public function invocation in C code for simple getters with no logic (#8395) * wm: Apply window effects to clones (#8497) * layout: Misc. clean up (#8465) [ JosephMcc ] * cinnamon-settings-ui: Remove the hack to center the stack switcher (#8520) [ Michael Webster ] * workspace-switcher applet: Fix updating the focus window position and size at startup, and ensure the focus window starts out on top of the graph button. [ Cobinja ] * Fix: update the input regions when going fullscreen (#8523) [ Jason ] * runDialog: Fix run dialog not opening when cursor is hovering over a panel * messageTray: Call updateRegions after notifications complete their effect [ Clement Lefebvre ] * SettingsWidgets: Remove obsolete classes [ JosephMcc ] * SettingsWidgets: Convert to use the new style used in xapps (#8577) [ Michael Webster ] * cinnamon-settings.py: Improve bring_selection_into_view calculations. [ Jason Hicks ] * windowEffects: Fix opacity during the close effect, stacking during the minimize effect (#8596) * layout: Ensure regions update after the keyboard is hidden (#8585) * overview: Fix some thumbnails not appearing (#8594) * st-label: Move St-specific shadow processing out of the paint vfunc (#8588) * layoutManager: Always update regions when untracking an actor (#8601) [ Clement Lefebvre ] * window-list: Fix skip_taskbar call on metawindow * Revert "runDialog: Fix run dialog not opening when cursor is hovering over a panel" * Revert rect caching and obstructed windows optimizations (#8606) [ dependabot[bot] ] * build(deps): bump js-yaml from 3.12.0 to 3.13.1 (#8610) [ Jason Hicks ] * git ignore auto-generated files (#8586) * issue template: Request info about daily builds PPA usage (#8605) * Update vulnerable NPM dependencies (#8614) [ Clement Lefebvre ] * Change onscreen keyboard icon to input-keyboard [ BeatLink ] * Remove All Caps from default workspace naming (#8513) [ dilinger ] * cinnamon-settings-users.py: update symlink vulnerability fix (#8515) [ claudiux ] * Consider the "last-edited" field as integer even when enclosed in quotation marks. (#8459) [ Cobinja ] * Fix: update the input regions when going fullscreen (#8523) [ Jason ] * messageTray: Call updateRegions after notifications complete their effect [ Jason Hicks ] * layoutManager: Always update regions when untracking an actor [ Clement Lefebvre ] * Revert layout.js optimizations (#8624) [ JosephMcc ] * Revert some changes to fix icon and text shadow issues on the panel (#8630) [ Clement Lefebvre ] * Notifications: Small fixes [ montagdude ] * Use ConsoleKit instead of old upower for suspend/hibernate (cs_power.py) (#8438) [ Stephen Collins ] * Workspace switcher applet settings: add tooltip with informative note (#8524) [ Jason Hicks ] * overview: Fix some thumbnails not appearing (#8594) [ Clement Lefebvre ] * cinnamon2d: Remove CLUTTER_PAINT=disable-clipped-redraws [ Odyseus ] * Xlets removal confirmation dialogs (#8636) [ Michael Webster ] * Add a utility script for accessing cinnamon's dbus methods from a terminal (#8628) [ Germán Franco ] * Ripples: use St.Widget instead of St.BoxLayout (#8640) * Fix misplaced windows in overview [ Michael Webster ] * st-theme-node.c: Allow parsing of 'symbolic' (and -warning, -error, and -success) as a color. * spacer applet: Outline applet during panel edit mode to make spacers more apparent when arranging panel items. * appsys: When processing apps in the menu tree, watch for and de- (#8550) [ Clement Lefebvre ] * l10n: Update POT * l10n: Generate additional files [ Michael Webster ] * runDialog.js: Go back to using the original spawnCommandLineAsync, as well as the original code using it in runDialog. [ Simon Brown ] * modemManager: fix cjs warning (#8667) [ James Ross ] * "Peek" panel for 1.5 seconds when highlighted (#8659) [ Germán Franco ] * Notifications applet: proper i18n of plurals (#8645) [ Simon Brown ] * st: pass framebuffer parameter to avoid excess call to get_draw_framebuffer (#8590) [ Gabriel Medina Pegoraro ] * cinnamon-settings: Use global proxy settings when available (#8589) [ Simon Brown ] * st: Move processing after early returns where possible (#8576) [ pwfrank ] * Workspace switcher: shade labels of empty workspaces in simple button mode (#8555) [ Sean Adams ] * power@cinnamon.org: improved support for multiple batteries (#8400) [ Simon Brown ] * Systray: Indicator alignment fix (#8208) [ claudiux ] * Cinnamon Settings: Adding capability to open specific tab and choose sort type (#8333) [ Clement Lefebvre ] * Menu: Tune search results [ LingMan ] * Cinnamon Settings: Fix search for locales with a non-Latin character set (#8674) [ Clement Lefebvre ] * cinnamon-xlet-makepot: Switch to subprocess module [ Michael Webster ] * theme settings: Add capability to override some scrollbar-related Gtk settings. (#8547) [ Clement Lefebvre ] * l10n: Update POT * Add files/usr/share/applications/cinnamon-settings-online-accounts.desktop -- Clement Lefebvre Sat, 29 Jun 2019 15:38:01 +0200 cinnamon (4.0.10) unstable; urgency=medium [ Michael Webster ] * cinnamon-desktop-editor.py: Check for item_path before modifying it. [ Jason Hicks ] * IndicatorManager: Clean up (#8004) * [Next] perf: Add a simple benchmark utility for prototype methods (#8081) * Refactor spawnCommandLineAsync for stdout/stderr output (#8130) [ NikoKrause ] * Preferred Applications: Add entry for "PDF viewer" (#8133) [ Jason Hicks ] * recorder: Use clutter_stage_capture instead of cogl's read_pixels (#8159) [ Simon Brown ] * st-entry: remove an explicit destroy (#8215) * st-icon: remove unused size values (#8218) * st-texture-cache: Use right event to detect file changes (#8219) [ Jason Hicks ] * gwl: Fix progress not fully resetting when the last window from a group is closed (#8160) [ MTzukanov ] * cs_keyboard.py:Fix category search in layout tab (#8184) [ Mikhail Bodrov ] * Use push instead of unshift for array (#8193) [ Jason Hicks ] * misc/util: Fix typo in tryFn function (#8201) [ Simon Brown ] * Default theme: document css used by symbolic icons (#8205) * st-bin: Destroy child in ClutterActor:destroy vfunc (#8220) [ Jason Hicks ] * gwl: Fix incorrect window accounting in multi-workspace cases (#8192) [ Stephen Collins ] * Menu applet settings: move the favbox height setting (#8291) [ Jason Hicks ] * JsonSettingsWidgets: Fix TypeError (#8286) [ Germán Franco ] * Overview: don't close on key release just after opening from keyboard (#8249) * settings.js: Add a method to get the default value from settings-schema (#8292) [ Clement Lefebvre ] * Backgrounds settings: Rework bg colors [ Jason Hicks ] * Use icon-changed signal * runDialog: Always close on loss of key focus (#8306) * gwl: Average the progress of all windows belonging to an app group button (#8161) * gwl: Fix thumbnails not populating the menu when opened by click (#8302) * gwl: Simplify AppList.prototype.windowAdded (#8148) [ Simon Brown ] * st-theme-node: fix text shadow 'none' to correctly draw no shadow (#8216) * st-icon: create shadow pipeline only at paint (#8238) * st-drawing-area: use pipeline_copy (#8241) [ Clement Lefebvre ] * Simplify DocSystem/DocInfo (#8278) * Backport appsys changes (#8295) [ James Ross ] * Various menu improvements (#8297) [ Clement Lefebvre ] * Menu applet: Don't call recalc_height() in refreshFavs() [ Jason Hicks ] * st-cogl-wrapper: Get context from Clutter once (#8325) * st-private: Remove redundant calculations (#8323) * st-drawing-area: Call cogl_pipeline_new when needed (#8324) [ Germán Franco ] * Stop using deprecated bindProperty method (#8318) [ Jason Hicks ] * cinnamon-app: Fix function call in cinnamon_app_launch (#8336) [ Clement Lefebvre ] * Revert "Backport appsys changes (#8295)" * Simplify Appsys (#8367) [ Jason Hicks ] * appsys: a couple changes for more optimal muffin usage (#8369) * gwl: Fix icon-changed handler * cinnamon-app: Get a fallback icon from Muffin for some window-backed apps (#8151) * gwl: Fix the thumbnail menu not closing on leave after closing a window (#8376) [ ghostslayer989 ] * [ImgBot] Optimize images (#8379) [ Jason Hicks ] * cinnamon-app: Simplify icon retrieval for window-backed apps (#8370) * windowManager: Cache settings, various clean up (#8290) [ James Ross ] * all/python: use setproctitle (#8403) [ Clement Lefebvre ] * WindowManager: Reduce the number of signal listeners (#8399) [ Simon Brown ] * gwl: apply style class to the thumbnail menu (#8096) [ Jason Hicks ] * window-list: Fix MetaWindowActor TypeError (#8445) [ Simon Brown ] * quiet some ISO C90 compile warnings (#8435) * remove some unused variables (#8429) [ Damien Simonin Feugas ] * Slideshow applet: Show current file name in popupmenu (#8003) [ Jason Hicks ] * Replace MetaShapedTexture usage with MetaWindowActor (#8269) * Add compatibility for the obscured window optimization in Muffin (#8300) [ Stephen Collins ] * Spices.py: fix a bug causing gwl to be removed when wl is disabled (#8309) [ James Ross ] * Menu applet: Various improvements (#8314) * General optimizations (#8351) * menu applet: fix last eslint warning (#8396) * Melange/all: huge style refactor (#8447) [ Mirko Girgenti ] * FIX: https://github.com/linuxmint/cinnamon-settings-daemon/issues/192 (#8145) [ Simon Brown ] * st-scroll-view: fix a couple of fall-through situations (#8431) [ Stephen Collins ] * Workspace switcher applet: various improvements to the graph style (#8352) [ Jason Hicks ] * cinnamon-global: Only setup paint callbacks for performance monitoring when enabled (#8337) [ Stephen Collins ] * xlet settings list widget: some fixes and improvements to the tree (#8311) * sound chooser widget: add all mimetypes option and improve default (#8312) [ Nicolai Weitkemper ] * Add tooltip to window focus behaviour (#8247) [ Jason Hicks ] * st: Move allocation calls out of paint vfuncs (#8326) [ Stephen Collins ] * Spices.py: fix disabling of desklets and extensions (#8466) [ James Ross ] * layout.js: fix typo (#8468) -- Clement Lefebvre Thu, 28 Mar 2019 11:10:59 +0000 cinnamon (4.0.9) tessa; urgency=medium [ Michael Webster ] * menu/desktop editor: Run update-desktop-database on the user's applications folder when modifying a desktop entry. [ Jason Hicks ] * window-list: Prevent _addWindow from getting called before windows finish mapping (#8180) * PopupSubMenu: Set sourceActor active before closing menu (#8242) [ Simon Brown ] * st-private: Don't try to create shadow for empty texture (#8217) -- Clement Lefebvre Tue, 08 Jan 2019 16:38:19 +0000 cinnamon (4.0.8) tessa; urgency=medium * Cinnamon Settings: Make directly launched modules feel like standalone apps (#8146) -- Clement Lefebvre Mon, 17 Dec 2018 11:30:52 +0000 cinnamon (4.0.7) tessa; urgency=medium [ Clement Lefebvre ] * GWL: Fix blurry logout/shutdown dialog icon * RunDialog: Fix pkexec support [ Jason Hicks ] * gwl: Fix incorrect app group button widths on close with labels enabled (#8137) [ Clement Lefebvre ] * GWL: Launch new instances on Shift+Click * cinnamon-settings: Fix if->elif statement [ Steve M ] * Stock theme - fix expo workspace entry not expanding to fit scaled fonts (#8142) -- Clement Lefebvre Sat, 15 Dec 2018 13:59:20 +0000 cinnamon (4.0.6) tessa; urgency=medium [ Michael Webster ] * cs_default.py: Improve heuristic used to find calculator programs. * cd_keyboard.py: Escape the accel label when setting the markup for the shortcut conflict-resolution dialog. * cs_fonts.py: Rename title to 'Font Selection' so it doesn't conflict with the font viewer (also called 'Fonts'). [ Clement Lefebvre ] * l10n: Regenerate cs_fonts desktop file [ Jason Hicks ] * gwl: Always persist pinned apps' positioning after drag, fix duplicate thumbnails on init in vertical menu orientation (#8115) [ NikoKrause ] * menu-applet: fix broken option `Open menu on hover` (#8117) [ Jason Hicks ] * gwl: Fix the thumbnail menu not closing when using Super + # keys (#8121) * gwl: Always check the skip-taskbar hint (#8126) * window-list: Fix icons not appearing for some apps (#8123) [ NikoKrause ] * gwl: add missing icons for libreoffice actions (#8127) [ Jason Hicks ] * gwl: Only use notify::icon signal for un-grouped apps (#8113) * gwl: Add support for dragging files to windows from the thumbnail menu (#8118) * gwl: Fix a couple ungrouped mode bugs, fix thumbnail menu positioning on window add/remove (#8120) * gwl: Fix DND ops originating from menu items leaving large gaps (#8125) -- Clement Lefebvre Tue, 11 Dec 2018 11:14:18 +0000 cinnamon (4.0.5) tessa; urgency=medium * Revert "gwl: Open new windows by holding ctrl and left clicking (#8103)" * gwl: Open new windows by holding ctrl and left clicking -- Clement Lefebvre Thu, 06 Dec 2018 15:17:14 +0000 cinnamon (4.0.4) tessa; urgency=medium [ Clement Lefebvre ] * Revert "Panel settings: Move symbolic setting to customize section" [ Leigh Scott ] * Update muffin minimum required version (#8076) [ Michael Webster ] * grouped window list: appGroup.js: account for the desktop scale factor when determining window list item widths [ NikoKrause ] * menu-applet: fix vanishing system buttons (#8107) [ Clement Lefebvre ] * Settings: Fix mintlocale-im launcher [ NikoKrause ] * fix broken slideshow applet (#8099) [ James Ross ] * AppletManager: perform _removeAppletFromPanel on idle (#8101) [ Jason Hicks ] * utils: Simplify URL regex to only support one layer of parentheses (#8079) * gwl: Fix the drag actor being too big in high DPI (#8098) * gwl: Fix spacing between icons and labels (#8091) * gwl: Fix icon alignment in left oriented panels (#8084) * gwl: Translate preferences context menu item (#8086) * gwl: Speed up initialization (#8092) [ Clement Lefebvre ] * Xlet settings: Fix UUID filtering * Adjust the default look of Cinnamon 4.0 (#8108) [ Jason Hicks ] * gwl: Fix unresponsive window dialog appearing when closing windows with middle click (#8109) * gwl: Open new windows by holding ctrl and left clicking (#8103) -- Clement Lefebvre Thu, 06 Dec 2018 13:24:54 +0000 cinnamon (4.0.3) tessa; urgency=medium [ Michael Webster ] * cinnamon-settings.py: Don't animate stack transitions when launching directly to a sidepage. [ Clement Lefebvre ] * l10n: Simplify msgids in gwl applet * l10n: Update POT [ Jason Hicks ] * extension: Prevent loading xlets that use imports.gi.NMClient that have no 4.0 directory (#8050) [ Germán Franco ] * gwl: Pin badge position to icon corner (#8040) [ Jason Hicks ] * gwl: Fix focus change (#8045) [ Simon Brown ] * grouped-window-list: ensure thumbnails are same size in hidpi (#8041) [ James Ross ] * panel.js: be more consistent about closing menu (#8047) * PopupMenu: update position and fix size before tweening out (#8046) [ Simon Brown ] * systray: stop indicator icons coming up oversize (#8051) [ Michael Webster ] * panel-launcher applet: Make sure the icon's aspect ratio is correct, even if that means using a non-optimal size. * sound applet: Use player Identity property for labels if available. * menu applet: Initialize the favBoxIter when the menu opens, since we try to access it when closing the menu, whether we've interacted with favorites or not (which is ordinarily when the iterator would first be populated). * sound applet: Capitalize the player name only when the bus name is used to generate it, and convert to lowercase when needed for matching our support lists. * sound applet: Use string.capitalize() for fixing up the player name. [ brownsr ] * panel launcher: ensure icon aspect is correct in any panel extends eda3e20d6b530169c625eb00977d8f5255ad4141 [ Jason Hicks ] * Make transitions between restarts seamless [ Michael Webster ] * panel/theme: Use just a single relative percentage for sizing symbolic icons. (#8055) [ Clement Lefebvre ] * Panel settings: Move symbolic setting to customize section [ Jason Hicks ] * popupMenu: Avoid unnecessary relayouts (#8065) * gwl: Improve thumbnail menu input and button label handling (#8057) * gwl: Round the actor transformed position (#8067) [ Clement Lefebvre ] * l10n: Update POT -- Clement Lefebvre Tue, 27 Nov 2018 17:15:50 +0000 cinnamon (4.0.2) tessa; urgency=medium [ Leigh Scott ] * Network: Port to libnm (#7699) [ NikoKrause ] * network-applet: use new network-wireless-signal-secure icons (#8022) * menu-applet: several fixes (#8021) [ James Ross ] * menu applet places hover fixup/forEach cleanup (#8023) [ NikoKrause ] * systray-applet: more spacing between icons (#8006) * gwl: use generic icon names (#8027) [ Michael Webster ] * network applet: Keep track of unmanaged networks (and listen to their (#7628) [ Jason Hicks ] * st-texture-cache: Don't add NULL textures to cache (#8036) * gwl: Improve thumbnail scaling for lower resolutions (#8035) [ Clement Lefebvre ] * l10n: Update POT -- Clement Lefebvre Mon, 19 Nov 2018 10:00:33 +0000 cinnamon (4.0.1) tessa; urgency=medium [ Clement Lefebvre ] * Menu: Add style classes for new objects and fix motion on hover * Systray: Fix icon size in HiDPI when zone icon size changes * Panel settings: Call the zones appropriately * Packaging: Fixed breaks/replaces/recommends * Packaging: Relax dependencies * Menu: Change default logo to cinnamon-symbolic [ Michael Webster ] * cinnamon-desktop-editor.py: Allow custom paths for icons. [ Jason Hicks ] * st-polygon: Fix memory leak during picking (#7983) [ IAmTheRedSpy ] * Reduce word duplication in README.rst (#7982) [ Jason Hicks ] * panel: Preserve logic to only emit icon-size-changed on actual change, while exempting symbolic changes (#7981) [ Michael Webster ] * cs_panel.py: Re-arrange and group new panel settings. [ Clement Lefebvre ] * l10n: Update POT [ Jason Hicks ] * panel: Fix icon size, panel height defaults (#7984) [ Clement Lefebvre ] * Notifications: Fix symbolic icons rendering as fullcolor [ JosephMcc ] * applet-separator: Better support vertical panels (#8013) [ NikoKrause ] * show-desktop applet: use symbolic icon for "show desklets" action (#8001) [ Jason Hicks ] * panel: Fix invalid object access case (#7997) * cinnamonDBus: Handle stale xlet settings (#7996) [ Clement Lefebvre ] * Menu applet: Ignore keywords/descriptions/ids when name is an exact match [ Michael Webster ] * st-texture-cache.c: Don't use a GIcon with fallback names. [ James Ross ] * melange: clean up a bunch of deprecation warnings (#8015) [ Clement Lefebvre ] * Menu applet: Go back to previous layout * Menu applet: Fix height [ Jason Hicks ] * gwl: Give the number label badge styling, misc. clean up (#7986) [ Clement Lefebvre ] * Menu: Fix camelCase in previous menu commit [ James Ross ] * melange/lookingGlass: better object inspection (#7978) [ Germán Franco ] * gwl: Remove unnecesary styles that make themes look bad by default (#8005) [ Jason Hicks ] * indicatorManager: Fix icons not appearing (#7999) [ Germán Franco ] * st-theme-node: Fix border color blending (#7990) [ Clement Lefebvre ] * l10n: Update POT -- Clement Lefebvre Mon, 12 Nov 2018 15:01:24 +0000 cinnamon (4.0.0) tessa; urgency=medium [ Michael Webster ] * cs_sound.py: Gracefully handle input streams that don't have a name, ignore streams created by sound effects and a11y utilities, and don't add the same source id more than once. * cs_themes.py: Add xdg user data dir to theme search paths, search all system data dirs. This corresponds to the same behavior as code that actually loads these themes in Gtk, Cinnamon. * menu applet: Make sure the menu is fully reset when the search entry is cleared (thru any means) and don't let the favorites Del key handler steal keystrokes from an active search. [ NikoKrause ] * Translation for "Users and Groups" policy (#7763) [ Jason Hicks ] * popupMenu: Fix undefined _delegate property warning (#7706) [ Michael Webster ] * power: Show primitive battery level for devices that don't support percentages. * cs_power.py: Use symbolic icons for battery status. * cs_power.py: Align the new peripheral battery status at the end of the row, and do the same for the charge status of battery devices for consistency. * power applet/settings: Lock keyboard backlight changes to only valid increments. * power applet: override scroll handler for the brightness sliders, to use the step value obtained from csd-power (if available.) * power applet: Don't attempt to send csd-power a brightness over 100%. [ Jason Hicks ] * deskletManager: Fix launcher-list gsetting resetting on desklet snap grid width change * Issue template: Start requesting logs [ Clement Lefebvre ] * Spices.py: Fix connection to server with certain connexions * Keyboard applet: Hide when Fcitx is running [ Jason Hicks ] * Migrate to private Clutter and Cogl libraries (#7771) * Fix incorrect _updatePanelVisibility documentation (#7829) [ Germán Franco ] * Fix typo (#7842) [ Abdur-Rahmaan Janhangeer ] * import change (#7867) [ Jason Hicks ] * ChooserButtonWidgets.py: Handle GLib.Error (#7820) * signalManager: Migrate to ES2015 class, improve code readability * Add a method to GObject.Object.prototype that checks if it is finalized * tweener: Fix invalid object access errors (#7863) * Fix various cases of invalid object access (#7870) * systray: Fix invalid access errors, implement a reloading API for xlets (#7869) * DND, tweener: Fix invalid object access errors (#7873) * environment: Override Clutter.Actor.prototype.destroy and add is_finalized check (#7875) * tweener: Check if instance of GObject.Object before calling is_finalized (#7874) * window overview, menu applet: Fix invalid object access cases (#7880) [ Germán Franco ] * Update calculator search provider example (#7879) [ Abdur-Rahmaan Janhangeer ] * string formatting - line 112 (#7881) * migrated print to py3 - line 19 (#7888) [ Michael Webster ] * cs_power.py: Add "Lock Screen" to the lid close action combobox. [ Stephen Collins ] * Spices.py: don't set permissions on the source files when installing from a local folder via cinnamon-install-spice (#7913) * settings.js: fix updgrade so that settings don't get overwritten by the default (#7915) [ Jason Hicks ] * Move restart handling to Muffin, reload theme on video memory purged errors (#7908) * applet, desklet, popupMenu: Migrate to class syntax (#7523) [ Fabien LEFEBVRE ] * Update applet.js (#7905) [ Germán Franco ] * Hot corners: don't block a click after another click (#7923) * Hot corner: remove ripple tween before animating (#7936) [ James Ross ] * looking glass window tracker cleanup/fix (#7581) [ Jason Hicks ] * menu: Fix issues preventing the container children from rendering (#7900) [ James Ross ] * window-list: don't try to destroy clutter clone multiple times (#7883) [ Jason Hicks ] * window-list: Fix TypeError in _set_position (#7901) [ Germán Franco ] * Cinnamon Settings: Remove Gtk warnings (#7930) * Xlet Settings: remove Gtk warnings (#7932) * Don't lookup the monitor index (#7587) * Overview: Remove META_KEYBINDING_ACTION_PANEL_MAIN_MENU (#7911) [ Jason Hicks ] * StScrollView: Clean up gsettings on dispose (#7929) [ Germán Franco ] * Allow margins in panel tooltips too (#7551) * Sound applet: fix seeking not detected for not hardcoded players (#7589) [ Abdur-Rahmaan Janhangeer ] * migrated print to py3 - line 62 (#7889) [ mrmajik45 ] * [CodeFactor] Apply fixes (#7887) [ Abdur-Rahmaan Janhangeer ] * pep8ify - equals (#7877) [ Germán Franco ] * Remove unused bottomMonitor property (#7561) [ Mikhail Bodrov ] * Simplify getting timestamp in DebugTimers (#7570) [ Kevin West ] * inhibit applet: Display list of inhibiting programs (#7748) [ Mikhail Bodrov ] * Optimize parse params. Return defaults if params not passed (#7569) [ Isaac Carter ] * Fix 'Win' button issues in 'Alt + F2' dialog (#7619) [ Levi Bard ] * Menu applet: autoselect exact matches (#7395) [ Germán Franco ] * Menu applet: add support for theming opacity to greyed category icons (#7847) [ Jason Hicks ] * menu: Fix application items not rendering (#7938) [ Germán ] * Overview: Fix window close buttons offset * Overview: Add windows hover indicator * Overview: Better utilize the available space to maximize windows size * Overview: Code fixups [ Germán Franco ] * Overview: Replace Lang.bind with native bind and arrow functions * Overview: Use MetaButtonLayout to get side of close button * Overview: Fix close button flashing in the corner when opening * Overview: Keep keyboard focus on the last mouse-focused window * Overview: Improve open animation performance [ Germán ] * Overview: Style window close button hover state [ Germán Franco ] * Overview: Remove zoom-on-scroll feature [ Germán ] * Overview: Hidden windows appear with a zoom-in animation * Overview: Add left/right style class to the close button * Overview: Close if the last window is closed * Overview: Add empty placeholder * Overview: Smooth background shade appear/disappear * Overview: Respect animation effects settings * Overview: Exit with a click when there are no windows * Overview: Don't delay windows repositioning after closing a window * Overview: Unify window close code * Overview: Don't hijack workspace switching keybindings * Overview: Improve workspace switch swipe responsiveness * Overview: Windows added while in the overview do zoom-in animation [ Clement Lefebvre ] * CI: Fix apt segfault in LMDE3 [ Michael Webster ] * window list applet: Don't display windows with skip-taskbar set. [ NikoKrause ] * notifications applet: new icons (#7947) [ claudiux ] * js/ui/panel.js - Delete annoying message in .xsession-errors (#7946) [ Germán Franco ] * params: don't return reference to defaults object, make a copy instead (#7942) [ Tuomo Syvänperä ] * Add setting to window-list applet for minimizing. (#7925) [ Michael Webster ] * windowManager.js: Update window dragging/tiling OSD message to reflect new capabilities in muffin. * KeybindingWidgets.py: Disallow keypad shortcuts without modifiers. * cs_desktop: use Nemo.DesktopPreferences widget * cs_windows.py: Update edge resistance label and tooltip to reflect changed functionality. [ Clement Lefebvre ] * Add a couple of keywords for cs_default and cs_startup [ Jackson Dearnley ] * cs_default.py: Add a SettingsWidget() for a default calculator application (#7957) [ Germán Franco ] * Alt-TAB: Don't bypass workspace switching restrictions (#7956) * Latest overview fixes (#7954) [ Stephen Collins ] * cinnamon-desktop-editor: use XApp.IconChooserDialog rather than the custom icon picker (#7969) [ Michael Webster ] * cs_screensaver.py: Remove screensaver selection page. [ Jason Hicks ] * Add grouped-window-list@cinnamon.org and related utilities * Add a gulpfile for xlet reloading on code change * Disable console.log lint restriction for gulpfile.js * Add misc/state.js to js/Makefile.am [ Clement Lefebvre ] * Panel: Replace panel-launchers/window-list with grouped-window-list * Panel: Re-order default applets (bluetooth - network - sound - clock) * Grouped window list: Pin Firefox, terminal, nemo. * modalDialog: Switch buttons [ Jason Hicks ] * Misc. clean-up * Remove Firefox bookmarks, history, and most visited * gulpfile: Clear the system xlet directory incase of file removal, add some sanity checks * Fix some Codacy issues * Add dedicated style classes, remove theme work-arounds * Add a specific focus pseudo class for Mint-Y * Always use symbolic icons in the context menu [ Germán Franco ] * window-list: Fix blurry icons in vertical mode [ Jason Hicks ] * Fix typo in each function * [WIP] Implement per-panel-zone icon sizes * Remove back slashes from gschema * applets: Update icon size on change * Don't allow float sizes * minor: make signal names more consistent * Implement IconApplet compatibility, let panels take care of handling icon size change on panel height change * gwl: Fix off-center icons on icon size change * gwl: Move icon spacing and transition duration options to panel page * gwl: Fix padding issues when labels are present * gwl: Set number display default to None * gwl: Make per-monitor window lists default * .pylintrc: Cut some slack on max branches, number of statements * Fix incorrect per-monitor windows on init * Don't remove focus styling on focused apps on window monitor change when only one instance is in use * Make sure window lists reload when different instances are added or removed * Refresh only windows on instances changed * Fix untranslated strings * Start checking the skip-taskbar hint, remove "Include all windows" option [ Clement Lefebvre ] * Panel: Disgregard panel height (and scaling) define in the theme * Panel settings: Small fixes * Panel: Fix icon scaling in systray/status * Fix systray icon size in HiDPI * Grouped-window-list: Close windows on middle-click * Grouped-window-list: Remove thumbnails icons * Grouped-window-list: Remove icon-padding pref * Grouped-window-list: Remove close-button-size * Grouped-window-list: Fix previous commit * Default panel sizes: 40px + 0/0/24px [ Jason Hicks ] * Don't allow panel sizes below 20 * Fix invalid object error case * Make sure we remove the corresponding zone config for a panel that is removed * Also check panel height minimum in _getScaledPanelHeight * gwl: Fix thumbnails not updating on size change * gwl: Hide non-vital options under "advanced" toggles * Fix incorrect window accounting in AppList.prototype.refreshWindows * gwl: minor clean up * Make sure thumbnails are cleared when the last window of a pinned app is closed * panel: Cache icon size calculations, re-calculate on settings change * gwl: Remove thumbnail padding option, default to 3 * global.ui_scale [ Clement Lefebvre ] * Panel: Don't scale text [ Jason Hicks ] * Switch thumbnail size to a combobox, use Medium (6) default * Convert number display option to a toggle between off and on (smart) * Let themes control transition-duration [ Clement Lefebvre ] * Menu: Use gsettings keys for default icon and label [ Jason Hicks ] * gwl: Switch thumbnail timeout to use the configured value on menu open except when transitioning between menus, and on close * gwl: Make hover-peek option a combobox, add a fade-out delay * gwl: Remove advanced toggles * panel: Don't store all zone configurations in every panel * gwl: Fix thumbnail scaling in high-DPI mode * Fix invalid object access when deselecting the selection tool and toggling ctrl in Melange * Fix thumbnail menu key navigation * gwl: Make sure thumbnail window textures scale in high DPI * gwl: Fix off-center icons in high-DPI mode * gwl: padding logic clean up * gwl: When left click action cycles windows, revert to normal behavior when windows < 2 * gwl: Default to auto-start option disabled * gwl: Shrink the thumbnail label container a bit to fit the close button * gwl: Give actors their own unique class names * gwl: Make sure the Preferences sub-menu is above Recent * Fix "Close others" option * gwl: Minor formatting clean up * state: Fix docs for gtk-doc * gwl: Prevent missing listener store errors and invalid object access errors when using "Close all" on an unpinned app * gwl: Add icons for desktop actions * gwl: Use the provided icon for non-action "New Window" entries * gwl: Add pin/unpin icons * gwl: Make pin/unpin icons less blurry [ NikoKrause ] * gwl: use key/value array for desktop actions (#7964) [ Jason Hicks ] * gwl: Minor style clean up * ui/applet: Remove duplicate setOrientation method * ui/applet: Make sure icon sizes reset on orientation change * panel: Fix applets loading in incorrect zones when re-adding a previously removed panel with applets * ui/applet: Fix applets not loading when re-adding a previously removed panel with applets * gwl: Fix the thumbnail menu not rendering after adding a new panel * gwl: Support dragging of unpinned apps * gwl: Check if a group has windows before refreshing thumbnails in acceptDrop * systray: Don't defer loading of icons * gwl: Move thumbnail timeout option next to on-click option * gwl: Remove remaining ITM references * ui/applet: Don't depend on data passed from applets * panel: Remove scaleMode * systray: Set icon size before re-display * gwl: Clarify alerts option [ Germán Franco ] * Some fixes to the new panel layout (#7967) [ Jason Hicks ] * menu: Wrap favorites in a scroll box, separate system buttons * menu: Fix key navigation * menu: Fix key navigation transition between favorites and system buttons * menu: Make sure the favorites scroll box scrolls with key navigation * gwl: Keep the drag actor contained within the applet area * gwl: Fix the drag actor sticking to the cursor * menu: Add user settings button * panel: Remove user@cinnamon.org from default enabled-applets * menu: Add switch-user button * gwl: Round thumbnail sizes * menu: Use the categories container instead of the monitor for the favorites scroll box height calculation * menu: Remove user button * menu: Make the menu shorter * gwl: Make sure the demands attention styling is removed when an app is closed * panel: Always re-adjust symbolics [ Stephen Collins ] * SettingsWidgets.py: use the new XApp.IconChooserDialog for icon choosers (#7973) * xlet-settings: add the ability for xlets to provide custom widgets for the settings window and add one to the settings example applet (#7977) [ Germán Franco ] * Menu applet: don't hardcode favorites button padding (#7582) [ Clement Lefebvre ] * Menu: Place system buttons beside the search field [ Jason Hicks ] * panel: Fix undefined height warning (#7979) [ Clement Lefebvre ] * Menu: Minor fixes * Menu: Fix system button size in HiDPI * Panel: Make symbolic icon size configurable * Menu: Don't hide other results when one if found by name * l10n: Update POT and additional files -- Clement Lefebvre Sun, 04 Nov 2018 15:56:15 +0000 cinnamon (3.8.8) tara; urgency=medium [ Michael Webster ] * network applet: Initialize CinnamonNetworkApplet._updateFrequencySeconds before using in _periodicUpdateIcon. -- Clement Lefebvre Tue, 17 Jul 2018 09:41:21 +0200 cinnamon (3.8.7) tara; urgency=medium [ Michael Webster ] * spices: Remove support for installing/removing system-wide gsettings schemas. [ Matthias Gerstner ] * cinnamon-settings-users.py: fix symlink attack vulnerability -- Clement Lefebvre Thu, 05 Jul 2018 11:45:59 +0200 cinnamon (3.8.6) tara; urgency=medium * Revert "network applet: Fix typo with showing access points in certain instances -" * Revert "network applet: show the actual active connection's signal strength" -- Clement Lefebvre Sun, 24 Jun 2018 17:19:57 +0200 cinnamon (3.8.5) tara; urgency=medium [ David H. Gutteridge ] * Update po/README: provide a link to Launchpad (#7655) [ Michael Webster ] * cs_windows.py: have the 'auto-raise' setting only visible when supported focus modes are active. [ Clement Lefebvre ] * Revert "shell-embedded-window: change realize to map (#6965)" -- Clement Lefebvre Fri, 22 Jun 2018 20:59:33 +0200 cinnamon (3.8.4) tara; urgency=medium [ Michael Webster ] * SettingsWidgets.py: strip pkexec from standalone module exec strings when checking for their existence. Simplify the check as well. * st-theme-node-drawing,transition.c: initialize framebuffer early to check for error. * cs_startup.py: Don't lose 's' for delay time when editing and saving an entry. * tooltips.js: use ClutterActor's has-pointer property for timeout callback check. * network applet: Fix typo with showing access points in certain instances - caused by 319958fac2dd9347 * cs_power.py: Eliminate redundant check for screen backlight. It fails incorrectly. [ Clement Lefebvre ] * systray: Fix skype * Revert "network applet: Don't show unmanaged networks in the list." [ Michael Webster ] * cs_power.py: Display a keyboard backlight section on the brightness (#7621) [ Clement Lefebvre ] * l10n: Update POT file -- Clement Lefebvre Fri, 08 Jun 2018 11:51:41 +0100 cinnamon (3.8.3) tara; urgency=medium [ NikoKrause ] * Use default icon names in Online Accounts (GOA) (#7559) * fix symbolic icons and delete obsolete (#7566) * Cinnamon theme: window-list progress improvements (#7562) [ Clement Lefebvre ] * Settings: Fix launching mintsources/mintdrivers/lightdm-settings [ Michael Webster ] * cs_startup.py: Always have delay widgets, but hide/show them depending on if there's a delay or not. [ Jason Hicks ] * extension: Fix inability to force xlet installs (#7571) -- Clement Lefebvre Mon, 21 May 2018 13:00:33 +0100 cinnamon (3.8.2) tara; urgency=medium [ Clement Lefebvre ] * Startup settings: Fix blurry icons * Startup settings: Fix using the wrong variable * Startup settings: Use icons in button box [ Michael Webster ] * Spices.py: Use https for spices downloads. [ Clement Lefebvre ] * Startup settings: Show delay units and only show delay when it's not 0 * l10n: Update POT file [ Cobinja ] * Startup settings: Fix creation of autostart files [ Germán Franco ] * notificationDaemon: Fix fallback icon names (#7533) [ Jason Hicks ] * Make the key binding setting for Show Desklets global (#7538) [ Clement Lefebvre ] * l10n: Rephrase a few msgids [ James Ross ] * Notification clearing on app focus + blacklist + limit (#7513) [ Michael Webster ] * cs_default: Don't print info before checking that it's valid. * menu applet: Wrong parent class for SystemButton (fixes focus stealing when hovering over system buttons.) [ Germán Franco ] * Fix window list previews position [ Stephen Collins ] * Spices.py: refactor downloading code for better error handling * Spices.py: fix file permissions durring install [ Michael Webster ] * Spices.py: Handle the cinnamon proxy better regardless of whether cinnamon is running or not. [ Fabio Fantoni ] * debian: now that python3 migration is completed remove python2 * debian/control: increase deps version of muffin, cjs and cinnamon-desktop [ Germán Franco ] * popupMenu: fix menu cutoff during open/close animation (#7547) [ Stephen Collins ] * Fix some issues with the download refactoring in Spices.py (#7549) [ Arda Güler ] * Minor lang changes (#7554) [ Jason Hicks ] * fileUtils: Fix module exporter bug, fix line numbers in stack traces being incorrect (#7553) [ Germán Franco ] * Notification close policy (#7531) [ Michael Webster ] * chrome: Improve visibility conditions for panels and other chrome (#7552) [ Clement Lefebvre ] * l10n: Update POT file -- Clement Lefebvre Sun, 06 May 2018 16:12:57 +0100 cinnamon (3.8.1) tara; urgency=medium [ Michael Webster ] * network applet: Disconnect all signals for NMDevice when our proxy gets destroyed. When the device became unavailable, we would connect to 'firmware-missing' to get notified when it was available again. At some point, a change to networking caused the NMDevice to get destroyed rather than lingering for the firmware to 'return.' * st-label.c: remove the reference to our ClutterText when it gets finalized during a Clutter.Actor.destroy() chain. [ NikoKrause ] * add symbolics cs-desklet and cs-backgrounds [ Michael Webster ] * network applet: Don't show unmanaged networks in the list. * network applet: refresh the panel icon more frequently when the menu is open. * network applet: show the actual active connection's signal strength in the AP list, rather than the strongest AP for a given ssid, which may not be the same thing. [ JosephMcc ] * cs_themes.py: Remove the setting for prefer-dark-themes (#7517) [ Germán Franco ] * Fix panel tooltips position with multiple monitors (#7503) * window-list: update icons on panel height/orientation changed (#7514) * Workspace switcher improvements (#7508) [ Clement Lefebvre ] * systray: Bail out if the plug window is gone [ Germán Franco ] * Allow colons in hot corners commands (#7528) * Remove exported variable warning (#7524) * Xlet settings: don't show a row for "generic" settings entries (#7526) -- Clement Lefebvre Tue, 01 May 2018 16:05:14 +0100 cinnamon (3.8.0) tara; urgency=medium [ Stephen Collins ] * debian/control: remove unneeded dep (#7073) * switch js doc gen scripts to python3 (#7066) * Port urgentwindow.py and check-for-missing.py to python3 (#7077) * cinnamon-settings-users: port to python3 (#7072) * port cinnamon-menu-editor and cinnamon-desktop-editor to python3 (#7074) * Fix cinnamon-desktop-editor import error (#7152) * move spices settings install schema scripts to /usr/bin, switch to python3 and clean up/simplify the schema installation code in Spices.py (#7063) * utils: port all to python3 (#7075) * port melange to python3 (#7154) [ Clement Lefebvre ] * Add dependency on python3-pyinotify [ Stephen Collins ] * launcher desklet: switch editor dialog to python3 and fix a warning (#7155) * screensaver lock dialog: use python3 instead of python2 (#7157) [ Clement Lefebvre ] * Simplify the look of the screensaver away message dialog * Melange: Add a margin in the log tab [ Simon Brown ] * st-private: Update shadow APIs for Cogl deprecations (#6931) [ Jason Hicks ] * Add eslint configuration (#7192) * overrides.js: Add Tweener patch from CJS * overrides.js: Add Signals patch from CJS * Refactor the extension system and add commonjs compatible module importation (#6878) * Fix issues related to Cinnamon running with cjs/mozjs52 (#7126) [ Michael Webster ] * debian/control: Remove gnome-dbg from cinnamon-dbg dependencies (no longer offered) [ Clement Lefebvre ] * Add CI configuration * CI: Set locale * CI: Install locales * CI: Fix locale generation in Debian [ Simon Brown ] * St: fix some cogl deprecations (#7206) * St: Use G_DEFINE_TYPE_WITH_PRIVATE() (#7200) * St: Drop vfuncs from StThemeNodeTransition (#7201) * shell-tray-manager: Disconnect theme_widget signals on finalize (#6956) * shell-embedded-window: change realize to map (#6965) * magnifier: remove a run time warning (#7213) * dnd: declare some js variables to avoid warning (#7216) * main: avoid a run time warning (#7214) [ Stephen Collins ] * Allow column options in the xlet settings list widget (#7040) [ Leigh Scott ] * Fix some depreciation warnings (#7170) [ Stephen Collins ] * Spices: Fix update all button not updating correctly when updates are installed (#7163) [ Jason Hicks ] * windows-quick-list: Fix icon allocation warnings (#7164) [ Jusix ] * sound applet middle click mute refinement (#7172) [ icarter09 ] * dbusMenu.js: Formatted code to allow for better readability. (#7044) [ Clement Lefebvre ] * Titlebar button layout: Stop using org.cinnamon.muffin button-layout * Packaging: Depend on libcanberra-pulse * Sound: Make maximum sound volume configurable (#7238) * Sound applet: Repaint the sound volume bar when max sound vol changes. [ Mikhail Bodrov ] * Remove needless check in compareNew (#7241) [ Clement Lefebvre ] * Theme settings: Restrict metacity selection to metacity-3 themes. * Speed up windows mapping (#7251) [ Germán Franco ] * Power applet: truly hide label when there are no devices (#7246) [ Jason Hicks ] * dnd: Fix scope warning (#7233) [ itzexor ] * popupMenu.js: PopupSubMenu: add prototype method closeAfterUnmap (#7190) [ NikoKrause ] * menu-applet: fix dnd cursor icon (#7253) [ Clement Lefebvre ] * Sounds Settings: Rename Effects tab * Sound applet: Fix control buttons being squashed. * Sound applet: Don't show player launcher when the option to control players is disabled. * Sound applet: Next/Previous track on Scroll Right/Left * Sound applet: Add a setting to keep aspect ratio [ Michael Webster ] * cinnamon-app: Add cinnamon_app_create_icon_texture_for_window - allows supplying a MetaWindow to more correctly retrieve the correct icon. * cinnamon-app.c: Revert cinnamon_app_create_icon_texture to work as it did prior to 8d7a8755352a20d21efc001. The behavior of the new method (cinnamon_app_create_icon_texture_for_window) is unchanged. [ JosephMcc ] * Fix a couple visual issues in Melange (#7288) [ schachmat ] * Prevent users from editing locked settings (#7260) [ JosephMcc ] * cs-sound: Fix the width of the amplification slider (#7280) * panel-launchers: Set the default icon size to 22 (#7276) * cinnamon-settings-info: Make some labels selectable (#7275) * window-animations: Make the animations a bit less drastic (#7274) [ Simon Brown ] * cinnamon-app-system: various minor cleanups, dead code removal etc. (#6948) [ Abdous Kamel ] * Improving a piece of code in cinnamon-settings.py (#7019) [ Björn Esser ] * cinnamon-settings: Add defaults for Fedora, RHEL and CentOS (#7079) [ Jason Hicks ] * Notifications: Add support for a bottom position option (#7111) [ itzexor ] * docs: Fix build with gtk-doc 1.27+ (#7130) [ Simon Brown ] * st-private: Fix offscreen leak if cogl_framebuffer_allocate fails (#7273) * st: Do not try to unref potentially NULL CoglObjects (#7277) * st: Don't assert when corner texture creation fails (#7278) [ Stephen Collins ] * Add a dbus method to activate scale overview. We already had one for expo. (#7279) [ Germán Franco ] * SettingsWidgets: prevent toggling disabled switches (#7282) [ Simon Brown ] * st-entry:don't possibly allocate actors a negative size (#7285) * cinnamon-recorder: treat some switch compile warnings (#7290) [ Filip Ayazi ] * Sound: reuse cover temp file (#7291) [ Stephen Collins ] * background slideshow: move to python3 (#7158) [ Jason Hicks ] * Fix panel applet clearing (#7286) [ JosephMcc ] * [gtk3.22] cinnamon-settings: Remove some broken and hardcoded theming (#7284) [ itzexor ] * window-list: preview: new style class, options, layout (#7134) [ Stephen Collins ] * cinnamon-settings: move everything to python 3 (#6992) * desktop file gen scripts: port to python3 (#7153) [ Clement Lefebvre ] * User settings: Fix a couple of broken things in LMDE 3 [ Mikhail Bodrov ] * Optimize RegExprs in ui serach (#7242) * Optimize appFavorites (#7239) [ Clement Lefebvre ] * sound applet: configurable maximum volume fixes (#7250) [ Germán Franco ] * Fix blurry switches in the default theme (#7269) [ Simon Brown ] * st: remove some cogl deprecations (#7272) [ Jason Hicks ] * appletManager, deskletManager: Fix change handlers * Ensure applets are queried by applet_id * Skip unnecessary panel loading in change handlers, fix settings destruction on desklet move [ Clement Lefebvre ] * Xlet Settings: Fix regression in python3 migration * KeybindingWidgets.py: Fix index out of range error [ Germán Franco ] * Improve label settings widget (#7283) [ Clement Lefebvre ] * Packaging: Update python3 dependencies * Change gnome-terminal.desktop -> org.gnome.Terminal.desktop [ Jason Hicks ] * Fix multi-version xlets loading twice, address metadata availability (#7306) [ itzexor ] * Melange fixes (#7299) [ Michael Webster ] * keybindingWidgets.py: Cancel teach mode on focus-out. Fixes issues caused by clicking out of a cell renderer currently being edited. * notifications: destroy unwanted notifications explicitly, or they linger and continue to get updates (and, not being on the stage, cause a huge amount of warnings); [ itzexor ] * cinnamon-settings: make keybinding tooltip generic [ Jason Hicks ] * Redirect logging output to .xsession-errors [ JosephMcc ] * cinnamon-settings-users: Clean up the use of stock icons (#7326) [ Steve M ] * Remove deprecated .panel-launcher-add-dialog selectors (#7332) [ Simon Brown ] * cinnamon-slicer: remove some deprecations (#7307) * st-scroll-view: resolve some switch warnings (#7308) * tray manager: resolve some GdkColor deprecations (#7309) * cinnamon-perf-helper: resolve a function definition compile warning (#7310) * tray: avoid deprecation warning by dropping use of gdk_display_supports_composite (#7311) * cinnamon-global: resolve a gdk_cursor_new deprecation warning (#7312) [ Clement Lefebvre ] * Menu applet: delegate auth responsibility to cinnamon-remove-application [ Simon Brown ] * gtk-embed: fix null pointer dereference (#7341) [ itzexor ] * notifications: close button and no fade on mouseover (#7336) [ tanderson-google ] * Don't clear notifications when an app becomes focused (#7252) * Fix resident notifications not displaying (#7248) [ Simon Brown ] * cinnamon-tray-icon: remove an include that seems unneeded (#7342) * tray: remove some deprecations for gdk_window_set_composited (#7338) * Systray: remove the resize delay in scale mode (#7340) [ Jason Hicks ] * Fix indicator icons being off-center * Systray: Fix indicators cache being iterated as a keyed object * Remove unused circular reference on indicator objects * Fix incorrect invocation of formatError in extension.js * Fix duplicate applets of the same UUID disappearing when added to the panel * Minor clean up of _removeAppletFromPanel * deskletManager: Fix handling of duplicates, avoid unnecessary load cycling on drag [ Stephen Collins ] * Create new cinnamon-xlet-makepot utility for automattically extractin… (#7149) [ Mikhail Bodrov ] * Simplify for loop in search (#7296) [ itzexor ] * appletManager.js: fix getRunningInstancesForUuid() (#7298) [ NikoKrause ] * menu: recalc height after deleting favorites (#7346) [ Ilya Zlobin ] * Added app switcher option for cycle windows on current workspace (#7316) [ Clement Lefebvre ] * Alt-tab: Make the app-switcher honor the same setting as the Alt-tab switcher. [ NikoKrause ] * inhibit applet: use even more common icon (#7353) [ Germán Franco ] * Fix bad allocation of panels with borders (#7325) [ Jason Hicks ] * Add ability to raise desklets above windows (#7315) [ Clement Lefebvre ] * Drop usage of gksu [ Jason Hicks ] * Add desklet visibility toggling to the Show Desktop applet context menu, update with class syntax (#7354) [ Eli Schwartz ] * cs_user.py: Add compatibility for multiple pam modules (#7327) [ Clement Lefebvre ] * Remove cinnamon-extension-tool and support for jhbuild [ NikoKrause ] * on-screen-keyboard applet: change icon to keyboard (#7361) * keyboard applet: change icon to cs-keyboard (#7359) * power applet: change icon to cs-power (#7358) * network applet: change icon to preferences-system-network (#7363) [ Simon Brown ] * cinnamon-recorder: Update for new cogl apis (#7369) [ Michael Webster ] * cs_keyboard: Use Gtk.accelerator_parse_with_keycode() to compare accel strings when checking for collisions instead of string compare. * Add .pylintrc file. All of it defaults except the following disabled items: [ itzexor ] * user-applet: fix loading with newer accountsservice [ JosephMcc ] * keyboard-settings: Fix the use of wide separators (#7421) [ Clement Lefebvre ] * Docs: Fix python3 unicode errors [ Eli Schwartz ] * Retire outdated bluetooth code. (#7482) [ Germán Franco ] * Sound applet: fix missing muted icon (#7402) [ Fabio Fantoni ] * circleci: remove mint18 job (#7483) [ Jason Hicks ] * Update eslintrc.json for more flexibility (#7485) [ NikoKrause ] * user applet: use system-switch-user icon (#7387) * keyboard applet: centering text (#7468) * hicolor icon: Add removable-drives icon (#7396) [ Jason Hicks ] * ui/settings: Check for null values on this.settingsData (#7404) * overrides: Clean up overrideDumpStack (#7405) * Notifications: Remove circular reference on notification actors (#7466) [ Stephen Collins ] * ExtensionCore: show the number of available updates in the 'Update all' button tooltip (#7366) [ Germán Franco ] * Inhibit applet icon: fix uncolored parts (#7399) [ James Ross ] * Notifications fixups (#7413) [ Germán Franco ] * Workspace switcher: fix blurry #panelRight's applets in visual mode (#7456) * Reduce huge gap in top notifications * Fix bottom notification position with multiple monitors [ Robert Antoni Buj Gelonch ] * calendar@cinnamon.org closes #7378 (#7381) [ Stephen Collins ] * cinnamon-json-makepot: fix some issues (#7390) * Cinnamon Settings: Add window-list progress support to the spices management/downloads pages (#7374) [ Steve M ] * tooltips.js - base #PanelTooltip position on panel width / height (#7388) [ Germán Franco ] * Sound applet: move close button to the right (#7391) [ Clement Lefebvre ] * System settings: Don't crash when failing to set up file monitors [ Germán Franco ] * Window list applet: fix bad allocation of icons and labels (#7386) [ claudiux ] * sound@cinnamon.org applet - Solves issue #7375 (#7376) [ Maximiliano Curia ] * PEP8ify (#7434) [ James Ross ] * Melange: slight UI rework (#7424) [ Germán Franco ] * Modal dialog: don't stretch icon, align it to the top (#7397) [ NikoKrause ] * user-applet: use symbolic icon from themes (#7494) [ Germán Franco ] * Fix blurry st scrollbars (#7498) [ Maximiliano Curia ] * PEP8ify (#7448) * Use ints for the menu position (#7449) [ Odyseus ] * [Spices.py] Added missing import, fixed typo and removed unnecessary semicolons (#7459) [ Steve M ] * menu applet - if no selected item when adding search provider results make first search provider result selected item (#7414) * Default menu - fix unused selector .menu-category-button-button (#7393) [ Germán Franco ] * Fix top panel overlapping the on-screen keyboard (#7398) * Sound applet: make optional horizontal scroll to move between tracks (#7407) * Hot corners cleanup and fixes (#7442) * Fix JS exporter parsing (#7477) * PopupMenu.js: Use some lambdas to create half the functions on each action (#7493) * Workspace switcher: fix buttons sizing (#7495) [ Stephen Collins ] * Add a script to install 3rd party spices from a local folder. This is… (#7420) [ Clement Lefebvre ] * Spices.py: Initiate monitor variable [ Stephen Collins ] * SettingsWidgets.py: TextView widget - fix focus-stealing bug (#7377) [ Steve M ] * default theme - add .menu-background{} as placeholder (#7416) * date applet - add option to theme calendar menu separately from other applet menus (#7415) [ Maximiliano Curia ] * Sync the logic in cs_startup with cinnamon-session (#7463) [ James Ross ] * report paint volumes / don't use stage "paint" signal (#7478) [ Jason Hicks ] * Debugging: Add GObject property value logging (#7490) [ Germán Franco ] * Repaint node when background position changes (#7408) [ Jason Hicks ] * Applets, desklets: switch to class syntax, remove try-catch blocks (#7389) [ Mikhail Bodrov ] * Use for of for arrays (#7431) * Optimizr nextIndex in grid navigator (#7450) [ Clement Lefebvre ] * User applet: Don't show switch-user when it's disabled in lockdown schema * User applet: Fix compatibility with python3-pampy 1.8.2 [ Vanov ] * Added "shutdown immediately" entries for lid close and power critical. (#7426) [ Stephen Collins ] * Spices.py: fix placement of docstrings (#7488) * settings.js: remove 'units' from the list of required properties for the spinbutton widget - it isn't actually necessary (#7500) * xlet-settings: improvements to key dependency handling (#7419) [ Fabio Fantoni ] * debian: wrap-and-sort -bst * remove debian/cinnamon-maintscript entry are all related to very old version * debian: small improve to .install files * debian: create links for doc in /usr/share/doc/cinnamon * add debian/not-installed * Bump debhelper build-dep and compat to 10 * improve debian/rules * improve debian/control * debian/rules: avoid adding libcinnamon.so plugin to shlibs files * debian/rules: fix override_dh_girepository * debian: remove unused lintian override entries [ Clement Lefebvre ] * l10n: Update files -- Clement Lefebvre Tue, 24 Apr 2018 15:03:18 +0100 cinnamon (3.6.7) sylvia; urgency=medium [ NikoKrause ] * Online Accounts: Use translations (#7088) [ Michael Webster ] * cinnamonDBus.js: Have GetMonitors throw an error back to GDBus if something goes wrong. [ itzexor ] * menu-applet: rework vectorBox [ jrsrjrsr ] * Fix Issue #7114 [ NikoKrause ] * Spices description: Do not cut off the letter `n` (#7103) * Xlets: Fix shown info for overwritten xlets. (#7090) -- Clement Lefebvre Mon, 18 Dec 2017 12:52:43 +0000 cinnamon (3.6.6) sylvia; urgency=medium * Sound settings: Assign the selected device to the profile selector. -- Clement Lefebvre Thu, 23 Nov 2017 09:55:33 +0000 cinnamon (3.6.5) sylvia; urgency=medium [ Michael Webster ] * cs_sound.py: Replace tab with space. * calendar applet: Fix formatting. -- Clement Lefebvre Mon, 20 Nov 2017 15:15:07 +0000 cinnamon (3.6.4) sylvia; urgency=medium [ Michael Webster ] * calendar applet: Just listen to the gsetting key for 24h to make sure the vertical panel default clock obeys global date/time settings. [ Simon Brown ] * st-theme.c: st_theme_resolve_url could assert with a theme issue (#7046) [ brownsr ] * st-theme: ensure callers of st_theme_resolve_url cater for it returning null knock-on from previous commit [ JosephMcc ] * cinnamon-settings: Use icon buttons in the xlet management pages [ François Lachèse ] * Fixes crash if device.get_icon_name() is Null (#7054) [ Corbin Auriti ] * Allow showing seconds on vertical panel (#7038) -- Clement Lefebvre Mon, 20 Nov 2017 10:05:39 +0000 cinnamon (3.6.3) sylvia; urgency=medium [ Clement Lefebvre ] * Show-desktop: Disable peek-at-desktop by default [ Michael Webster ] * menu applet: recalculate applications list box height when the menu's allocation changes. [ Stephen Collins ] * Applets: when setting an icon, make sure it's actually an St.Icon. Some applets (such as the keyboard applet) set _applet_icon to something other than an St.Icon, so it causes an error when trying to set the icon using one of the api functions. This was causing the keyboard applet not to show in panel edit mode after a keyboard layout was added and removed. (#7008) * applet settings: fix panel switch buttons not being hidden when there is only one panel (#7023) [ Bernhard Landauer ] * add Adwaita-dark thumbnails (#7015) [ Stephen Collins ] * extesion settings: scan system folder for extensions. While we don't ship with any extensions, other distros may choose to do so [ brownsr ] * initialise applet position to avoid drag and drop errors in edit mode occasionally the null applet position was being carried through to the writing of the new applet causing apparent drop failures, and to the disappearance of the highlighted drop box. Much visible weirdness with a very simple solution [ Stephen Collins ] * workspace switcher: fix undeclared variable warning * applet settings: Improve the logic for highlighting the panel. The panel is now only highlighted when there is more than one panel, and it's better about selecting and highlighting the correct panel when one is added or removed [ icarter09 ] * Fixed spacing. Added missing semicolon. (#7032) [ Jason Hicks ] * popupMenu: Prevent warning of this._triangle (#7033) [ Corbin Auriti ] * Clock applet: Respect 12h/24h choice in vertical mode (#7034) -- Clement Lefebvre Fri, 17 Nov 2017 10:48:22 +0000 cinnamon (3.6.2) sylvia; urgency=medium [ Simon Brown ] * st-texture-cache: avoid potential null pointer dereference (#7001) [ Clement Lefebvre ] * Packaging: Add missing polkit policy file -- Clement Lefebvre Sat, 11 Nov 2017 17:19:36 +0000 cinnamon (3.6.1) sylvia; urgency=medium [ Germán Franco ] * Fix blurry and off-centered arrow in popup submenus (#6986) [ Stephen Collins ] * cinnamon-settings: remove ui file that is no longer used since the extension-settings-rework (#6990) [ Jason Hicks ] * Spices.py: Fix xlets not installing if a file without an extension is in the po directory (#6968) [ Germán Franco ] * TreeListWidgets.py: edit elements with double click (#6978) [ Abdous Kamel ] * Fixing Gtk-Message when running a dialog (#6977) [ itzexor ] * window-list: account for hidden items during DnD repositioning (#6987) [ Clement Lefebvre ] * Spices: Don't fail if the spice directory is missing -- Clement Lefebvre Thu, 09 Nov 2017 13:30:28 +0000 cinnamon (3.6.0) sylvia; urgency=medium [ itzexor ] * melange/cinnamon-looking-glass.py: convert to normal toplevel window * melange/page_results.py: fix scrolling * melange/page_inspect.py: add ability to insert property path into entry * melange/page_log.py: implement autoscrolling * melange/all: various cleanups [ NikoKrause ] * xlets-about-dialog: improvements for about dialog [ brownsr ] * st-theme-node-drawing: correct logic for calculation of cover and contain fixed upstream a long time ago https://github.com/GNOME/gnome-shell/commit/3dbf06420df0ad669f12939a788ed44061dcc1e1 * st-theme-node-drawing: Group multiple cogl_rectangle calls https://github.com/GNOME/gnome-shell/commit/d8540819af7978b3c244877ddb85109a55278bee#diff-8a01b40c2c1be22ef97916811be0ab65 * st-theme-node-drawing: move setting of corner material before rendering box shadow https://github.com/GNOME/gnome-shell/commit/36fc3a5c9671c45ca17e8169826e21ae4f9d5fa8#diff-8a01b40c2c1be22ef97916811be0ab65 [ Michael Webster ] * cinnamon-app.c: read the icon name or icon path from muffin when getting a window- backed icon, if it's been set (by us in some other app via gdk_window_set_icon_name() * remove a comment * cinnamon-app.c: If a custom icon_name is set in the MetaWindow, always use that, whether we have a matched desktop entry or not. * Update for XApp api * xlet-settings.py: Use XAppGtkWindow, which takes care of all setting of icon names by shadowing the respective GtkWindow methods. * Fix scaling for icon-name app icons [ brownsr ] * st: Remove _st_allocate_fill https://github.com/GNOME/gnome-shell/commit/24ad59ea3728cf55ad127085e486d73345e33a35#diff-578ccc5ce70c4a11d7f30e3f38002f0b plus a very minor simplification in st-box-layout * st-bin: Make sure not to allocate hidden children https://github.com/GNOME/gnome-shell/commit/7e343f11f28a736d88619b85c9b9c6ea52a7e142#diff-b948bb195b709c61ce7275142a2fbdfd * st-widget: Unset hover when setting track_hover to FALSE https://github.com/GNOME/gnome-shell/commit/79bfea5970a055a3990f7e52a3669a59594851a1#diff-b948bb195b709c61ce7275142a2fbdfd * st-bin: Don't allocate a hidden actor https://github.com/GNOME/gnome-shell/commit/50f8ae6fc756d1a0fb33912e6b9d08a8fa71c197#diff-b948bb195b709c61ce7275142a2fbdfd * st-private: Don't create attr lists if we don't need them https://github.com/GNOME/gnome-shell/commit/7e5f1fe41104dfcf4ca2a104651441ae49ee5865#diff-b948bb195b709c61ce7275142a2fbdfd * StDrawingArea: fix texture drawing https://github.com/GNOME/gnome-shell/commit/587c93eadf01fafc6a6a6cb53aac94d9802de44d#diff-b948bb195b709c61ce7275142a2fbdfd * st-widget: remove stylable property https://github.com/GNOME/gnome-shell/commit/5c0ee02251ebd21f72ee8d32b93d707547a06803#diff-b948bb195b709c61ce7275142a2fbdfd [ Michael Webster ] * osdWindow.js: Always check the theme node on first showing - an actor's width isn't necessarily filled if it hasn't been explicitly set, causing the first few activations of the OSD to not show an accurate level bar. * cs_default: Fix incorrect button label (but preserve translations). [ itzexor ] * main.js: remove obsolete Meta enum member reference * workspace.js: use our normal prototype init method * workspace.js: initalize WindowClone._zoomStep to 0 [ NikoKrause ] * slideshow-applet: fix translation [ Michael Webster ] * cs_themes.py: Create the file "~/.icons/default/index.theme" and set the selected cursor theme inside of it. This ensures other (non-gtk) applications end up using the same theme (though they are required to be restarted for these changes to take effect.) [ NikoKrause ] * keyboard-applet: applet icon vanishes when moved in edit mode [ Jason Hicks ] * cinnamon-json-makepot: Add keyword option, change language used by xgettext to JavaScript [ brownsr ] * expoThumbnail: correct a couple of calls with mismatched argument counts [ itzexor ] * window-list: set AppMenuButtons unreactive during panel edit mode * panel-launchers: set PanelAppLaunchers unreactive during panel edit mode * windows-quick-list: fix argument warning [ Jason Hicks ] * Fix reference to undefined actor._delegate warning * ui/environment: Handle undefined actors in containerClass.prototype.add * ui/cinnamonDBus: Handle null xlet objects in CinnamonDBus.highlightXlet [ brownsr ] * deskletManager: initialise some variables and remove the variables that were initialised, probable typo [ NikoKrause ] * panel settings: split height/width translation strings [ Stephen Collins ] * cinnamon-settings.py: allow search box placeholder text to be translated [ leigh123linux ] * Fonts: Add setting for RGBA order [ Michael Webster ] * network applet: Add a menu item to re-scan for wireless networks. [ NikoKrause ] * Translation: fetch some strings with ngettext [ Michael Webster ] * cinnamon-settings: Use an XAppGtkWindow, and update the icon depending on what sidepage we're on. * window-list: Update the icon according to notifications from an item's underlying MetaWindow. * cinnamon-screensaver-lock-dialog.py: use XApp window wrapper to set an icon name. Fix the dialog's icon to use the same icon if the user's can't be found (the old 'fallback' doesn't exist anymore, at least in a fresh Mint installation.) [ Jason Hicks ] * js/ui/panel: Change for ... in loops to length caching for loops since they are iterating arrays [ Michael Webster ] * cs_themes: set a parent window for the cinnamon themes spice window. [ Jason Hicks ] * popupMenu: Migrate signals to SignalManager management, add... [ Michael Webster ] * debian/control: Add libcjs-dbg to cinnamon-dbg depends. * sound applet: Avoid warnings when changing applet settings with no currently active player. [ Lars Mueller ] * Make cinnamon-settings unaware of installation location [ Jason Hicks ] * Fix TypeError regression when resizing panels [ Michael Webster ] * Add utils/cin-debug-run, a simpler trace tool. [ brownsr ] * fix some signed vs unsigned compiler warnings * avoid signed ints for bit flags results are implementation specific and can give odd results if bit operators are used. gboolean maps to int, not unsigned, so replace gboolean bit flags with guint. based on https://github.com/GNOME/gnome-shell/commit/69f17da5ca191c57acb6dfc5bbedc6f14f768e9b#diff-9ad11fdf581414b0f2501e50921d1052 with one additional instance found * systray: Improve icon scaling in hidpi They were coming up a bit small. Indicator icons were coming up double size. The default of 16px indicator icons in non-scaled panels was awfully blurry. Icon spacing appeared to be scaled up in hidpi for no good reason. * panel: correct margin calculation in hidpi + minor correction to regression from 718ce025dc360d62c6e510b5b57483553bf80c1c [ Stephen Collins ] * cinnamon-settings : rewrite to simplify code and implement a more modern ui * Add a dbus method to open the about dialog for applets, desklets and extensions, and a button in extension settings to call it. * Applet settings: fix error on removing multiple instances [ Jason Hicks ] * windows-quick-list: wrap menu in scrollable submenu container [ brownsr ] * panel: Remove dead code [ NikoKrause ] * recent-applet: always show icon in panel-edit-mode * notifications-applet: always show applet icon in panel-edit-mode [ itzexor ] * cin-debug: don't suggest backgrounding [ brownsr ] * st-drawing-area: Fix Cogl deprecations from upstream https://github.com/GNOME/gnome-shell/commit/ad75739fc5fc03173648a5c7a636b7d7ee0918e5#diff-b0a9fbb0a9269c620f76c568a690c7aa [ itzexor ] * panel.js: don't error on nonexistent panel [ Jason Hicks ] * trash applet: Fix arguments warnings [ brownsr ] * various: replace deprecated macros [ Michael Webster ] * recent applet: the visibility check can be distilled into just checking if the recent list is not empty, and clutter_actor_show/_hide do their own visiblity check before doing anything. * notification applet: don't change the icon when panel-edit mode changes - just show it, whatever its icon. Also, no need to check for existing visibility, we want it to show regardless. [ Jason Hicks ] * main: Improve logging [ Michael Webster ] * CinnamonGtkSettings.py: set switch valign to centered, to prevent it being stretched by multi-line text. [ Stephen Collins ] * Spices settings: fix prompt getting 'stuck' when cache is downloaded for the first time * Spices settings: Fix the trasition animation when switching to the downloads page [ Jason Hicks ] * extension: Use imports.searchPath instead of imports.addSubImporter * Ensure only applets, desklets, and extensions are added to imports.searchPath [ Michael Webster ] * calendar applet: Remove timer code and use updated WallClock api. * clock desklet: Refactor to use new WallClock api. calendar applet: track the notify handler id better thru applet_added and _removed functions. * debian/control: update cinnamon-desktop runtime dependency for dev version. [ brownsr ] * st: Make BoxLayout use a Clutter layout manager internally https://github.com/GNOME/gnome-shell/commit/aa394754b6d78e682f99d3aff7f170bea04b0a8a#diff-b948bb195b709c61ce7275142a2fbdfd NB align-end left present but non-functional, to be returned to * st: Remove empty dispose/finalize methods from StBoxLayoutChild https://github.com/GNOME/gnome-shell/commit/741b204fc7e023493d378d9fea8323f6a9a17823#diff-b948bb195b709c61ce7275142a2fbdfd * st: Notify on BoxLayout property changes https://github.com/GNOME/gnome-shell/commit/6a19b7c1b0cea3eb78c581e5ed417a0f9e04f9c7#diff-b948bb195b709c61ce7275142a2fbdfd * st: Translate StBoxLayoutChild properties to ClutterBoxChild https://github.com/GNOME/gnome-shell/commit/144f7d6813a9c2e43bc2b17055a5337db97d05d3 * panel, st-box-layout: Remove align_end, enabled by using a clutter layout manager This allowed the standard clutter alignment to be used, and the retirement of align_end [ Jason Hicks ] * Ensure extensions fully reload * Update documentation for xlet importation * Update grammar, formatting for xlet importation docs [ brownsr ] * various: correct some iso C compiler warnings * cinnamon-embedded-window, st-scroll-bar: fix deprecations cinnamon-embedded-window needs correcting from https://github.com/linuxmint/Cinnamon/commit/348186dabeb2063afffc379410b963c3992e9493 * texture-cache: Remove FBO path for padding icons adapted from https://github.com/GNOME/gnome-shell/commit/4184edc7f8cd17e0dbfe5c6c3422b2bf94e85e45#diff-3ca4e78fe4368510730192b6d59c2c80 Premise is that GtkIconTheme now pads icons, so it's dead code. Please comment if you think this premise is not right * st-entry.c: make it recognise upper case ctrl-c, x, v adapted from https://github.com/GNOME/gnome-shell/commit/387f5143f02f720b4d084aa4fca65e2ff31176b0#diff-b948bb195b709c61ce7275142a2fbdfd * st-texture-cache: port to GTask from https://github.com/GNOME/gnome-shell/commit/f2731d4d6a9ca1338dbc38c8f33fdde0113f9b50#diff-b948bb195b709c61ce7275142a2fbdfd and https://github.com/GNOME/gnome-shell/commit/df0b465e76305e011c5106d78b6fd19891db900d#diff-b948bb195b709c61ce7275142a2fbdfd * st-box-layout: Fix Cogl deprecations From upstream https://github.com/GNOME/gnome-shell/commit/8dab692f93522e3adbe3d03e59ddaca5c9a1e6ee * st-entry.c: Fix spacing on right icon in entry https://github.com/GNOME/gnome-shell/commit/954d262d674f597a35a4b4342a6d4fc41dc8ff43#diff-b948bb195b709c61ce7275142a2fbdfd * st-widget: Don't add hidden actors to the paint volume https://github.com/GNOME/gnome-shell/commit/ea55c36a3a2f1abcaa8e202e0f67a29ed807cebe#diff-b948bb195b709c61ce7275142a2fbdfd * St: avoid blocking IO to resolve relative urls https://github.com/GNOME/gnome-shell/commit/f7af96dbb2152c796c5877585e7d1e555471d6ce#diff-c391ade4ef6206f5dd58f1a00c6a6217 https://github.com/GNOME/gnome-shell/commit/9860b1c677430fe96f6afdd95a2958bce398ca62#diff-c391ade4ef6206f5dd58f1a00c6a6217 * popupmenu: fix an undeclared variable * popupMenu: ensure all tweens are controlled by the settings [ Jakob Stigloher ] * settings.js: Do not write valid settings files again to the disk [ brownsr ] * st-texture-cache:remove unused base64 code path https://github.com/GNOME/gnome-shell/commit/2dc41c944e3594bc0d9636d2515c50a1cbc4f88c * st-icon: remove custom size request/allocate https://github.com/GNOME/gnome-shell/commit/f5431612341887a339f545ddef5268d362c62755#diff-b9152792660693113ebfebfbd89105a2 * st-scroll-view-fade: Refuse to work without GLSL https://github.com/GNOME/gnome-shell/commit/ce5cd3bf30f9778746b94daa1f68c07854d2cfaa#diff-b948bb195b709c61ce7275142a2fbdfd [ Michael Webster ] * window-list applet: Add rudimentary support for progress display. [ Stephen Collins ] * Fix dnd position calculations for horizontal panels * Fix dnd for icon-only applets in vertical panels [ Michael Webster ] * window-list: Don't break when muffin doesn't support progress. (just softens the dependency, this can be removed later) [ brownsr ] * st-clipboard: Add the ability to choose the clipboard type https://github.com/GNOME/gnome-shell/commit/0616261a9455574fc26b452343b6bf9b8e0400b1#diff-f46ca0c0ff266172bd910e27927f342d * st-entry: Implement middle click paste https://github.com/GNOME/gnome-shell/commit/eaf184b5852825d49c85c683bd7bde96df02baf2#diff-f46ca0c0ff266172bd910e27927f342d adapted up to latest gnome st code * scroll-bar: Remove jitter on the scroll bar when moving the mouse https://github.com/GNOME/gnome-shell/commit/2492dc50db89042d19edb2210fdeac7f5c54d8db#diff-b948bb195b709c61ce7275142a2fbdfd * st-theme-node-transition: stop using clutter alpha https://github.com/GNOME/gnome-shell/commit/50f96d1c9cfc422128c5325fbbb03c0ab256d069#diff-58ec506f144fcf489b16beab596a99af [ collinss ] * Remove old applet download-related code that is no longer used [ Fabio Fantoni ] * Remove deprecated and unused gnome-keyring * Added missed gettext and xdg-utils to cinnamon-common deps [ itzexor ] * layout.js: special case handling of panel actors * layout.js: slight optimization for popup window tracking * layout.js: optimize signals a bit * layout.js: only update hotcorners once on monitor change * layout.js: queue region update directly in _updateVisibility * layout.js: add same guarantee to Chrome.findMonitorIndexForActor * layout.js: small short circuiting optimization * layout.js: add LayoutManager.updateChrome() and docs * panel.js: use new updateChrome helper from LayoutManager [ NikoKrause ] * spices about dialog: clearify what the date means ... [ Stephen Collins ] * dnd: call handleDragOut on a drop tartget (if available) when leaving the area, and use this function to remove the drag placeholder when dragging an applet. This fixes an issue where the drag placeholder would get stuck after a dnd, leaving an empty space with no applets * Simplify how applet positions are saved after a dnd operation and allow extra properties to be added to a definition in the enabled-applets key * Improve the way cinnamon handles applets that are added to an unsupported panel. Previously, Cinnamon would send a message to cinnamon-settings saying there was an error. With this change, the user is now prompted with the following options: 1. Leave the applet on the panel anyway (some applets are still suitable for vertical panels under certain circumstances - even if they aren't marked as such). In this case an override is added to the applet definition to avoid the user being prompted in the future. 2. Remove the applet. 3. Try to move the applet to a different panel. If a suitable panel cannot be found, the applet is removed instead. * Don't let hidden panels offset the menu position. It can lead to awkward placement in situations such as when there are mixed panels and auto-hide is involved [ brownsr ] * st-theme-node.c: Correct a function call that was missed in https://github.com/linuxmint/Cinnamon/commit/5a9ad973e766db9a0781d1791e31d89ce8d66dcb#diff-ea7efd941b083a785ba5e4b928a26d59 * st-entry: change deprecated key symbols [ Michael Webster ] * Fix a couple issues from previous commits: [ Fabio Fantoni ] * Change deprecated python-imaging to new fork pillow [ Michael Webster ] * st-label.c: Apply upstream patch - * st-label.c: Use correct type check instead of cast. [ itzexor ] * menu-applet: use a generic clutter actor container * panel.js: add some hacks to account for panel corners in clip region [ brownsr ] * st-box-layout.c: remove a couple of unused variables * st-box-layout-child.c: treat compiler warnings [ Cobinja ] * extension.js: Fix startup with invalid xlet uuid (#6858) [ Simon Brown ] * cinnamon-app.c: Don't crash when trying to dispose (#6853) * st-bin: delegate popup-menu signal to child if we have one (#6849) * boxpointer: Don't hide when we're already hidden (#6854) * tweener: Remove the onAnimationStart/onAnimationComplete callbacks (#6855) [ Fabio Fantoni ] * Use pkexec instead deprecated gksu for cinnamon-settings-users (#6827) [ Leigh Scott ] * fix indent (#6844) [ Jason Hicks ] * extension.js: Fix ReloadExtension error in forgetExtension (#6862) * window list: Prevent the progress indicator from showing when set to 0 (#6866) * window-list/fixup e6c3a21: Make sure the progress is shown if its > 0 on init (#6867) [ leigh123linux ] * Bump version for muffin build dep [ itzexor ] * panel.js: check if the panel corner has a parent (#6869) [ Clement Lefebvre ] * Settings: Add the ability to select HybridSleep * Settings: Show the URL in the terminal when a download fails [ Michael Webster ] * cinnamonDBus: add api to allow nemo startup timing to be more consistent. * main.js: Fix invalid ref to Main during no-animation startup. [ brownsr ] * panel: ensure rightbox has something to drag into in edit mode when empty * Defend against failure of cairo_pattern_get_surface() https://github.com/GNOME/gnome-shell/commit/6d22670307928dfdce75a7536598486fa25d51d7#diff-8a01b40c2c1be22ef97916811be0ab65 [ Jason Hicks ] * panel: Increment panelCount by 1 [ brownsr ] * window-list: correct progress overlay logic it was showing unwanted artefacts as it was using .visible instead of a direct show or hide of the actor. Simplified the use of the pseudoclass to ensure it was only set once. Theme Graphite-Zero can be used for testing if required the unwanted artefacts are particularly visible in a vertical left panel [ Jason Hicks ] * dnd, appletManager: Fix applet DND on mozjs52 [ Michael Webster ] * window-list applet: Use clipping to adjust the progress overlay, instead of changing the width. [ Jason Hicks ] * main.js: Add search_providers to xlet types in _addXletDirectoriesToSearchPath [ Michael Webster ] * popupMenu.js: Stop relying on an idle callback to toggle menus. * dnd.js: Use get_transformed_allocation instead of get_allocation_box * panel dnd: Improve stability when dragging. * applet.js: Only try to add a context menu separator once, to prevent warnings during DnD operations. * panel dnd: ensure a clean slate when an applet drag begins. We work with lists across all panels (with 3 zones apiece), but only the final drop zone can know when a drag ends. It's easier to make sure we're cleared out at the start of a drag instead. * panel.js: Clean up some unused variables. * cinnamonDBus.js: catch an invalid monitor index before it goes to muffin (where it will g_assert and crash cinnamon.) [ JosephMcc ] * Use a style class name for the new window list progress indicator [ NikoKrause ] * xlet-settings: translate title in list widget [ brownsr ] * panel: tidy up some indentation * dnd: avoid use of deprecated reparent * dnd: Don't queue an idle handler if we already have one https://github.com/GNOME/gnome-shell/commit/fce2930b859af8530c4fed9f258e8186649455d2#diff-902d56799170f0dc27500667c665b683 no observable difference in use * theme-node: Fix font family formatting https://github.com/GNOME/gnome-shell/commit/6fc5b0477ba1c77b6bcdd23e07254fbe97c92b83#diff-b948bb195b709c61ce7275142a2fbdfd [ slepton ] * Update cs_power.py [ wesdawg ] * Search provider updates (#6905) [ BG Stack ] * add Show all workspaces setting to window list (#6922) [ Simon Brown ] * st-texture-cache: Plug some pixbuf refcount leaks on async operations (#6921) [ guzzard ] * indicatorManager.js: add support for appindicator SecondaryActivate (#6915) [ Björn Esser ] * cinnamon-settings: Add online-accounts (#6881) [ Clement Lefebvre ] * Settings: Add an icon for GOA * Settings: Wrap Online Accounts into a Python module and provide information about supported accounts [ Albert Pool ] * Make touchpad settings compatible with libinput (#6694) [ Clement Lefebvre ] * On-screen keyboard: Don't register Caribou's daemon DBUS name * On-screen keyboard: Don't register Onboard's DBUS name * On-screen keyboard: Add 'tablet' as a layout option in the settings * On-screen keyboard: Remove animations * On-screen keyboard: Make size and position configurable * On-screen keyboard: Default position to top and layout to tablet [ Simon Brown ] * environment: stray semicolon (#6936) [ Ingo Lafrenz ] * improve menu search results (#4053) (#6929) [ NikoKrause ] * removable-drives applet: show applet in panel edit mode (#6917) [ Simon Brown ] * st: add some default cases and avoid compiler warnings (#6932) * st-icon: remove unused fields (#6934) [ BG Stack ] * Add 'show all workspaces' option to appSwitcher (#6938) [ Jason Hicks ] * Performance: Avoid caching `this` context in SignalManager instances (#6918) [ NikoKrause ] * Applets: fix linter warnings (#6927) [ JosephMcc ] * window-manager: Show the workspace OSD even when effects are disabled (#6944) [ Jason Hicks ] * Improve JS logging [ brownsr ] * cinnamon-util: fix GFile leak https://github.com/GNOME/gnome-shell/commit/447246da741da9126aadb41c98a9179290bbcd86#diff-e13d0669f81906a880112b462a031c53 also fix an instance of deceptive indentation * cinnamon-util: fix some more leaks [ Simon Brown ] * st-texture-cache: load file simple, avoid leaks (#6953) [ H8to ] * Add alternative alt+tab behaviour to appSwitcher (#6952) [ Clement Lefebvre ] * Alt-tab: Set alttab-minimized-aware to false by default. * Main: Use black for the default stage color * XDG Menu: Remove legacy items [ Simon Brown ] * cinnamon-mime-sniffer: fix a GFile leak (#6955) [ Clement Lefebvre ] * l10n: Update POT file and fix some msgids -- Clement Lefebvre Tue, 24 Oct 2017 16:33:22 +0100 cinnamon (3.4.4) sonya; urgency=medium [ Michael Webster ] * classicSwitcher.js: Fix hidpi issues. * KeybindingWidgets.py: fix parsing of accelerators that are shifted but not alpha-numeric characters. * xlet-settings.py: Don't crash when an invalid xlet id is provided. [ itzexor ] * window-list applet: fix argument warning [ Michael Webster ] * add issue template [ Jason Hicks ] * ui/settings: Handle undefined old settings values [ Michael Webster ] * hotCorner.js: Fix hover delay callback. -- Clement Lefebvre Thu, 06 Jul 2017 11:17:41 +0200 cinnamon (3.4.3) sonya; urgency=medium [ Michael Webster ] * panel-launchers: put individual launcher actions back in the main popup, having an options and preferences submenu was a bit ambiguous. [ Simon Brown ] * Panel-launchers: remove an undeclared variable warning (#6648) * deskletManager: Correct call to file.delete (#6650) [ Clement Lefebvre ] * Add a menu item to toggle the on-screen keyboard -- Clement Lefebvre Mon, 26 Jun 2017 12:44:24 +0200 cinnamon (3.4.2) sonya; urgency=medium [ Michael Webster ] * st-texture-cache.c: don't cache st_texture_cache_load_from_raw - its only user is the notificationDaemon. These are transient images that were being stored in the cache that would never be evicted during theme changes (this does not just mean times when the user changed the icon them.) [ Clement Lefebvre ] * l10n: Translate hardcoded string for settings reset confirmation dialog [ Michael Webster ] * Silence a few more warnings new warnings. * expo, overview: unreference actors that we destroy whenever the respective view closes. * cinnamon-slideshow.py: only allow a single instance to run. [ brownsr ] * Sound applet: avoid spacing problem in vertical panel Knock on from commit 3870e42fe58533598ef8998ffb7d6bd3f213cbec [ JosephMcc ] * photoframe-desklet: Fix a few issues [ Michael Webster ] * notificationDaemon.js: Silence an occasional warning. * SettingsWidgets.py: Make switch widgets use "center" vertical alignment instead of "fill," to prevent the switch growing in height when the label text gets ellipsized (either thru resizing of the window, or localization.) [ BinHong Lee ] * Progress bar text initializes and resets [ Michael Webster ] * cinnamon-settings-users: Restrict the size of user images, as they are displayed in the right view when a user is selected. If the image at /var/lib/AccountsService/icons/ is set to a ridiculously-sized image, it won't break the ui. * cs_user: Don't let large images break the ui - make sure we scale the selected image to an appropriate size. Also, don't crop user-selected images (but keep cropping webcam images) - it's strange to select an image file and have the ends of it cut off. * cinnamon-settings-users.py: Fix picture preview in file selector to maintain a reasonable size. * cs_user.py: Handle image previews better in the face chooser dialog. [ Jason Hicks ] * ChooserButtonWidgets.py: Fix Python 3 error [ brownsr ] * window-list: bring space around preview down and correct a calculation problem beta testing user asked for the space around the window preview to be brought in a bit that in turn highlighted a bug where the scaling was calculated without taking the icon+title into effect I've brought the spare space down a bit, but I can't bring it down further and have it look right in all themes without major surgery, which would be best done in a development cycle. The space allowance for the icon is not fully adequate as the title font could be set large, and so take up more room than the icon. But I've tried with this height adjustment and this scaling across a wide selection of themes, and it appears to stand up. [ Michael Webster ] * cinnamon-settings-users, cs-user, ChooserButtonWidgets: let GdkPixbuf do the work of restricting the size of images while maintaining aspect ratio. Follow-up to last few commits. * StScrollView: queue redraws whenever the adjustments change, to prevent artifacts outside of the view itself. * StScrollView: More effective way of fixing the graphical artifacts generated during scrolling. This also appears to fix some unrelated tearing issues I was seeing in the menu while testing. * main.c: Own onboard's dbus name to prevent it starting when gnome's a11y keyboard settings key is active (org.gnome.desktop.a11y.applications screen-keyboard-enabled.) Also own caribou's daemon. Caribou's OSK won't interfere in a Cinnamon session, but its daemon will run needlessly in the background otherwise. [ brownsr ] * panel: avoid cjs giving a warning that dummyPanels[i][j] is undefined [ Michael Webster ] * systray applet: make sure an icon actually got parented to this.manager_container before calling remove_child. This issue can occur during session startup. * StScrollView: queue redraws whenever the adjustments change, to prevent artifacts outside of the view itself. * spacer applet: use a unique style class in the theme to prevent the applet from appearing active when hovered. * theme: add applet-spacer class for spacer applet. * spacer applet: use track_hover instead of a new style to prevent highlighting. [ leigh123linux ] * Remove unused dep [ Michael Webster ] * osdWindow: get the correct child allocation when calculating the width of the level bar. If a padding or margin is added to the level-bar style class, it was causing the parent bin to expand to accomodate the child's width plus its required padding. * Revert "StScrollView: queue redraws whenever the adjustments change, to prevent" -- Clement Lefebvre Tue, 20 Jun 2017 16:16:34 +0200 cinnamon (3.4.1) sonya; urgency=medium [ Clement Lefebvre ] * Remove usage of GTK_POLICY_EXTERNAL [ Stephen Collins ] * checkBox.js: remove extra unused argument which was causing a warning with new cjs/mozjs [ Michael Webster ] * st-bin.c: Fix y_fill setter (it was setting x_fill to the value of the existing y_fill, before it is set in the same call). * menu applet: fix keyboard navigation of recent context menu. Fix closing of same menu when switching to another category. Also fix closing when opening another recent's context menu. * menu applet: notify when a recent file is activated that can't be accessed. * menu applet: make missing file notification transient. * menu applet (vector box): partially revert c0d37dd79d68c97 - there is flickering as events go from a button to the vector box and back. Remove the idle callback, and directly react to the enter even once more. To compensate, increase our maybeUpdateVectorBox delay timeout, which more or less fixes the original problem the above commit was attempting to fix. * menu applet: _select_category - only call displayButtons if the category has really changed. * menu applet: fix keyboard navigation when a second recent context menu is toggled open. [ Clement Lefebvre ] * Sound settings: Fix device icons [ Stephen Collins ] * xlet-settings.py: ignore files and directories in the config directory that aren't created by our settings api as well as instances that no longer exist * ExtensionCore.py: Don't scrub the config directory on load. This is no longer necessary since xlet settings now ignores anything that isn't an active instance, and some applets need a place to store extra files so they get cleaned up on uninstall. * cs_panel.py: Fix crash when there are no panels [ itzexor ] * sound-applet: remove extraneous arguments on add_actor calls [ Michael Webster ] * radioButton.js: remove extra argument to add_actor. [ itzexor ] * window-list-applet: fix undefined reference warning [ Odyseus ] * [cinnamon-json-makepot] Added support to extract "title" and "units" keys on list elements [ Michael Webster ] * debian/control: use correct runtime dependency on caribou introspection only. [ Clement Lefebvre ] * User applet: Remove ability to switch to guest with LightDM [ JosephMcc ] * runDialog.js: Fix undefined variable warning (#6539) [ Clement Lefebvre ] * Reorganize the default applets in the panel * User applet: Remove trailing spaces * Applets: Make TextIconApplet smarter and adapt to vertical panels. [ Michael Webster ] * menu applet: use _select_category to select recents and places, so we can cache the current selection more accurately and prevent needless calls to _displayButtons. [ Stephen Collins ] * window list: add missing dependency to settings (#6551) -- Clement Lefebvre Tue, 23 May 2017 15:44:25 +0100 cinnamon (3.4.0) sonya; urgency=medium [ Lars Mueller ] * Fix gnome terminal losing desktop file association during cinnamon restart [ Odyseus ] * cinnamon-json-makepot: Added support to scan for JS files inside sub-dirs. [ leigh123linux ] * Start systray applet first * Use generic marshaller * Fix file permissions [ Jason Hicks ] * Pull functions out of loops in _refreshPlaces, _refreshApps... * Move uri assignment in _refreshRecent's while loop into new... * Use let instead of var in new handler functions [ brownsr ] * panel: rework allocation logic to avoid looping in edit mode this was causing the context menu animation to fail to complete causing the user not to be able to exit edit mode * theme-node: Fix leak on stylesheet change. From upstream https://github.com/GNOME/gnome-shell/commit/72bfa9125945919e9d69505d3e739480855f331e * cinnamon_dbus_acquire_name: don't leak the result from upstream https://github.com/GNOME/gnome-shell/commit/3f0fbae7e213b2fbe7267b9d25ac7fcfaa8afcff * cinnamon_dbus_acquire_name: Don't leak error from upstream https://github.com/GNOME/gnome-shell/commit/7f1a258ff9fc768a7fc13e5c37e1fd6d7ab5c33b * keyboard: destroy the key's boxpointer from upstream https://github.com/GNOME/gnome-shell/commit/9d933356e171a1dc49b61b5864826531c0f24d97 [ Lars Mueller ] * Fix hotcorner hover delay timeout removal This fixes a "Invalid or null source id used when attempting to run Mainloop.source_remove()" when leaving a hotcorner. The timeout is already destroyed by returning false in the callback, but we still knew about the timeout id and tried to remove the non-existing timeout. [ brownsr ] * st-box-layout: Don't report a paint volume when we have no allocation from upstream https://github.com/GNOME/gnome-shell/commit/aa6f352cb06d3ae8940af323f048c8c7886fa0cd * window-tracker: fix memory leak from upstream https://github.com/GNOME/gnome-shell/commit/ac22172a6ec37a158ca4cecf8c18f8fb29c1aa97 [ Michael Webster ] * tooltips.js: Remove leftover logging. * Add cinnamon-stap-monitor utility. * panel.js: Couple fixes to previous commit. Let the panel sections cover the entire panel in edit mode. Clean up _allocate a bit - since we always have the center zone occupied (artificially or naturally,) we don't ever need to handle cases where it isn't. * panel.js: Fix dnd pseudo-class style application for vertical panels. * panel: Allow right and left panel zones to naturally fill space. Fix vertical allocate calculations in st-box-layout (align_end was only working for horizontal box layouts). * panel.js: Cleanup actor and style class names, simplify some code that no longer needs to differentiate between vertical and horizontal panels. * cs_screensaver.py: Expose setting for floating widgets. * panel.js: restore 'important' style flag, accidentally removed from panel zones. [ Chris Allan ] * expoThumbnail.js: Don't reposition thumbnails on position-changed. [ Michael Webster ] * cs_screensaver.py: Use a stack to switch between default screensaver and plugin previews. * panel.js: Restore some allocation code mistakenly removed in a previous commit. This restores the behavior of allowing left/right panels to occupy more than half the panel if the center zone is empty. [ Lars Mueller ] * [Sound applet] Fix a segmentation This fixes a segmentation fault that happened when menu animations were disabled. Fixes #5977 [ itzexor ] * cinnamon-desktop-editor: use the default icon when file is nonexistent [ brownsr ] * st-theme-node.c: rename a confusing variable At the moment we have an outer loop on i, and then a separately declared internal loop on i This changes the name of the variable in the internal loop to avoid confusion * st-theme-node: Improve error reporting from upstream https://github.com/GNOME/gnome-shell/commit/1d235395765226a981fd31f16adae505ad8642de#diff-ea7efd941b083a785ba5e4b928a26d59 * St: support css margin property From upstream https://github.com/GNOME/gnome-shell/commit/2935fd4ffe9176d28f68192bb34bdba1a0e57a2b and https://github.com/GNOME/gnome-shell/commit/216e996f6680a3ffb797caafe1ed29990360c8f1 [ leigh123linux ] * Fix cursor black background when taking screenshot [ Jason Hicks ] * JS API misc/util.js: Add spawnCommandLineAsync [ JosephMcc ] * recent-applet: Fix wrong menu placement [ NikoKrause ] * Cinnamon Tutorial: Add instructions for xlet l10n [ Stephen Collins ] * User applet: Remove inaccurate comment - This is not actually the shutdown applet by Shelly [ JosephMcc ] * windowManager: Move handling of workspace switch effects to one place * window-list: Don't lose our focus style class when opening the context menu [ Stephen Collins ] * Settings widgets range: Add an optional argument to show the current value of on the scale widget. This was originally the way it worked in the xlet settings, but with the rework, that functionality wasn't reimplemented. This rendered the settings of several applets less usefull. This pull request reimplements the functionality for applets and also makes it available for cinnamon settings as well. * Show desktop applet: fix preview being stuck by keyboard-triggered menu open * settings.js: Rebuild the settings file if it becomes corrupted. If the settings have already been loaded, we use the latest version we have, otherwise we restore from defaults. [ JosephMcc ] * vertical-panels: Make proper calculations for panel intellihide [ Stephen Collins ] * Keyboard applet: always show something in panel edit mode * Power applet: always show something in panel edit mode [ Jason Hicks ] * JS API util.js: Add doNotReap parameter to trySpawn ct. itzexor [ Stephen Collins ] * util.js: add documentation for spawn_async [ Sam Burgos ] * added support to manage the systemd services available on the system [ Michael Webster ] * cs_startup.py: Add a "Run now" button for when a row is selected. [ Stephen Collins ] * Make sure applets that don't support vertical panels don't get droped on a vertical panel. This was happening with at least some applets, causing them to 'disappear', and could only be recovered by removing them from applet settings and readding them again. [ JosephMcc ] * cinnamon-settings: Fix some sliders being drawn backwards [ Stephen Collins ] * settings.js: Handle corrupt settings the right way. Fixes several issues with the previous implementation. * xlet settings: add list widget [ Odyseus ] * [Xlet settings] Fix reference to new option added to wrong element [ Clement Lefebvre ] * Settings: Add support for lightdm-settings [ NikoKrause ] * [xlets-about-dialog] show timestamp if exists else show version & show "more info" button [ itzexor ] * spawn_async: clean up the callbacks after we're done * looking-glass: use bracket notation for property accessors when inspecting * Environment: don't fail in toString() * looking-glass: set null results' value to "[null]" [ Lars Mueller ] * Fix panel timeout spinbuttons jumping around Fixes #6374 [ Madh93 ] * Add Manjaro Support in System Info #6387 [ brownsr ] * systray: add css class to permit theming * st-theme.c: rename confusing variable Compiler is complaining about shadow variables because the same variable names are defined in a function and in an if statement in the function [ itzexor ] * systray-applet: don't crash in on_applet_removed_from_panel [ brownsr ] * st-theme-node: remove a double declaration that gives a compiler warning * cinnamon-app-system: rename a doubly declared variable causing a compiler warning * st-background-effect: avoid a couple of ISO C90 compiler warnings [ Daniel Schürmann ] * Start inode/directory app instead unregistered x-scheme-handler/file in case of unmounted bookmarks [ brownsr ] * st-entry: change variable type to avoid compiler warning [ Lars Mueller ] * Add a chooser for "inode/directory" to be able to choose the default file manager [ brownsr ] * st-polygon: avoid a couple of ISO C90 compiler warnings [ leigh123linux ] * remove ENABLE_EXPERIMENTAL_API defines [ NikoKrause ] * xlet-settings: add missing string for l10n [ brownsr ] * st-box-layout: remove unused variable [ itzexor ] * panel.js: refactor Panel._showPanel and Panel._hidePanel * panel.js: don't clip the panel box shadow when showing after hide [ JosephMcc ] * cs_accessibility: Restore previous theme when disabling High Contrast [ Michael Webster ] * remove panelMenu.js, which is unused but for 2 applets. There are a bunch of applets that import it but don't use it, all of which can be fixed now. [ JosephMcc ] * hotcorners: remove the icon option [ itzexor ] * cinnamon-looking-glass.py: handle numpad enter in entry [ leigh123linux ] * Remove aclocal as autoreconf runs it [ Odyseus ] * Fix for non translated applet names on Remove context menu items. [ Lars Mueller ] * [Xlets] Expose config deletion request to xlet * Revert "Fix panel timeout spinbuttons jumping around" * [cs_panel.py] Remove unused methods * [cs_panel.py] Better fix for jumping spinbuttons This fixes it, avoiding excessive disk writing [ brownsr ] * st-texture-cache: use convenience function to free linked list * modalDialog: avoid a js warning [ Michael Webster ] * utils: add check-js, to scan for runtime-breaking javascript syntax errors. [ brownsr ] * Adjustments after enabling margin for st * st-box-layout: change variable type to avoid compiler warning * st-drawing-area: redefine a variable to avoid a compiler warning * st-private: change variable types to match and so avoid compiler warnings * st-button: avoid redundant redeclaration compiler warnings * st-label: avoid redundant redeclaration compiler warnings * st-theme-node: avoid compiler warnings about redundant redeclarations * st-widget: avoid redundant duplicate declarations giving compiler warnings * st_theme: add missing enums and default case avoids compiler warnings done upstream [ Nicholas Carrington ] * cs_user.py: Save appropriately sized .face for cinnamon-screensaver [ JosephMcc ] * cs_mouse: Add new settings to control acceleration/sensitivity * power-applet: Add support for warning and error style classes [ Stephen Collins ] * cs_panel.py: rework individual panel page to simplify code, fix some bugy behavior, and improve readability [ brownsr ] * st-widget: use g_clear_pointer https://github.com/GNOME/gnome-shell/commit/4d1358b7ed483b3822ab889e4851cca2c3fa8841#diff-9ad11fdf581414b0f2501e50921d1052 [ Harry Wynn-Williams ] * Update keybindings.js [ Clement Lefebvre ] * Adapt Cinnamon to multi-process CSD [ JosephMcc ] * messageTray: Show critical notifications in fullscreen [ itzexor ] * panel.js: fix missing variable declaration [ Stephen Collins ] * cs_panel.py: replace panel widgets with backended ones. This will hopefully ensure that the widgets are consistent with the rest of Cinnamon in terms of behavior and appearance, as well as easier to maintain. [ itzexor ] * panel.js: improve code uniformity in show/hide functions * panel.js: cleanup _processPanelAutoHide usage * panel.js: move clipping code into new _setClipRegion helper * panel.js: keep track of panelPosition and monitor changes * panel.js: refactor _moveResizePanel [ brownsr ] * St: support margin: corrections to PR 6271 * st-scroll-bar: add default to case statement to avoid compiler warning done using g_return_val_if_reached as upstream * st-scroll-view: add missing enums and default case statements avoids compiler warnings missing enums are placed in the same places as upstream [ itzexor ] * layout.js: don't include clipped off areas in input region [ brownsr ] * st-theme-node: add defaults to case statements to avoid compiler warnings also treat an iso C warning by moving a variable declaration [ Elias Ojala ] * README file to reStructuredText file [ brownsr ] * st-widget: add missing enums to avoid compiler warnings * cinnamon-window-tracker: add default to case statement to avoid compiler warnings and a couple of other very minor changes, again to avoid compiler warnings * St: Margin: remove margin:auto from menu applet and default theme This avoids warning messages as margin:auto is not supported And it also means third party theme developers will not copy non-functional CSS The warning messages for the programmatic insertion of margin:auto in the menu applet were particularly cryptic [ JosephMcc ] * st: Fix a couple icon/text-shadow bugs [ Odyseus ] * cinnamon-json-makepot: Fix for undefined global name. [ mikee805 ] * Update cs_power.py [ Michael Webster ] * Use St.Icon instead of fetching icons from St.TextureCache. * all: adapt to changes for new cjs (gjs 1.48/mozjs38) [ itzexor ] * panel.js warning fix * lookingGlass.js: fix warning * sound-applet: fix warning [ JosephMcc ] * osdWindow: Fix the level bar display [ Michael Webster ] * Remove memory info stuff from looking glass, cinnamon-global. * control: adjust version reqs for libcjs * all: Some additional warning fixes due to gjs 1.48.0->1.48.2 changes. [ JosephMcc ] * panel-launchers: Fix the panel launcher animation [ itzexor ] * melange: don't freeze on quit with custom log watchers [ JosephMcc ] * desklet.js: Ignore an extra argument to setContent() [ Jason Hicks ] * js/ui/tooltip.js: Check if this.mousePosition is defined * Move this.mousePosition initial assignment to TooltipBase * Supress CJS mozjs38 warnings in applet, dbusMenu, indicator... * Correct indentation [ SteveMoto ] * reformatting and fix css (#6510) [ Simon Brown ] * cinnamon-util: sort out various compiler warnings (#6506) * cinnamon-perf-log: treat a couple of compiler warnings (#6503) * cinnamon-tray-manager: remove an ISO C compiler warning (#6505) * cinnamon-recorder: remove some compiler warnings (#6504) * cinnamon-doc-system: remove a couple of compiler warnings (#6502) * cinnamon-app-system: treat various compiler warnings (#6501) * cinnamon-app: avoid default case and integer/unsigned compiler warnings (#6498) * st-theme-node-drawing: add default cases to switch statements to avoid compiler warnings (#6495) * workspace-switcher: correct undefined property warning (#6497) * na-tray-manager: remove an ISO C compiler warning (#6508) [ Jason Hicks ] * js/ui/dnd.js: Fix undefined error with mozjs38 * ui/js/panel.js: Fix undefined this._dragShowId error with mozjs38 * js/ui/appletManager: Fix undefined error with mozjs38 * js/ui/extension: Fix undefined requiredArray[2] error with mozjs38 * js/ui/appletManager: Fix invalid parameter count with mozjs38 for Gio.File.delete [ itzexor ] * main.js: improve logging of GLib.Errors and objects (#6486) [ NikoKrause ] * [menu-applet & panel-launchers] added new mouse cursors while dragging apps (#5859) [ Clement Lefebvre ] * l10n: Update POT file * l10n: Generate additional files -- Clement Lefebvre Thu, 04 May 2017 16:02:56 +0100 cinnamon (3.2.8) serena; urgency=medium [ Michael Webster ] * menu applet: Only construct one context menu for recent files, and re-use it. * cs_screensaver.py: Re-use the Gtk.Socket always - it can hold both Gtk.Plugs and normal Gtk.Widgets, just treat it like a normal bin/container. This seems to assist on ref-cleanup and child reaping when switching screensavers. (observed on Arch, reported on Arch and Fedora) * menu applet: Don't reconstruct recent files, just re-order, add, remove as required. * menu applet: Fix a couple of minor leaks (actors created but never added to a container - being GInitiallyUnowned, they never get their floating ref sunk, and so can't be unreffed. Fix a prototype mis-match, and just rename GenericButton to NoRecentDocsButton, since that's the only user of it. * menu applet: Some fixes for previous commits, don't be so destructive when refreshing applications. * Revert "cs_screensaver.py: Re-use the Gtk.Socket always - it can hold both Gtk.Plugs" * Fix tuples for python 3.6 * tooltips.js: add a hide timer to check if a tooltip should hide itself, but for various reasons never got to act on a leave-event (due to vagaries in event reporting). * recent applet: Rework to be non-destructive when updating the recent list (this brings a lot of the recent changes to the menu applet over to this one.) * recents, applets: Couple warning cleanups * network applet: Remove a useless log warning. At some point more than a year ago we started getting these (possibly a change to network-manager), they have no value whatsoever, but fill up the log. -- Clement Lefebvre Sat, 07 Jan 2017 11:19:30 +0000 cinnamon (3.2.7) serena; urgency=medium [ JosephMcc ] * cinnamon-settings: Do a better job of handling long labels [ Niklas Kreer ] * Update polling frequency to make the mouse tracking smoother [ Clement Lefebvre ] * Layout: Ignore NaN numbers when updating regions -- Clement Lefebvre Thu, 22 Dec 2016 11:45:01 +0000 cinnamon (3.2.6) serena; urgency=medium * Revert "Remove the 20 recent files limit" * Recent documents: Don't store objects we don't need * Menu applet: Try/catch call to decodeURIComponent -- Clement Lefebvre Tue, 13 Dec 2016 22:27:47 +0000 cinnamon (3.2.5) serena; urgency=medium * l10n: Generate additional files -- Clement Lefebvre Mon, 12 Dec 2016 14:28:39 +0000 cinnamon (3.2.4) serena; urgency=medium [ Stephen Collins ] * Partial revert of 864f632a and handle premature signals from the file monitor gracefully [ Michael Webster ] * cs_screensaver.py: clear preview container any time the default screensaver is selected. [ JosephMcc ] * cinnamon-settings: Fix a couple of ugly buttons -- Clement Lefebvre Sun, 11 Dec 2016 11:24:41 +0000 cinnamon (3.2.3) serena; urgency=medium [ Albert Pool ] * Remove the 20 recent files limit [ Odyseus ] * Default theme: Added support for applets with :checked pseudo class. [ Clement Lefebvre ] * sound applet: Add rhythmbox to the list of known players [ NikoKrause ] * [menu-applet] symbolic icons for contextMenu of appsButtons [ JosephMcc ] * icons: Add an icon for the "Run with NVIDIA" option in the menu [ Stephen Collins ] * Tutorials: Update the xlet settings tutorial and reference pages to reflect changes to the api in Cinnamon 3.2 [ Germán Franco ] * workspace-switcher: avoid fast consecutive moves [ leigh123linux ] * Fix gi import version warning * Change shebang to use system python [ lestcape ] * Do not make inecessary iteration on popupmenu close function [ JosephMcc ] * SoundFileChooser: Fix showing incorrect names * SoundFileChooser: Change play icon [ NikoKrause ] * [menu-applet] fix file-exists-query and indentation [ Germán Franco ] * Fix typo, missing parenthesis [ brownsr ] * remove rtl code in vertical panel will require testing by 3rd party [ Michael Webster ] * menu applet, overrides.js: fix some loss in effectiveness of our vectorbox caused by feacb693f529bd7db2. Having these calls within a callback, even one with no delay, was enough to provide for a bit of 'fuzziness' when defining/picking against the vectorbox's triangle, and preventing accidental category selection. [ Clement Lefebvre ] * cinnamon-launcher: Add support for mate-panel * cinnamon-launcher: Center fallback message dialog [ leigh123linux ] * add depends wget [ Clement Lefebvre ] * Calendar applet: Allow custom date formats in vertical panels * Calendar applet: Remove trailing spaces * Panel Launchers: Fix the ability to edit * l10n: Update POT file * Fallback mode: Kill the panel when restarting Cinnamon [ leigh123linux ] * Add setting to disable automatic screen rotation on tablet's * add orientation lock keybinding * add tooltip [ Darshaka Pathirana ] * screensaver settings: Add button with info on custom format [ Michael Webster ] * cs_screensaver.py: A few changes to improve reliability of the screensaver plugin previews. Use Gio.Subprocess, it seems to be more reliable at cleaning up after itself. And don't re-make the GtkSocket every time - connecting to socket's plug-removed and returning True prevents the socket from auto-destructing and also improves cleanup when changing row selection. [ itzexor ] * appletManager.js: fix max instance check when pasting applet config [ Clement Lefebvre ] * Info settings: Rephrase tooltip * l10n: Update POT file * Window list applet: Move preferences up in the context menu * General settings: Rephrase automatic rotation option * l10n: Update POT file -- Clement Lefebvre Sat, 10 Dec 2016 12:15:31 +0000 cinnamon (3.2.2) serena; urgency=medium [ Clement Lefebvre ] * build: Make AX_ macros optional [ Odyseus ] * [Xlet settings] Fix for icon choosers stuck dialogs * [cinnamon-json-makepot] Added support for "title" key [ lestcape ] * Ensure a default icon size of 16px if the icon-size is not set in the indicator icon theme class. [ Germán Franco ] * [workspace-switcher] Fix buttons' size Buttons didn't get proper height (or width in vertical mode) if the auto-scale font setting was not enabled. [ NikoKrause ] * [sound-applet] removed ancient code for timeLabel * uniform names [ Stephen Collins ] * Restore ability to theme the menu applet menu separately from other menus [ JosephMcc ] * cs_effects: Disable menu animations when turning of window effects [ Odyseus ] * [applet.js] Re added ability to display a separator on applets context menus. * [applet.js] Added a mechanism to highlight applets with open menus. [ NikoKrause ] * [menu-applet] fix keynav issues with TAB and right [ lestcape ] * Use the Gio library for establish the file permissions in replace of the spawnCommandLine usage. [ itzexor ] * panel-launchers: close the menu before destroying when removing launcher [ Odyseus ] * [Xlet settings] Added translation mechanism to xlets settings windows [ itzexor ] * cs_backgrounds.py: fix thumb generation on LMDE2 [ NikoKrause ] * [sound-applet] remove show percentage label for slider option [ JosephMcc ] * theme: Fix theming of the workspace switcher [ NikoKrause ] * typo [ Clement Lefebvre ] * l10n: Update POT file -- Clement Lefebvre Wed, 23 Nov 2016 13:02:10 +0000 cinnamon (3.2.1) serena; urgency=medium [ kloun ] * rm obsolute and unsupport NEWS file [ Michael Webster ] * keyboard applet: Fix positioning of the flag render within its actor. * Fix some runtime warnings - in the sound applet, object construction is too soon to get the theme node, wait until 'style-changed' signal is sent by the main actor. In the menu applet, remove return values of navigateContextMenu() - there is only one user of this function, and they don't check for a value. * keyboard applet: Allow flag icon to properly scale its size to match the panel and preferences. Monkey patch some St.Icon methods to the EmblemedIcon class so we can use the existing applet icon sizing calculations by pretending we're just another icon hanging around, getting things done. [ NikoKrause ] * [menu-applet] fix warnings caused by keynavigation [ Clement Lefebvre ] * Update ./test script * Info settings: Add upload-system-info button * l10n: Update POT file * Info settings: Add tooltip to upload button * Fix typo * l10n: Update POT file -- Clement Lefebvre Tue, 08 Nov 2016 14:26:20 +0000 cinnamon (3.2.0) serena; urgency=medium [ Margarita Manterola ] * Re-order and re-word idle-delay and re-word lock-enabled [ AlbertJP ] * Resize a thumbnail when the window resizes [ Henry Williams ] * Add Remove button for Xlets [ dralley ] * Added gi.require_version() in many, many, many places [ Michael Webster ] * cs_keyboard.py: Fix keybindings for quiet volume up and down (they were showing the same keys as normal volume-up/down.) [ JosephMcc ] * Add the ability to play a sound effect when showing notifications [ Corbin Auriti ] * Clean up output filenames on the tracker search provider [ Antti Nilakari ] * Show flags based on short name of language in keyboard applet [ Stephen Collins ] * Settings: switch gsettings widgets to use new settings backend: * Add json settings backend to settings widgets * settings.js: rewrite to simplify code and aviod the use of object.watch() which can be costly on resources * Revamp the xlet settings: - xlet settings now open in their own window/process - matches new style of cinnamon settings - now supports pages and sections in the settings file - instances are now automatically highlighted in the panel when the instance is selected in the settings window (uses a new 'highlight' pseudoclass) - uses the new JSON backend for easier maintenance and simplification of the code - added support for backendable widgets which were not previously available to the xlet settings api - updated for newer Gtk versions - added a new configure function to applets and desklets * Udate some of the applets and desklet to use the new settings api [ brownsr ] * Give more informative message when starting to remove applet * wrap applet description At the moment a long applet description will push the subsequent icons off the visible screen which is likely to confuse some. Scaling up font or text scaling exacerbates this Some simple column wrapping avoids the issue [ Michael Webster ] * Add cinnamon-related debug packages to cinnamon-dbg package [ Clement Lefebvre ] * Localize the applet name in previous commit [ Maximiliano Curia ] * Migrate away from gnome-common deprecated vars and macros [ IHaveThatPower ] * Corrected "output" to "input" [ collinss ] * settings.js: fix some settings not updating due to unspecific conditional * appletManager.js: (multi-instance) fix applet setting file not being removed with applet [ Marcus Lundgren ] * sound applet: Add a menu that allows the user to switch between active players [ JosephMcc ] * panel-launchers: Fix an undeclared variable warning [ Giulio Girardi ] * Menu applet: Show 'Run with nVidia GPU' in context menu [ collinss ] * Fix background settings color chooser not working [ brownsr ] * Vertical panels [ JosephMcc ] * build: Bump the required gtk version [ Marcus Lundgren ] * sound applet: Remove entry in players list if player doesn't exist when switching - Make sure to always use the correct player owner when performing a switch [ Michael Webster ] * workspace-switcher applet: Use the WindowManager functions to switch workspaces when using the mousewheel - this ensures that: [ collinss ] * JsonSettingsWidgets.py: Ignore dependency key that doesn't exist with a warning rather than failing with an error * Settings widgets: add backendable date chooser widget * Refactor sound chooser widgets to simplify and avoid unnecessary duplication of code * Fix xlet settings not upgrading properly with new key * Fix panel-launchers add/edit dialog not working [ Michael Webster ] * keyboard layout applet: Fix showing the correct flags. [ JosephMcc ] * window-list: Don't hide the current workspace in context menu * ExtensionCore.py: Don't show the uuid to the user [ itzexor ] * cinnamon-settings: remove unused webkit code and dependency [ Corbin ] * Make the whole BalanceBar insensitive when the channel map is changed * Fix some device icon spacing issues [ Dan Dascalescu ] * Explain where to look for components to file bugs properly [ MajidSas ] * change the maximum delay for backgrounds slideshow [ collinss ] * settings.js: fix error caused by missing quotations [ dralley ] * Convert cinnamon bin utils to Python 3 [ Michael Webster ] * window-list applet: Listen to a new signal from muffin's MetaScreen which will notify when an item should be add or removed due to its skip_taskbar hint changing. [ JosephMcc ] * cs_panel: Fix some terminology * panels: Allow themes to set separate default width and height values for panels * theme: Stop panel launchers from jumping around in vertical panels on hover * theme: Use a larger width for vertical panels in the default theme [ Michael Webster ] * menu applet: Make the hover delay create a delay in opening the menu on hover, *not* changing categories. There should never be a delay switching categories. [ Pierre G. Bogossian ] * sound applet: bind mouse buttons 4/5 to previous/next track NB: mouse buttons 4 and 5 (aka back/forward buttons) are numbered 8 and 9 by X [ Michael Webster ] * st-cogl-wrapper.c: Don't ignore cogl parameters. [ itzexor ] * cs_backgrounds.py: Use built in mimetypes module * cs_backgrounds.py: Refactor disk caching [ Clement Lefebvre ] * Fixed build [ JosephMcc ] * window-list: Rework for vertical panels * theme: Set a 32px size for vertical panels * window-list: Allow themes to control spacing between items [ brownsr ] * vertical panels: put the notification count under the notification symbol This keeps things central in the panel and avoids problems with the panel width being able to accomodate icon+text label unless there is a silly number of notifications. [ Marcus Lundgren ] * sound applet: Removed unnecessary call to remove player. [ Michael Webster ] * cinnamon-util: Add cinnamon_get_file_contents_utf8 asynchronous function with callback. Mark _sync version as deprecated. * cinnamon-util.c: Don't leave a cinnamon_get_file_contents_utf8 caller hanging, always run the callback, even with a NULL result. [ Balló György ] * Follow the Icon Naming Specification [ itzexor ] * cs_backgrounds.py: Don't check mimetype if filename is None [ Balló György ] * removable-drives applet: don't hardcode Nemo [ Lars Mueller ] * Remove panel barriers on panel removal [ itzexor ] * cs_backgrounds.py: Apply white background to RGBA images [ Michael Webster ] * JsonSettingsWidgets.py: close file objects. settings.js: remove file monitor, push all settings changes thru Cinnamon's dbus interface. [ brownsr ] * Indentation corrections to remove inadvertent tabs also corrected an erroneous variable reference in a log message [ NikoKrause ] * [show-desktop applet] new feature added: Peek at desktop * [keyboard applet] added switch in settings to use uppercase letters in panel [ brownsr ] * minor change into a more natural case statement * centre align the centre box in a vertical panel and also clean up an if sequence, a few related comments, and a misalignment [ Michael Webster ] * settings.js: don't try to use python in javascript. Also, payload is just the raw value string, not an array or variant array. [ itzexor ] * panelMenu.js: fix incorrect logic [ Clement Lefebvre ] * Show-desktop applet: Enabled peek-at-desktop, rephrased settings * Keyboard applet: Fixed typo * Fixed typos in files/usr/bin/cinnamon-settings [ JosephMcc ] * applet.js: Properly layout applets in vertical panels * user-applet: Properly hide the panel label in vertical panels * applet.js: Fix visual alignment of Text applets in vertical panels * notification-applet: Fix the layout in vertical panels * menu-applet: Fix the layout of the menu applet in vertical panels * power-applet: Fix layout in vertical panels * workspace-switcher: Don't allow the visual style layout in vertical panels * spacer-applet: Adapt layout for vertical panels [ Michael Webster ] * Revert "Revert "keyboard layout applet: Fix showing the correct flags."" [ JosephMcc ] * sound-applet: Adapt layout for vertical panels * separator applet: Clean up some code styling * a11y-applet: Don't allow the a11y applet in vertical panels * sound-applet: Properly hide/show label on initial load * applet.js: Clean up the code a bit [ itzexor ] * write-applet.xml: fix incorrect example code [ brownsr ] * correct applet context menu on panel orientation move Thanks @lestcape [ Jess Wu ] * Fix grammar mistakes in source files [ NikoKrause ] * [menu-applet] hiding favorites box leaves an empty box in the menu, this should fix this [ itzexor ] * show desktop applet: keep track of peek timeout id * show desktop applet: various cleanups [ brownsr ] * Correct drag and drop bugs in panel launcher 1) an issue that looks to have been there before the vertical panels change where drag and drop within the panel launcher would drop icons in unscaled rather than at the same scale as the other icons 2) a vertical panels issue where the drag and drop code was assuming horizontal orientation and so was calculating both the position in the list of icons and the new position in the actor incorrectly 3) took the opportunity to correct a number of minor indentation issues * correct window list internal drag and drop for vertical panels 1) The override on the allowable drag direction was not set to allow vertical dragging also previous override needed clearing when orientation changed 2) Removed a few stray tabs etc. 3) Calculated the drop position correctly for vertical panels [ NikoKrause ] * [window-list applet] using icons on context menu [ itzexor ] * panel.js: add dialog to launch settings when the last panel is removed * panel.js: don't try to hide the panel if it's destroyed [ Michael Webster ] * Keyboard layout applet: Update to use new XAppKbdLayoutController to supply appropriate icons and short names, and as a general wrapper around libgnomekbd for layout control. * Remove flag folder for keyboard applet (provided by libxapp now) [ JosephMcc ] * systray: Clean up code formatting [ Michael Webster ] * keyboard layout applet: Use this._config.get_enabled() to check whether applet should be 'active' [ NikoKrause ] * [menu-applet] a more intuitive way of navigating through the menu with the keyboard [ itzexor ] * appletManager.js: fix removeAppletFromPanels [ collinss ] * Move all settings chooser button code to it's own file * xlet settings: Replace old binding function in settings.js with two new ones and allow multiple bindings on the same key [ JosephMcc ] * applets: Change how applets set the type of panel they are allowed in [ leigh123linux ] * remove grabber [ NikoKrause ] * [menu-applet] fixed key-navigation of filesystem search path [ Lars Mueller ] * Fix tooltip position This fixes the tooltip position on the first show of a tooltip. Previously, the extents fetched from the actor were wrong, because the actor had never been allocated before. [ JosephMcc ] * cs_themes: Don't show duplicate themes [ NikoKrause ] * [menu-applet] create favBox, even if it's not shown at Cinnamon restart [ itzexor ] * st-scroll-view.c: move comment up and remove indentation For whatever reason, this comment hangs g-ir-scanner indefinitely with version 1.50 of gobject-introspection in Arch Linux, at least on my machine. Moving the comment onto its own line fixes this issue. [ NikoKrause ] * [menu-applet] clear recent list applet with ENTER-key * [menu-applet] show AppDescription only on hovered buttons and hover allAppsCatButton when search pattern is deleted [ Balló György ] * Remove dependency on GConf [ collinss ] * ChooserButtonWidgets.py: add missing imports [ Michael Webster ] * cs_screensaver.py: rename date/time section to customize, rename combobox selections to be more grammatically correct [ itzexor ] * cinnamon-global.c: fix a gi warning [ JosephMcc ] * messageTray: Fix the placement of notifications [ Michael Webster ] * keyboard applet: restore upper-case option, fix regression from xlet settings revamp. [ brownsr ] * workspace switcher - change whether graph is shown or not At the moment the graph is suppressed in vertical panels because a long wide workspace resulting from multiple monitors results in an unworkable graph when scaled to fit the panel width. Change this to test on the workspace size ratio, as this will permit single monitor setups to have the workspace graph * add vertical style class to workspace switcher No code is needed to remove it as buttons are rebuilt from scratch when panels are moved between orientations. Linked to a change to improve appearance of this applet in vertical panels in Mint-X themes [ NikoKrause ] * [menu-applet] decodeUriComponent in placesManager.js and docInfo.js [ brownsr ] * refactor if sequence to case statement, and sort alignment [ NikoKrause ] * added PopupSwitchIconMenuItem and used it in sound-applet [ Michael Webster ] * cinnamon-settings: On widgets that don't use bind functions, connect to the widget changed handlers only after setting their initial value. This prevents on_settings_changed() from being triggered right away, as well as a subsequent trigger of the widget changed handler (for a second time.) [ brownsr ] * make accessibility applet suitable for vertical panels The issue is that sticky keys make use of the applet label to display and this is not compatible with a vertical panel. Resolve this by re-purposing the applet tooltip to show the sticky keys in a vertical panel The functionality in a horizontal panel is unchanged. The tooltip also shows normally in all cases excepting when the relevant keys are actually pressed [ JosephMcc ] * inhibit-applet: Fix an oversized menu item [ Clement Lefebvre ] * Fixed typo in js/ui/popupMenu.js * Revert "Fixed typo in js/ui/popupMenu.js" [ Michael Webster ] * windowAttentionHandler.js: fix logic for matching ignored wmclass names. [ brownsr ] * correct unreactive top/bottom strip in vertical panels fixes #5748. [ Germán Franco ] * Style sound applet overlay controls * Added buttons styling same as other in the theme * Change color to fit the theme [ JosephMcc ] * panel-launchers: Redesign the launcher context menu * window-list: Add the standard applet context menu items * window-list: Tweak the settings layout * panel-launchers: Tweak the layout of the settings * notifications-applet: Tweak the layout of the settings * calendar-applet: Tweak the layout of the settings * keyboard-applet: Tweak the layout of the settings * expo-applet: Tweak the layout of the settings [ Michael Webster ] * menu applet: Fix hover delay tooltip [ JosephMcc ] * window-list: Fix an undeclared variable warning [ collinss ] * Remove the boxpointer from popup menus [ NikoKrause ] * [menu-applet] fixes https://github.com/linuxmint/Cinnamon/issues/5820 * [sound-applet] added dependencies in the settings-schema * [menu-applet] rewritten keynavigation codeblock [ Odyseus ] * [Hot Corners] Added hover delay functionality. Added tooltips to hot corner icons. Corrected some minor indentation/white space inconsistencies. Closes linuxmint/Cinnamon#1050 [ Clement Lefebvre ] * Enable vfade effect by default [ NikoKrause ] * [sound-applet] add option: show percentage next to volume slider [ Lars Mueller ] * Fix menu item order in window list This fixes a problem, when the menu orientation is not St.Side.TOP. the menu box layout was is reverse order. [ JosephMcc ] * popupMenu: Mark the new 'menu' style class as important [ lestcape ] * Improving slightly the appindicators. * Allow the appindicator used the theme icon size if is not in scale mode. * Remove the boxpointer features of the indicator API. [ JosephMcc ] * panel.js: Change the order which panels are drawn [ itzexor ] * cs_screensaver.py: expose new cinnamon screensaver settings * cinnamon-settings.py: refactor maybe_resize slightly [ brownsr ] * ensure applets that override on_panel_height_changed get to scale properly The logic in the common applet code has been changed so that the scaling is not overridden by the locally overridden function. The local function thus becomes additional to the core function, rather than overriding it in its entirety. This also corrects errors associated with turning scale mode on and off. One more associated change to the window-list applet in a vertical panel will be needed but as there are changes queued up for that I think it's best done subsequently fixes #5700 * Ensure that the edge of the screen reacts to mouse clicks Previously the outside couple of pixels were unreactive. This was set so as to avoid recursion errors but these seem no longer to be there, so this resets to the desired behaviour [ itzexor ] * lookingGlass.js: inspect: better handle undefined and null values * menu applet: remove keybinding when applet is removed from panel * menu applet: make menu hotkey binding per-instance [ Odyseus ] * [Menu applet] Added keyboard navigation for context menus. [ Clement Lefebvre ] * Simplify backgroundManager [ Odyseus ] * [Xlet settings] "entry" and "iconchooser" elements modifications. [ JosephMcc ] * workspace-swithcer: Fix the vertical style class [ NikoKrause ] * [menu-applet] hide recent files, which are no longer available [ Odyseus ] * [Xlet settings] Added support for "button" to extensions settings windows. * [Tooltips] Fixed positioning of tooltips. [ Clement Lefebvre ] * sound: Add xplayer to the list of players without seek support [ JosephMcc ] * panel-launchers: Fix 'Add' and 'Edit' not working * menu-applet: Add a setting for the new menu animations [ Clement Lefebvre ] * Update POT file * Generate additional files [ NikoKrause ] * [menu-applet] keynav: make sure to scroll the appsBox to top if category is changed [ Michael Webster ] * keyboard applet: Rework to sync with changes to XApp.KbdLayoutController - the controller provides only icon names now. Handle icon construction ourselves. * cs_screensaver.py: Update to reflect new preferences, remove old ones that are now in keyboard->region panel. [ JosephMcc ] * popupMenu: Insert menus that open from the panel below the panels [ Alex Peters ] * avoid varying space between month and day [ Clement Lefebvre ] * screensaver setttings: Rephrase some of the msgids * Xlet settings: Add support for alpha colors in ColorChooser * Fix JS warning * Tooltips: Round coordinates * l10n: Update POT file -- Clement Lefebvre Mon, 07 Nov 2016 16:12:22 +0000 cinnamon (3.0.7) sarah; urgency=medium [ Jonathan Washington ] * fixes https://github.com/linuxmint/Cinnamon/issues/5410 (Power settings segfault) -- Clement Lefebvre Thu, 14 Jul 2016 22:51:08 +0200 cinnamon (3.0.6) sarah; urgency=medium [ JosephMcc ] * Add a generic "bluetooth" icon [ Michael Webster ] * power applet: Don't connect to any signals that call _devicesChanged until we have the power proxy (since the callbacks assume we do have it). * windowAttentionHandler.js: make the ignored app check case- insensitive. While we're here make it a gsettings array for convenience. * org.cinnamon.gschema.in - add pidgin to ignored wm classes. [ Clement Lefebvre ] * Touchpad settings: Invert motion-threshold setting widget [ Michael Webster ] * appletManager.js: Fix copy/pasting applet panel applet layouts. Extension.get_max_instances() needed an extra argument, and then we were doing work twice - finished removing obsolete code. * cinnamon-recorder: fix crash when starting recorder... * cinnamon-recorder.c: restore avoidance of the panel when drawing the recording indicators. This was removed during some panel work a while back and never restored. Always draw them on the primary monitor now (the only monitor with reliable, simple-to-get workarea information). [ leigh123linux ] * fix spelling mistakes [ Michael Webster ] * onscreen keyboard: Add option to change activation behavior - accessible mode has the keyboard appear whenever focus demands it (ordinary accessibility behavior). On-demand mode will have the keyboard only appear when the user requests it via an applet click or keyboard shortcut. [ Clement Lefebvre ] * Themes settings: Fixed loading icon themes when a theme isn't readable [ Michael Webster ] * popupMenu.js: use the signalManager.disconnect correctly - the source actor (the panel actor for the applet) has to be the second argument, the object to disconnect from. Was causing flickering in the menu applet after repositioning it. [ Clement Lefebvre ] * Makepot * Settings: Don't hardcode "more info" link color in spices modules * [desrt] network: properly remove connections from list * Network applet: Fixed icon not showing VPN status * Network applet: Delete trailing spaces * Network applet: Fixed applet showing "Auto" wireless connection when turning wifi OFF and then back ON. [ Michael Webster ] * tray icons: Bump icon request to 24, then scale back to 20 in the applet. This is needed due to changes to GtkIconSize values in Gtk3. GtkStatusIcon iterates thru the built-in icon sizes to pick an appropriate icon to use, and as of 3.18 there are no sizes between 16 and 24px. [ Clement Lefebvre ] * Preferred application settings: Set mimetypes more exhaustively -- Clement Lefebvre Thu, 23 Jun 2016 13:39:10 +0100 cinnamon (3.0.5) sarah; urgency=medium [ JosephMcc ] * cinnamon-settings: Remove hard-coded theming for the main cinnamon-settings icon view [ Clement Lefebvre ] * Background settings: Apply EXIF rotations to thumbnails [ Michael Webster ] * cinnamon-util.c: cinnamon_util_get_icon_for_uri.c - use a custom icon if one is set in metadata (via file manager). -- Clement Lefebvre Tue, 31 May 2016 09:54:44 +0100 cinnamon (3.0.4) sarah; urgency=medium [ Clement Lefebvre ] * Updated pot file [ Michael Webster ] * cs_effects: Only show overlay scrollbar toggle when using gtk3 >= 3.16. * sound applet: Use an icon that actually exists for blank coverart. [ JosephMcc ] * sound-applet: Fix an icon name [ Clement Lefebvre ] * Ignore accents/stokes when searching the menu or cinnamon-settings * Menu applet: Removed trailing spaces * Menu applet: Don't refresh twice at the same time. [ Lars Mueller ] * [Menu applet] Fix not cleared drag placeholder in favorites box This fixes the uncleared drag placeholder in the favorites box, if an application was dragged over, but not dropped on the favorites box This is for #5322 -- Clement Lefebvre Mon, 23 May 2016 12:51:41 +0100 cinnamon (3.0.3) sarah; urgency=medium [ Dustin Falgout ] * Ensure label text is properly escaped before applying it with set_markup() Fixes #5287 * fix typo [ Michael Webster ] * SettingsWidgets.py: use a more compatible GFileMonitorFlags - WATCH_MOVES is not available in Mint 17/glib 2.40 * cinnamon-settings: include module keywords in desktop files * cinnamon-app: provide access to desktop file keywords. Use them in the menu applet search. * generated desktop files: re-run, to remove unnecessary comment * extensions: Check extensions for unsafe calls (synchronous, etc.. things that can potentially freeze Cinnamon) and make the user aware of them in cinnamon settings. * ExtensionCore.py: scan_extension_thread - if the metadata.json file is not found, this must be a versioned xlet, check the parent folder for it instead. * cs_power.py: Expose setting to allow lid-closed action even when external monitors are attached. * messageTray.js: Don't let notifications with buttons fade on mouse-over. [ itzexor ] * menu applet: use app id instead of app name for searches prevents duplicate search results for apps with the same desktop entry name when searching with a more specific term * sound applet: smplayer: fix artist metadata display and disable seek While seeking does work, after the first time you seek the amount seeked is incorrect. It appears to seek the amount between the beginning of the seek bar and where you released the click instead. [ Michael Webster ] * cs_themes: Add setting for dark theme variant preference. This is only settable from ~/.config/gtk-3.0/settings.ini, so add the ability to modify that as well. * cs_effects.py: Expose gtk-overlay-scrollbar setting. [ JosephMcc ] * cs_sound: Set selection mode to none on the SoundBox() object [ NikoKrause ] * Missing semicolon * Missing semicolon [ Clement Lefebvre ] * Settings: Don't include text/html in the source code mimetypes [ Michael Webster ] * st-texture-cache.c: use g_themed_icon_new instead of g_themed_icon_new_with_default_fallbacks. -- Clement Lefebvre Fri, 20 May 2016 12:04:29 +0100 cinnamon (3.0.2) sarah; urgency=medium [ ion201 ] * Cache generated thumbnails [ Lars Mueller ] * Fix desktop effects on dialogs and menus This prevents desktop effects on dialogs and menus from being used if desktop-effects is turned off. It's like already like this in the effects settings dialog. [ Clement Lefebvre ] * Power applet: Fixed declaration of alias variable * Window list: Fixed call on null object [ Stephen Collins ] * Fix handling of device icon where gicon is None (partially fixes #5248) [ JosephMcc ] * cinnamon-settings: Don't set the stack switcher to use the main settings stack on creation This is causing visual glitches in a lot of gtk themes when changing from the main icon view to a page that displays the stack switcher [ Stephen Collins ] * Fix highlighting not working correctly for multiple instances of an applet [ Michael Webster ] * ExtensionCore.py: Don't break when an xlet provides a bad icon file. [ Jason Jackson ] * Added null conditional to return empty array when get_devices returns null [ brownsr ] * correct potential infinite loop [ Michael Webster ] * accessibility settings: don't use packagekit for now when looking for assistance programs that are installed. Just look for their binaries, and notify if not installed. Watch the bin folders in case the user installs the dependency and doesn't restart cinnamon settings. * cs_sound.py: Add a close button to the speaker test dialog. [ ion201 ] * Fix image close crash -- Clement Lefebvre Tue, 10 May 2016 16:38:11 +0100 cinnamon (3.0.1) sarah; urgency=medium [ JosephMcc ] * extensions: Fix the alignment of the rating number in the "Get more" pages so it won't get covered by overlay scrollbars [ leigh123linux ] * bump muffin version because of API changes -- Clement Lefebvre Mon, 25 Apr 2016 10:10:43 +0100 cinnamon (3.0.0) sarah; urgency=medium [ A-Shahbazi ] * add option to show/hide favbox in menu applet [ Corbin ] * Added new default application buttons [ trolleyyy ] * show panel-launchers actions * tab indents into space indents, more item without dots [ Stephen Collins ] * Move sound settings to python as a native module [ JosephMcc ] * Add a custom page to display when no input devices are available or applications are currently playing. Add a custom settings box for the sound effects page to prevent getting a very tall window when opening the settings. Make a few tweaks to the test sound dialog and add the relevant icons. [ Stephen Collins ] * Some visual tweaks to the sound settings: * Sound settings: add mute to all volume controls [ Michael Webster ] * cs_sound.py: Few fixes to the volume slider/mute button: * layout.js: Remove code for interaction with the screensaver. It was always broken until 2.8.7, where I 'fixed' it, and has caused some reported regression where the panels will be hidden after returning from the screensaver. [ itzexor ] * cs_sound.py: add padding to the end of stream names in applications page [ s3rj1k ] * Viber stealing focus fix [ Michael Webster ] * magnifier.js: update the lens size as well as shape when we turn on lens mode. * Generate new desktop files for sound and accessibility [ Clement Lefebvre ] * Touchpad settings: Rename "natural scrolling" to "reverse scrolling direction" [ Martín Ferrari ] * Fix middle click action in the photo frame [ Maximiliano Curia ] * photoframe: recurse subdirectories [ Clement Lefebvre ] * Sound settings: Fixed device not showing when its icon isn't found (fixes bluetooth devices not showing up) * Power settings: Don't add the Gtk.Stack if it's empty (Fixes https://github.com/linuxmint/Cinnamon/issues/5194) * Power settings/applet: Let the user rename battery powered devices * Power settings: Fix power bars not being aligned * Startup settings: Fix https://github.com/linuxmint/Cinnamon/issues/5199 [ Michael Webster ] * tooltips.js: hide if the stage's key focus changes - prevents tooltips from becoming stuck if you use the keyboard to switch focus (hit the menu key while a window list preview is showing.) [ JosephMcc ] * cs_keyboard: Add a "wide" style class to the pane separator in the shortcuts page and remove some unneeded padding so this looks a little nicer in most newer themes * effects: Enable effects on dialogs and menus by default [ Clement Lefebvre ] * Sound applet: Correctly identify changed artwork from Spotify (and add support for new URLs in version 0.27.x) * Theme settings: Don't filter themes missing gtk-3.0 if they provide gtk-3.* [ brownsr ] * show multi line descriptions in applet about: Fix #5193 [ Clement Lefebvre ] * Sound applet: Use wget to download remote artwork covers [ JosephMcc ] * layout: Tweak the handling of menus in the top_window_group to match muffin changes [ Clement Lefebvre ] * Cinnamon Settings: Fixed gi.require_version warnings * Cinnamon Settings: Remove a couple of old debug output * Cinnamon Settings: Retire cinnamon-bluetooth (replaced with Blueberry) [ Michael Webster ] * Revert "St-texture-cache: Don't monitor file changes (should increase performance, might cause regressions in cases where the St texture needs to be refreshed following a file change)" [ JosephMcc ] * panel-launcher: Fix an undeclared variable warning [ Daniel Alley ] * Fixed cinnamon slideshow error (Issue #4280) [ JosephMcc ] * Adjust to Muffin API changes for handling fullscreen windows * Extensions: Fix the "Disable all extensions" not working [ Clement Lefebvre ] * Updated generated files * Updated pot file * Packaging: Bumped internal dependencies -- Clement Lefebvre Sun, 24 Apr 2016 14:02:02 +0100 cinnamon (2.8.7) rosa; urgency=medium [ Michael Webster ] * cs_keyboard.py: Fix event handlers for teaching keybindings - the cursor-down and -up keys were being incorrectly used to navigate the tree view during teach mode, and it was breaking focus (and cancelling the teach.) * magnifier: limit max zoom to a reasonable value * menu applet: Fix vfade in the program list - it was only showing when desktop zoom was turned entirely off. We've reworked zoom since then, so that the .applications key only determines whether we listen to key and mouse bindings or not - actual zoom activation occurs only when the magnification factor becomes > 1.0. * screensaver: Fix proxy to listen to the correct service, fix layout changes when the screensaver starts/stops. * layout.js: get an actual boolean from the screensaver proxy. * signalManager.js: pass argument array correctly, and don't wipe out this._storage when filtering out disconnected items. * cinnamonDBus: rename Cinnamon to CinnamonDBus, and import Cinnamon so screenshot calls work. [ JosephMcc ] * window-list: Prevent the window list thumbnails from showing when the applets context menu is open * window-list: Properly update the label in the window preview. Fixes https://github.com/linuxmint/Cinnamon/issues/4879 * cs_backgrounds: For an update of some of the reveal children on initial page load to fix some settings not showing properly [ Rob Adams ] * Fix D-Bus methods for screen capture [ itzexor ] * util.js: do not modify error message -- Clement Lefebvre Mon, 07 Mar 2016 17:21:41 +0000 cinnamon (2.8.6) rosa; urgency=medium [ JosephMcc ] * launcher-editor: Implement the idea in https://github.com/linuxmint/Cinnamon/issues/4849 makes more sense for than the current behavior. Do the same for directory-editor.ui * window-list: Properly scale the window previews for hidpi [ Dexter Chua ] * popupmenu.js: Fix documentation -- Clement Lefebvre Thu, 26 Nov 2015 20:35:01 +0000 cinnamon (2.8.5) rosa; urgency=medium [ Michael Webster ] * workspace-switcher applet: update relevant workspace graph when a window is added or removed from a workspace. * workspace-switcher applet: Don't ignore maximized windows in the graph [ Michal ] * #4767: Handle situations when /usr/lib64 is a symlink to /usr/lib and vice versa on some distributions causing modules are being loaded multiple times * #4357: Replace has_icon method with lookup_icon one to fix missing flags icons in keyboard applet [ Dexter Chua ] * signalManager.js: fix typo (fixes #4818) [ JosephMcc ] * effects: Currently when setting the minimize animation to "traditional" no sound effect is used when restoring the window. Change this so the minimize sound is played in this case. [ Clement Lefebvre ] * Sound applet: Close menu when closing media player. [ Lars Mueller ] * Fix menu applet's graphical oddity during search This is fixing #4845 -- Clement Lefebvre Fri, 20 Nov 2015 17:13:52 +0000 cinnamon (2.8.4) rosa; urgency=medium [ Lars Mueller ] * Fix a timer issue in TooltipBase In rare cases, two enter events occurred without a leave event in between, leaving an orphaned _showTimer behind * Same fix for the overriden _onEnterEvent in the window list applet as in TooltipBase [ pixunil ] * Sound applet: Fetch the status of Loop and Shuffle at the beginning, not just on update [ Björn Richter ] * Fix: user_data is not passed to callback [ Michael Webster ] * js/ui/keybindings.js: Remove idle function for media keys. This is implemented in muffin now, for *all* muffin-managed keybindings. -- Clement Lefebvre Wed, 11 Nov 2015 19:00:34 +0000 cinnamon (2.8.3) rosa; urgency=medium [ JosephMcc ] * layout.js: Rework our strut handling code to better handle multi-monitor situations * effects: Set the default settings to actually match the default "Cinnamon" style so these get used on new installs * desklet/boxpoiner: Don't try to correct the arrow side for the desklet menu inside desklet.js. The boxpointer handles this on it's own. * CinnamonWindowTracker: Pull some upstream fixes so google chrome apps will use the proper icons in the window list [ Lars Mueller ] * Fix allocation error when STBoxLayout is align_end [ Clement Lefebvre ] * Sound applet: Fixed huge icons/artwork in HiDPI * Keyboard settings: Release grab when focus is lost [ cave ] * attentionhandler suppress autofocus -- Clement Lefebvre Mon, 09 Nov 2015 11:33:49 +0000 cinnamon (2.8.2) rosa; urgency=medium [ Daniel Alley ] * Replaced uses of the commands module with subprocess [ Michael Webster ] * st-container.c: Fix dispose method causing crashes. priv->children was being updated during destruction of each child, causing invalid pointers when iterating thru priv->children. Use clutter_actor_destroy_all_children to do just that, and we get no corruption. * appletManager.js: fix get_object_for_uuid() when an empty index of appletObj is hit upon. [ Clement Lefebvre ] * Settings: Added link to mintlocale's input method * Updated pot file -- Clement Lefebvre Fri, 30 Oct 2015 12:03:31 +0000 cinnamon (2.8.1) rosa; urgency=medium [ Dexter Chua ] * panel.js: factor out panel allocation code and prevent division-by-zero error [ JosephMcc ] * workspace-switcher: Properly resize the switcher when using custom panel sizes [ Daniel Alley ] * fixed code execution by replacing os.system() w/ subprocess.call(), pep8 formatting [ pixunil ] * Panel launchers applet: syncronize with settings with correct variable Caused issues when adding, moving or removing items [ Michael Webster ] * capi.py: Handle the failure to locate c-c-c modules more gracefully. * capi.py: fix i386 platform detection. [ Clement Lefebvre ] * capi.py: Scan all relevant paths * Removed unused files/generate_desktop_files file * capi.py: Add support for /usr/lib64 (used in RPM distros) [ Daniel Alley ] * fixed command injection, replaced deprecate calls to "commands" module with their subprocess replacements * pep8 formatting * added exception handler just in case * fix potential NameError * pep8 -- Clement Lefebvre Mon, 26 Oct 2015 11:46:40 +0000 cinnamon (2.8.0) rosa; urgency=medium [ Alexandre Rostovtsev ] * build: require libmuffin-2.5.0 for show_tile_preview * build: append ST_CFLAGS when building test-recorder [ Asier Iturralde Sarasola ] * Fix some typos in the Writing applets tutorial [ Clement Lefebvre ] * Power applet: Fix case when last battery is removed (applet continued to show up) * Power settings/applet: Added vendor/model info, refactored code/logic as to which device to show in the applet, fixed 6px margin issue * Power applet: Don't show time until fully charged when equal to 0 (i.e. when unknown) * Multi-monitor support: When switching workspace, the workspace name OSD should appear on all relevant monitors * Alt-tab: Improved preview mode (faster switching animations, less delay, less opacity in the background) * Alt-tab: Speed up preview backdrop animation a little more * Alt-tab: Classic switcher, don't animate thumbnail removal (it looks weird when switching to the next window..). Also, increase the delay to show thumbs to 300ms. Both 180ms and 300ms seem slow when trying to identify windows by their thumbs, but 180ms gets in the way and shows shadow-thumbs when pressing Alt at "normal" speed. It's all empirical/subjective really.. but this seems to improve things a bit. * Display applet: Show output names (handy when the the display name is the same for 2 or more monitors) * Workspace Switcher applet: Added visual representations and configuration to switch between visual and button modes * Applets: Fixed enabling/disabling applets * Window list applet: Simplified setting description * Revert "Stop using deprecated functions" * Network applet: If the device vendor/model are empty, return the device name or the device type * Sound applet: Replaced 'menuitem-detail' style with popup-inactive-menu-item * Sound applet: Group player_info/artwork/track_info/controls/position_seeker together, implement flat slider support in slider.js. * Sound applet: Reduce the number of theme styles used * Sound applet: Fixed recent regression when displaying track info in the panel * Sound applet: Move input components, output devices and applications to context menu * Sound applet: Hide applications/output-devices initially * Sound applet: Make new styles important so the new elements look nice in all themes * Sound applet: Fixed introduced regression (title/artist info only changed when cover changed) * Sound applet: Themeable button sizes (bigger by default) and a little more padding in the track info * User settings: Removed trailing spaces and fixed indentation * User settings: Replace os.system() with subprocess.call() * Indicators: Less debug info in Melange, and hide indicators which role is registered by applets * Fixed redeclaration of const Params * FHS fixes: move arch indip. files from /usr/lib to /usr/share * Move capi.py to /usr/lib as contain one path arch dependent * Sound applet: Force padding/alignment on device output origins * Removed unused code * Don't register Cinnamon with cinnamon-session * Fixed Cinnamon caused by previous commits * Fixed Cinnamon crash caused by previous commits * Removed cinnamon-preload * Added debian/cinnamon.maintscript to remove obsolete preload files in /etc * Window list applet: Add window title and icon to window preview thumb * Systray applet: Fixes for invisible/out-of-place icons * Updated makepot * Updated additional files * Fixed ./generate_cs_module_desktop_files.py and updated cs module desktop files * Fixed missing paths in makepot * Don't translate "v%s".. * Updated pot file * Systray applet: Fixed Cinnamon crash when resizing the panel or toggling scale mode * Systray applet: Fixed indicators not being removed properly * A couple of improvements for indicators * Window list applet: Enable thumbnail previews by default [ Corbin ] * Improve/Bugfixes password changer dialogs * finishing touches [ darealshinji ] * Packaging: fix and override more Lintian warnings [ Dexter Chua ] * appletManager.js: use a more efficient method to add applet * appletManager.js: avoid code duplication * Menu Applet: Code Cleanup 1 * Menu Applet: Code Cleanup 2 * appletManager.js: Don't reinvent Applet.prototype.filter * appletManager.js: more cleanup * Panel Launchers: Code Cleanup * popupmenu.js: Code Cleanup * signalManager.js: Code Simplification * Fix deprecation warnings * [Alt-F2] Work well with whitespace in filenames * cs_startup.py: don't crash when XDG_CURRENT_DESKTOP is not set * [Alt-F2] Redo (broken) completion mechanism * [Alt-F2] Allow user-defined aliases * [Alt-F2] Fix completion for symlink to directory * Allow documentation of signals * Document signals in PopupMenu.PopupMenuBase * Stop using deprecated functions * Removed unused variables * Stop using deprecated functions * tooltip.js: split out TooltipBase class for easier reuse * Window list applet: add window preview * Add missing import * tooltips: simplify position calculations * [Docs] Fix regression in whitespace determination * windowManger.js: use Tweener for timeout * tooltip.js: yet again more cleanup * window list: steal alt-tab style for preview [ Dustin Falgout ] * Display the name of Arch Derivatives When Applicable [ Fabio Fantoni ] * Install python script supporting files in /usr/share * Fix cinnamon-settings python files path * Fix cinnamon-settings-users policy path * Fix cinnamon-settings-users path * Fix cinnamon-desktop-editor path * Fix cinnamon-menu-editor path * Fix cinnamon-screensaver-lock-dialog path * Fix cinnamon-json-makepot path * Fix other FHS path * Fix cinnamon-settings after FHS fixes * Improve debian/rules * Add capi search path [ Filip Kowalczyk ] * fixed sticky highlight on Clear List button in Recent Files when browsing with keys [ Garry Filakhtov ] * Removed dateFormat from toLocaleTimeString() call [ James Lu ] * cs_startup: fix crash on NameError when copying a desktop file fails [ JosephMcc ] * Deprecations: Remove use of deprecated g_type_init () and bump GObject requirement accordingly. * Deprecations: Replace gtk_icon_info_free() with g_object_unref() * Cleanup: instead of attempting to clean up deprecated functionality in cinnamon-arrow, just remove it since it seems to be unused. * Cleanup: Fix an unused function warning in cinnamon-global.c * Cleanup: Remove st-tooltip. It's the source of a lot of build warnings and we no longer use it. * js: Explicitly dispose of all cairo contexts. A long read on why you want to do this here: https://bugzilla.gnome.org/show_bug.cgi?id=685513 * trash-applet: Fix an issue: JS ERROR: Error: Too few arguments to method Gio.close expected 1 got 0 in the trash applet * effects: bring back our window unminimize effect * workspace-switcher: Add an "Add new workspace" option to the context menu * boxpointer: Pull in some upstream fixes that better handle the boxpointer "arrow" in some cases * Set the X-Gnome-AutoRestart hint to false. Stumbled across this in an old gnome bug report. Fixes the issue with Cinnamon restarting twice with cinnamon --replace * windowManager: Destroy the tile hud/preview when we are done with it. Currently after showing the preview you will get a noticeable slowdown when moving windows that pass off the monitor edges. This should help solve that. * popupMenu: Add back the expander arrow on PopupSubMenuMenuItem but with a different layout. Also tweak the layout of a couple of our applet menus to look nicer with this change. The addition of the icons to Cinnamon itself is a workaround for Mint. Newer versions of the gnome icon theme have these as built in icons but not in the version supplied with Mint 17. They can be removed in the future. * bg: add "spanned" to the list of bg types that need to show the background color options * popupMenu: add back a couple checks for the existence of submenu expander arrow to prevent breaking the right click context menus in the menu applet * use the new meta_screen_get_current_monitor() to place appswitchers and modal dialogs on the proper monitor in multiple monitor setups * workspace-applet: properly dispose a cairo context * cs_windows: Reword a setting to match https://github.com/linuxmint/muffin/pull/204 * windowManager: Make the window dimming effect with attached dialogs a bit stronger and more obvious * windowManager: Properly declare a variable * add new slider and separator objects * workspace-switcher: Rework the visual style workspace switcher so it can be themed. Also fix some st_theme_node warnings and stop windows from being able to be drawn outside the workspace background * cs_startup: set modal to true for both the "Choose application" and "Add custom command" dialogs so the behavior is the same for both when using attached dialogs * rework the window list and effects so minimize effects work properly with multiple window lists on multiple monitors * sound-applet: make the volume slider for individual applications fully expand * workspace-swithcer: Use the set_important() function to make sure we get proper theming on the visual workspace switcher in themes that don't yet support it * systray-applet: fix an undeclared variable warning * theme: Re-style and size checkboxes and radio buttons in the default theme [ leigh123linux ] * cinnamon_recorder_LDADD' is defined but no program or library has 'cinnamon_recorder' as canonical name (possible typo) * Remove relic from old mozjs-17 * fix gtk import version * fix gtk import version * fix gtk import version * fix notify import version * fix cinnamon-desktop and upowerglib import versions * fix accountsservice import version * remove unused browser plugin stuff * cs_screensaver: fix Deprecation Warning * SettingsWidgets: fix Deprecation Warning * cs_themes: fix Deprecation Warning * Spices: fix Deprecation Warning * deprecated schema * missed one [ lestcape ] * Be more selective when filter the mouse release events. * Add support for indicators. * Fix missing or improperly imports. * Moved the indicator to the main cinnamon class. Removed the NameWatchDog Class. Added some checks, and the compatibility with this new behavior. * Removed also the NameWatchDog declaration (was omitted in the previous commit). * Inhibit the indicator icon, when has a draggable parent. * As a pedro recommendation, this is an attempt to move the RadioButton and CheckBox classes to the corresponding place, and reuse it, in the same place. * Fixed an error in the regretion from signalManager. [ Marga Manterola ] * Optimize rebuilding of media-keys hotkeys (fixes #4691) * Reorder setting delay_setup_started variable to avoid possible races (improves #4692) [ Matthew Petroff ] * Restore time remaining option for power applet. * Fix translation strings. [ Michael Webster ] * cs_backgrounds: add missing import * window-list applet: restore 2.4 behavior where a window list item demanding attention remains highlighted after it's done flashing. * panel-launcher: Use a generic icon when creating a new launcher, if the user didn't select a custom icon. * st-widget: Expand the "important" property: add set/get methods, remove CONSTRUCT_ONLY flag, have a theme node recalculation triggered when the property changes. * capi.py: Move with rest of cinnamon-settings files to their new location, remove debian sed rule for multiarch fix, instead figure out the right location in the capi code. Cinnamon-bluetooth is not MultiarchSpec compliant, so we still need to *also* load from /usr/lib/*. * st-widget.c: Fix typo in st_widget_recompute_style * st-theme-node: properly recalc the theme node when an StWidget's important property changes. * main.js: Fix typo from 08474a03cd660bb176d5ebb361a01ff6d51162fc * tooltips.js: Fix some occasional log warnings * window list: don't delay showing a preview, if another preview was just showing. * keybindings.js: don't tell muffin to remove a keybinding that we never set. This quiets warnings during startup about magnifier hotkeys. [ Phillip Berndt ] * Calendar applet: Avoid unnecessary wakeups * Calendar applet: Update each second if global time format is set to include seconds * Calendar applet: Update if Date&Time configuration has changed * Calendar applet: Simpler detection method for 8aa5264 [ pixunil ] * Power applet: Fixed a logical bug, when the primary device does not change its icon string after an update, battery-full will be used Fixes #4329 * Sound applet: Use the style class .sound-button-container with the pseudo class :small for quit and raise buttons Theme: Apply the :small pseudo class, cleanup of unused sound applet classes * Also translate xlet metadata in about dialogs * cs-backgrounds: add revealer to gradient widgets when picture-options is set to a value where those have no effect * Network applet: hide the switch if the switch has got no function This is typically the case e.g. when a cable is unplugged * trash applet: do not add items to context menu on orientation changed * extension.js: Use a macro function to create the Extension.Type members * extension.js: xlet uuids are unique for each xlet type, it is now possible to have more than one xlet of different types and the same uuid - Extension.unloadExtension, Extension.forgetExtension and Extension.get_max_instances needs to have a type argument after the uuid - Extension.importObjects, Extension.objects, Extension.meta, Extension.dirs are moved to Extension.Type[type].maps[mapType] * Automatically reload xlets when updating them instead of showing an info dialog * extension.js: Enable imports in a xlet via import.xlet (where xlet is the type of xlet; applet, desklet, extension or search_provider) cinnamon-js.cpp: Removed cinnamon_js_add_extension_importer * appletManager: In arrow filter functions, check if the value exists (when iterating over appletObj) Fixed the bug when the button in applet settings has no effect [ Rob Adams ] * Show audio device name (origin) in sound applet * Change calls to highlight, activate callbacks on xlets - Fixed initial instance not being selected on multi-instance xlets (error on highlight) - Passing uuid and instance_id to cinnamon via dbus - instance_id is the same as uuid when multi-instance not allowed - Corrected order of instance tabs in Gtk.Notebook to reflect order instances were added in [ Stephen Collins ] * Fix St.Entry not honoring some css text properties * settings.js: allow for dynamic getting and setting of options for supported key types (eg comboboxes and radio groups) * Make more cursor types available to Cinnamon * Sound applet: make sure player controls are destroyed when multiple names are used * Add two more cursor types to Cinnamon javascript * Fix some problems with the checkbox api [ The Aviator ] * Only get local users from /home -- Clement Lefebvre Tue, 20 Oct 2015 10:39:24 +0100 cinnamon (2.6.13) rafaela; urgency=medium * A11y applet: Show active keyboard modifiers when sticky keys are enabled * Renamed mintInstall.desktop -> mintinstall.desktop -- Clement Lefebvre Thu, 09 Jul 2015 14:16:19 +0200 cinnamon (2.6.12) rafaela; urgency=medium [ mtwebster ] * photoframe desklet: remove long-unused 'quality' setting. * Spices.py: remove redundant url request when refreshing thumbnails. [ JosephMcc ] * Fix the activation of right side hot corners being blocked by the pointer barrier * Some improvements to the trash applet * fix the trash applet crashing cinnamon due to a misnamed function * cs_startup: Fix an issue where startup applications fails to start because a desktop file fails to load -- Clement Lefebvre Wed, 01 Jul 2015 09:29:20 +0200 cinnamon (2.6.11) rafaela; urgency=medium * Trash applet: Fixed icon not updating, Cinnamon freezes and memory leaks when trashing large numbers of files * Updated translations in desktop files -- Clement Lefebvre Fri, 26 Jun 2015 16:05:29 +0200 cinnamon (2.6.10) rafaela; urgency=medium [ Gwendal Le Bihan ] * Don't fail when a stack is empty (can happen with the power panel) -- Clement Lefebvre Wed, 24 Jun 2015 16:35:46 +0200 cinnamon (2.6.9) rafaela; urgency=medium [ Dexter Chua ] * signalManager.js: fix errors when disconnecting JS objects * cs_themes.py: fix potential crash. Fixes #4325 [ Clement Lefebvre ] * Power Settings: Fixed battery info duplicated on the page every time it is refreshed * Power settings: Fixed typo in the code * Keyboard applet: Show text when layout icon isn't found * Bumped cjs dependency to 2.6.2 (required by signalManager) [ Michael Webster ] * photoframe desklet: Adjust an image's size only after it's been fully loaded, and we've received notification the size has changed (otherwise width and height are initially 0, and the aspect ratios of pictures aren't right. * cinnamon-settings: Set the first child visible each time a stacked settings page is navigated to. [ JosephMcc ] * fix an issue where panels/desklets can't get focus when a window is fullscreened on the primary monitor * Place modal dialogs like the About dialog on the monitor that currently has the mouse cursor instead of the monitor with the last focused window. [ glebihan ] * Added missing runtime dependency -- Clement Lefebvre Mon, 22 Jun 2015 23:33:09 +0200 cinnamon (2.6.8) rafaela; urgency=medium [ glebihan ] * Fix typo in doc [ Dexter Chua ] * windowManager.js: fix typo; fixes #4253 * panel.js: fix panel autohide glitch * applet.js: don't use deprecated MenuItem [ Clement Lefebvre ] * Revert "Menu applet: Removed context menu on recent items (overkill and we're really struggling with performance at startup)" * Power applet: Fixed panel icon not getting refreshed after falling back to brightness icon (after a suspend/resume for instance) * Power Settings: Added missing "self" in front of function * Background settings: Don't fail when locale isn't as expected (fixes "LC_ALL=C cinnamon-settings backgrounds") [ zyisrad ] * Display Volume OSD on primary monitor correctly [ Michael Webster ] * windowManager.js: Fix window dimming behavior for attached modal dialogs. * menu applet: clean up panel icon section - having no icon is a valid option, and it wasn't working. * cs_startup: Let double-clicking entry open the edit dialog. [ David Gasquez ] * Fix typo [ leigh123linux ] * remove empty tooltip -- Clement Lefebvre Sun, 14 Jun 2015 13:18:44 +0200 cinnamon (2.6.7) rafaela; urgency=medium [ Michael Webster ] * Make cinnamon a proper registered client with cinnamon-session. This lets us kill it on command. Otherwise, it lasts longer than c-s-d does (which is also a registered client) and we get strange icon/theme issues during logout, once xsettings dies. [ Clement Lefebvre ] * Renamed Screen Locker settings -> Screensaver and regenerated module desktop files * Updated desktop files * Make sure to refresh menu/panel-launchers at least once (when the Cinnamon icon theme is the same as the GTK one we don't get any icon-theme-change from St) * By default, allow Cinnamon to scale panel text and icons according to the panel heights -- Clement Lefebvre Tue, 02 Jun 2015 12:39:58 +0200 cinnamon (2.6.6) rafaela; urgency=medium * Revert "Menu/Panel Launchers applets: Don't listen to St directly, refresh when icon theme or active display scale is changed" (Fixes race condition causing gnome icon theme in menu/panel-launchers at login) * BackgroundManager: After 60 seconds, apply gnome bg changes blindly (fixes case where Firefox->set as wallpaper saves a new picture using the same path as before) -- Clement Lefebvre Sun, 31 May 2015 18:59:15 +0200 cinnamon (2.6.5) rafaela; urgency=medium [ Clement Lefebvre ] * Added cinnamon-killer-daemon to restart nemo/CSD/cinnamon via keyboard shortcut -- Clement Lefebvre Sat, 30 May 2015 13:22:51 +0200 cinnamon (2.6.4) rafaela; urgency=medium [ mtwebster ] * cinnamon-desktop-editor: Don't panic when an existing .desktop file doesn't have an icon defined. [ Stephen Collins ] * Make sure notification applet always stays hidden when it's supposed to [ Clement Lefebvre ] * Network applet: Fixed default IPV6 device being considered as important as default IPV4 one -- Clement Lefebvre Fri, 29 May 2015 10:21:05 +0200 cinnamon (2.6.3) rafaela; urgency=medium [ Clement Lefebvre ] * Power settings: Don't rely on output.get_backlight_min|max() to show brightness controls as it's not reliable with all hardware. Try to get backlight() info directly to see if it's supported instead. * Theme settings: Fixed regression caused by gettext fix ;) * Power settings: Don't show "When the battery is critically low" option with upower 1.0 (it no longer supports that) * Power settings: Don't use variables that don't exist (in UPS handling) * Calendar applet: Refresh view when show-week-numbers setting is changed * Network applet: Properly detect active VPN connection at session start when updating the panel icon * On-Screen keyboard: Affect Struts * On-Screen keyboard: Removed transparent background in default theme. * Sound applet: Only read position for seek-supported players, only support seek when playback rate is 1.0, don't support seek for Totem/GNOME-MPlayer/Pithos (either getting or setting the position isn't fully functional), only update the position timer once every second * Systray applet: Factorize icon resize code, removed special cases (we know they don't work for pidgin and thunderbird) * Systray applet: force natural icon sizes for known buggy icons (pidgin, thunderbird) * Keyboard settings: Renamed horizontal/vertical maximization options [ Dexter Chua ] * cinnamon-slideshow.py: fix crash when file change * expo.js: don't respond to scrolls when animating * docs: Split out tutorials * cs_general.py: Sync GNOME HiDPI settings * Fix panel launcher dnd * cinnamon-settings: be compatible with old gi * cs_screensaver.py: use gtk_container_foreach instead of gtk_container_forall * docs: Fix doc image not showing * docs: Fix missing syntax highlight * cs_panel.py: better protection against broken panel config [ Gwendal Le Bihan ] * Don't show stack switcher on applet configuration page * Follow date format setting in notification applet [ Didenko Vladimir ] * Load default icon if icon theme doesn't have application icon [ Michael Webster ] * js/docInfo.js: don't make a thumbnail factory (it never gets used) * cinnamon-settings: invert mouse sensitivity setting so it makes sense, eliminate rubber-banding of GSettingsRange by restricting int setting types to whole number adjustments in the slider. * cs_privacy: replace broken unbind() - take advantage of the behavior that a new binding will overwrite a previous one on the same object property. * Add image for default screensaver preview. * cs_screensaver.py: bring the currently selected screensaver row into view when the panel is displayed. * menu applet: when refreshing happens, apps, recent and places need to end up in the same order as before. Also, since we empty the whole container during an app refresh, we need to rebuild recent and places. When places change, we need to refresh recent also (to maintain order). * SettingsWidgets: display the correct number of SpinButton digits depending on the step value. (fixes issue with font scale spinner) * cs_panel: don't connect to settings until the page has been constructed. Don't crash and burn if cinnamon isn't running. * cs_panel: don't crash when there aren't any panels [ JosephMcc ] * osd: fix the media keys osd not showing on top of full screen windows * remove double '/' from paths * allow disabling of pointer barriers on all panels [ pixunil ] * Added missing method to ExtensionSidePage class, which blocked the update of the indicator of the active theme -- Clement Lefebvre Wed, 27 May 2015 10:30:20 +0200 cinnamon (2.6.2) rafaela; urgency=medium [ Dexter Chua ] * docs: Move tutorial index to tutorials/ folder * docs: include image used in source [ Clement Lefebvre ] * Gettext fixes * Gettext fix: "Lock Screen" is ambiguous in English, we decided in 2.4 it would be translated as the action, whereas "Screen Locker" would be the noun. * Gettext fix: Can't use adjectives without nouns -- Clement Lefebvre Thu, 21 May 2015 12:41:46 +0200 cinnamon (2.6.1) rafaela; urgency=medium * cs_screensaver.py: ellipsize description when necessary -- Clement Lefebvre Wed, 20 May 2015 09:28:56 +0200 cinnamon (2.6.0) rafaela; urgency=medium * 2.6.0 -- Clement Lefebvre Tue, 19 May 2015 17:50:50 +0200 cinnamon (2.5.0) unstable; urgency=medium * bump for development -- Michael Webster Sat, 11 Apr 2015 08:37:01 -0400 cinnamon (2.4.6) rebecca; urgency=medium * Settings: Fix occasional GTK-Warning and blank menu entry in the terminal selection, some comments * overrides: only check gsettings schema when it's actually provided. * magnifier.js: fix source id warning * notifications: fix default opacity being doubled in hidpi mode. * desklets: Make sure a new desklet is placed in a visible portion of the primary monitor. * photo desklet: Fix a warning, clock desklet: move some String class overrides to js/ui/overrides.js so they can be used in the desklet as well as the calendar applet. * panel applet: always remove the drag placeholder after a drag (not just after a successful one) * menu applet: always remove a favorites drag placeholder after a drag (not just after a successful one) * Added missing dependency on gir1.2-notify-0.7 * Cinnamon Settings: Properly handle themes which thumbnail isn't readable * cinnamon-slideshow: fix introspection for some Fixes #3742 * fix user added picture slideshow * fix 'genericpath.py:29:isfile:TypeError: coercing to Unicode: need string or buffer, NoneType found' * sound applet: fixed #3735 - mute on middle click * windowManager.js: Fix opacity issues when using fade mapping, and other effects involving opacity changes. * cinnamon-settings keyboard: fix Escape key handling to cancel keybinding teach mode (when numlock is on), and allow backspace to be used as a hotkey when modified. * keybindings: Ignore capslock for teach mode * keybindings: force lower case when comparing existing keybindings for collisions. * Fixed scroll direction in window list applet * layout.js: don't hide/show the panels during the startup animation, make them temporarily transparent instead - this fixes an issue when panel auto-hide is active, the animation will complete, and you'll see a temporary blank area where the panel would be, as the chrome adjusts to the panel. * layout.js: Only alter panel behavior during animation when the panel auto-hide is actually active - it 'looks' better during startup for any non-auto-hidden panel. * appletManager.js: Don't dump orphaned applets into the remaining panel when changing layouts from double to single panel. They are silently ignored. They will show as having an issue in applet settings (red dot) and a looking glass log note, describing how to fix, if desired. * keybindings: Filter out reserved GdkModifierTypes - they can interfere with keybindings on certain systems. * classicSwitcher.js: prevent warning from an errant source id. * app switcher: Fix double-destroy when activating a minimized window. The app switchers listen for the 'map' signal from windows - a mapping signal triggers an _activateWindow, and we also get an activate from actually selecting the window in the first place. * st-im-text.c: Fix capslock in StEntry widgets. * expoThumbnail.js: Fix warning from invalid source id. * overrides.js: Add dump_stack when .disconnecting with an invalid ID. * classicSwitcher.js: Force a re-allocation of the alt-tab container when a thumbnail/preview is removed. * Fixed default avatar image path * menu applet: Don't reset the category when dragging an app. * st-texture-cache.c: Make sure the pixbuf requested ends up with the correct-sized texture (instead of the original texture size) - StIcon's update_shadow_material method was getting a bad size to generate the shadow/blur. * Rename the stock cinnamon menu applet icon so it gets rendered correctly as a symbolic icon. * applet.js: Make sure set_applet_icon_symbolic_name and _path use a good size when scale mode is off. Also reduce the padding of the menu-symbolic.svg icon so its visible size is more in line with other symbolic icons. * menu applet: Fix logic surrounding the default icon. * Fixed the PictureChooserButton in Gtk 3.14, compatible with 3.10. * Cinnamon Settings: Fixed menu picture sizes in PictureChooserButton in Gtk 3.14, compatible with 3.10. -- Clement Lefebvre Mon, 19 Jan 2015 16:42:40 +0100 cinnamon (2.4.5) rebecca; urgency=medium * Fixed startup animation -- Clement Lefebvre Wed, 26 Nov 2014 22:21:25 +0100 cinnamon (2.4.4) rebecca; urgency=medium * Xlets: silently ignore uninstalled items * Theme: Fixed Expo trash-icon not fitting in button * Fixed: settings/backgrounds Gradient and Picture Aspect text not aligned on the left side * Point the onscreen keyboard to the proper gsettings key * Settings/Default: Added a bit more height * Settings/Account Details: Fixed button not showing any icon when user has no "face" picture * Menu applet: Fixed "recent" label making menu too wide * Systray applet: Fixed icons getting resized to 20px.. * Users and Groups admin tool: Don't allow root to modify the password for user whose home dir is encrypted * Menu applet: don't show recent if it's disabled in privacy settings * Fixes applet name in 'About' modal * cinnamon-settings: Fixed spices progress window becoming corrupted after refreshing themes. Allow each xlet page to own its own GtkBuilder for generating the refresh dialog. * Fixed 2d session requirements * Prevent cinnamon crash when an invalid gsettings schema is used. Many thanks and all credit to @lestscape (#3692) * Revert "[window list applet] Fix attention visibility on mouse hover" ~ possible cause of temporary DE freezes -- Clement Lefebvre Sun, 23 Nov 2014 14:55:09 +0100 cinnamon (2.4.3) rebecca; urgency=medium * Small l10n fixes, refreshed desktop files -- Clement Lefebvre Thu, 13 Nov 2014 13:56:14 +0100 cinnamon (2.4.2) rebecca; urgency=medium * photoframe desklet: fix mega leak, don't cache all images, destroy old images. * photoframe desklet: cancel the update timer when removing the desklet. -- Clement Lefebvre Mon, 10 Nov 2014 11:00:28 +0100 cinnamon (2.4.1) rebecca; urgency=medium * Sound Applet: use Math.round instead of .floor on volume values and better mute handling * Sound Applet: play sound "volume" on scroll event of the sliders * Sound Applet: scrollevent on the icon: 0% -> 5% instead of 0% -> 10% * Notifications applet: Don't show empty tray by default * Utils: added a string latinise function Menu Applet: applied this new latinise function to sort the applications * keybindings: change signal name to listen for media key changes. * Cinnamon Settings, extension-core: l10n fix for Highlight and Remove buttons * l10n fixes for Menu Editor * l10n fix in Cinnamon Settings * Cinnamon Settings: Give MDM the same label as present in mdmsetup.desktop * Hide root terminal from terminal selection list as it doesn't work * menu applet: recognize symbolic icon file paths for the applet icon * power applet: make applet label configurable when plugged in, improve logic a bit when deciding what to show. * power applet: prevent device refresh before proxy is acquired (caused by panel height change callback which is called when the applet is loaded, but sometimes before the async acquisition of _proxy is completed.) * Use system proxy settings in cinnamon-settings * Settings, backgrounds: Sort system collections, special-case Linux Mint (composed name) and Retro collections - icons/display_name * Add settings for cinnamon-session timer * re-add deprecated keybinding schema to allow migration script to work -- Clement Lefebvre Sat, 08 Nov 2014 10:13:36 +0100 cinnamon (2.4.0) rebecca; urgency=medium * 2.4.0 -- Clement Lefebvre Fri, 31 Oct 2014 23:21:29 +0100 cinnamon (2.3.0) unstable; urgency=medium * 2.3.0 -- Clement Lefebvre Fri, 27 Jun 2014 14:10:47 +0100 cinnamon (2.2.14) qiana; urgency=medium * 2.2.14 -- Clement Lefebvre Fri, 27 Jun 2014 14:09:34 +0100 cinnamon (2.2.13) qiana; urgency=medium * 2.2.13 -- Clement Lefebvre Sun, 25 May 2014 21:10:17 +0100 cinnamon (2.2.12) qiana; urgency=medium * 2.2.12 -- Clement Lefebvre Sun, 25 May 2014 18:56:09 +0100 cinnamon (2.2.11) qiana; urgency=medium * 2.2.11 -- Clement Lefebvre Sun, 25 May 2014 13:42:18 +0100 cinnamon (2.2.10) qiana; urgency=medium * 2.2.10 -- Clement Lefebvre Tue, 20 May 2014 11:10:11 +0100 cinnamon (2.2.9) qiana; urgency=medium * 2.2.9 -- Clement Lefebvre Mon, 12 May 2014 21:38:29 +0100 cinnamon (2.2.8) qiana; urgency=medium * 2.2.8 -- Clement Lefebvre Sun, 11 May 2014 17:29:45 +0100 cinnamon (2.2.7) qiana; urgency=medium * 2.2.7 -- Clement Lefebvre Sun, 11 May 2014 10:04:02 +0100 cinnamon (2.2.6) qiana; urgency=medium * 2.2.6 -- Clement Lefebvre Sun, 04 May 2014 16:29:59 +0100 cinnamon (2.2.5) qiana; urgency=medium * 2.2.5 -- Clement Lefebvre Sat, 03 May 2014 15:35:05 +0100 cinnamon (2.2.4) qiana; urgency=medium * 2.2.4 -- Clement Lefebvre Thu, 01 May 2014 13:40:45 +0100 cinnamon (2.2.3) qiana; urgency=medium * 2.2.3 -- Clement Lefebvre Mon, 14 Apr 2014 18:07:20 +0100 cinnamon (2.2.2) qiana; urgency=medium * 2.2.2 -- Clement Lefebvre Mon, 14 Apr 2014 14:12:39 +0100 cinnamon (2.2.1) qiana; urgency=medium * 2.2.1 -- Clement Lefebvre Sun, 13 Apr 2014 11:31:47 +0100 cinnamon (2.2.0) qiana; urgency=medium * 2.2.0 -- Clement Lefebvre Sat, 12 Apr 2014 15:28:43 +0100 cinnamon (2.0.14) petra; urgency=low * 2.0.14 -- Clement Lefebvre Mon, 25 Nov 2013 18:41:18 +0000 cinnamon (2.0.13) petra; urgency=low * 2.0.13 -- Clement Lefebvre Sat, 23 Nov 2013 13:32:14 +0000 cinnamon (2.0.12) petra; urgency=low * 2.0.12 -- Clement Lefebvre Mon, 11 Nov 2013 13:33:35 +0000 cinnamon (2.0.11) petra; urgency=low * 2.0.11 -- Clement Lefebvre Thu, 07 Nov 2013 10:18:29 +0000 cinnamon (2.0.10) petra; urgency=low * 2.0.10 -- Clement Lefebvre Sun, 03 Nov 2013 17:53:18 +0000 cinnamon (2.0.9) petra; urgency=low * 2.0.9 -- Clement Lefebvre Sun, 03 Nov 2013 15:51:46 +0000 cinnamon (2.0.8) petra; urgency=low * 2.0.8 -- Clement Lefebvre Thu, 31 Oct 2013 13:30:20 +0000 cinnamon (2.0.7) petra; urgency=low * 2.0.7 -- Clement Lefebvre Tue, 29 Oct 2013 10:42:11 +0000 cinnamon (2.0.6) petra; urgency=low * 2.0.6 -- Clement Lefebvre Fri, 25 Oct 2013 15:29:10 +0100 cinnamon (2.0.5) petra; urgency=low * 2.0.5 -- Clement Lefebvre Thu, 24 Oct 2013 11:14:45 +0100 cinnamon (2.0.4) petra; urgency=low * 2.0.4 -- Clement Lefebvre Tue, 22 Oct 2013 14:37:13 +0100 cinnamon (2.0.3) petra; urgency=low * 2.0.3 -- Clement Lefebvre Fri, 18 Oct 2013 16:04:36 +0100 cinnamon (2.0.2) petra; urgency=low * 2.0.2 -- Clement Lefebvre Wed, 09 Oct 2013 15:05:24 +0100 cinnamon (2.0.1) petra; urgency=low * 2.0.1 -- Clement Lefebvre Wed, 09 Oct 2013 13:52:55 +0100 cinnamon (2.0.0) petra; urgency=low * 2.0.0 -- Clement Lefebvre Wed, 09 Oct 2013 10:47:58 +0100 cinnamon (1.9.2) petra; urgency=low * 1.9.2 -- Clement Lefebvre Mon, 30 Sep 2013 13:26:09 +0100 cinnamon (1.9.1) olivia; urgency=low * 1.9.1 -- Clement Lefebvre Sat, 01 Jun 2013 22:16:16 +0100 cinnamon (1.8.7) olivia; urgency=low * 1.8.7 -- Clement Lefebvre Sat, 01 Jun 2013 14:57:52 +0100 cinnamon (1.8.6) olivia; urgency=low * 1.8.6 -- Clement Lefebvre Thu, 23 May 2013 16:28:18 +0100 cinnamon (1.8.5) olivia; urgency=low * 1.8.5 -- Clement Lefebvre Wed, 22 May 2013 17:34:29 +0100 cinnamon (1.8.4) olivia; urgency=low * 1.8.4 -- Clement Lefebvre Wed, 22 May 2013 16:15:07 +0100 cinnamon (1.8.3) olivia; urgency=low * 1.8.3 -- Clement Lefebvre Sun, 19 May 2013 21:00:31 +0100 cinnamon (1.8.2) olivia; urgency=low * 1.8.2 -- Clement Lefebvre Tue, 07 May 2013 14:30:31 +0100 cinnamon (1.8.1) olivia; urgency=low * 1.8.1 -- Clement Lefebvre Tue, 07 May 2013 00:09:09 +0100 cinnamon (1.8.0) olivia; urgency=low * 1.8.0 -- Clement Lefebvre Sun, 05 May 2013 17:40:50 +0100 cinnamon (1.7.10) olivia; urgency=low * 1.7.10 -- Clement Lefebvre Fri, 03 May 2013 21:06:16 +0100 cinnamon (1.7.9) olivia; urgency=low * 1.7.9 -- Clement Lefebvre Fri, 03 May 2013 17:53:50 +0100 cinnamon (1.7.8) olivia; urgency=low * 1.7.8 -- Clement Lefebvre Tue, 30 Apr 2013 17:01:30 +0100 cinnamon (1.7.7) olivia; urgency=low * 1.7.7 -- Clement Lefebvre Sun, 28 Apr 2013 11:40:38 +0100 cinnamon (1.7.6) olivia; urgency=low * 1.7.6 -- Clement Lefebvre Sat, 27 Apr 2013 19:56:06 +0100 cinnamon (1.7.5) olivia; urgency=low * 1.7.5 -- Clement Lefebvre Sat, 27 Apr 2013 19:54:05 +0100 cinnamon (1.7.4) olivia; urgency=low * 1.7.4 -- Clement Lefebvre Mon, 15 Apr 2013 14:54:44 +0100 cinnamon (1.7.3) olivia; urgency=low * 1.7.3 -- Clement Lefebvre Fri, 22 Mar 2013 14:05:06 +0000 cinnamon (1.7.2) olivia; urgency=low * 1.7.2 -- Clement Lefebvre Tue, 05 Mar 2013 10:40:53 +0000 cinnamon (1.7.1) olivia; urgency=low * 1.7.1 -- Clement Lefebvre Thu, 21 Feb 2013 16:21:59 +0000 cinnamon (1.6.7) nadia; urgency=low * 1.6.7 -- Clement Lefebvre Wed, 14 Nov 2012 14:44:36 +0000 cinnamon (1.6.6) nadia; urgency=low * 1.6.6 -- Clement Lefebvre Tue, 06 Nov 2012 18:08:46 +0000 cinnamon (1.6.5) nadia; urgency=low * 1.6.5 -- Clement Lefebvre Mon, 05 Nov 2012 18:50:04 +0000 cinnamon (1.6.4) nadia; urgency=low * 1.6.4 -- Clement Lefebvre Wed, 24 Oct 2012 16:45:19 +0100 cinnamon (1.6.3) nadia; urgency=low * 1.6.3 -- Clement Lefebvre Sat, 20 Oct 2012 21:24:02 +0100 cinnamon (1.6.2) nadia; urgency=low * 1.6.2 -- Clement Lefebvre Thu, 18 Oct 2012 14:44:40 +0100 cinnamon (1.6.1) maya; urgency=low * 1.6.1 -- Clement Lefebvre Thu, 27 Sep 2012 14:32:57 +0100 cinnamon (1.6.0) maya; urgency=low * 1.6.0 -- Clement Lefebvre Mon, 17 Sep 2012 16:42:54 +0100 cinnamon (1.5.8) maya; urgency=low * 1.5.8 -- Clement Lefebvre Sun, 09 Sep 2012 13:36:26 +0100 cinnamon (1.5.7) maya; urgency=low * 1.5.7 -- Clement Lefebvre Wed, 05 Sep 2012 18:18:09 +0100 cinnamon (1.5.6) maya; urgency=low * 1.5.6 -- Clement Lefebvre Wed, 05 Sep 2012 16:25:33 +0100 cinnamon (1.5.5) maya; urgency=low * 1.5.5 -- Clement Lefebvre Wed, 05 Sep 2012 16:22:08 +0100 cinnamon (1.5.4) maya; urgency=low * 1.5.4 -- Clement Lefebvre Wed, 05 Sep 2012 12:31:55 +0100 cinnamon (1.5.3) maya; urgency=low * 1.5.3 -- Clement Lefebvre Wed, 29 Aug 2012 11:36:31 +0100 cinnamon (1.5.2) maya; urgency=low * 1.5.2 -- Clement Lefebvre Thu, 26 Jul 2012 23:27:00 +0100 cinnamon (1.5.1) maya; urgency=low * 1.5.1 -- Clement Lefebvre Thu, 26 Jul 2012 13:07:36 +0100 cinnamon (1.5.0) maya; urgency=low * 1.5.0 -- Clement Lefebvre Tue, 24 Jul 2012 15:52:06 +0100 cinnamon (1.4-UP3) maya; urgency=low * 1.4 UP3 -- Clement Lefebvre Sun, 20 May 2012 11:05:35 +0100 cinnamon (1.4-UP2) maya; urgency=low * 1.4 UP2 -- Clement Lefebvre Fri, 18 May 2012 18:35:28 +0100 cinnamon (1.4-UP1) maya; urgency=low * 1.4 UP1 -- Clement Lefebvre Sun, 13 May 2012 23:43:22 +0100 cinnamon (1.4.0) lisa; urgency=low * New Cinnamon release -- Clement Lefebvre Tue, 13 Mar 2012 16:11:41 +0000 cinnamon (1.3.1) lisa; urgency=low * New Cinnamon release -- Clement Lefebvre Mon, 20 Feb 2012 10:14:59 +0000 cinnamon (1.3.0) lisa; urgency=low * New Cinnamon release -- Clement Lefebvre Fri, 17 Feb 2012 14:55:12 +0000 cinnamon (1.2.0) lisa; urgency=low * New Cinnamon release -- Clement Lefebvre Mon, 23 Jan 2012 14:10:38 +0000 cinnamon (1.1.3) lisa; urgency=low * Menu improvements: The search entry isn't cleared anymore when the menu is closed * Menu improvements: Clearing the search entry now resets the search results * Menu improvements: Context menu for applications and favorites to "Add to panel", "Add to desktop", "Add/Remove to/from favorites" * Panel Launchers improvements: Custom launchers don't appear in the menu anymore and are store separately * Panel Launchers improvements: Application launchers can be added by right-clicking on apps in the menu and selecting "Add to panel" * Panel Launchers improvements: The Panel Launchers applet refreshes automatically when launchers are added/removed * Visual improvements: The space between panel applets was reduced to 4px * Visual improvements: Improved menu look & feel (less margins, system buttons merged with favorites..etc) * Visual improvements: Reduced overall font size to 9.5pt (we're targeting PC users not mobile phones) * Visual improvements: Windows in overview now feature icons for easier recognition * Visual improvements: The notifications were moved a bit in order not to appear on top of window buttons when a window is maximized * Visual improvements: Thumbnails from theme.json files in Gnome Shell themes are now used * Visual improvements: Improved dialog for adding custom launchers * Visual improvements: Panel Launchers now have tooltips * Network Manager Applet improvements: Switching Ethernet off now actually disconnects the device * Network Manager Applet improvements: Switching Wireless off now actually disconnects the device * Bug fixes: Critical: Cinnamon doesn't crash anymore when a theme was unreadable due to permission problems * Bug fixes: Themes: Themes in ~/.themes are now detected * Bug fixes: Panel: New default size for status icons (fixes issue with Gnome Shell themes where an icon could get too big) * Bug fixes: Window List: A bug which prevented LibreOffice applications from showing an icon was fixed * Bug fixes: Dual Monitors: Fixed a bug which prevented the mouse pointer from moving from the primary monitor to the secondary monitor * New configuration options: The menu text ("Menu") is now configurable via gsettings (at "org.cinnamon menu-text") * New configuration options: The panel can now auto-hide (this is turned OFF by default and available via gsettings at "org.cinnamon panel-autohide") * New configuration options: The Overview Hot Corner can be disabled (it is enabled by default and this is available via gsettings at "org.cinnamon overview-corner-hover") * New configuration options: The Overview Icon can be disabled (it is enabled by default and this is available via gsettings at "org.cinnamon overview-corner-visible") -- Clement Lefebvre Sun, 01 Jan 2012 21:52:36 +0000 cinnamon (1.1.2) lisa; urgency=low * Feature: New Panel Launchers applet (alpha, adding apps launchers is done via gsettings) * Feature: New Themes selection tab in overview (stable) * Performance: Telepathy client and Calendar server are not run/used anymore * Performance: Minimizing and restoring windows is much faster. This is especially visible when using the "showDesktop" applet * Visual: Removed search entry from overview * Visual: Easier to read calendar applet * Visual: Fixed blurry tooltips in windowlist * Critical: Fixed memory leak (which made Cinnamon use a lot of memory and the whole system eventually becoming really slow) * Critical: Fixed important packaging bug preventing sound applet to work after a media player was launched (affected users and distributions using the .deb packages) * Critical: Added missing files in data's and js' Makefile.am (for users and distributions not using the .deb packages) * Critical: Fixed frozen menu when applications or favorites changed -- Clement Lefebvre Fri, 23 Dec 2011 12:23:36 +0000 cinnamon (1.1.1) lisa; urgency=low * Fix: Added missing panelLaunchers.js -- Clement Lefebvre Wed, 21 Dec 2011 18:29:29 +0000 cinnamon (1.1.0) lisa; urgency=low * Fixed run dialog * Fixed sound devices disappearing in sound applet * Fixed amarok support in sound applet * Hide sound applet when media player is launched * Alt tab is now window-centric * Alt tab uses window titles * Added Ctrl+Alt+Up/Down keybindings to show overview screen * Added panel launchers applet (with terminal so far and no configuration so far..) * Many small visual improvements made to default theme -- Clement Lefebvre Wed, 21 Dec 2011 17:43:55 +0000 cinnamon (1.0.0) lisa; urgency=low * Initial version (based on gnome-shell 3.2.1) -- Clement Lefebvre Tue, 20 Dec 2011 14:10:34 +0000 cinnamon-4.4.8/debian/cinnamon-common.install000066400000000000000000000002561360505115200212340ustar00rootroot00000000000000etc/xdg/menus/cinnamon* usr/share/cinnamon-session usr/share/cinnamon usr/share/desktop-directories usr/share/glib-2.0 usr/share/icons usr/share/polkit-1 usr/share/xsessions cinnamon-4.4.8/debian/cinnamon-doc.dirs000066400000000000000000000000301360505115200177720ustar00rootroot00000000000000/usr/share/doc/cinnamon cinnamon-4.4.8/debian/cinnamon-doc.install000066400000000000000000000000221360505115200205000ustar00rootroot00000000000000usr/share/gtk-doc cinnamon-4.4.8/debian/cinnamon-doc.links000066400000000000000000000005041360505115200201570ustar00rootroot00000000000000/usr/share/gtk-doc/html/cinnamon-js/ /usr/share/doc/cinnamon/cinnamon-js /usr/share/gtk-doc/html/cinnamon-st/ /usr/share/doc/cinnamon/cinnamon-st /usr/share/gtk-doc/html/cinnamon-tutorials/ /usr/share/doc/cinnamon/cinnamon-tutorials /usr/share/gtk-doc/html/cinnamon/ /usr/share/doc/cinnamon/cinnamon cinnamon-4.4.8/debian/cinnamon.gsettings-override000066400000000000000000000002471360505115200221240ustar00rootroot00000000000000[org.cinnamon] favorite-apps=[ 'firefox.desktop', 'mintinstall.desktop', 'cinnamon-settings.desktop', 'xchat.desktop', 'org.gnome.Terminal.desktop', 'nemo.desktop' ] cinnamon-4.4.8/debian/cinnamon.install000066400000000000000000000001061360505115200177400ustar00rootroot00000000000000usr/bin usr/lib usr/share/applications usr/share/dbus-1 usr/share/man cinnamon-4.4.8/debian/compat000066400000000000000000000000031360505115200157500ustar00rootroot0000000000000010 cinnamon-4.4.8/debian/control000066400000000000000000000100241360505115200161510ustar00rootroot00000000000000Source: cinnamon Section: x11 Priority: optional Maintainer: Linux Mint Build-Depends: autoconf-archive, automake, debhelper (>= 10), dh-python, dpkg-dev (>= 1.16.1~), gir1.2-json-1.0, gir1.2-meta-muffin-0.0 (>= 3.8), gnome-pkg-tools (>= 0.11), gobject-introspection (>= 1.29.15), gtk-doc-tools, intltool, libcinnamon-desktop-dev (>= 3.8), libcinnamon-menu-3-dev, libcjs-dev (>= 3.8), libcroco3-dev (>= 0.6.2), libdbus-glib-1-dev, libgirepository1.0-dev (>= 1.29.15), libgl1-mesa-dev, libglib2.0-dev (>= 2.25.11), libgstreamer1.0-dev, libgtk-3-dev (>= 3.9.12), libgudev-1.0-dev, libjson-glib-dev (>= 0.13.2), libmuffin0 (>= 3.8), libnm-dev (>= 1.6) [linux-any], libnma-dev [linux-any], libpolkit-agent-1-dev (>= 0.100), libpulse-dev, librsvg2-dev, libsoup2.4-dev, libstartup-notification0-dev (>= 0.11), libwnck-dev, libxfixes-dev (>= 1:5.0), libxss-dev, python3:any, Standards-Version: 3.9.5 Homepage: http://cinnamon.linuxmint.com Package: cinnamon Architecture: any Pre-Depends: ${misc:Pre-Depends} Depends: cinnamon-common, cinnamon-control-center, cinnamon-desktop-data, cinnamon-l10n, cinnamon-screensaver, cinnamon-session, cinnamon-settings-daemon, cjs (>= 3.8), cups-pk-helper, gir1.2-accountsservice-1.0, gir1.2-caribou-1.0, gir1.2-cinnamondesktop-3.0, gir1.2-cmenu-3.0, gir1.2-cvc-1.0, gir1.2-gkbd-3.0, gir1.2-gtkclutter-1.0, gir1.2-keybinder-3.0, gir1.2-meta-muffin-0.0, gir1.2-nm-1.0 [linux-any] | gir1.2-networkmanager-1.0 [linux-any], gir1.2-nma-1.0 [linux-any], gir1.2-notify-0.7, gir1.2-polkit-1.0, gir1.2-soup-2.4, gir1.2-upowerglib-1.0, gir1.2-xapp-1.0 (>= 1.0.4~), gkbd-capplet, gnome-icon-theme-symbolic (>= 2.91), gsettings-desktop-schemas (>= 0.1.7), iso-flag-png, libcanberra-pulse, libcinnamon-desktop4, libcinnamon-menu-3-0, libcjs0f (>= 3.8), libglib2.0-bin, libmuffin0, mate-panel | gnome-panel | tint2, mesa-utils, metacity, nemo, network-manager-gnome [linux-any], policykit-1-gnome, python3, python3-dbus, python3-gi, python3-gi-cairo, python3-pam | python3-pampy, python3-pexpect, python3-pil, python3-pyinotify, python3-setproctitle, python3-tinycss, python3-tz, streamer, wget, xapps-common, ${gir:Depends}, ${icon-theme:Depends}, ${misc:Depends}, ${python3:Depends}, ${shlibs:Depends}, Recommends: gnome-terminal | x-terminal-emulator, gnome-themes-extra | gnome-themes-standard, Suggests: cinnamon-doc Provides: notification-daemon, x-window-manager Description: Modern Linux desktop Cinnamon is a modern Linux desktop which provides advanced innovative features and a traditional user experience. It's easy to use, powerful and flexible. Package: cinnamon-common Architecture: all Depends: gettext, gir1.2-cinnamondesktop-3.0, gir1.2-meta-muffin-0.0, gvfs-bin, gir1.2-timezonemap-1.0, xdg-utils, python3-xapp, ${misc:Depends}, ${python3:Depends}, Description: Cinnamon desktop (Common data files) Cinnamon is a modern Linux desktop which provides advanced innovative features and a traditional user experience. It's easy to use, powerful and flexible. . This package contains the architecture independent files needed by Cinnamon Package: cinnamon-dbg Section: debug Priority: extra Architecture: any Depends: cinnamon (= ${binary:Version}), cinnamon-control-center-dbg, libcinnamon-desktop-dbg, libcinnamon-menu-3-0-dbg, libcjs-dbg, libcvc-dbg, muffin-dbg, nemo-dbg, ${misc:Depends}, Description: Debugging symbols for the Cinnamon desktop Cinnamon is a modern Linux desktop which provides advanced innovative features and a traditional user experience. It's easy to use, powerful and flexible. . This package contains the debugging symbols. Package: cinnamon-doc Section: doc Architecture: all Multi-Arch: foreign Depends: devhelp, ${misc:Depends} Description: Cinnamon documentation Cinnamon is a modern Linux desktop which provides advanced innovative features and a traditional user experience. It's easy to use, powerful and flexible. . This package contains the code documentation for various Cinnamon components. cinnamon-4.4.8/debian/copyright000066400000000000000000000024121360505115200165030ustar00rootroot00000000000000This package is based on the Debian packaging of gnome-shell: The Debian gnome-shell package was debianized by Sebastien Bacher on Wed, 01 Jul 2009 23:29:31 +0200. Upstream Authors: Colin Walters Dan Winship Marina Zhurakhinskaya Owen Taylor William Jon McCann Files: src/* js/* Copyright: © 2000 Helix Code, Inc. © 2000,2001 Eazel, Inc. © 2001 George Lebl © 2002 Sun Microsystems Inc. © 2004-2005 James M. Cape © 2006-2008 Red Hat, Inc. © 2007 Ryan Lortie © 2008 Intel Corp. License: GPL-2+ (/usr/share/common-licenses/GPL-2) Files: src/tray/* Copyright: © 2002 Anders Carlsson © 2003-2006 Vincent Untz © 2008 Red Hat, Inc. Files: src/st/* Copyright: © 2008 OpenedHand © 2009 Intel Corporation. © 2003-2004 Dodji Seketeli License: LGPL-2.1 (/usr/share/common-licenses/LGPL-2.1) The Debian packaging is: Copyright © 2009 Sebastien Bacher Copyright © 2009 Collabora Ltd. and is licensed under the GPL version 3, see `/usr/share/common-licenses/GPL-3'. cinnamon-4.4.8/debian/icon.svg000066400000000000000000000252331360505115200162270ustar00rootroot00000000000000 image/svg+xml cinnamon-4.4.8/debian/not-installed000066400000000000000000000002711360505115200172510ustar00rootroot00000000000000# moved to /usr/share usr/lib/cinnamon-* # libtool not installed usr/lib/*/cinnamon/libcinnamon-js.la usr/lib/*/cinnamon/libcinnamon.la # manpages are compressed usr/share/man/man1/*.1 cinnamon-4.4.8/debian/rules000077500000000000000000000027621360505115200156400ustar00rootroot00000000000000#!/usr/bin/make -f # -*- makefile -*- # Uncomment this to turn on verbose mode. #export DH_VERBOSE=1 # Force UTF8 to workaround doc build error export LC_ALL=C.UTF-8 export DEB_LDFLAGS_MAINT_APPEND=-Wl,--as-needed export DEB_BUILD_MAINT_OPTIONS = hardening=+all DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH) # To avoid running configure twice (because gnome-autogen.sh) export NOCONFIGURE=yes # This will set current version string VERSION := $(shell dpkg-parsechangelog | sed -n 's/Version: //p') # This will set major version string (strip substring '.' after 'maemo') CINNAMON_VERSION := $(shell echo $(VERSION) | sed 's/\(.*.*\)\..*/\1.0/') DH_GENCONTROL_ARGS = -Vcinnamon:Version=$(CINNAMON_VERSION) %: dh $@ --with python3,gir override_dh_autoreconf: dh_autoreconf --as-needed ./autogen.sh override_dh_auto_configure: dh_auto_configure -- \ --enable-compile-warnings=yes \ --enable-gtk-doc \ override_dh_auto_test: # Disable checks since they are not functional for the moment : override_dh_install-indep: dh_install --list-missing override_dh_install-arch: dh_install -X.la --list-missing override_dh_strip: dh_strip --dbg-package=cinnamon-dbg override_dh_makeshlibs: dh_makeshlibs -pcinnamon -Xlibcinnamon.so dh_makeshlibs --remaining-packages override_dh_girepository: dh_girepository -l src -p/usr/lib/$(DEB_HOST_MULTIARCH)/muffin /usr/lib/$(DEB_HOST_MULTIARCH)/cinnamon override_dh_gencontrol: dh_gencontrol -- $(DH_GENCONTROL_ARGS) cinnamon-4.4.8/debian/source/000077500000000000000000000000001360505115200160515ustar00rootroot00000000000000cinnamon-4.4.8/debian/source/format000066400000000000000000000000151360505115200172600ustar00rootroot000000000000003.0 (native) cinnamon-4.4.8/debian/source/lintian-overrides000066400000000000000000000002131360505115200214260ustar00rootroot00000000000000# https://github.com/linuxmint/Cinnamon/pull/1750 cinnamon source: source-is-missing files/usr/lib/cinnamon-settings/data/spices/jquery.js cinnamon-4.4.8/docs/000077500000000000000000000000001360505115200142575ustar00rootroot00000000000000cinnamon-4.4.8/docs/Makefile.am000066400000000000000000000000241360505115200163070ustar00rootroot00000000000000SUBDIRS = reference cinnamon-4.4.8/docs/applets-examples/000077500000000000000000000000001360505115200175435ustar00rootroot00000000000000cinnamon-4.4.8/docs/applets-examples/finder@cinnamon.org/000077500000000000000000000000001360505115200234235ustar00rootroot00000000000000cinnamon-4.4.8/docs/applets-examples/finder@cinnamon.org/applet.js000066400000000000000000000403511360505115200252510ustar00rootroot00000000000000const 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("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_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.addHotKey("finder_launch", this.launch_shortcut, Lang.bind(this, this.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-4.4.8/docs/applets-examples/finder@cinnamon.org/metadata.json000077500000000000000000000002351360505115200261010ustar00rootroot00000000000000{ "uuid": "finder@cinnamon.org", "name": "Search using search providers", "description": "Search using search providers", "icon": "edit-find-symbolic" } cinnamon-4.4.8/docs/applets-examples/finder@cinnamon.org/settings-schema.json000066400000000000000000000002261360505115200274140ustar00rootroot00000000000000{ "launch_shortcut": { "type" : "keybinding", "default" : "F1", "description" : "Keyboard shortcut to show the search entry" } } cinnamon-4.4.8/docs/reference/000077500000000000000000000000001360505115200162155ustar00rootroot00000000000000cinnamon-4.4.8/docs/reference/Makefile.am000066400000000000000000000000651360505115200202520ustar00rootroot00000000000000SUBDIRS = cinnamon cinnamon-js cinnamon-tutorials st cinnamon-4.4.8/docs/reference/cinnamon-js/000077500000000000000000000000001360505115200204315ustar00rootroot00000000000000cinnamon-4.4.8/docs/reference/cinnamon-js/Makefile.am000066400000000000000000000072611360505115200224730ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in # Generate the sgml using the python script. this is a dependency # of scan-build.stamp in gtk-doc.make via HFILE_GLOBS gen-doc.stamp: $(top_srcdir)/js/*/* gen_lib.py gen_doc.py ./gen_doc.py $(top_srcdir) $(PACKAGE_VERSION) touch gen-doc.stamp #for gtk-doc older than 1.27 $(DOC_MAIN_SGML_FILE): gen-doc.stamp # We require automake 1.6 at least. AUTOMAKE_OPTIONS = 1.6 # This is a blank Makefile.am for using gtk-doc. # Copy this to your project's API docs directory and modify the variables to # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples # of using the various options. # The name of the module, e.g. 'glib'. DOC_MODULE=cinnamon-js # Uncomment for versioned docs and specify the version of the module, e.g. '2'. #DOC_MODULE_VERSION=2 # The top-level SGML file. You can change this if you want to. DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml # Directories containing the source code # gtk-doc will search all .c and .h files beneath these paths # for inline comments documenting functions and macros. DOC_SOURCE_DIR= # Extra options to pass to gtkdoc-scangobj. Not normally needed. SCANGOBJ_OPTIONS= # Extra options to supply to gtkdoc-scan. # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" SCAN_OPTIONS=--rebuild-types # Extra options to supply to gtkdoc-mkdb. # e.g. MKDB_OPTIONS=--xml-mode --output-format=xml MKDB_OPTIONS=--xml-mode --output-format=xml # Extra options to supply to gtkdoc-mktmpl # e.g. MKTMPL_OPTIONS=--only-section-tmpl MKTMPL_OPTIONS= # Extra options to supply to gtkdoc-mkhtml MKHTML_OPTIONS= # Extra options to supply to gtkdoc-fixref. Not normally needed. # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS=--src-lang=js # Used for dependencies. The docs will be rebuilt if any of these change. # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c HFILE_GLOB=gen-doc.stamp CFILE_GLOB= # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h EXTRA_HFILES= # Header files or dirs to ignore when scanning. Use base file/dir names # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code IGNORE_HFILES= # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png HTML_IMAGES= # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # These files must be listed here *and* in content_files # e.g. expand_content_files=running.sgml expand_content_files= # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # Only needed if you are using gtkdoc-scangobj to dynamically query widget # signals and properties. # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) GTKDOC_CFLAGS= GTKDOC_LIBS= # This includes the standard gtk-doc make rules, copied by gtkdocize. include $(top_srcdir)/gtk-doc.make # Add our custom stamp to the gtk-doc.make stamps list so it'll get # cleaned DOC_STAMPS += gen-doc.stamp # Other files to distribute # e.g. EXTRA_DIST += version.xml.in EXTRA_DIST += # Files not to distribute # for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types # for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt DISTCLEANFILES = $(DOC_MODULES).types # Comment this out if you want 'make check' to test you doc status # and run some sanity checks if ENABLE_GTK_DOC TESTS_ENVIRONMENT = cd $(srcdir) && \ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) #TESTS = $(GTKDOC_CHECK) endif -include $(top_srcdir)/git.mk cinnamon-4.4.8/docs/reference/cinnamon-js/gen_doc.py000077500000000000000000000257661360505115200224240ustar00rootroot00000000000000#!/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 xml.etree.ElementTree as ET 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] 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" TYPE_REGEX = r'\w*\.?\w+/?\w*\.?\w*' COMMENT_REGEX = re.compile(r'/\*([^*]|(\*[^/]))*\*+/') RETURNS_REGEX = re.compile(r'^Returns\s*\(?(' + TYPE_REGEX + ')?\)?:(.*)') INHERITS_REGEX = re.compile(r'^Inherits:\s*(' + TYPE_REGEX + ')\s*$') PROPERTY_REGEX = re.compile(r'^@(\w+)\s*\(?(' + TYPE_REGEX + ')?\)?:(.*)') 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 esacped. 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_sgml(files, sys.argv[2] if len(sys.argv) > 2 else "") 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-4.4.8/docs/reference/cinnamon-js/gen_lib.py000077500000000000000000000641011360505115200224070ustar00rootroot00000000000000#!/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('@(\w*)', '\g<1>', line) line = re.sub('`([^`]*)`', '\g<1>', line) line = re.sub('\*\*([^*]*)\*\*', '\g<1>', line) line = re.sub('\*([^*]*)\*', '\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('#(([\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('%(([\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 SGML_FORMAT = '''\ ]> Cinnamon Javascript Reference Manual This document is for Cinnamon {version}. The latest version of this documentation can be found online at http://developer.linuxmint.com/reference/git/cinnamon-js/. {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_sgml(files, version): sgml = open('cinnamon-js-docs.sgml', 'w') chapters = [] 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.append(SGML_CHAPTER_FORMAT.format( prefix = _file.prefix, title = _file.imports, entries = "\n".join(entries))) sgml.write(SGML_FORMAT.format( version = version, chapters = "\n".join(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-4.4.8/docs/reference/cinnamon-tutorials/000077500000000000000000000000001360505115200220435ustar00rootroot00000000000000cinnamon-4.4.8/docs/reference/cinnamon-tutorials/Makefile.am000066400000000000000000000075511360505115200241070ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in # We require automake 1.6 at least. AUTOMAKE_OPTIONS = 1.6 # This is a blank Makefile.am for using gtk-doc. # Copy this to your project's API docs directory and modify the variables to # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples # of using the various options. # The name of the module, e.g. 'glib'. DOC_MODULE=cinnamon-tutorials # Uncomment for versioned docs and specify the version of the module, e.g. '2'. #DOC_MODULE_VERSION=2 # The top-level SGML file. You can change this if you want to. DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml # Directories containing the source code # gtk-doc will search all .c and .h files beneath these paths # for inline comments documenting functions and macros. DOC_SOURCE_DIR= # Extra options to pass to gtkdoc-scangobj. Not normally needed. SCANGOBJ_OPTIONS= # Extra options to supply to gtkdoc-scan. # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" SCAN_OPTIONS=--rebuild-types # Extra options to supply to gtkdoc-mkdb. # e.g. MKDB_OPTIONS=--xml-mode --output-format=xml MKDB_OPTIONS=--xml-mode --output-format=xml # Extra options to supply to gtkdoc-mktmpl # e.g. MKTMPL_OPTIONS=--only-section-tmpl MKTMPL_OPTIONS= # Extra options to supply to gtkdoc-mkhtml MKHTML_OPTIONS= # Extra options to supply to gtkdoc-fixref. Not normally needed. # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS=--src-lang=js # Used for dependencies. The docs will be rebuilt if any of these change. # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c HFILE_GLOB= CFILE_GLOB= # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h EXTRA_HFILES= # Header files or dirs to ignore when scanning. Use base file/dir names # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code IGNORE_HFILES= # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png HTML_IMAGES=settings.png # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml 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 \ $(NULL) # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # These files must be listed here *and* in content_files # e.g. expand_content_files=running.sgml expand_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 \ $(NULL) # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # Only needed if you are using gtkdoc-scangobj to dynamically query widget # signals and properties. # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) GTKDOC_CFLAGS= GTKDOC_LIBS= # This includes the standard gtk-doc make rules, copied by gtkdocize. include $(top_srcdir)/gtk-doc.make # Other files to distribute # e.g. EXTRA_DIST += version.xml.in EXTRA_DIST += # Files not to distribute # for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types # for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt DISTCLEANFILES = $(DOC_MODULES).types # Comment this out if you want 'make check' to test you doc status # and run some sanity checks if ENABLE_GTK_DOC TESTS_ENVIRONMENT = cd $(srcdir) && \ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) #TESTS = $(GTKDOC_CHECK) endif -include $(top_srcdir)/git.mk cinnamon-4.4.8/docs/reference/cinnamon-tutorials/building.xml000066400000000000000000000073711360505115200243720ustar00rootroot00000000000000 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-4.4.8/docs/reference/cinnamon-tutorials/cinnamon-tutorials-docs.sgml.in000066400000000000000000000024231360505115200301110ustar00rootroot00000000000000 ]> Cinnamon Tutorials This document is for Cinnamon @VERSION@. The latest version of this documentation can be found online at http://developer.linuxmint.com/reference/git/cinnamon-tutorials/. Documentation Cjs Extension system cinnamon-4.4.8/docs/reference/cinnamon-tutorials/documenting-source.xml000066400000000000000000000222031360505115200263760ustar00rootroot00000000000000 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 itmes, @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-4.4.8/docs/reference/cinnamon-tutorials/documenting-tutorial.xml000066400000000000000000000212031360505115200267400ustar00rootroot00000000000000 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 whitepsace 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-4.4.8/docs/reference/cinnamon-tutorials/importer.xml000066400000000000000000000167761360505115200244470ustar00rootroot00000000000000 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-4.4.8/docs/reference/cinnamon-tutorials/settings.png000066400000000000000000000403171360505115200244160ustar00rootroot00000000000000PNG  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-4.4.8/docs/reference/cinnamon-tutorials/using-documentation.xml000066400000000000000000000272161360505115200265710ustar00rootroot00000000000000 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 referencial 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-4.4.8/docs/reference/cinnamon-tutorials/write-applet.xml000066400000000000000000000317361360505115200252140ustar00rootroot00000000000000 ]> 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 Force Quit applet. For those who are unfamiliar with “force-quitting”: When a window becomes unresponsive and doesn’t want to close, the most efficient way to force it to close is to kill its process. You could use the “ps” command to find its process ID and kill it with the “kill” command. Or alternatively you could run the “xkill” command, and simply click on the window you want to kill. And that’s exactly what our “Force Quit” applet is going to do... after you click on it, your mouse cursor will change into a window killer, which you’ll target at the window you want to get rid of :) Creating the basic structure of the applet An applet has to be given a unique ID (uuid). In this tutorial we will name it "force-quit@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 there and let’s create the files and folders necessary for any Cinnamon applet. cd mkdir -p .local/share/cinnamon/applets/force-quit@cinnamon.org cd .local/share/cinnamon/applets/force-quit@cinnamon.org touch metadata.json touch applet.js 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": "force-quit@cinnamon.org", "name": "Force Quit", "description": "Click on the applet to launch xkill and force any window to quit immediately", "icon": "force-exit" } 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 force-quit 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": "force-quit@cinnamon.org", "name": "Force Quit", "description": "Click on the applet to launch xkill and force any window to quit immediately", "icon": "force-exit", "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; function MyApplet(orientation, panel_height, instance_id) { this._init(orientation, panel_height, instance_id); } MyApplet.prototype = { __proto__: Applet.IconApplet.prototype, _init: function(orientation, panel_height, instance_id) { Applet.IconApplet.prototype._init.call(this, orientation, panel_height, instance_id); this.set_applet_icon_name("force-exit"); this.set_applet_tooltip(_("Click here to kill a window")); }, on_applet_clicked: function() { Util.spawn(['xkill']); } }; function main(metadata, orientation, panel_height, instance_id) { return new MyApplet(orientation, panel_height, 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 MyApplet(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 MyApplet 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. 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 two lines: const Applet = imports.ui.applet; const Util = imports.misc.util; 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 (xkill). 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. Not very interesting. Next! function MyApplet(orientation, panel_height, instance_id) { this._init(orientation, panel_height, instance_id); } This is the standard constructor of a Javascript Object. When someone calls it, it calls the _init function of the object, and does stuff. Note that here we called our applet MyApplet. You are free to call it whatever you want (and change the main function accordingly, of course), but there really is no reason to do so!. Also note that we pass all the orientation etc. information down the chain until it ultimately reaches the applet API. What we've gone through is mostly boilerplate. Now we get to the meat of the code: MyApplet.prototype = { __proto__: Applet.IconApplet.prototype, _init: function(orientation, panel_height, instance_id) { Applet.IconApplet.prototype._init.call(this, orientation, panel_height, instance_id); this.set_applet_icon_name("force-exit"); this.set_applet_tooltip(_("Click here to kill a window")); }, on_applet_clicked: function() { Util.spawn(['xkill']); } }; Roughly speaking, the prototype is the list of all functions of the object. Here we have the _init function and the on_applet_clicked function, which is all we need. 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 using the __proto__: Applet.IconApplet.prototype, line. This copies all the functions found in Applet.IconApplet to our applet, which we are going to use. Next, in our _init function, we call the _init function of Applet.IconApplet. Here we pass on all the information about orientation etc. to this _init function, and this function will help us sort out all the mess required to make the applet display properly. 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_name("force-exit"); Note that set_applet_icon_name is a function defined inside Applet.IconApplet, which makes the applet display the corresponding icon. By using the applet API, we have saved ourselves from the hassle of creating icons and putting them in the right place. (force-exit is the name of an icon from the user's icon set. The icons available for use can be found in /usr/share/icons/) The next line is this.set_applet_tooltip(_("Click here to kill a window")); which says that the applet should have a tooltip called _("Click here to kill a window"). By wrapping the string with the _( ) function, we are telling Cinnamon to translate the string to the correct language, if translations are available. That is all the code in our _init function. Now we have to wait for the user to click on the applet. The applet API automatically helps you to listen to these events, and when the user presses the applet, the API will call the on_applet_clicked of your applet. Here we have on_applet_clicked: function() { Util.spawn(['xkill']); } which calls the spawn function from Util, and launches an external command, xkill. cinnamon-4.4.8/docs/reference/cinnamon-tutorials/xlet-settings-ref.xml000066400000000000000000000674611360505115200261670ustar00rootroot00000000000000 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: '2000'} 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: "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", "sections" : ["setting1", "setting2"] }, "section2" : { "type" : "section", "title" : "2nd section", "sections" : ["setting3", "setting4"] }, "section3" : { "type" : "section", "title" : "3rd section", "sections" : ["setting5", "setting6"] }, "section1" : { "type" : "section", "title" : "4th section", "sections" : ["setting7", "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 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 propery. 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 bool. 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 possibl 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 paramenters: 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 the following command: xlet-settings <type> <uuid> <instanceid> Where type is applet, desklet or extension depending on what type it is. The instanceid is optional. cinnamon-4.4.8/docs/reference/cinnamon-tutorials/xlet-settings.xml000066400000000000000000000311031360505115200253750ustar00rootroot00000000000000 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, sipmly 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, stings, 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-4.4.8/docs/reference/cinnamon-tutorials/xlet-translating.xml000066400000000000000000000141561360505115200260740ustar00rootroot00000000000000 ]> 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-json-makepot --js po/yourApplet.pot 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 programm "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-json-makepot --js po/yourApplet.pot 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-json-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-json-makepot -r to remove the installed translations. Restart Cinnamon: CTRL+ALT+ESC cinnamon-4.4.8/docs/reference/cinnamon-tutorials/xlet-versioning.xml000066400000000000000000000061341360505115200257260ustar00rootroot00000000000000 ]> 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. To enable extension versioning, extensions have to add the line "multiversion": true in metadata.json. 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-4.4.8/docs/reference/cinnamon/000077500000000000000000000000001360505115200200175ustar00rootroot00000000000000cinnamon-4.4.8/docs/reference/cinnamon/Makefile.am000066400000000000000000000072421360505115200220600ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in # We require automake 1.6 at least. AUTOMAKE_OPTIONS = 1.6 # This is a blank Makefile.am for using gtk-doc. # Copy this to your project's API docs directory and modify the variables to # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples # of using the various options. # The name of the module, e.g. 'glib'. DOC_MODULE=cinnamon # Uncomment for versioned docs and specify the version of the module, e.g. '2'. #DOC_MODULE_VERSION=2 # The top-level SGML file. You can change this if you want to. DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml # Directories containing the source code # gtk-doc will search all .c and .h files beneath these paths # for inline comments documenting functions and macros. DOC_SOURCE_DIR=$(top_srcdir)/src # Extra options to pass to gtkdoc-scangobj. Not normally needed. SCANGOBJ_OPTIONS= # Extra options to supply to gtkdoc-scan. # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" SCAN_OPTIONS=--rebuild-types # Extra options to supply to gtkdoc-mkdb. # e.g. MKDB_OPTIONS=--xml-mode --output-format=xml MKDB_OPTIONS=--xml-mode --output-format=xml # Extra options to supply to gtkdoc-mktmpl # e.g. MKTMPL_OPTIONS=--only-section-tmpl MKTMPL_OPTIONS= # Extra options to supply to gtkdoc-mkhtml MKHTML_OPTIONS= # Extra options to supply to gtkdoc-fixref. Not normally needed. # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS= # Used for dependencies. The docs will be rebuilt if any of these change. # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c HFILE_GLOB=$(top_srcdir)/src/*.h CFILE_GLOB=$(top_srcdir)/src/*.c # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h EXTRA_HFILES= # Header files or dirs to ignore when scanning. Use base file/dir names # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code IGNORE_HFILES= \ calendar-server \ libcvc \ hotplug-sniffer \ st \ tray \ gactionmuxer.h \ gactionobservable.h \ gactionobserver.h \ cinnamon-network-agent.h \ cinnamon-recorder-src.h if !BUILD_RECORDER IGNORE_HFILES += cinnamon-recorder.h endif # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png HTML_IMAGES= # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # These files must be listed here *and* in content_files # e.g. expand_content_files=running.sgml expand_content_files= # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # Only needed if you are using gtkdoc-scangobj to dynamically query widget # signals and properties. # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) GTKDOC_CFLAGS=$(GNOME_SHELL_CFLAGS) GTKDOC_LIBS=$(GNOME_SHELL_LIBS) $(abs_top_builddir)/src/libcinnamon.la -rpath $(libdir)/muffin # This includes the standard gtk-doc make rules, copied by gtkdocize. include $(top_srcdir)/gtk-doc.make # Other files to distribute # e.g. EXTRA_DIST += version.xml.in EXTRA_DIST += # Files not to distribute # for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types # for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt DISTCLEANFILES = $(DOC_MODULES).types # Comment this out if you want 'make check' to test you doc status # and run some sanity checks if ENABLE_GTK_DOC TESTS_ENVIRONMENT = cd $(srcdir) && \ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) #TESTS = $(GTKDOC_CHECK) endif -include $(top_srcdir)/git.mk cinnamon-4.4.8/docs/reference/cinnamon/cinnamon-docs.sgml.in000066400000000000000000000044331360505115200240440ustar00rootroot00000000000000 ]> Cinnamon Reference Manual This document is for Cinnamon @VERSION@. The latest version of this documentation can be found online at http://developer.linuxmint.com/reference/git/cinnamon/. Actors Application tracking Search Tray Icons Recorder Integration helpers and utilities Object Hierarchy API Index Index of deprecated API cinnamon-4.4.8/docs/reference/st/000077500000000000000000000000001360505115200166435ustar00rootroot00000000000000cinnamon-4.4.8/docs/reference/st/Makefile.am000066400000000000000000000071311360505115200207010ustar00rootroot00000000000000## Process this file with automake to produce Makefile.in # We require automake 1.6 at least. AUTOMAKE_OPTIONS = 1.6 # This is a blank Makefile.am for using gtk-doc. # Copy this to your project's API docs directory and modify the variables to # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples # of using the various options. # The name of the module, e.g. 'glib'. DOC_MODULE=cinnamon-st # Uncomment for versioned docs and specify the version of the module, e.g. '2'. #DOC_MODULE_VERSION=2 # The top-level SGML file. You can change this if you want to. DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml # Directories containing the source code # gtk-doc will search all .c and .h files beneath these paths # for inline comments documenting functions and macros. DOC_SOURCE_DIR=$(top_srcdir)/src/st # Extra options to pass to gtkdoc-scangobj. Not normally needed. SCANGOBJ_OPTIONS= # Extra options to supply to gtkdoc-scan. # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" SCAN_OPTIONS=--rebuild-types --rebuild-sections # Extra options to supply to gtkdoc-mkdb. # e.g. MKDB_OPTIONS=--xml-mode --output-format=xml MKDB_OPTIONS=--xml-mode --output-format=xml # Extra options to supply to gtkdoc-mktmpl # e.g. MKTMPL_OPTIONS=--only-section-tmpl MKTMPL_OPTIONS= # Extra options to supply to gtkdoc-mkhtml MKHTML_OPTIONS= # Extra options to supply to gtkdoc-fixref. Not normally needed. # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html FIXXREF_OPTIONS= # Used for dependencies. The docs will be rebuilt if any of these change. # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c HFILE_GLOB=$(top_srcdir)/src/st/*.h CFILE_GLOB=$(top_srcdir)/src/st/*.c # Extra header to include when scanning, which are not under DOC_SOURCE_DIR # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h EXTRA_HFILES= # Header files or dirs to ignore when scanning. Use base file/dir names # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code IGNORE_HFILES=st-private.h st-theme-node-private.h # Images to copy into HTML directory. # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png HTML_IMAGES= # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # e.g. content_files=running.sgml building.sgml changes-2.0.sgml content_files= # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # These files must be listed here *and* in content_files # e.g. expand_content_files=running.sgml expand_content_files= # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. # Only needed if you are using gtkdoc-scangobj to dynamically query widget # signals and properties. # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) GTKDOC_CFLAGS=-Wno-undef GTKDOC_LIBS=$(top_builddir)/src/libst-1.0.la -rpath $(libdir)/muffin # This includes the standard gtk-doc make rules, copied by gtkdocize. include $(top_srcdir)/gtk-doc.make # Other files to distribute # e.g. EXTRA_DIST += version.xml.in EXTRA_DIST += # Files not to distribute # for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types # for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt DISTCLEANFILES = $(DOC_MODULE).types $(DOC_MODULE)-sections.txt # Comment this out if you want 'make check' to test you doc status # and run some sanity checks if ENABLE_GTK_DOC TESTS_ENVIRONMENT = cd $(srcdir) && \ DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) #TESTS = $(GTKDOC_CHECK) endif -include $(top_srcdir)/git.mk cinnamon-4.4.8/docs/reference/st/cinnamon-st-docs.sgml.in000066400000000000000000000045041360505115200233130ustar00rootroot00000000000000 ]> Cinnamon St Reference Manual This document is for Cinnamon @VERSION@. The latest version of this documentation can be found online at http://developer.linuxmint.com/reference/git/st/. API reference Abstract classes and Interfaces Widgets Containers Styling Object Hierarchy API Index Index of deprecated API cinnamon-4.4.8/docs/search-providers-examples/000077500000000000000000000000001360505115200213535ustar00rootroot00000000000000cinnamon-4.4.8/docs/search-providers-examples/apt@cinnamon.org/000077500000000000000000000000001360505115200245505ustar00rootroot00000000000000cinnamon-4.4.8/docs/search-providers-examples/apt@cinnamon.org/metadata.json000066400000000000000000000001771360505115200272300ustar00rootroot00000000000000{ "description": "Provides packages search results", "uuid": "apt@cinnamon.org", "name": "APT search provider" } cinnamon-4.4.8/docs/search-providers-examples/apt@cinnamon.org/search_provider.js000066400000000000000000000015601360505115200302670ustar00rootroot00000000000000const 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-4.4.8/docs/search-providers-examples/apt@cinnamon.org/search_provider.py000066400000000000000000000010111360505115200302720ustar00rootroot00000000000000# -*- 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-4.4.8/docs/search-providers-examples/calc@cinnamon.org/000077500000000000000000000000001360505115200246665ustar00rootroot00000000000000cinnamon-4.4.8/docs/search-providers-examples/calc@cinnamon.org/metadata.json000066400000000000000000000002131360505115200273350ustar00rootroot00000000000000{ "description": "Solves basic mathematical operations", "uuid": "calc@cinnamon.org", "name": "Calculator Search Provider" } cinnamon-4.4.8/docs/search-providers-examples/calc@cinnamon.org/search_provider.js000066400000000000000000000020211360505115200303760ustar00rootroot00000000000000const 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("galculator.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-4.4.8/docs/search-providers-examples/chromium-history@cinnamon.org/000077500000000000000000000000001360505115200273065ustar00rootroot00000000000000cinnamon-4.4.8/docs/search-providers-examples/chromium-history@cinnamon.org/metadata.json000066400000000000000000000001711360505115200317600ustar00rootroot00000000000000{ "description": "Chromium history", "uuid": "chromium-history@cinnamon.org", "name": "Chromium history" } cinnamon-4.4.8/docs/search-providers-examples/chromium-history@cinnamon.org/search_provider.js000066400000000000000000000021211360505115200330170ustar00rootroot00000000000000const 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-4.4.8/docs/search-providers-examples/chromium-history@cinnamon.org/search_provider.py000066400000000000000000000052711360505115200330440ustar00rootroot00000000000000#! /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 not domain 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-4.4.8/docs/search-providers-examples/trackerprovider@cinnamon.org/000077500000000000000000000000001360505115200271725ustar00rootroot00000000000000cinnamon-4.4.8/docs/search-providers-examples/trackerprovider@cinnamon.org/metadata.json000066400000000000000000000001721360505115200316450ustar00rootroot00000000000000{ "description": "Search using tracker", "uuid": "trackerprovider@cinnamon.org", "name": "Tracker search" } cinnamon-4.4.8/docs/search-providers-examples/trackerprovider@cinnamon.org/search_provider.js000066400000000000000000000047121360505115200327130ustar00rootroot00000000000000const 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-4.4.8/docs/search-providers-examples/trackerprovider@cinnamon.org/search_provider.py000066400000000000000000000050011360505115200327170ustar00rootroot00000000000000# -*- coding=utf-8 -*- import subprocess 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 == None: t = result_types.pop() if t in CONVERT_TYPES: defined_type = CONVERT_TYPES[t] if defined_type == 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-4.4.8/docs/search-providers-examples/wikipedia@cinnamon.org/000077500000000000000000000000001360505115200257325ustar00rootroot00000000000000cinnamon-4.4.8/docs/search-providers-examples/wikipedia@cinnamon.org/metadata.json000066400000000000000000000004551360505115200304110ustar00rootroot00000000000000{ "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-4.4.8/docs/search-providers-examples/wikipedia@cinnamon.org/search_provider.js000066400000000000000000000044171360505115200314550ustar00rootroot00000000000000const 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-4.4.8/docs/search-providers-examples/yahoo@cinnamon.org/000077500000000000000000000000001360505115200251035ustar00rootroot00000000000000cinnamon-4.4.8/docs/search-providers-examples/yahoo@cinnamon.org/metadata.json000066400000000000000000000005041360505115200275550ustar00rootroot00000000000000{ "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-4.4.8/docs/search-providers-examples/yahoo@cinnamon.org/search_provider.js000066400000000000000000000015551360505115200306260ustar00rootroot00000000000000const 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-4.4.8/files/000077500000000000000000000000001360505115200144315ustar00rootroot00000000000000cinnamon-4.4.8/files/Makefile.in000066400000000000000000000023001360505115200164710ustar00rootroot00000000000000HAVE_NETWORKMANAGER = @HAVE_NETWORKMANAGER@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ datadir = @datadir@ sysconfdir = @sysconfdir@ all: usr/share/cinnamon-session/sessions/cinnamon.session \ usr/share/cinnamon-session/sessions/cinnamon2d.session clean: -rm -f usr/share/cinnamon-session distclean: clean maintainer-clean: clean install: mkdir -p $(DESTDIR)$(bindir) find usr/bin -mindepth 1 -maxdepth 1 -type f -exec cp -R {} $(DESTDIR)$(bindir)/ \; mkdir -p $(DESTDIR)$(datadir) find usr/share -mindepth 1 -maxdepth 1 -type d -exec cp -R {} $(DESTDIR)$(datadir)/ \; mkdir -p $(DESTDIR)$(sysconfdir) find etc -mindepth 1 -maxdepth 1 -type d -exec cp -R {} $(DESTDIR)$(sysconfdir)/ \; uninstall: find usr/bin -mindepth 1 -type f -exec rm $(DESTDIR)$(bindir)/{} \; find usr/share -mindepth 1 -type f -exec rm $(DESTDIR)$(datadir)/{} \; find etc -mindepth 1 -type f -exec rm $(DESTDIR)$(sysconfdir)/{} \; usr/share/cinnamon-session/sessions: mkdir -pv usr/share/cinnamon-session/sessions usr/share/cinnamon-session/sessions/%.session: %.session.in usr/share/cinnamon-session/sessions ifeq ($(HAVE_NETWORKMANAGER),true) cp -fp $< $@ else sed -e "s/;nm-applet//" $< >$@ endif cinnamon-4.4.8/files/cinnamon.session.in000066400000000000000000000002341360505115200202440ustar00rootroot00000000000000[Cinnamon Session] Name=Cinnamon RequiredComponents=cinnamon;cinnamon-screensaver;nemo-autostart;nm-applet;cinnamon-killer-daemon; DesktopName=X-Cinnamon cinnamon-4.4.8/files/cinnamon2d.session.in000066400000000000000000000002631360505115200204740ustar00rootroot00000000000000[Cinnamon Session] Name=Cinnamon (Software Rendering) RequiredComponents=cinnamon2d;cinnamon-screensaver;nemo-autostart;nm-applet;cinnamon-killer-daemon; DesktopName=X-Cinnamon cinnamon-4.4.8/files/etc/000077500000000000000000000000001360505115200152045ustar00rootroot00000000000000cinnamon-4.4.8/files/etc/xdg/000077500000000000000000000000001360505115200157665ustar00rootroot00000000000000cinnamon-4.4.8/files/etc/xdg/menus/000077500000000000000000000000001360505115200171155ustar00rootroot00000000000000cinnamon-4.4.8/files/etc/xdg/menus/cinnamon-applications-merged000077700000000000000000000000001360505115200304342applications-mergedustar00rootroot00000000000000cinnamon-4.4.8/files/etc/xdg/menus/cinnamon-applications.menu000066400000000000000000000116231360505115200242740ustar00rootroot00000000000000 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 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 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-4.4.8/files/usr/000077500000000000000000000000001360505115200152425ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/bin/000077500000000000000000000000001360505115200160125ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/bin/cinnamon-desktop-editor000077500000000000000000000004371360505115200225010ustar00rootroot00000000000000#!/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-4.4.8/files/usr/bin/cinnamon-file-dialog000077500000000000000000000042541360505115200217210ustar00rootroot00000000000000#!/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") 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-4.4.8/files/usr/bin/cinnamon-install-spice000077500000000000000000000047321360505115200223150ustar00rootroot00000000000000#!/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-4.4.8/files/usr/bin/cinnamon-json-makepot000077500000000000000000000020651360505115200221520ustar00rootroot00000000000000#!/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 arguement 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-4.4.8/files/usr/bin/cinnamon-killer-daemon000077500000000000000000000035451360505115200222720ustar00rootroot00000000000000#!/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 --replace &") # 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-4.4.8/files/usr/bin/cinnamon-launcher000077500000000000000000000052521360505115200213450ustar00rootroot00000000000000#!/usr/bin/python3 # """ Launches or restarts cinnamon """ import os import sys import gettext from setproctitle import setproctitle import gi gi.require_version('Gtk', '3.0') # noqa from gi.repository import Gtk FALLBACK_COMMAND = "metacity" FALLBACK_ARGS = ("--replace",) gettext.install("cinnamon", "/usr/share/locale") panel_process_name = None panel_cmd = None if os.path.exists("/usr/bin/mate-panel"): panel_process_name = "mate-panel" panel_cmd = "mate-panel --replace &" elif os.path.exists("/usr/bin/gnome-panel"): panel_process_name = "gnome-panel" panel_cmd = "gnome-panel --replace &" elif os.path.exists("/usr/bin/tint2"): panel_process_name = "tint2" panel_cmd = "killall tint2; tint2 &" def confirm_restart(): 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" return(True) return(False) if __name__ == "__main__": setproctitle("cinnamon-launcher") cinnamon_pid = os.fork() if cinnamon_pid == 0: os.execvp("cinnamon", ("cinnamon", "--replace", ) + tuple(sys.argv[1:])) else: exit_status = os.waitpid(cinnamon_pid, 0)[1] if exit_status != 0: if os.fork() == 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: if confirm_restart(): # Kill the fallback panel os.system("killall %s" % panel_process_name) # Restart Cinnamon os.execvp(sys.argv[0], (sys.argv[0], "--replace")) cinnamon-4.4.8/files/usr/bin/cinnamon-looking-glass000077500000000000000000000003761360505115200223170ustar00rootroot00000000000000#!/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-4.4.8/files/usr/bin/cinnamon-menu-editor000077500000000000000000000011161360505115200217670ustar00rootroot00000000000000#!/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-4.4.8/files/usr/bin/cinnamon-preview-gtk-theme000077500000000000000000000024351360505115200231100ustar00rootroot00000000000000#!/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-4.4.8/files/usr/bin/cinnamon-screensaver-lock-dialog000077500000000000000000000002721360505115200242440ustar00rootroot00000000000000#!/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-4.4.8/files/usr/bin/cinnamon-session-cinnamon000077500000000000000000000000711360505115200230210ustar00rootroot00000000000000#!/bin/sh exec cinnamon-session --session cinnamon "$@" cinnamon-4.4.8/files/usr/bin/cinnamon-session-cinnamon2d000077500000000000000000000000731360505115200232510ustar00rootroot00000000000000#!/bin/sh exec cinnamon-session --session cinnamon2d "$@" cinnamon-4.4.8/files/usr/bin/cinnamon-settings000077500000000000000000000122541360505115200214040ustar00rootroot00000000000000#!/usr/bin/python3 """ Launch the cinnamon-settings utility, or a specific settings module Usage: To open System Settings: $ cinnamon-settings To open the settings of a particular module: $ cinnamon-settings module_name To open the settings of an applet, a desklet or an extension downloaded by the user: $ cinnamon-settings applets|desklets|extensions UUID Example: $ cinnamon-settings applets SpicesUpdate@claudiux To add a xlet on a specific panel: $ cinnamon-settings applets|desklets|extensions panel1|panel2|panel3|panel4 To open a particular tab of the settings of a module, use the '--tab=' or '-t' argument: $ cinnamon-settings module_name --tab=x or $ cinnamon-settings module_name -t x (where x is the tab name (e.g. download) or the tab number (e.g. 1)) Example: $ cinnamon-settings applets --tab=download To open the 'download' tab of a type of Spices (applets, desklets, extensions, themes), sorting them by 'name', 'score', 'date' or 'installed', use the '--sort=' or '-s' argument: $ cinnamon-settings applets|desklets|extensions|themes --tab=1 --sort=name|score|date|installed or $ cinnamon-settings applets|desklets|extensions|themes -t 1 -s name|score|date|installed Example: $ cinnamon-settings applets -t 1 -s date Available modules, their tab names and corresponding numbers: "MODULE_NAME": {"TAB_NAME": TAB_NUMBER, ... } "accessibility":{"visual": 0, "keyboard": 1, "typing": 2, "mouse": 3}, "applets": {"installed": 0, "more": 1, "download": 1}, "backgrounds": {"images": 0, "settings": 1}, "default": {"preferred": 0, "removable": 1}, "desklets": {"installed": 0, "more": 1, "download": 1, "general": 2}, "effects": {"effects": 0, "customize": 1}, "extensions": {"installed": 0, "more": 1, "download": 1}, "keyboard": {"typing": 0, "shortcuts": 1, "layouts": 2}, "mouse": {"mouse": 0, "touchpad": 1}, "power": {"power": 0, "batteries": 1, "brightness": 2}, "screensaver": {"settings": 0, "customize": 1}, "sound": {"output": 0, "input": 1, "sounds": 2, "applications": 3, "settings": 4}, "themes": {"themes": 0, "download": 1, "options": 2}, "windows": {"titlebar": 0, "behavior": 1, "alttab": 2}, "workspaces": {"osd": 0, "settings": 1} Available types of sort, and corresponding numbers: "name":0, "score":1, "date":2, "installed":3 """ import getopt import os import sys def usage(): print("""Usage: cinnamon-settings [MODULE [OPTIONS]] [HELP_OPTION] Help option (HELP_OPTION): -h, --help Displays help message (e.g. this message). Module options: -t, --tab Opens the specified tab (see list in manpage) of module settings. -s, --sort xlets modules option. xlets are 'applets', 'desklets', 'extensions' and 'themes'. Sorts the xlets by: 'name' or 0 'score' or 1 (by default) 'date' or 2 'installed' or 3 'update' or 4 Example: $ cinnamon-settings applets -t download -s date For complete description and examples, see the manpage: cinnamon-settings(1) """) exit(2) opts = [] try: if len(sys.argv) > 1: opts = getopt.getopt(sys.argv[1:], "h", ["help"])[0] except getopt.GetoptError: pass for opt, arg in opts: if opt in ("-h", "--help"): usage() break opts = [] try: if len(sys.argv) > 2: opts = getopt.getopt(sys.argv[2:], "t:s:", ["tab=", "sort="])[0] except getopt.GetoptError: pass optional_args = False for opt, arg in opts: if opt in ("-t", "--tab", "-s", "--sort"): optional_args = True break if len(sys.argv) > 1: module = sys.argv[1] if module in ("applets", "desklets", "extensions") and len(sys.argv) > 2 and sys.argv[2][0:5] != "panel": if not optional_args: os.execvp("/usr/share/cinnamon/cinnamon-settings/xlet-settings.py", (" ", module[0:-1]) + tuple(sys.argv[2:])) elif os.path.exists("/usr/share/cinnamon/cinnamon-settings/modules/cs_%s.py" % module): os.execvp("/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py", (" ",) + tuple(sys.argv[1:])) elif os.path.exists("/usr/share/cinnamon/cinnamon-settings/modules/cs_%s.py" % module): os.execvp("/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py", (" ",) + tuple(sys.argv[1:])) elif os.path.exists("/usr/bin/cinnamon-control-center"): os.execvp("/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py", (" ",) + tuple(sys.argv[1:])) elif os.path.exists("/usr/bin/gnome-control-center"): print ("Unknown module %s, calling gnome-control-center" % module) os.execvp("gnome-control-center", (" ",) + tuple(sys.argv[1:])) else: print ("Unknown module %s" % module) os.execvp("/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py", (" ",) + tuple(sys.argv[1:])) else: os.execvp("/usr/share/cinnamon/cinnamon-settings/cinnamon-settings.py", (" ",) + tuple(sys.argv[1:])) cinnamon-4.4.8/files/usr/bin/cinnamon-settings-users000077500000000000000000000002671360505115200225440ustar00rootroot00000000000000#!/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-4.4.8/files/usr/bin/cinnamon-slideshow000077500000000000000000000002631360505115200215420ustar00rootroot00000000000000#!/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-4.4.8/files/usr/bin/cinnamon-subprocess-wrapper000077500000000000000000000013421360505115200234060ustar00rootroot00000000000000#!/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 import dbus from setproctitle import setproctitle 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 = "" success = False session_bus = dbus.SessionBus() dbus = session_bus.get_object("org.Cinnamon", "/org/Cinnamon") PushSubprocessResult = dbus.get_dbus_method('PushSubprocessResult', 'org.Cinnamon') PushSubprocessResult(process_id, result, success) cinnamon-4.4.8/files/usr/bin/cinnamon-xlet-makepot000077500000000000000000000243451360505115200221620ustar00rootroot00000000000000#!/usr/bin/python3 import os import json import subprocess import collections import argparse 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 syatems "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) else: pot_file = polib.POFile() for root, dirs, files in os.walk(dir): rel_root = os.path.relpath(root) for file in files: if rel_root is '.': 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 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 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 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 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 is 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 is 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('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 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 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 = True 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 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-4.4.8/files/usr/bin/cinnamon2d000077500000000000000000000003051360505115200177660ustar00rootroot00000000000000#!/bin/bash CLUTTER_PAINT=disable-culling LIBGL_ALWAYS_SOFTWARE=1 CINNAMON_SOFTWARE_RENDERING=1 CINNAMON_2D=1 CINNAMON_SLOWDOWN_FACTOR=0.0001 MUFFIN_NO_SHADOWS=1 CLUTTER_DEFAULT_FPS=15 cinnamon $@ cinnamon-4.4.8/files/usr/bin/xlet-about-dialog000077500000000000000000000076051360505115200212710ustar00rootroot00000000000000#!/usr/bin/python3 import sys import os import json import gettext import datetime import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, GdkPixbuf usage = """ usage : xlet-about-dialog applets/desklets/extensions uuid """ gettext.install('cinnamon', '/usr/share/locale') class AboutDialog(Gtk.AboutDialog): def __init__(self, metadata, stype): super(AboutDialog, self).__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(self.metadata['last-edited']).isoformat(' ') self.props.version = _("Updated on %s") % timestamp comments = self._(self.metadata['description']) if 'comments' in self.metadata: comments += '\n' + self.metadata['comments'] self.props.comments = comments s_id = self.get_spices_id() if s_id: self.props.website = 'https://cinnamon-spices.linuxmint.com/%s/view/%s' % (self.stype, s_id) self.props.website_label = _("More info") if 'contributors' in self.metadata: self.props.authors = self.metadata['contributors'].split(',') self.props.program_name = '%s (%s)' % (self.metadata['name'], self.metadata['uuid']) self.connect('response', self.close) self.show() def close(self, *args): Gtk.main_quit() def set_icon(self): if 'icon' in self.metadata: self.set_logo_icon_name(self.metadata['icon']) else: 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) else: self.set_logo_icon_name('cs-%s' % self.metadata['type']) self.set_default_icon_name('cs-%s' % self.metadata['type']) def _(self, msg): translation = gettext.dgettext(self.metadata['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(os.path.expanduser('~'), '.cinnamon', 'spices.cache', self.stype[0:-1], 'index.json') if os.path.exists(cache_path): with open(cache_path, 'r') 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__": if len(sys.argv) < 3: print(usage) quit() xlet_type = sys.argv[1] uuid = sys.argv[2] suffix = 'share/cinnamon/%s/%s' % (xlet_type, uuid) prefixes = [ os.path.join(os.path.expanduser('~'), '.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)) quit() with open(os.path.join(path, 'metadata.json')) as meta_file: metadata = json.load(meta_file) metadata['path'] = path metadata['type'] = xlet_type AboutDialog(metadata, xlet_type) Gtk.main() cinnamon-4.4.8/files/usr/bin/xlet-settings000077500000000000000000000004361360505115200205550ustar00rootroot00000000000000#!/usr/bin/python3 import os import sys if len(sys.argv) < 3: print("usage:\n xlet-settings \nor\n xlet-settings ") else: os.execvp("/usr/share/cinnamon/cinnamon-settings/xlet-settings.py", (" ",) + tuple(sys.argv[1:])) cinnamon-4.4.8/files/usr/share/000077500000000000000000000000001360505115200163445ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/applications/000077500000000000000000000000001360505115200210325ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/applications/cinnamon-killer-daemon.desktop000066400000000000000000000003101360505115200267420ustar00rootroot00000000000000[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-4.4.8/files/usr/share/applications/cinnamon-menu-editor.desktop000066400000000000000000000004201360505115200264510ustar00rootroot00000000000000[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-4.4.8/files/usr/share/applications/cinnamon-onscreen-keyboard.desktop000066400000000000000000000145121360505115200276420ustar00rootroot00000000000000[Desktop Entry] Exec=dbus-send --print-reply --dest=org.Cinnamon /org/Cinnamon org.Cinnamon.ToggleKeyboard Icon=input-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[az]=Sanal düyməlik Name[bg]=Виртуална клавиатура Name[bn]=ভার্চুয়াল কিবোর্ড 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[fi]=Virtuaalinäppäimistö Name[fr]=Clavier virtuel Name[fr_CA]=Clavier virtuel Name[he]=מקלדת מדומה Name[hr]=Virtualna tipkovnica Name[hu]=Virtuális billentyűzet Name[ia]=Claviero virtual Name[id]=Keyboard virtual Name[ie]=Tastatura virtual Name[is]=Sýndarlyklaborð Name[it]=Tastiera virtuale Name[kab]=Anasiw aḥlis Name[ko]=가상 키보드 Name[lt]=Virtuali klaviatūra Name[nap]=Tastiera faveza Name[nb]=Virtuelt tastatur Name[nl]=Virtueel toetsenbord Name[pl]=Klawiatura wirtualna Name[pt]=Teclado virtual Name[pt_BR]=Teclado virtual Name[ro]=Tastatură virtuală Name[ru]=Виртуальная клавиатура Name[sc]=Tastiera virtuale Name[sk]=Virtuálna klávesnica Name[sl]=Virtualna tipkovnica Name[sq]=Tastiera virtuale Name[sr]=Виртуелна тастатура 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]=Виртуал клавиатура 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[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 no el teclado en pantalla Comment[es_AR]=Activar o no el teclado en pantalla Comment[et]=Ekraaniklaviatuuri sisse või välja lülitamine Comment[eu]=Aktibatu edo desaktibatu pantailako teklatua Comment[fi]=Näyttönäppäimistö päälle/pois 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[hr]=Uključi/Isključi zaslonsku tipkovnicu Comment[hu]=Képernyő-billentyűzet be- vagy kikapcsolása Comment[ia]=Activar o stoppar le claviero sur-le-schermo Comment[id]=Menyalakan atau mematikan papan tik di layar Comment[is]=Skjályklaborð af eða á Comment[it]=Attiva o disattiva la tastiera sullo schermo Comment[kab]=Rmed neɣ ssens anasiw amwalan Comment[kk]=Экрандағы пернетақтаны қосу/сөндіру Comment[ko]=화상 키보드 켜고 끄기 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[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[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@ijekavianlatin]=Укључи/искључи тастатуру на екрану Comment[sr@latin]=Uključ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]=Экран клавиатурасини ёқиш ёки ўчириш Comment[vi]=Bật tắt bàn phím màn hình Comment[zh_CN]=开关屏幕键盘 Comment[zh_HK]=開啟或關閉熒幕鍵盤 Comment[zh_TW]=開啟或關閉螢幕鍵盤 cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-applets.desktop000066400000000000000000000154321360505115200275400ustar00rootroot00000000000000[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[az]=Uyğulamalar Name[be]=Аплеты Name[bg]=Аплети Name[bn]=অ্যাপলেট 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[et]=Apletid Name[eu]=Applet-ak Name[fa]=ابزارک‌ها Name[fi]=Paneelisovelmat 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[kab]=Tiplatin Name[kk]=Апплеттер Name[km]=អាប់​ភ្លេត Name[ko]=애플릿 Name[ku]=Sepanok Name[lo]=ແອັບເພັດ Name[lt]=Įskiepiai Name[lv]=Sīklietotnes Name[ml]=ആപ്‌ലെറ്റുകൾ Name[ms]=Aplet Name[nb]=Miniprogrammer Name[ne]=एप्प्लेट्स Name[nl]=Werkbalkhulpjes Name[nn]=Småprogram Name[om]=Apleetota Name[pa]=ਐਪਲਿਟ Name[pl]=Aplety Name[ro]=Appleturi Name[ru]=Апплеты Name[rue]=Апплеты Name[sk]=Aplety Name[sl]=Apleti Name[so]=Kaabayaasha Name[sq]=Programthet Name[sr]=Програмчићи Name[sr@ijekavianlatin]=Програмчићи Name[sr@latin]=Apleti Name[sv]=Panelprogram Name[ta]=குறுநிரல்கள் Name[te]=ఆప్లెట్లు Name[tg]=Барномаҳо Name[th]=แอปเพล็ต Name[tr]=Uygulamacıklar Name[ts]=Tiphurogireme-ntsongo Name[uk]=Аплети Name[ur]=ایپلیٹ Name[uz]=Апплетлар Name[vi]=Tiểu trình Name[zh_CN]=小程序 Name[zh_HK]=應用小程式 Name[zh_TW]=面板小程式 Comment=Manage Cinnamon applets Comment[am]=የ ሲናሞን አፕሌቶች አስተዳዳሪ Comment[ar]=إدارة تطبيقات Cinnamon المصغرة Comment[ast]=Alministra los applets de Cinnamon Comment[az]="Cinnamon" uyğulamalarını Yönəlt Comment[be]=Кіраванне аплетамi Cinnamon Comment[bg]=Управление на аплетите за 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]=Rheolwch raglenigau Cinnamon Comment[da]=Administrér Cinnamon-panelprogrammer Comment[de]=Cinnamon-Applets verwalten Comment[el]=Διαχείριση μικροεφαρμογών Cinnamon Comment[eo]=Administri Cinnamon-aplikaĵetojn Comment[es]=Administrar applets de Cinnamon Comment[es_AR]=Administrar applets de Cinnamon Comment[eu]=Kudeatu Cinnamon applet-ak Comment[fa]=مدیریت اپلت‌های سینمون Comment[fi]=Hallitse Cinnamon-sovelmia Comment[fr]=Gérer les applets de Cinnamon Comment[fr_CA]=Gérer les applets Cinnamon Comment[fy]=Cinnamon applets beheare Comment[gd]=Stiùirich aplaidean Cinnamon Comment[gl]=Administración dos miniaplicativos de Cinnamon Comment[he]=נהל את יישומוני Cinnamo Comment[hr]=Upravljajte Cinnamon apletima Comment[hu]=Cinnamon kisalkalmazások kezelése Comment[ia]=Administrar le applets de Cinnamon Comment[id]=Atur applets Cinnamon Comment[is]=Sýsla með Cinnamon forritlinga Comment[it]=Gestione applet di Cinnamon Comment[kab]=Sefrek tiplatin n Cinnamon Comment[ko]=시나몬 애플릿 관리 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[oc]=Gerir los applets de Cinnamon Comment[pl]=Zarządzaj apletami Cinnamon Comment[pt]=Gerir applets do Cinnamon Comment[pt_BR]=Gerenciar applets do Cinnamon Comment[ro]=Gestionează appleturile Cinnamon Comment[ru]=Управление апплетами 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@ijekavianlatin]=Управљање програмчићима Цимета Comment[sr@latin]=Управљање програмчићима Цимета 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]=Синнамон апплетларини бошқариш Comment[vi]=Quản lý tiểu dụng Cinnamon Comment[zh_CN]=管理Cinnamon小程序 Comment[zh_HK]=管理 Cinnamon 應用小程式 Comment[zh_TW]=管理 Cinnamon 面板小程式 Keywords=applet; Keywords[am]=አፕሌት; Keywords[ar]=التطبيق المصغر; Keywords[az]=uyğulama; Keywords[be]=аплет; Keywords[bg]=аплет; Keywords[bs]=aplet; Keywords[ca]=miniaplicació; Keywords[ca@valencia]=miniaplicació; Keywords[cy]=rhaglennig; 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[hr]=aplet; Keywords[hu]=kisalkalmazás; Keywords[id]=aplet; Keywords[is]=smáforrit; Keywords[ja]=アプレット; Keywords[kab]=Taplet; Keywords[ko]=애플릿; Keywords[lo]=ແອັບເພັດ; Keywords[lt]=įskiepis; Keywords[lv]=sīkrīks; Keywords[ms]=aplet; Keywords[nb]=miniprogram; Keywords[nds]=Minianwendung / Applet; Keywords[nl]=werkbalkhulpje; Keywords[pa]=ਐਪਲਿਟ; Keywords[pl]=aplet; Keywords[ru]=апплет; Keywords[sk]=aplet; Keywords[sl]=aplet; Keywords[sq]=programth; Keywords[sr]=програмче; Keywords[sr@ijekavianlatin]=програмче; Keywords[sr@latin]=програмче; Keywords[sv]=panelprogram; Keywords[ta]=குறுநிரல்; Keywords[tg]=зербарнома; Keywords[th]=แอปเพล็ต; Keywords[tr]=uygulamacık; Keywords[uk]=аплет; Keywords[ur]=ایپلیٹ; Keywords[uz]=апплет; Keywords[vi]=tiểu trình; Keywords[zh_CN]=小程序; Keywords[zh_HK]=應用小程式; Keywords[zh_TW]=面板小程式; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-backgrounds.desktop000066400000000000000000000242661360505115200303770ustar00rootroot00000000000000[Desktop Entry] Icon=cs-backgrounds Exec=cinnamon-settings backgrounds Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Backgrounds Name[am]=መደቦች Name[ar]=الخلفيات Name[ast]=Fondos de pantalla Name[az]=Arxaplanlar Name[be]=фон Name[bg]=Фон 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]=Fonds d’écran Name[fy]=Eftergrûn Name[ga]=Cúlraí Name[gd]=Cùlaibhean Name[gl]=Fondos Name[he]=רקעים 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[kab]=Idren n wegdil Name[ko]=배경화면 Name[ku]=Paşxane Name[lo]=ພື້ນຫຼັງ Name[lt]=Fonai Name[lv]=Fona attēli Name[ms]=Latar Belakang Name[nb]=Bakgrunner Name[nds]=Hintergrundbilder Name[nl]=Achtergronden 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[sc]=Fundales Name[sk]=Pozadia Name[sl]=Ozadja Name[sq]=Sfondet Name[sr]=Позадине Name[sr@ijekavianlatin]=Позадине Name[sr@latin]=Позадине Name[sv]=Bakgrundsbilder Name[ta]=பின்னணிகள் Name[tg]=Пасзаминаҳо Name[th]=พื้นหลัง Name[tr]=Arkaplanlar Name[uk]=Фонові зображення Name[ur]=پسِ منظر Name[uz]=Фонлар Name[vi]=Hình nền Name[zh_CN]=背景 Name[zh_HK]=背景 Name[zh_TW]=背景 Comment=Change your desktop's background Comment[am]=የ ዴስክቶፕ መደብ መቀየሪያ Comment[ar]=تغيير خلفية سطح المكتب الخاص بك Comment[ast]=Camuda'l fondu del to escritoriu Comment[az]=İş qoyacağı'nın arxaplanını dəyiş Comment[be]=Змянiце фон працоўнага стала Comment[bg]=Промяна на фона на работния плот 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]=Newidiwch gefndir 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 de escritorio Comment[es_AR]=Cambiar el fondo de escritorio Comment[eu]=Aldatu mahaigainaren atzeko planoa Comment[fa]=پس‌زمینه‌ی دسکتاپ‌تان را تغییر دهید Comment[fi]=Muuta työpöydän taustakuvaa Comment[fr]=Changer le fond d'écran Comment[fr_CA]=Modifier votre fond d'écran 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[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 background 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[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[oc]=Cambiar lo rèireplan de vòstre burèu Comment[pl]=Zmień tło pulpitu Comment[pt]=Mudar o fundo do seu ambiente de trabalho Comment[pt_BR]=Alterar plano de fundo de sua área de trabalho Comment[ro]=Schimbă imaginea de fundal Comment[ru]=Изменить обои рабочего стола 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@ijekavianlatin]=Промените позадину радне површи Comment[sr@latin]=Промените позадину радне површи Comment[sv]=Byt skrivbordsbakgrund Comment[ta]=பணிமேடையின் பின்னணியை மாற்று Comment[tg]=Тағйир додани пасзаминаи мизи корӣ Comment[th]=เปลี่ยนพื้นหลังบนพื้นโต๊ะของคุณ Comment[tr]=Masaüstü arkaplan resmini değiştir Comment[uk]=Змінити фон стільниці Comment[ur]=ڈیسک ٹاپ پس منظر تبدیل کریں Comment[uz]=Иш столи фонини ўзгартиринг Comment[vi]=Đổi nền màn hình làm việc Comment[zh_CN]=修改桌面背景 Comment[zh_HK]=變更你桌面的背景 Comment[zh_TW]=變更您的桌面背景 Keywords=background;picture;screenshot;slideshow; Keywords[am]=መደብ : ስእል : የመመልከቻ ፎቶ : ተንሸራታች ማሳያ; Keywords[ar]=الخلفية، الصور، لقطة الشاشة، عرض الشرائح; Keywords[az]=arxaplan;görsəl;göstərici çəkimi;sürüşmə göstərişi; Keywords[be]=фон;выява;скрыншот;слайд-шоў; Keywords[bg]=тапет;изображение;screenshot;slideshow; Keywords[bs]=pozadina;slika;slika ekrana;prezentacija slajdova; Keywords[ca]=fons;imatge;captura de pantalla;presentació de diapositives; Keywords[ca@valencia]=fons;imatge;captura de pantalla;presentació de diapositives; Keywords[cs]=pozadí;obrázek;snímek obrazovky;prezentace; Keywords[cy]=cefndir;darlun;cliplun;sioe sleidiau; Keywords[da]=baggrund;billede;skærmbillede;slideshow; Keywords[de]=Hintergrund;Bild;Bildschirmaufnahme;Diaschau;background;picture;screenshot;slideshow; Keywords[el]=παρασκήνιο;εικόνα;στιγμιότυπο;προβολή διαφανειών;φόντο;ταπετσαρία; Keywords[eo]=fono;bildo;ekrankopio;bildoprezento; Keywords[es]=fondo;imagen;captura de pantalla;presentación de diapositivas; Keywords[es_AR]=fondo;imagen;captura de pantalla;presentación de diapositivas; Keywords[eu]=atzeko planoa;irudia;pantaila-argazkia;diaporama; Keywords[fa]=پس‌زمینه، تصویر، اسکرین‌شات، اسلایدشو; Keywords[fi]=tausta;kuva;kuvankaappaus;diaesitys; Keywords[fr]=fond;image;capture d'écran;diaporama; Keywords[fr_CA]=fond;image;capture d’écran;diaporama; Keywords[fy]=eftergrûn;printsje;skermôfbielding;diapresentaasje; Keywords[ga]=cúlra;pictiúr;gabháil scáileáin;taispeántas sleamhnáin; Keywords[gd]=cùlaibh;dealbh;glacadh-sgrìn;taisbeanadh-shleamhnagan;background;picture;screenshot;slideshow; Keywords[gl]=fondo;imaxe;captura de pantalla;diaporama; Keywords[he]=רקע;תמונה;צילום-מסך;מצגת שקופיות; Keywords[hr]=pozadina;slika;snimka zaslona;promjena pozadine; Keywords[hu]=háttér;kép;képernyőkép;diavetítés; Keywords[ia]=fundo;photo;captura de schermo;presentation de photos; Keywords[id]=latar belakang;gambar;tangkapan layar;slideshow; Keywords[is]=bakgrunnur;mynd;skjámynd;skyggnusýning; Keywords[it]=sfondo;immagine;screenshot;diapositive; Keywords[ja]=背景、写真、スクリーンショット、スライドショー; Keywords[kab]=agilal;tugna;tuddma n wegdil;tigiri; Keywords[ko]=배경화면;사진;스크린샷;슬라이드쇼; Keywords[lo]=ພື້ນຫຼັງ;ຮູບພາບ;ພາບໜ້າຈໍ;ສະໄລໂຊວ໌; Keywords[lt]=fonas;paveikslėlis;paveikslas;ekrano kopija;ekranvaizdis;demonstracija;skaidrių rodymas; Keywords[lv]=fona attēls;attēls;ekrānuzņēmums;slīdrāde; Keywords[ms]=latar belakang;gambar;cekupan skrin;paparan skrin; Keywords[nb]=bakgrunn;bilde;skjermbilde;bildefremvisning; Keywords[nds]=Hintergrund;Bild;Screenshot;Diashow; Keywords[nl]=achtergrond;foto;schermafdruk;diavertoning; Keywords[pa]=ਬੈਕਗਰਾਉਂਡ;ਤਸਵੀਰ;ਸਕਰੀਨਸ਼ਾੱਟ;ਸਲਾਇਡ-ਸ਼ੋ; Keywords[pl]=tapeta;zdjęcie;zrzut ekranu;pokaz slajdów; Keywords[pt]=fundo;imagem;captura;apresentação; Keywords[pt_BR]=plano de fundo;imagem;captura de tela;apresentação de slides; Keywords[ro]=fundal;poză;captură de ecran;slideshow; Keywords[ru]=фоновый;рисунок;снимок экрана;слайд-шоу; Keywords[sc]=fundale;immàgine;caturischermu;presentatzione; Keywords[sk]=pozadie;obrázok;screenshot;prezentácia; Keywords[sl]=ozadje;slika;zaslonska slika;predstavitev; Keywords[sq]=sfondi;figura;screeshot;prezantimi; Keywords[sr]=позадина;слика;снимак екрана;покретни приказ; Keywords[sr@ijekavianlatin]=позадина;слика;снимак екрана;покретни приказ; Keywords[sr@latin]=позадина;слика;снимак екрана;покретни приказ; Keywords[sv]=bakgrund;bild;skärmdump;bildspel; Keywords[ta]=பின்னணி;படம்;திரைப்பிடிப்பு;சறுக்குகாட்சி; Keywords[tg]=пасзамина;тасвир;сурати экран;намоиши слайдҳо; Keywords[th]=พื้นหลัง;รูปภาพ;ภาพหน้าจอ;การนำเสนอภาพนิ่ง; Keywords[tr]=arkaplan;resim;ekran görüntüsü;slayt gösterisi; Keywords[uk]=фон;зображення;знімок екрану;показ слайдів; Keywords[ur]=پس منظر، تصویر، سکرین شاٹ، سکرین کی تصویر، سلائڈشو، سلائڈ شو; Keywords[uz]=фон;расм;экран тасвири;слайд-шоу; Keywords[vi]=hình nền;hình ảnh;ảnh chụp màn hình;trình chiếu; Keywords[zh_CN]=背景,图像,截图,幻灯片; Keywords[zh_HK]=背景;圖片;熒幕截圖;幻燈片; Keywords[zh_TW]=背景;圖片;螢幕截圖;幻燈片放映; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-calendar.desktop000066400000000000000000000257261360505115200276500ustar00rootroot00000000000000[Desktop Entry] Icon=cs-date-time Exec=cinnamon-settings calendar Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Date & Time Name[am]=ቀን & ሰአት Name[ar]=التاريخ والوقت Name[ast]=Data y hora Name[az]=Gün ilə Vaxt Name[be]=Дата і час Name[bg]=Дата и час 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[fr]=Date & 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[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 & Ora Name[ja]=日付と時刻 Name[kab]=Azemz & Akud Name[ko]=날짜 & 시간 Name[ku]=Roj & Dem Name[lo]=ວັນແລະເວລາ Name[lt]=Data ir laikas Name[lv]=Datums un laiks Name[ms]=Tarikh & Masa Name[nb]=Dato og klokkeslett Name[nds]=Datum & Zeit Name[nl]=Datum en tijd 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[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@ijekavianlatin]=Датум и време Name[sr@latin]=Датум и време Name[sv]=Datum och tid Name[ta]=தேதியும் நேரமும் Name[tg]=Сана ва вақт: Name[th]=วันที่และเวลา Name[tr]=Tarih & Zaman Name[uk]=Дата й час Name[ur]=وقت اور تاريخ Name[uz]=Сана & Вақт Name[vi]=Ngày giờ Name[zh_CN]=日期和时间 Name[zh_HK]=日期與時間 Name[zh_TW]=日期與時間 Comment=Manage date and time settings Comment[am]=የ ቀን እና ሰአት ማሰናጃ አስተዳዳሪ Comment[ar]=إدارة إعدادات التاريخ والوقت Comment[ast]=Alministra los axustes de data y tiempu Comment[az]=Gün, vaxt quruluşlarını yönəlt Comment[be]=Кіраванне наладамi даты і часу Comment[bg]=Управление на часа и датата 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]=Rheolwch osodiadau 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]=Administrar la configuración de fecha y hora Comment[es_AR]=Administrar la configuración de fecha y hora Comment[eu]=Kudeatu data eta orduaren ezarpenak Comment[fa]=مدیریت تنظیمات تاریخ و زمان Comment[fi]=Muuta päivä- ja aika-asetuksia 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[hr]=Upravljajte postavkama datuma i vremena Comment[hu]=Dátum és idő beállítások kezelése Comment[ia]=Administrar preferentias 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[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[oc]=Gerir los paramètres de data e d'ora Comment[pl]=Zarządzaj ustawieniami daty i czasu Comment[pt]=Gerir as definições de data e hora Comment[pt_BR]=Gerenciar configurações de data e hora Comment[ro]=Gestionează setările datei și orei Comment[ru]=Настройки даты и времени 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@ijekavianlatin]=Управљање поставкама датума и времена Comment[sr@latin]=Управљање поставкама датума и времена 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]=Сана ва вақт созламаларини бошқариш Comment[vi]=Quản lý thiết đặt ngày tháng Comment[zh_CN]=管理时间/日期设置 Comment[zh_HK]=管理日期與時間設定 Comment[zh_TW]=管理日期與時間設定 Keywords=time;date;calendar;format;network;sync; Keywords[am]=ሰአት : ቀን : ቀን መቁጠሪያ : አቀራረብ : ኔትዎርክ : ማስማሚያ; Keywords[ar]=الوقت، التاريخ، التنسيق، الشبكة، المزامنة; Keywords[ast]=tiempu;hora;data;calendariu;calandariu;formatu;rede;sincronizar;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[eu]=ordua;data;egutegia;formatua;sarea;sinkronizazioa; Keywords[fa]=زمان، تاریخ، تقویم، فرمت، شبکه، هم‌زمانی; Keywords[fi]=aika;päiväys;kalenteri;formaatti;verkko;synkronointi; Keywords[fr]=heure;date;calendrier;format;réseau;synchronisation; Keywords[fr_CA]=heure;date;calendrier;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[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]=時間、日付、カレンダー、フォーマット、ネットワーク、同期; 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[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[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@ijekavianlatin]=време;датум;календар;формат;мрежа;усклађивање; Keywords[sr@latin]=време;датум;календар;формат;мрежа;усклађивање; 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]=вақт;сана;календар;формат;тармоқ;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-4.4.8/files/usr/share/applications/cinnamon-settings-default.desktop000066400000000000000000000317151360505115200275160ustar00rootroot00000000000000[Desktop Entry] Icon=cs-default-applications Exec=cinnamon-settings default Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Preferred Applications Name[am]=የ መረጥኩት መተግበሪያ Name[ar]=التطبيقات المفضلة Name[ast]=Aplicaciones preferíes Name[az]=Üstünlük verilən Uyğulamalar Name[be]=Пераважныя дастасаванні Name[bg]=Предпочитани програми Name[bn]=পছন্দের অ্যাপ্লিকেশন 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 favoritas Name[es_AR]=Aplicaciones favoritas Name[et]=Eelistatud rakendused Name[eu]=Hobetsitako aplikazioak Name[fi]=Oletussovellukset Name[fr]=Applications préférées Name[fr_CA]=Applications préférées Name[gd]=Aplacaidean as fhearr leat Name[gl]=Aplicativos preferidos Name[he]=יישום מועדף 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[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[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[sc]=Aplicatziones preferidas Name[sk]=Uprednostňované aplikácie Name[sl]=Prednostni programi Name[sq]=Programet e preferuara Name[sr]=Омиљени програми Name[sr@ijekavianlatin]=Омиљени програми Name[sr@latin]=Омиљени програми Name[sv]=Förvalda program Name[th]=โปรแกรมที่ชอบ Name[tr]=Tercih Edilen Uygulamalar Name[uk]=Стандартні програми Name[ur]=ترجیحی ایپلی کیشنز Name[uz]=Танланган дастурлар Name[vi]=Ứng dụng Ưa thích Name[zh_CN]=首选应用程序 Name[zh_HK]=喜好的應用程式 Name[zh_TW]=偏好的應用程式 Comment=Preferred Applications Comment[am]=የ መረጥኩት መተግበሪያ Comment[ar]=التطبيقات المفضلة Comment[ast]=Aplicaciones preferíes Comment[az]=Üstünlük verilən Uyğulamalar Comment[be]=Пераважныя дастасаванні Comment[bg]=Предпочитани програми Comment[bn]=পছন্দের অ্যাপ্লিকেশন 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 favoritas Comment[es_AR]=Aplicaciones favoritas Comment[et]=Eelistatud rakendused Comment[eu]=Hobetsitako aplikazioak Comment[fi]=Oletussovellukset Comment[fr]=Applications préférées Comment[fr_CA]=Applications préférées Comment[gd]=Aplacaidean as fhearr leat Comment[gl]=Aplicativos preferidos Comment[he]=יישום מועדף 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[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[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[sc]=Aplicatziones preferidas Comment[sk]=Uprednostňované aplikácie Comment[sl]=Prednostni programi Comment[sq]=Programet e preferuara Comment[sr]=Омиљени програми Comment[sr@ijekavianlatin]=Омиљени програми Comment[sr@latin]=Омиљени програми Comment[sv]=Förvalda program Comment[th]=โปรแกรมที่ชอบ Comment[tr]=Tercih Edilen Uygulamalar Comment[uk]=Стандартні програми Comment[ur]=ترجیحی ایپلی کیشنز Comment[uz]=Танланган дастурлар 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[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; 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[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]=medios;predeterminado;aplicaciones;programas;extraíble;explorador;correo;email;calendario;música;vídeos;fotos;imágenes;cd;reproducción automática;favorito;apps; Keywords[es_AR]=medios;predeterminado;aplicaciones;programas;extraíble;explorador;correo;email;calendario;música;vídeos;fotos;imágenes;cd;reproducción automática;favorito;apps; Keywords[eu]=multimedia;lehenetsiak;aplikazioak;programak;aldagarria;arakatzailea;posta;egutegia;musika;bideoak;argazkiak;irudiak;cd;erreproduzitu automatikoki;gogokoak;app-ak; Keywords[fi]=media;oletukset;sovellukset;ohjelmat;poistettavat;selain;sähköposti;kalenteri;musiikki;videot;valokuvat;kuvat;cd;automaattitoisto;suosikki;sovellukset; Keywords[fr]=médias;défaut;applications;programmes;amovible;navigateur;e-mail;courriel;agenda;musique;vidéos;photos;images;cd;lecture automatique;favorites;applications; Keywords[fr_CA]=médias;défaut;applications;programmes;amovible;navigateur;e-mail;courriel;agenda;musique;vidéos;photos;images;cd;lecture automatique;favorites;applications; Keywords[he]=מדיה;ברירות מחדל;יישומים;תוכניות;ניתנים להסרה;דפדפן;אימייל;לוח שנה;מוזיקה;וידאו;תמונות;צילומים;CD;נגינה אוטומטית;מועדפים;יישומונים; 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;auto-reproduce;favorite;applicationes; 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[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[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[nl]=media;standaarden;toepassingen;programma's;verwijderbaar;webbrowser;email;kalender;muziek;video's;foto's;afbeeldingen;CD;automatisch afspelen;favoriet; 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]=media;predefinidos;aplicações;programas;removível;navegador;email;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[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[sr]=медија;подразумевано;апликације;програми;уклоњиво;прегледач;е-пошта;календар;музика;видео;фотографија;слике;цд;аутоматска репродукција;омиљено аплик; Keywords[sr@ijekavianlatin]=медија;подразумевано;апликације;програми;уклоњиво;прегледач;е-пошта;календар;музика;видео;фотографија;слике;цд;аутоматска репродукција;омиљено аплик; Keywords[sr@latin]=медија;подразумевано;апликације;програми;уклоњиво;прегледач;е-пошта;календар;музика;видео;фотографија;слике;цд;аутоматска репродукција;омиљено аплик; 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[zh_CN]=媒体,默认,应用程序,程序,可移动,浏览器,电子邮件,日历,音乐,视频,照片,图像,CD,自动播放,收藏,应用程序; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-desklets.desktop000066400000000000000000000226061360505115200277070ustar00rootroot00000000000000[Desktop Entry] Icon=cs-desklets Exec=cinnamon-settings desklets Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Desklets Name[am]=ዴስክሌቶች Name[ar]=التطبيقات المكتبية Name[az]=Qoyacaq uyğulamaları Name[be]=Дэсклеты Name[bg]=Десклети 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[eu]=Desklet-ak Name[fa]=دسک‌لت Name[fi]=Työpöytäsovelmat Name[ga]=Deiscíní Name[gl]=Trebellos Name[he]=יישומוני-שולחן-עבודה 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]=Werkbladmini's Name[pa]=ਡੈਸਕਲੇਟਸ Name[pl]=Desklety Name[pt]=Mini-aplicações Name[ro]=Deskleturi Name[ru]=Десклеты Name[sc]=Desklet Name[sk]=Desklety Name[sl]=Apleti namizja Name[sq]=Desklet-ët Name[sr]=Справице Name[sr@ijekavianlatin]=Справице Name[sr@latin]=Справице Name[sv]=Skrivbordsprogram Name[ta]=திரை நிரல்கள் Name[tg]=Барномаҳои мизи корӣ Name[th]=เดสก์เล็ต Name[tr]=Masaüstü Uygulamacıkları Name[uk]=Десклети Name[ur]=ڈیسکلیٹ Name[uz]=Десклетлар Name[vi]=Tiểu trình màn hình Name[zh_CN]=桌面小工具 Name[zh_HK]=桌面小工具 Name[zh_TW]=桌面小程式 Comment=Manage your Cinnamon desklets Comment[am]=የሲናሞን ዴስክሌትስ አስተዳዳሪ Comment[ar]=إدارة تطبيقات Cinnamon المكتبية الخاصة بك Comment[ast]=Alministra los tos desklets de Cinnamon Comment[az]=Öz "Cinnamon" qoyacaq uyğulamalarınızı yönəldin Comment[be]=Кiраванне дэсклетамi Cinnamon Comment[bg]=Управлявайте Вашите 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]=Rheolwch 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]=Administrar desklets de Cinnamon Comment[es_AR]=Administrar desklets de Cinnamon Comment[eu]=Kudeatu zure Cinnamon desklet-ak Comment[fa]=دسک‌لت‌های سینمون‌تان را مدیریت کنید Comment[fi]=Hallitse Cinnamon-sovelmia Comment[fr]=Gérez 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]=נהל את יישומוני-שולחן-העבודה של Cinnamo Comment[hr]=Upravljajte Cinnamon deskletima Comment[hu]=Cinnamon asztalkalmazások kezelése Comment[ia]=Administrar tu desklets de Cinnamon Comment[id]=Atur desklet Cinnamon Comment[is]=Sýsla með stillingar fyrir Cinnamon skjáborðsgræjur (desklets) Comment[it]=Gestione dei desklets di 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 werkbladmini's voor Cinnamon Comment[oc]=Gerir vòstres desklets Cinnamon Comment[pl]=Zarządaj swoimi deskletami Cinnamon Comment[pt]=Gerir as suas mini-aplicações do Cinnamon Comment[pt_BR]=Gerenciar seus desklets do Cinnamon Comment[ro]=Gestionează deskleturile Cinnamon Comment[ru]=Управление десклетами Cinnamon Comment[sc]=Manìgia sos desklet de Cinnamon tuos Comment[sk]=Spravuje vaše desklety prostredia Cinnamon Comment[sl]=Upravljajte z apleti namizja Cinnamona Comment[sq]=Menaxhoni desklet-ët tuaj në Cinnamon Comment[sr]=Управљање справицама Циметове површи Comment[sr@ijekavianlatin]=Управљање справицама Циметове површи Comment[sr@latin]=Управљање справицама Циметове површи 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]=Синнамон десклетларни бошқариш Comment[vi]=Quản lý tiểu dụng màn hình Cinnamon Comment[zh_CN]=管理桌面小工具 Comment[zh_HK]=管理你的 Cinnamon 桌面小工具 Comment[zh_TW]=管理您的 Cinnamon 桌面小程式 Keywords=desklet;desktop;slideshow; Keywords[am]=ዴስክሌት : ዴስክቶፕ : ተንሸራታች : ማሳያ; Keywords[ar]=التطبيقات المكتبية، سطح المكتب، عرض الشرائح; 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;sioesleidiau; Keywords[da]=skrivebordsprogram;skrivebord;slideshow; Keywords[de]=Desklet;Arbeitsfläche;Desktop;Schreibtisch;Diaschau;Diashow; Keywords[el]=εφαρμογές οθόνης;επιφάνεια εργασίας;προβολή διαφανειών; Keywords[eo]=labortablaĵo;labortablo;bildoprezento; Keywords[es]=desklet;escritorio;presentación de diapositivas; Keywords[es_AR]=desklet;escritorio;presentación de diapositivas; 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[hr]=desklet;radna površina;promjena pozadine; Keywords[hu]=asztalkalmazás;asztal;diavetítés; Keywords[ia]=desklet;scriptorio;presentation de photos; Keywords[is]=skjáborðsgræja;skjáborð;skyggnusýning; Keywords[ja]=デスクレット、デスクトップ、スライドショー; 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]=werkbladmini;bureaublad;diapresentatie; Keywords[pa]=ਡੈਸਕਲੇਟ;ਡੈਸਕਟਾੱਪ;ਸਲਾਇਡਸ਼ੋ; Keywords[pl]=desklet;pulpit;pokaz slajdów; Keywords[pt]=mini-aplicação;ambiente de trabalho;apresentação; Keywords[pt_BR]=desklet;área de trabalho;apresentação de slides; Keywords[ru]=десклет;рабочий стол;слайд-шоу; Keywords[sc]=desklet;iscrivania;presentatzione; Keywords[sk]=desklet;plocha;prezentácia; Keywords[sl]=aplet namizja;namizje;predstavitev; Keywords[sq]=desklet;desktop;prezantim; Keywords[sr]=справица;површ;покретни приказ; Keywords[sr@ijekavianlatin]=справица;површ;покретни приказ; Keywords[sr@latin]=справица;површ;покретни приказ; 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]=десклет;иш столи;слайд-шоу; Keywords[vi]=tiểu trình màn hình làm việc;màn hình làm việc;trình chiếu; Keywords[zh_CN]=桌面小工具、桌面、背景切换; Keywords[zh_HK]=桌面小工具;桌面;幻燈片; Keywords[zh_TW]=桌面小程式;桌面;幻燈片放映; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-desktop.desktop000066400000000000000000000223171360505115200275410ustar00rootroot00000000000000[Desktop Entry] Icon=cs-desktop Exec=cinnamon-settings desktop Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Desktop Name[am]=ዴስክቶፕ Name[ar]=سطح المكتب Name[ast]=Escritoriu Name[az]=İş qoyacağı Name[be]=Працоўны стол Name[bg]=Работен плот 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]=Työpöytä Name[fil]=Pook ng Likha Name[fr]=Bureau Name[fr_CA]=Bureau Name[ga]=Deasc Name[gl]=Escritorio Name[he]=שולחן-עבודה Name[hr]=Radna površina Name[hu]=Asztal Name[ia]=Scriptorio Name[ie]=Pupitre Name[is]=Skjáborð Name[ja]=デスクトップ Name[kab]=Tanarit Name[ko]=바탕화면 Name[ku]=Sermasê Name[lo]=ພື້ນທີ່ໜ້າຈໍ Name[lt]=Darbalaukis Name[lv]=Darbvirsma Name[nb]=Skrivebord Name[nl]=Bureaublad Name[oc]=Burèu Name[pa]=ਡੈਸਕਟਾਪ Name[pl]=Pulpit Name[pt]=Ambiente de trabalho Name[pt_BR]=Área de Trabalho Name[ru]=Рабочий стол Name[sc]=Iscrivania Name[sk]=Pracovná plocha Name[sl]=Namizje Name[sq]=Desktopi Name[sr]=Радна површ Name[sr@ijekavianlatin]=Радна површ Name[sr@latin]=Радна површ Name[sv]=Skrivbord Name[ta]=பணிமேடை Name[tg]=Мизи корӣ Name[th]=พื้นโต๊ะ Name[tl]=Pook ng likha Name[tr]=Masaüstü Name[uk]=Стільниця Name[ur]=ڈیسک ٹاپ Name[uz]=Иш столи Name[vi]=Màn hình làm việc Name[zh_CN]=桌面 Name[zh_HK]=桌面 Name[zh_TW]=桌面 Comment=Manage your desktop icons Comment[am]=የ ዴስክቶፕ ምልክቶች አስተዳዳሪ Comment[ar]=إدارة أيقونات سطح المكتب Comment[az]=İş qoyacağınızın simgələrini yönəldin Comment[be]=Наладзіць значкі на працоўным стале Comment[bg]=Управлявайте Вашите иконки на работния плот 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]=Rheolwch eiconau'ch bwrdd gwaith Comment[da]=Administrér dine skrivebordsikoner Comment[de]=Schreibtischsymbole verwalten Comment[el]=Διαχείριση εικονιδίων επιφάνειας εργασίας Comment[eo]=Administri viajn labortablajn piktogramojn Comment[es]=Administrar iconos del escritorio Comment[es_AR]=Administrar iconos del escritorio Comment[et]=Halda oma töölaua ikoone Comment[eu]=Kudeatu mahaigaineko ikonoak Comment[fa]=آیکن‌های دسکتاپ‌تان را مدیریت کنید Comment[fi]=Hallitse työpöydän kuvakkeita Comment[fr]=Gérez vos icones de bureaux Comment[fr_CA]=Gérer vos icônes du bureau Comment[gd]=Stiùirich ìomhaigheagan an deasga agad Comment[gl]=Xestiona as iconas do escritorio Comment[he]=נהל את הסמלים על שולחן העבודה 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[kab]=Sefrek taykunin n tnarit-inek Comment[ko]=바탕화면 아이콘을 관리합니다 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[oc]=Gerir las icònas de vòstre burèu Comment[pl]=Zarządzaj swoimi ikonami pulpitu Comment[pt]=Gerir os seus ícones Comment[pt_BR]=Gerenciar seus ícones da área de trabalho Comment[ro]=Gestionează pictogramele de pe desktop Comment[ru]=Настроить значки на рабочем столе 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@ijekavianlatin]=Управљање иконицама радне површи Comment[sr@latin]=Управљање иконицама радне површи Comment[sv]=Hantera dina skrivbordsikoner Comment[tg]=Идоракунии нишонаҳои мизи корӣ Comment[th]=จัดการไอคอนพื้นโต๊ะของคุณ Comment[tr]=Masaüstü simgelerini yönet Comment[uk]=Керування піктограмами стільниці Comment[ur]=ڈیسک ٹاپ کے آئکن کا انتظام کریں Comment[uz]=Иш столидаги расмчаларни бошқариш Comment[vi]=Quản lý biểu tượng màn hình của bạn Comment[zh_CN]=管理桌面图标 Comment[zh_HK]=管理你的桌面圖示 Comment[zh_TW]=管理您的桌面圖示 Keywords=desktop;home;button;trash; Keywords[am]=ዴስክቶፕ : ቤት : ቁልፍ : ቆሻሻ; Keywords[ar]=سطح المكتب، المجلد الرئيسي، الزر، سلة المهملات; Keywords[az]=iş qoyacağı;ev;düymə;çöplük; Keywords[be]=працоўны стол;дамой;кнопка;смецце; Keywords[bg]=Работен плот;домашна папка;бутон;кошче; 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[en_GB]=desktop;home;button;rubbish bin; Keywords[eo]=labortablo;hejmo;butono;rubujo; Keywords[es]=escritorio;casa;botón;papelera; Keywords[es_AR]=escritorio;casa;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[fr]=bureau;dossier personnel;bouton;corbeille;poubelle; Keywords[fr_CA]=bureau;index;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[hr]=radna površina;osobna mapa;tipka;smeće; Keywords[hu]=asztal;saját mappa;gomb;kuka; Keywords[ia]=scriptorio;domo;button;immunditia; Keywords[id]=desktop;rumah;tombol;tong sampah; Keywords[is]=skjáborð;heimamappa;hnappur;rusl; Keywords[it]=desktop. home;pulsante;cestino; Keywords[ja]=デスクトップ、ホーム、ボタン、ゴミ箱; 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[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]=spațiu de lucru;dosar personal;buton;gunoi; Keywords[ru]=рабочий стол;домашняя;кнопка;корзина; 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@ijekavianlatin]=површ;лично;дугме;смеће; Keywords[sr@latin]=површ;лично;дугме;смеће; Keywords[sv]=skrivbord;hem;knapp;papperskorg; Keywords[ta]=பணிமேடை;முகப்பு;பொத்தான்;குப்பை; Keywords[tg]=мизи корӣ;асосӣ;тугма;сабад; Keywords[th]=พื้นโต๊ะ;บ้าน;ปุ่ม;ถังขยะ; Keywords[tr]=masaüstü;ev;düğme;çöp kutusu; Keywords[uk]=стільниця;домівка;кнопка;смітник; Keywords[ur]=ڈیسک ٹاپ، ھوم، بٹن، ردی; Keywords[uz]=иш столи;асосий жилд;тугма;чиқиндилар қутиси; Keywords[vi]=màn hình làm việc;nhà;nút;thùng rác; Keywords[zh_CN]=desktop;home;button;trash;桌面;按钮;回收站;主目录; Keywords[zh_HK]=桌面;家目錄;按鈕;垃圾桶; Keywords[zh_TW]=桌面;家屋;按鍵;回收筒; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-effects.desktop000066400000000000000000000202271360505115200275050ustar00rootroot00000000000000[Desktop Entry] Icon=cs-desktop-effects Exec=cinnamon-settings effects Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Effects Name[am]=ውጤቶች Name[ar]=المؤثرات Name[ast]=Efeutos Name[az]=Etgilər Name[be]=Спецэфекты Name[bg]=Ефекти 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[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[kab]=Isemda Name[ko]=효과 Name[ku]=Efekt Name[lo]=ເອັບເຟັກ Name[lt]=Efektai Name[lv]=Efekti Name[ms]=Kesan Name[nb]=Effekter Name[nds]=Effekte Name[nl]=Effecten 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[sc]=Efetos Name[sk]=Efekty Name[sl]=Učinki Name[sq]=Efektet Name[sr]=Дејства Name[sr@ijekavianlatin]=Дејства Name[sr@latin]=Дејства Name[sv]=Effekter Name[ta]=விளைவுகள் Name[tg]=Таъсирҳо Name[th]=ลูกเล่น Name[tr]=Efektler Name[uk]=Ефекти Name[ur]=اثرات Name[uz]=Эффектлар Name[vi]=Hiệu ứng Name[zh_CN]=特效 Name[zh_HK]=效果 Name[zh_TW]=效果 Comment=Control Cinnamon visual effects. Comment[am]=የ ሲናሞን መመልከቻ ውጤቶች መቆጣጠሪያ Comment[ar]=التحكم في مؤثرات Cinnamon المرئية. 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 efectos visuales de Cinnamon Comment[es_AR]=Configurar efectos visuales de Cinnamon Comment[eu]=Kontrolatu Cinnamonen efektu bisualak Comment[fa]=جلوه‌های تصویری سینمون را کنترل کنید. Comment[fi]=Hallitse Cinnamonin ilmettä. Comment[fr]=Gérez 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]=שלוט באפקטים הוויזואלים של Cinnamo 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[kab]=Sefrek isemda imeẓriyen n Cinnamon Comment[ko]=시나몬 비주얼 효과를 조절합니다. 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[pl]=Kontroluj efekty wizualne Cinnamon. Comment[pt]=Controle os efeitos visuais do Cinnamon. Comment[pt_BR]=Controle os efeitos visuais do Cinnamon. Comment[ro]=Controlează efectele vizuale Cinnamon. Comment[ru]=Управление визуальными эффектами Cinnamon. Comment[sk]=Ovláda vizuálne efekty prostredia Cinnamon.s Comment[sl]=Upravljajte z vidnimi učinki Cinnamona. Comment[sq]=Efektet vizuale të Cinnamon. Comment[sr]=Управљање видним дејствима површи Цимета. Comment[sr@ijekavianlatin]=Управљање видним дејствима површи Цимета. Comment[sr@latin]=Управљање видним дејствима површи Цимета. 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]=Синнамоннинг визуал эффектларини назорат қилиш 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;fancy;window; Keywords[am]=ተፅእኖ: ማስጌጫ: መስኮት; Keywords[ar]=المؤثرات، الخيالي، النافذة; Keywords[az]=etgilər;düşsəl;pəncərə; Keywords[be]=эфекты;фантазія;акно; Keywords[bg]=ефекти;декорации;прозорец; Keywords[bs]=efekti;fantazija;prozor; Keywords[ca]=efectes;fantasia;finestra; Keywords[ca@valencia]=efectes;fantasia;finestra; Keywords[cs]=efekty;rozmar;okno; Keywords[cy]=effeithiau;ffansi;ffenestr; Keywords[da]=effekter;smart;vindue; Keywords[de]=Effekte;Ausgefallen;Fenster; Keywords[el]=εφέ;παράθυρο;παράθυρα; Keywords[eo]=efektoj;delikate;fenestro; Keywords[es]=efectos;fantasía;ventana; Keywords[es_AR]=efectos;fantasía;ventana; Keywords[eu]=efektuak;dotore;leihoa; Keywords[fa]=جلوه‌ها، تصویر، پنجره; Keywords[fi]=tehosteet;koristeellinen;ikkuna; Keywords[fr]=effets;fantaisie;fenêtre; Keywords[fr_CA]=effets;fantaisie;fenêtre; Keywords[ga]=maisíochtaí;galanta;fuinneoga; Keywords[gd]=buaidhean;èifeachdan;leòmach;uinneag;effects;fancy;window; Keywords[gl]=efectos;fantasía;xanela; Keywords[he]=אפקט;מהודר;חלון; Keywords[hr]=efekti;ukrašeno;prozor; Keywords[hu]=effektusok;díszes;ablak; Keywords[ia]=effectos;eccentric;fenestra; Keywords[id]=efek;kesenangan;jendela; Keywords[is]=brellur;skraut;gluggi; Keywords[it]=effetti;fantasia;finestra; Keywords[ja]=効果、ファンシー、ウィンドウ; Keywords[kab]=isemduyen;axayel;asfaylu; Keywords[ko]=효과;팬시;창; Keywords[lo]=ເອັບເຟັກ;fancy;ໜ້າຕ່າງ; Keywords[lt]=efektai;papuošimai;langas; Keywords[lv]=efekti;moderns;logs; Keywords[ms]=kesan;ragam;tetingkap; Keywords[nb]=effekter;fiffig;vindu; Keywords[nds]=Effekte;Fantasie;Fenster; Keywords[nl]=effecten;verfraaid;venster; Keywords[om]=galteelee;miidhagaa;foddaa; Keywords[pl]=efekty;fantazyjne;okno; Keywords[pt]=efeitos;especiais;janela; Keywords[pt_BR]=efeitos;extravagante;janela; Keywords[ro]=efecte;fantezie;fereastră; Keywords[ru]=эффекты;фантазия;окно; Keywords[sk]=efekty;fantázia;okná; Keywords[sl]=učinki;modno;okno; Keywords[sq]=efektet;zbukuruar;dritarja; Keywords[sr]=утисци;прозор;лепо;; Keywords[sr@ijekavianlatin]=утисци;прозор;лепо;; Keywords[sr@latin]=утисци;прозор;лепо;; Keywords[sv]=effekter;infall;fönster; Keywords[ta]=விளைவுகள்;பகட்டு;சாளரம்; Keywords[tg]=таъсирҳо;ҳаёл;равзана; Keywords[th]=ลักษณะพิเศษ;แฟนซี;หน้าต่าง; Keywords[tr]=efekt;süs;pencere; Keywords[uk]=ефекти;фантазія;вікно; Keywords[ur]=اثرات، فینسی(fancy)، ونڈو; Keywords[uz]=эффектлар;кулгили;ойна; Keywords[vi]=hiệu ứng;đẹp đẽ;cửa sổ; Keywords[zh_CN]=effects;fancy;window;效果;特效;窗口; Keywords[zh_HK]=效果;花式;視窗; Keywords[zh_TW]=效果;花樣;視窗; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-extensions.desktop000066400000000000000000000174011360505115200302650ustar00rootroot00000000000000[Desktop Entry] Icon=cs-extensions Exec=cinnamon-settings extensions Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Extensions Name[am]=ተጨማሪዎች Name[ar]=الملحقات Name[ast]=Estensiones Name[az]=Uzantılar Name[be]=Пашырэнні Name[bg]=Разширения 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[ga]=Iarmhíreanna Name[gd]=Leudachain Name[gl]=Extensións Name[he]=תוספות Name[hr]=Proširenja Name[hu]=Kiterjesztések Name[ia]=Extensiones Name[id]=Ekstensi Name[ie]=Extensiones Name[is]=Viðbætur Name[it]=Estensioni Name[ja]=拡張機能 Name[kab]=Isiɣzifen Name[ko]=확장 프로그램 Name[ku]=Pêvek Name[lo]=ສ່ວນຂະຫຍາຍ Name[lt]=Plėtiniai Name[lv]=Papildinājumi Name[ms]=Sambungan Name[nb]=Utvidelser Name[nds]=Erweiterungen Name[nl]=Extensies Name[pa]=ਐਕਸਟੈਂਸ਼ਨਾਂ Name[pl]=Rozszerzenia Name[pt]=Extensões Name[pt_BR]=Extensões Name[ro]=Extensii Name[ru]=Расширения Name[sc]=Estensiones Name[sk]=Rozšírenia Name[sl]=Razširitve Name[sq]=Prapashtesat Name[sr]=Проширења Name[sr@ijekavianlatin]=Проширења Name[sr@latin]=Proširenja Name[sv]=Tillägg Name[ta]=நீட்சிகள் Name[tg]=Пасвандҳо Name[th]=ส่วนขยาย Name[tr]=Eklentiler Name[uk]=Розширення Name[ur]=ایکس ٹینشنز Name[uz]=Кенгайтмалар Name[vi]=Phần mở rộng Name[zh_CN]=扩展 Name[zh_HK]=擴充套件 Name[zh_TW]=擴充套件 Comment=Manage your Cinnamon extensions Comment[am]=የ ሲናሞን ተጨማሪዎች አስተዳዳሪ Comment[ar]=إدارة ملحقات Cinnamon Comment[ast]=Alministra les tos estensiones Cinnamon Comment[az]=Öz "Cinnamon" uzantılarınızı yönəldin Comment[be]=Кiраванне пашырэннямi Cinnamon Comment[bg]=Управление на Вашите разширения за 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]=Rheolwch 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]=Administrar extensiones de Cinnamon Comment[es_AR]=Administrar extensiones de Cinnamon Comment[eu]=Kudeatu zure Cinnamon hedapenak Comment[fa]=ضمیمه‌های سینمون‌تان را مدیریت کنید Comment[fi]=Hallitse Cinnamon-laajennuksia Comment[fr]=Gérez vos extensions Cinnamon Comment[fr_CA]=Gérer les extensions Cinnamon Comment[gd]=Stiùirich na leudachain Cinnamon agad Comment[gl]=Administra os engadidos de Cinnamon Comment[he]=נהל את התוספות של Cinnamo Comment[hr]=Upravljajte svojim Cinnamon proširenjima Comment[hu]=Cinnamon kiterjesztések kezelése Comment[ia]=Administrar tu extensiones de Cinnamon Comment[id]=Pengaturan extensions Cinnamon Comment[is]=Sýsla með stillingar fyrir Cinnamon viðbætur Comment[it]=Gestisci le estensioni di 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[oc]=Gerir vòstras extensions de Cinnamon Comment[pl]=Zarządzaj swoimi rozszerzeniami Cinnamon Comment[pt]=Gerir as suas extensões do Cinnamon Comment[pt_BR]=Gerenciar suas extensões do Cinnamon Comment[ro]=Gestionează extensiile tale Cinnamon Comment[ru]=Управление расширениями 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@ijekavianlatin]=Управљање проширењима Цимета Comment[sr@latin]=Upravljanjе proširеnjima Cimеta 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]=Синнамон кенгайтмаларини бошқариш Comment[vi]=Quản lý phần mở rộng Cinnamon Comment[zh_CN]=扩展管理 Comment[zh_HK]=管理你的 Cinnamon 擴充套件 Comment[zh_TW]=管理您的 Cinnamon 擴充套件 Keywords=extension;addon; Keywords[am]=ተጨማሪ መጨመሪያ; Keywords[ar]=الملحق، الإضافة; Keywords[ast]=estensión;addon;amiestu; Keywords[az]=uzantılar;artırma; Keywords[be]=пашырэнне;дадатак; Keywords[bg]=разширение;добавка; 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[eu]=hedapena;gehigarria; Keywords[fa]=ضمیمه، افزونه; Keywords[fi]=laajennus;liitännäinen; Keywords[fr]=extension;add-on; Keywords[fr_CA]=extension;add-on; Keywords[ga]=iarmhír;forlíontán; Keywords[gd]=leudachan;tuilleadain;extension;addon; Keywords[gl]=extensión;engadido; Keywords[he]=תוספות;תוספים; 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]=拡張機能、アドオン; 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[pl]=rozszerzenie;dodatek; Keywords[pt]=extensão;extra; Keywords[pt_BR]=extensão;complemento; Keywords[ro]=extensie;supliment; Keywords[ru]=расширение;дополнение; Keywords[sk]=rozšírenie;doplnok; Keywords[sl]=razširitev;dodatek; Keywords[sq]=prapashtesa;shtesë; Keywords[sr]=проширење;додатак; Keywords[sr@ijekavianlatin]=проширење;додатак; Keywords[sr@latin]=proširеnjе;dodatak; Keywords[sv]=utökning;tillägg; Keywords[ta]=நீட்சி; Keywords[tg]=пасванд;барномаи иловагӣ; Keywords[th]=ส่วนขยาย;ส่วนเสริม; Keywords[tr]=eklenti; Keywords[uk]=розширення;додаток; Keywords[ur]=ایکسٹینشن، ایڈ آن; Keywords[uz]=кенгайтма;қўшимча; Keywords[vi]=phần mở rộng;gắn thêm; Keywords[zh_CN]=extension;addon;扩展;附加; Keywords[zh_HK]=擴充套件;附加元件; Keywords[zh_TW]=擴充套件;附加套件; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-fonts.desktop000066400000000000000000000213401360505115200272140ustar00rootroot00000000000000[Desktop Entry] Icon=cs-fonts Exec=cinnamon-settings fonts Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Font Selection Name[am]=የ ፊደል ምርጫዎች Name[ar]=تحديد الخط Name[ast]=Esbilla de fonte Name[az]=Yazı biçiminin Seçimi Name[be]=Выбар шрыфта Name[bg]=Избор на шрифт 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 tipos de letra Name[es_AR]=Selección de tipos de letra Name[et]=Kirjatüübi valik Name[eu]=Letra-tipoen hautapena Name[fa]=انتخاب فونت Name[fi]=Fonttien valinta Name[fr]=Sélection de polices Name[fr_CA]=Sélection de police Name[gd]=Taghadh a' chrutha-chlò Name[gl]=Selección de tipos de letra Name[he]=בחירת גופן Name[hr]=Odabir slova Name[hu]=Betűkészlet kiválasztása Name[ia]=Selection del typo de characteres Name[id]=Pilihan Font Name[ie]=Selection de fonde Name[is]=Velja letur Name[it]=Selezione carattere Name[ja]=フォントの選択 Name[kab]=Tafrayt n tsefsit Name[ko]=글꼴 선택 Name[ku]=Hilbijartina Curetîpan Name[lo]=ການເລືອກຟອນ Name[lt]=Šriftų pasirinkimas Name[lv]=Fontu izvēle Name[ms]=Pemilihan Font Name[nb]=Skriftvalg Name[nds]=Schriftart auswählen Name[nl]=Lettertypeselectie Name[oc]=Selector de poliças Name[pl]=Wybór czcionki Name[pt]=Seleção de Tipo de Letra Name[pt_BR]=Seleção de fonte Name[ro]=Selecție fonturi Name[ru]=Выбор шрифтов Name[sc]=Seletzione caràteres Name[sk]=Výber písma Name[sl]=Izbira pisave Name[sq]=Zgjedhja e shkronjave Name[sr]=Избор фонта Name[sr@ijekavianlatin]=Избор фонта Name[sr@latin]=Избор фонта Name[sv]=Typsnittsval Name[ta]=எழுத்துரு தேர்வு Name[th]=การเลือกแบบอักษร Name[tr]=Yazıtipi Seçimi Name[uk]=Вибір шрифту Name[ur]=فونٹ انتخاب Name[uz]=Шрифтларни танлаш Name[vi]=Chọn Kiểu chữ Name[zh_CN]=选择字体 Name[zh_HK]=字型選擇 Name[zh_TW]=字型選擇 Comment=Configure system fonts Comment[am]=የ ስርአቱን ፊደል ማሰናጃ Comment[ar]=تكوين خطوط النظام Comment[ast]=Configura les fontes del sistema Comment[az]=Qurmaca yazı biçimlərini qur Comment[be]=Наладзіць сістэмныя шрыфты Comment[bg]=Конфигуриране на системни шрифтове 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]=Ffurfweddwch ffontiau'r system Comment[da]=Konfigurér systemskrifttyper Comment[de]=Systemschriften konfigurieren Comment[el]=Ρύθμιση γραμματοσειράς συστήματος Comment[eo]=Agordi sistemtiparojn Comment[es]=Administrar tipos de letra del sistema Comment[es_AR]=Administrar tipos de letra del sistema Comment[eu]=Konfiguratu sistemaren letra-tipoak Comment[fa]=تنظیم فونت‌های سیستم Comment[fi]=Hallitse järjestelmän fontteja 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[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 font Comment[is]=Stilla kerfisletur Comment[it]=Configura il carattere di sistema Comment[kab]=Seɣwer tisefsa n unagraw Comment[ko]=시스템 글꼴 설정 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[pl]=Konfiguracja czcionek systemu Comment[pt]=Configurar fontes do sistema Comment[pt_BR]=Configurar fontes do sistema Comment[ro]=Configurează fonturile sistemului Comment[ru]=Настроить системные шрифты 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@ijekavianlatin]=Подешавање слова система Comment[sr@latin]=Подешавање слова система Comment[sv]=Konfigurera systemets typsnitt Comment[tg]=Танзимоти шрифтҳои низомвӣ Comment[th]=กำหนดแบบอักษรของระบบ Comment[tr]=Sistem yazı tiplerini yapılandır Comment[uk]=Налаштування системних шрифтів Comment[ur]=نظام کے فونٹ کو تشکیل دیں Comment[uz]=Тизим шрифтларини созлаш 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[am]=የ ፊደል መጠን: ትንሽ: ትልቅ; Keywords[ar]=الخط، الحجم، صغير، كبير; Keywords[ast]=fonte;tamañu;pequeñu;grande;lletra;lletres;fontes; Keywords[az]=yazı biçimi;kiçik;geniş; Keywords[be]=шрыфт;памер;маленькі;вялікі; Keywords[bg]=шрифт;размер;малък;голям; 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]=tipo de letra;tamaño;pequeño;grande; Keywords[es_AR]=tipo de letra;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[fr]=police;taille;petit;grand; Keywords[fr_CA]=police;taille;petit;grand; 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[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]=huruf;ukuran;kecil;besar; Keywords[is]=letur;stærð;lítið;stórt; Keywords[it]=carattere;dimensione;piccolo;grande; Keywords[ja]=フォント、サイズ、小さく、大きく; 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[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[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@ijekavianlatin]=писмо;слова;фонт;величина;мало;велико; Keywords[sr@latin]=писмо;слова;фонт;величина;мало;велико; 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]=шрифт;ўлчам;кичкина;катта; 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-4.4.8/files/usr/share/applications/cinnamon-settings-general.desktop000066400000000000000000000144101360505115200275000ustar00rootroot00000000000000[Desktop Entry] Icon=cs-general Exec=cinnamon-settings general Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=General Name[am]=ባጠቃላይ Name[ar]=عام Name[ast]=Xeneral Name[az]=Toplam Name[be]=Агульны Name[bg]=Общи Name[bs]=Opšte Name[cs]=Obecné Name[cy]=Arferol 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[hr]=Općenito Name[hu]=Általános Name[id]=Umum Name[is]=Almennt Name[it]=Generali Name[ja]=一般 Name[kab]=Amatu Name[ko]=일반 Name[ku]=Giştî Name[lo]=ທົ່ວໄປ Name[lt]=Bendra Name[lv]=Vispārīgi Name[ms]=Am Name[nb]=Generelt Name[nds]=Allgemein Name[nl]=Algemeen Name[om]=Waliigala Name[pa]=ਸਧਾਰਨ Name[pl]=Ogólne Name[pt]=Geral Name[pt_BR]=Geral Name[ru]=Общие Name[sc]=Generale Name[sk]=Všeobecné Name[sl]=Splošno Name[sq]=Të përgjithshme Name[sr]=Опште Name[sr@ijekavianlatin]=Опште Name[sr@latin]=Опште Name[sv]=Allmänt Name[ta]=பொது Name[tg]=Умумӣ Name[th]=ทั่วไป Name[tr]=Genel Name[uk]=Загальні Name[ur]=عمومی Name[uz]=Умумий Name[vi]=Tổng quát Name[zh_CN]=常规 Name[zh_HK]=一般 Name[zh_TW]=一般 Comment=Miscellaneous Cinnamon preferences Comment[am]=የተለያዩ የ ሲናሞን ምርጫዎች Comment[ar]=تفضيلات Cinnamon المتنوعة 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[es]=Preferencias diversas de Cinnamon Comment[es_AR]=Preferencias diversas de Cinnamon Comment[eu]=Askotariko Cinnamon hobespenak Comment[fa]=گزینه‌های گوناگون سینمون Comment[fi]=Sekalaisia Cinnamonin asetuksia Comment[fr]=Préférences diverses de Cinnamon Comment[fr_CA]=Autres préférences pour Cinnamon Comment[gd]=Measgachadh de roghainnean Cinnamon Comment[gl]=Preferencias variadas para Cinnamon Comment[he]=הגדרות Cinnamon נוספות 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[kab]=Ixtiriyen yemgarasen n Cinnamon Comment[ko]=그밖의 시나몬설정 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[oc]=Preferéncias divèrsas de Cinnamon Comment[pl]=Różne preferencje Cinnamon Comment[pt]=Preferências diversas do Cinnamon Comment[pt_BR]=Preferências diversas do Cinnamon Comment[ro]=Alte preferințe Cinnamon Comment[ru]=Различные настройки 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@ijekavianlatin]=Разне поставке Цимета Comment[sr@latin]=Разне поставке Цимета 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]=Синнамоннинг турли хилдаги параметрлари Comment[vi]=Tuỳ thích Cinnamon linh tinh Comment[zh_CN]=其他Cinnamon偏好设置 Comment[zh_HK]=Cinnamon 雜項喜好設定 Comment[zh_TW]=其他 Cinnamon 偏好設定 Keywords=logging;click; Keywords[am]=በ መግባት ላይ: ይጫኑ; Keywords[ar]=تسجيل الدخول، النقر; Keywords[az]=giriş;tık; 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[es]=identificarse;clic; Keywords[es_AR]=identificarse;clic; Keywords[eu]=saioa-hastea;klik; 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[hr]=prijava;klik; Keywords[hu]=naplózás;kattintás; Keywords[ia]=connexion;clic; Keywords[id]=logging;klik; Keywords[is]=annáll;smella; Keywords[kab]=Anekcum;Senned; Keywords[ko]=로그 기록하기;클릭; Keywords[lt]=registravimas;spustelėjimas; Keywords[ms]=mengelog;klik; Keywords[nb]=logging;klikk; Keywords[nds]=Protokollieren;Klicken; Keywords[nl]=logboek bijhouden;klik; Keywords[pl]=logowanie;klik; Keywords[pt]=registo;carregue em; Keywords[pt_BR]=registrando;clique; Keywords[ro]=jurnalizare;clic; Keywords[ru]=вход в систему;клик; Keywords[sk]=prihlasovanie;kliknutie; Keywords[sl]=beleženje;klik; Keywords[sr]=пријава;клик; Keywords[sr@ijekavianlatin]=пријава;клик; Keywords[sr@latin]=пријава;клик; Keywords[sv]=loggning;klick; Keywords[th]=บันทึก;คลิก; Keywords[tr]=günlük kaydı;tıkla; Keywords[uk]=Увійти;натисніть; Keywords[ur]=لاگنگ، کلک; Keywords[uz]=журналга ёзиш;сичқон тугмасини босиш; Keywords[vi]=ghi nhật trình;nhấp; Keywords[zh_CN]=日志记录,点击; Keywords[zh_HK]=記錄;點選; Keywords[zh_TW]=記錄;點擊; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-hotcorner.desktop000066400000000000000000000226251360505115200300750ustar00rootroot00000000000000[Desktop Entry] Icon=cs-overview Exec=cinnamon-settings hotcorner Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Hot Corners Name[am]=ጠርዞች Name[ar]=الزوايا الساخنة 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[es]=Esquinas activas Name[es_AR]=Esquinas activas Name[et]=Abistavad nurgad Name[eu]=Izkina beroak Name[fi]=Toimintokulmat 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[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[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[pl]=Aktywne narożniki Name[pt]=Locais de ativação Name[pt_BR]=Cantos de Atalho Name[ro]=Colțuri sensibile Name[ru]=Горячие углы Name[sc]=Chirros ativos Name[sk]=Aktívne rohy Name[sl]=Vroči koti Name[sq]=Këndet aktivë Name[sr]=Вруће ивице Name[sr@ijekavianlatin]=Вруће ивице Name[sr@latin]=Вруће ивице Name[sv]=Aktiva hörn Name[tg]=Кунҷҳои тез Name[th]=ฮอตคอร์เนอร์ Name[tr]=Etkin Köşeler Name[uk]=Гарячі кути Name[ur]=ہاٹ کونے Name[uz]=Уйғоқ Бурчаклар Name[vi]=Góc nóng Name[zh_CN]=热区 Name[zh_TW]=熱角 Comment=Manage hotcorner settings Comment[am]=የ ትኩስ ጠርዞች ማሰናጃ አስተዳዳሪ Comment[ar]=إداره إعدادات الزاوية الساخنة 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]=Rheolwch osodiadau y gornel boeth Comment[da]=Administrér indstillinger for aktive hjørner Comment[de]=Einstellungen der aktiven Ecken verwalten Comment[el]=Ρυθμίστε τις ενεργές γωνίες Comment[es]=Administrar configuración de esquinas activas Comment[es_AR]=Administrar configuración de esquinas activas Comment[eu]=Kudeatu izkina beroen ezarpenak Comment[fi]=Muuta toimintonurkkien asetuksia Comment[fr]=Gérez 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[hr]=Upravljajte postavkama kutova zaslona Comment[hu]=Érzékeny sarok beállítása Comment[ia]=Administra le preferentias 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[oc]=Gerissètz los paramètres dels caires intelligents Comment[pl]=Zarządzaj ustawieniami aktywnego narożnika Comment[pt]=Gerir as definições dos cantos Comment[pt_BR]=Gerenciar as definições dos cantos Comment[ro]=Gestionează setările colțurilor sensibile Comment[ru]=Управление настройками горячих углов 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@ijekavianlatin]=Управљање подешавањима врућих ивица Comment[sr@latin]=Управљање подешавањима врућих ивица 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]=Уйғонган ҳолатдаги бурчаклар (hotcorner, горячие углы) ни бошқариш Comment[vi]=Quản lý thiết đặ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]=الزاوية الساخنة، نظرة عامة، التحجيم، Expo; 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;Hotcorner;Übersicht;Fensterübersicht;Scale;Schreibtischübersicht;Arbeitsflächenübersicht;Expo; Keywords[el]=ενεργή γωνία;επισκόπηση;κλίμακα;expo; Keywords[es]=esquina activa;vista general;escala;expo; Keywords[es_AR]=esquina activa;vista general;escala;expo; Keywords[eu]=izkina beroa;ikuspegi orokorra;eskala;expo; Keywords[fi]=toimintokulma;yleiskuva;levitysnäkymä;esittelynäkymä; 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[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]=ホットコーナー、外観、スケール、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[ms]=bucu panas;selayang pandang;skala;ekspo; Keywords[nb]=aktiv hjørne;overblikk;skaler;expo; Keywords[nds]=Hotcornor;Übersicht;Skalierung;EXPO; Keywords[nl]=actieve hoek;overzicht;schalen;expo; Keywords[pl]=aktywny narożnik;przegląd;skala;ekspozycja; Keywords[pt]=local;resumo;escala;expo; Keywords[pt_BR]=canto de atalho;visão geral;escala;modo expo; Keywords[ro]=colț sensibil;prezentare generală;scală;expo; Keywords[ru]=горячий угол;обзор;масштабирование;экспозиция; Keywords[sk]=aktívny roh;prehľad;mierka;expo; Keywords[sl]=vroči kot;pregled;umeri;razstava; Keywords[sr]=врућа ивица;преглед;распростирање;размеравање; Keywords[sr@ijekavianlatin]=врућа ивица;преглед;распростирање;размеравање; Keywords[sr@latin]=врућа ивица;преглед;распростирање;размеравање; 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]=уйғоқ бурчаклар;аввалдан кўриш;масштаб;экпо; 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-4.4.8/files/usr/share/applications/cinnamon-settings-info.desktop000066400000000000000000000262671360505115200270330ustar00rootroot00000000000000[Desktop Entry] Icon=cs-details Exec=cinnamon-settings info Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=System Info Name[am]=የ ስርአት መረጃ Name[ar]=معلومات النظام Name[ast]=Información del sistema Name[az]=Qurmaca Bilgisi Name[be]=Сістэмная інфармацыя Name[bg]=Информация за системата Name[bs]=Informacije o sistemu Name[ca]=Informació del sistema Name[ca@valencia]=Informació del sistema Name[cs]=Informace o systému Name[cy]=Mnylion 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[fi]=Järjestelmätiedot Name[fr]=Information système Name[fr_CA]=Information système Name[ga]=Faisnéis Córais Name[gd]=Fiosrachadh mun t-siostam Name[gl]=Información do sistema Name[he]=מידע על המערכת 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[kab]=Talɣut ɣef unagraw Name[ko]=시스템 정보 Name[ku]=Agahiyên pergalî Name[lo]=ຂໍ້ມູນລະບົບ Name[lt]=Sistemos informacija Name[lv]=Sistēmas informācija Name[ms]=Maklumat Sistem Name[nb]=Systeminformasjon Name[nds]=Systeminformationen Name[nl]=Systeeminformatie 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[sc]=Info de sistema Name[sk]=Systémové informácie Name[sl]=Sistemski podatki Name[sq]=Informacione mbi sistemin Name[sr]=Подаци о систему Name[sr@ijekavianlatin]=Подаци о систему Name[sr@latin]=Подаци о систему Name[sv]=Systeminformation Name[ta]=கணினி தகவல் Name[tg]=Иттилооти низом Name[th]=ข้อมูลระบบ Name[tr]=Sistem Bilgisi Name[uk]=Інформація про систему Name[ur]=سسٹم معلومات Name[uz]=Тизим ҳақида маълумот Name[vi]=Thông tin Hệ thống Name[zh_CN]=系统信息 Name[zh_HK]=系統資訊 Name[zh_TW]=系統資訊 Comment=Display system information Comment[am]=የ ስርአቱን መረጃ ማሳያ Comment[ar]=عرض معلومات النظام Comment[az]=Qurmaca bilgisini göstər Comment[be]=Паказаць сістэмная інфармацыю Comment[bg]=Показване на данни за системата 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[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[fi]=Näytä järjestelmätiedot Comment[fr]=Afficher les informations du système Comment[fr_CA]=Afficher les informations du système Comment[gd]=Seall fiosrachadh mun t-siostam Comment[gl]=Amosar a información do sistema Comment[he]=הצג מידע על המערכת 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[kab]=Sken talɣut ɣef unagraw Comment[ko]=시스템 정보 표시 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[oc]=Afichar las informacions del sistèma Comment[pl]=Wyświetlaj informacje systemowe Comment[pt]=Mostrar a informação do sistema Comment[pt_BR]=Exibir informações do sistema Comment[ro]=Arată informații despre sistem Comment[ru]=Отображать информацию о системе 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@ijekavianlatin]=Прикажи податке о систему Comment[sr@latin]=Прикажи податке о систему Comment[sv]=Visa systeminformation Comment[tg]=Намоиш додани иттилооти низом Comment[th]=แสดงข้อมูลระบบ Comment[tr]=Sistem bilgisini göster Comment[uk]=Показати системну інформацію Comment[ur]=سسٹم معلومات دکھائیں Comment[uz]=Тизим ҳақидаги маълумотларни кўрсатиш 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; Keywords[am]=ስርአት : መረጃ : ዝርዝር : ንድፍ : ድምፅ : kernel;እትም; Keywords[ar]=النظام، معلومات، التفاصيل، العرض، الصوت، النواة، الإصدار; Keywords[ast]=sistema;información;gráficu;soníu;kernel;versión; Keywords[az]=qurmaca;bilgi;ayrıntılar;görüntü;səs;özək;sürüm; Keywords[be]=сістэма;інфармацыя;падрабязнасці;графіка;гук;ядро;версія; Keywords[bg]=система;информация;детайли;графика;звук;ядро;версия; Keywords[bs]=sistem;informacije;detalji;grafika;zvuk;kernel;verzija; Keywords[ca]=sistema;informació;detalls;gràfics;so;kernel;versió; Keywords[ca@valencia]=sistema;informació;detalls;gràfics;so;kernel;versió; Keywords[cs]=systém;informace;podrobnosti;grafika;zvuk;jádro;verze; Keywords[cy]=system;gwybodaeth;manylion;graffigau;sain;cnewyllyn;fersiwn; Keywords[da]=system;information;detaljer;grafik;lyd;kerne;version; Keywords[de]=System;Informationen;Details;Grafik;Sound-Karte;Kernel;Version; Keywords[el]=σύστημα;πληροφορίες;λεπτομέρειες;γραφικά;ήχος;πυρήνας;έκδοση; Keywords[es]=sistema;información;detalles;gráficos;sonido;nucleo;versión; Keywords[es_AR]=sistema;información;detalles;gráficos;sonido;nucleo;versión; Keywords[et]=süsteem;info;detailid;graafika;heli;kernel;versioon; Keywords[eu]=sistema;informazioa;xehetasunak;grafikoak;soinua;kernela;bertsioa; Keywords[fi]=järjestelmä;tietoja;yksityiskohdat;grafiikka;ääni;ydin;versio; Keywords[fr]=système;information;détails;graphique;son;noyau;version; Keywords[fr_CA]=système;information;détails;graphique;son;noyau;version; Keywords[ga]=córas;eolas;sonraí;grafach;fuaim;eithne;leagan; Keywords[gd]=siostam;fiosrachadh;mion-fhiosrachadh;grafaigeach;fuaim;eitean;tionndadh;system;information;details;graphic;sound;kernel;version; Keywords[gl]=sistema;información;detalles;gráficos;son;núcleo;versión; Keywords[he]=מערכת;מידע;פרטים;גרפיקה;קול;ליבה;גירסא; Keywords[hr]=sustav;informacija;pojedinosti;grafika;zvuk;kernel;inačica; Keywords[hu]=rendszer;információk;részletek;grafika;hang;kernel;verzió; Keywords[ia]=systema;informationes;detalios;graphic;sono;kernel;version; Keywords[id]=sistem;informasi;detailm grafis;suara;kernel;versi; Keywords[is]=kerfi;upplýsingar;nánar;myndrænt;hljóð;kjarni;útgáfa; Keywords[it]=sistema;informazione;dettagli;grafica;suono;kernel;versione; Keywords[ja]=システム、情報、詳細、グラフィック、音、カーネル、バージョン; Keywords[kab]=anagraw;isalli;ttfaṣil;udlif;imesli;abeεεa;taḍrist; Keywords[ko]=시스템;정보;세부사항;그래픽;사운드;커널;버전; Keywords[lo]=ລະບົບ;ຂໍ້ມູນ;ລາຍລະອຽດ;ຮູບພາບ;ສຽງ;ເຄີເນວ;ລູ້ນ; Keywords[lt]=sistema;informacija;grafika;garsas;branduolys;versija; Keywords[lv]=sistēma;informācija;detaļas;grafika;skaņa;kodols;versija; Keywords[ms]=sistem;maklumat;terperinci;grafik;bunyi;kernel;versi; Keywords[nb]=system;informasjon;detaljer;grafikk;lyd;kjerne;versjon; Keywords[nds]=System;Information;Details;Grafik;Audio;Kernel;Version; Keywords[nl]=systeem;informatie;details;grafisch;geluid;kernel;versie; Keywords[om]=sirna;odeeffannoo;bal'inaalee;saxaatoo;sagalee;kerneelii;bahiinsa; Keywords[pl]=system;informacja;szczegóły;grafika;dźwięk;jądro;wersja; Keywords[pt]=sistema;informações;detalhes;objetos;som;kernel;versão; Keywords[pt_BR]=sistema;informação;detalhes;gráficos;som;kernel;versão; Keywords[ro]=sistem;informații;detalii;grafică;sunet;kernel;versiune; Keywords[ru]=система;информация;подробности;графика;звук;ядро;версия; Keywords[sc]=sistema;informatziones;particulares;gràfica;sonu;kernel;versione; Keywords[sk]=systém;informácie;podrobnosti;grafika;hudba;jadro;verzia; Keywords[sl]=sistem;podatki;podrobnosti;grafika;zvok;jedro;različica; Keywords[sq]=sistemi;informacione;detaje;grafika;zëri;kernel;versioni; Keywords[sr]=систем;обавештење;појединости;графика;звук;кернел;издање;подаци; Keywords[sr@ijekavianlatin]=систем;обавештење;појединости;графика;звук;кернел;издање;подаци; Keywords[sr@latin]=систем;обавештење;појединости;графика;звук;кернел;издање;подаци; Keywords[sv]=system;information;detaljer;grafik;ljud;kärna;version; Keywords[ta]=கணினி;தகவல்;விவரங்கள்;வரைகலை;ஒலி;கர்னல்;பதிப்பு; Keywords[tg]=низом;иттилоот;тафсилот;графика;садо;ҳаста;гуна; Keywords[th]=ระบบ;ข้อมูล;รายละเอียด;กราฟิก;เสียง;เคอร์เนล;รุ่น; Keywords[tr]=sistem;bilgi;ayrıntılar;grafik;ses;çekirdek;sürüm; Keywords[uk]=система;інформація;подробиці;графіка;звук;ядро;версія; Keywords[ur]=سسٹم، معلومات، تفصیل، گرافکس، آواز، کرنل، ورژن، تفصیلات; Keywords[uz]=тизим;маълумот;тафсилотлар;график;товуш;ядро;версия; Keywords[vi]=hệ thống;thông tin;chi tiết;đồ hoạ;âm thanh;nhân;phiên bản; Keywords[zh_CN]=system;information;details;graphic;sound;kernel;version;系统;信息;详情;细节;图形;声音;内核;版本; Keywords[zh_HK]=system;information;details;graphic;sound;kernel;version;系統;資訊;詳細;圖像;聲音;核心;版本; Keywords[zh_TW]=系統;資訊;詳細資訊;繪圖;音效;核心;版本; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-keyboard.desktop000066400000000000000000000242771360505115200276770ustar00rootroot00000000000000[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[az]=Düyməlik Name[be]=Клавіятура Name[bg]=Клавиатура Name[bn]=কিবোর্ড 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[hu]=Billentyűzet Name[hy]=Ստեղնաշար Name[ia]=Claviero Name[id]=Papan ketik 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@ijekavianlatin]=Тастатура Name[sr@latin]=Tastatura Name[sv]=Tangentbord Name[ta]=விசைப்பலகை Name[te]=కీబోర్డు Name[tg]=Ҳарфкалид Name[th]=แป้นพิมพ์ Name[tl]=Tiklado Name[tpi]=Kibot Name[tr]=Klavye Name[ts]=Khibodo Name[uk]=Клавіатура Name[ur]=کی بورڈ Name[uz]=Клавиатура Name[vi]=Bàn phím Name[zh_CN]=键盘 Name[zh_HK]=鍵盤 Name[zh_TW]=鍵盤 Comment=Manage keyboard settings and shortcuts Comment[am]=የፊደል ገበታ ማሰናጃዎች እና የ አቋራጭ ቁልፍ አስተዳዳሪ Comment[ar]=إدارة إعدادات لوحة المفاتيح والاختصارات 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[es]=Administrar configuración de teclado y accesos directos Comment[es_AR]=Administrar configuración de teclado y accesos directos Comment[eu]=Kudeatu teklatuaren ezarpen eta laster-teklak Comment[fi]=Muuta näppäimistön asetuksia ja pikanäppäimiä Comment[fr]=Gérer les paramètres du clavier et les raccourcis 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[hr]=Upravljajte postavkama i prečacima tipkovnice Comment[hu]=Billentyűzet beállítások és billentyűparancsok kezelése Comment[ia]=Administrar le preferentias de claviero e le vias breve Comment[id]=Atur pengaturan keyboard dan shortcuts Comment[is]=Sýsla með stillingar lyklaborðs og flýtilykla Comment[it]=Gestisci impostazioni e scorciatoie da tastiera Comment[kab]=Sefrek iɣewwaren n unasiw d iberdan igezmen Comment[ko]=키보드 설정과 바로가기 관리 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[pl]=Zarządzaj ustawieniami klawiatury i skrótami Comment[pt]=Geir as 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[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[sr]=Управљање поставкама тастатуре и пречицама Comment[sr@ijekavianlatin]=Управљање поставкама тастатуре и пречицама Comment[sr@latin]=Управљање поставкама тастатуре и пречицама 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]=Клавиатура параметрларини ва тез усулларни (shortcuts) бошқариш Comment[vi]=Quản lý thiết đặ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[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 d'accés ràpid; 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[es]=teclado;atajo. teclas de acceso rápido; Keywords[es_AR]=teclado;atajo. teclas de acceso rápido; Keywords[et]=klaviatuur;otsetee;kiirklahv; Keywords[eu]=teklatua;lasterbidea;laster-tekla; Keywords[fi]=näppäimistö;pikanäppäin;toimintonappi; Keywords[fr]=clavier;raccourci;raccourci; Keywords[fr_CA]=clavier;raccourci;raccourci clavier; 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[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]=キーボード、ショートカット、ホットキー; Keywords[kab]=anasiw;abrid igezmen;abrid iigezmen n unasiw; Keywords[ko]=키보드;바로가기;핫 키; 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[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[sc]=tecladu;incurtzadura;teclas de issèberu lestru; Keywords[sk]=klávesnica;skratky;horúce klávesy; Keywords[sl]=tipkovnica;bližnjica;hitra tipka; Keywords[sr]=тастатура;пречица; Keywords[sr@ijekavianlatin]=тастатура;пречица; Keywords[sr@latin]=тастатура;пречица; 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]=клавиатура;тез усуллар (shortcuts);уйғоқ тугунлар (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-4.4.8/files/usr/share/applications/cinnamon-settings-mouse.desktop000066400000000000000000000247221360505115200272220ustar00rootroot00000000000000[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[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[fi]=Hiiri ja kosketuslevy 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[hr]=Miš i touchpad Name[hu]=Egér és érintőtábla Name[ia]=Mus e pannello tactile Name[id]=Mouse dan Touchpad Name[ie]=Mus e panel tactil Name[is]=Mús og snertiplatti Name[it]=Mouse e touchpad Name[ja]=マウスとタッチパッド Name[kab]=Taɣerdayt d telwiḥt tawallsant Name[ko]=마우스와 터치패드 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[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]=Mouse și touchpad Name[ru]=Мышь и сенсорная панель Name[sc]=Sòrighe e sòrighe tàtile Name[sk]=Myš a touchpad Name[sl]=Miška in sledilna ploščica Name[sr]=Миш и додирна плочица Name[sr@ijekavianlatin]=Миш и додирна плочица Name[sr@latin]=Миш и додирна плочица Name[sv]=Mus och pekplatta Name[ta]=சொடுக்கி மற்றும் தொடுதிட்டு Name[tg]=Муш ва панели ламсӣ Name[th]=เมาส์และทัชแพด Name[tr]=Fare ve Dokunmatik Panel Name[uk]=Миша та сенсорна панель Name[ur]=ماؤس اور ٹچ پیڈ Name[uz]=Сичқонча ва Тачпад 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[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[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[eu]=Kontrolatu sagua eta ukipen-teklatuaren ezarpenak Comment[fi]=Muuta hiiren ja kosketuslevyn asetuksia Comment[fr]=Paramètres de contrôle de la souris et du pavé tactile Comment[fr_CA]=Contrôler les 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[hr]=Upravljajte mišem i touchpad postavkama Comment[hu]=Egér és érintőtábla beállítások Comment[ia]=Controla le preferentias del mus e del pannello tactile Comment[id]=Atur pengaturan mouse dan touchpad Comment[is]=Sýsla með stillingar músa og snertiplatta Comment[it]=Impostazioni mouse e touchpad Comment[kab]=Senqed iɣewwaren n tɣerdayt d telwiḥt tawallsant Comment[ko]=마우스와 터치패드 설정 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[pl]=Kontroluj ustawienia myszki i panelu dotykowego Comment[pt]=Controlar as definições de rato e touchpad Comment[pt_BR]=Controlar as configurações de mouse e touchpad Comment[ro]=Gestionează setările mouse-ului și touchpadului Comment[ru]=Настройка мыши и сенсорной панели 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[sr]=Управљање поставкама миша и додирне плочице Comment[sr@ijekavianlatin]=Управљање поставкама миша и додирне плочице Comment[sr@latin]=Управљање поставкама миша и додирне плочице 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]=Сичқонча ва тачпад параметрларини назорат қилиш Comment[vi]=Điều khiển thiết đặt chuột và bàn chạm Comment[zh_CN]=鼠标/触摸板设置 Comment[zh_HK]=控制滑鼠和觸控板設定 Comment[zh_TW]=管理滑鼠與觸控板設定 Keywords=mouse;touchpad;synaptic;double-click; Keywords[am]=አይጥ ተችፓድ ሲናፕቲክ ሁለት ጊዜ-መጫኛ; Keywords[ar]=الماوس، لوحة اللمس، التشابك، النقر المزدوج; Keywords[ast]=mur;touchpad;synaptic;clic doblu;duble clic;doblu clic;clic duble; 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[es]=ratón;panel táctil;synaptic;doble clic; Keywords[es_AR]=ratón;panel táctil;synaptic;doble clic; Keywords[eu]=sagua;ukipen-teklatua;synaptic;klik bikoitza; 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]=עכבר;לוח-מגע;synaptic;קליק כפול; 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]=mouse;touchpad;sinaptik;klik ganda; Keywords[is]=mús;bendill;snertiplatti;synaptic;tvísmella; Keywords[it]=mouse;touchpad;synaptic;doppio clic; Keywords[ja]=マウス、タッチパッド、synaptic、ダブルクリック; Keywords[kab]=taɣerdayt;talwiḥt;synaṭic;anqab uslig; Keywords[ko]=마우스;터치패드;시냅틱;더블 클릭; 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[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]=mouse;touchpad;synaptic;clic dublu; Keywords[ru]=мышь;сенсорная панель;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[sr]=миш;додирна плочица;синаптик;двоклик; Keywords[sr@ijekavianlatin]=миш;додирна плочица;синаптик;двоклик; Keywords[sr@latin]=миш;додирна плочица;синаптик;двоклик; 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]=сичқонча;тачпад;синаптик;қўшалоқ-босиш; 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-4.4.8/files/usr/share/applications/cinnamon-settings-notifications.desktop000066400000000000000000000147571360505115200307520ustar00rootroot00000000000000[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[az]=Bildirişlər Name[be]=Паведамленні Name[bg]=Известявания Name[bn]=বিজ্ঞপ্তি 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[fr_CA]=Avis Name[fy]=Notifikaasjes Name[ga]=Fógraí Name[gd]=Brathan Name[gl]=Notificacións Name[he]=התרעות Name[hr]=Obavijesti 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[kab]=Tilɣa Name[kk]=Мәлімдемелер Name[km]=ការ​ជូនដំណឹង​ Name[ko]=알림 Name[ku]=Hişyarî 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[oc]=Notificacions Name[pa]=ਸੂਚਨਾਵਾਂ Name[pl]=Powiadomienia Name[pt]=Notificações Name[pt_BR]=Notificações Name[ro]=Notificări Name[ru]=Уведомления Name[sc]=Notìficas Name[sk]=Oznámenia Name[sl]=Obvestila Name[sq]=Njoftimet Name[sr]=Обавештења 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]=Эслатмалар Name[vi]=Thông báo Name[xh]=Izaziso Name[zh_CN]=通知 Name[zh_HK]=通知 Name[zh_TW]=通知 Comment=Notification preferences Comment[am]=የ ማስታወቂያ ምርጫዎች Comment[ar]=تفضيلات الإخطار Comment[ast]=Preferencies de les notificaciones Comment[az]=Bildiriş üstünlükləri Comment[bg]=Настройки за известяване Comment[bn]=বিজ্ঞপ্তি বিষয়ে পছন্দ Comment[ca]=Preferències de notificació Comment[ca@valencia]=Preferències de notificació Comment[cs]=Předvolby oznamování Comment[cy]=Dewisiadau hysbysiad Comment[da]=Præferencer for underretninger Comment[de]=Benachrichtigungseinstellungen Comment[el]=Προτιμήσεις ειδοποιήσεων Comment[es]=Preferencias de notificación Comment[es_AR]=Preferencias de notificación Comment[eu]=Jakinerazpenen hobespenak Comment[fi]=Ilmoitusten asetukset Comment[fr]=Préférences des notifications Comment[fr_CA]=Préférences des notifications Comment[gd]=Roghainnean nam brathan Comment[gl]=Preferencias da notificación Comment[he]=העדפות של התרעות Comment[hr]=Osobitosti obavijesti Comment[hu]=Értesítések beállításai Comment[ia]=Preferentias de notification Comment[id]=Preferensi notifikasi Comment[ie]=Preferenties de notificationes Comment[is]=Valkostir kerfistilkynninga Comment[it]=Preferenze di notifica Comment[ja]=通知設定 Comment[kab]=Tisezmal usmenyif Comment[ko]=알림 설정 Comment[lt]=Pranešimų nuostatos Comment[ms]=Tetapan notifikasi Comment[nb]=Varslingsinnstillinger Comment[nds]=Benachrichtigungseinstellungen Comment[nl]=Meldingsvoorkeuren 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[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@ijekavianlatin]=Поставке обавештења Comment[sr@latin]=Поставке обавештења Comment[sv]=Aviseringsinställningar Comment[th]=ตั้งค่าการแจ้งเตือน Comment[tr]=Bildirim tercihleri Comment[uk]=Налаштування сповіщень Comment[ur]=اطلاعیہ ترجیحات Comment[uz]=Эслатмалар параметрлари Comment[vi]=Tùy thích thông báo Comment[zh_CN]=通知设置 Comment[zh_HK]=通知喜好設定 Comment[zh_TW]=通知偏好設定 Keywords=notifications; Keywords[am]=ማስታወቂያዎች; Keywords[ar]=الإخطارات; Keywords[ast]=notificaciones; Keywords[az]=bildirişlər; Keywords[bg]=известяване; Keywords[bn]=বিজ্ঞপ্তিসমূহ; Keywords[ca]=notificacions; Keywords[ca@valencia]=notificacions; Keywords[cs]=oznámení; Keywords[cy]=hysbysiadau; Keywords[da]=underretninger; Keywords[de]=Benachrichtigungen; Keywords[el]=ειδοποιήσεις; Keywords[es]=notificaciones; Keywords[es_AR]=notificaciones; Keywords[eu]=jakinarazpenak; Keywords[fi]=ilmoitukset; Keywords[gd]=brathan; Keywords[gl]=notificacións; Keywords[he]=התרעות; Keywords[hr]=obavijesti; Keywords[hu]=értesítések; Keywords[ia]=notificationes; Keywords[id]=notifikasi; Keywords[ie]=notificationes; Keywords[is]=tilkynningar; Keywords[it]=notifiche; Keywords[ja]=通知; Keywords[kab]=Tisezmal; Keywords[ko]=알림; Keywords[lt]=pranešimai; Keywords[ms]=notifikasi; Keywords[nb]=varslinger; Keywords[nds]=Benachrichtigungen; Keywords[nl]=meldingen; Keywords[oc]=notificacions; Keywords[pl]=powiadomienia; Keywords[pt]=notificações; Keywords[pt_BR]=notificações; Keywords[ro]=notificări; Keywords[ru]=уведомления; Keywords[sc]=notìficas; Keywords[sk]=oznámenia; Keywords[sl]=obvestila; Keywords[sr]=обавештења; Keywords[sr@ijekavianlatin]=обавештења; Keywords[sr@latin]=обавештења; Keywords[sv]=aviseringar; Keywords[th]=การแจ้งเตือน; Keywords[tr]=bildirimler; Keywords[uk]=сповіщення; Keywords[ur]=اطلاعات; Keywords[uz]=эслатмалар; Keywords[vi]=thông báo; Keywords[zh_CN]=通知; Keywords[zh_HK]=通知; Keywords[zh_TW]=通知; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-online-accounts.desktop000066400000000000000000000224701360505115200311710ustar00rootroot00000000000000[Desktop Entry] Icon=cs-online-accounts Exec=cinnamon-settings online-accounts Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Online Accounts Name[am]=የ መስመር ላይ መግለጫ Name[ar]=الحسابات عبر الإنترنت Name[az]=Bağlantılı Oturumlar Name[bg]=Онлайн акаунти Name[ca]=Comptes en línia Name[ca@valencia]=Comptes en línia Name[cs]=On-line účty Name[cy]=Cyfrifon Ar-lein Name[da]=Onlinekonti Name[de]=Internetkonten Name[el]=Online Λογαριασμοί Name[es]=Cuentas en línea Name[es_AR]=Cuentas en línea Name[eu]=Lineako kontuak Name[fi]=Verkkotilit Name[fr]=Comptes en ligne Name[fr_CA]=Comptes en ligne Name[he]=חשבונות מקוונים Name[hr]=Mrežni računi Name[hu]=Online fiókok Name[ia]=Contos online Name[id]=Akun Daring Name[is]=Aðgangar á neti Name[it]=Account Online Name[ja]=オンラインアカウント Name[kab]=Imiḍanen ɣef uẓeḍḍa Name[ko]=온라인 계정 Name[lt]=Internetinės paskyros Name[nl]=Internetaccounts Name[pl]=Konta usług online Name[pt]=Contas Online Name[pt_BR]=Contas Online Name[ro]=Conturi Online Name[ru]=Сетевые учётные записи Name[sc]=Contos in lìnia Name[sk]=Účty služieb Name[sl]=Spletni računi Name[sr]=Интернет Налози Name[sr@ijekavianlatin]=Интернет Налози Name[sr@latin]=Интернет Налози Name[sv]=Nätkonton Name[th]=บัญชีออนไลน์ Name[tr]=Çevrimiçi Hesaplar Name[uk]=Онлайн облікові записи Name[zh_CN]=在线账户 Comment=Connect to your online accounts Comment[am]=ወደ እርስዎ የ መስመር ላይ መግለጫ መገናኛ Comment[ar]=الاتصال بحساباتك على الإنترنت Comment[az]=Bağlantılı oturumlarınıza bağlanın Comment[bg]=Връзка с вашите онлайн акаунти Comment[ca]=Connecteu-vos als vostres comptes en línia Comment[ca@valencia]=Connecteu-vos als vostres comptes en línia Comment[cs]=Připojit se ke svým online účtům Comment[cy]=Cysylltwch i'ch cyfrifon ar-lein Comment[da]=Forbind til dine onlinekonti Comment[de]=Zu Ihren Internetkonten verbinden Comment[el]=Συνδεθείτε στους λογαριασμούς σας στο διαδίκτυο Comment[es]=Conectar a las cuentas en línea Comment[es_AR]=Conectar a las cuentas en línea Comment[eu]=Konektatu zure lineako kontuetara Comment[fi]=Yhdistä verkkotileihisi Comment[fr]=Connectez vos comptes en ligne Comment[fr_CA]=Connectez vos comptes en ligne Comment[he]=התחבר לחשבונך המקוון Comment[hr]=Povežite se sa svojim mrežnim računima Comment[hu]=Csatlakozás az online fiókokhoz Comment[ia]=Connecter al conto online Comment[is]=Tengstu notandaaðgöngum þínum á netinu Comment[it]=Connetti i tuoi account online Comment[kab]=Qqen ɣer imiḍanen-inek ɣef uẓeḍḍa Comment[ko]=온라인 계정에 연결 Comment[lt]=Prisijunkite prie savo internetinių paskyrų Comment[nl]=Verbinding maken met uw internetaccounts Comment[pl]=Podłącz swoje konta online Comment[pt]=Conetar-se às suas contas on-line Comment[pt_BR]=Conecte-se às suas contas on-line Comment[ro]=Conectează-te la conturile tale online Comment[ru]=Подключение к вашим сетевым учётным записям Comment[sc]=Connete a sos contos in lìnia tuos Comment[sk]=Pripojte sa k vašim účtom služieb Comment[sl]=Povežite svoje spletne račune Comment[sr]=Повежите ваше интернет налоге Comment[sr@ijekavianlatin]=Повежите ваше интернет налоге Comment[sr@latin]=Повежите ваше интернет налоге Comment[sv]=Anslut till dina nätkonton Comment[tr]=Çevrimiçi hesaplarınıza bağlanın Comment[uk]=Підключитися до своїх онлайн-облікових записів Comment[zh_CN]=连接到您的在线账户 Keywords=google;facebook;twitter;yahoo;web;online;chat;calendar;mail;contact;owncloud;kerberos;imap;smtp;pocket;readitlater;account; Keywords[am]=ጉግል: ፌስቡክ: ትዊተር: ያሁ: ዌብ: በ መስመር ላይ: ውይይት: ቀን መቁጠሪያ: ደብዳቤ: ግንኙነት: owncloud;kerberos;imap;smtp;pocket;readitlater;መግለጫ; Keywords[ar]=جوجل، فيسبوك، تويتر، ياهو، الإنترنت، الدردشة، التقويم، البريد، الاتصال، الحساب;owncloud;kerberos;imap;smtp;pocket;readitlater; Keywords[az]=google;facebook;twitter;yahoo;tor;bağlantılı;danışıq;ilgün;göndəriş;bağlantılar;owncloud;kerberos;imap;smtp;pocket;readitlater;oturum; Keywords[ca]=google;facebook;twitter;yahoo;web;en línia;xat;calendari;correu electrònic;contacte;owncloud;kerberos;imap;smtp;pocket;readitlater;compte; Keywords[ca@valencia]=google;facebook;twitter;yahoo;web;online;chat;calendari;email;contacte;owncloud;kerberos;imap;smtp;pocket;readitlater;compte; Keywords[cs]=google;facebook;twitter;yahoo;web;online;chat;calendar;mail;contact;owncloud;kerberos;imap;smtp;pocket;readitlater;účet; Keywords[cy]=google;facebook;twitter;yahoo;gwe;ar-lein;sgwrs;calendr;e-bost;cysylltiad;owncloud;kerberos;imap;smtp;pocket;readitlater;cyfrif; Keywords[da]=google;facebook;twitter;yahoo;web;online;chat;kalender;mail;kontakt;owncloud;kerberos;imap;smtp;pocket;readitlater;konto; Keywords[de]=Kalender;Konto;Nachrichten;Unterhaltung;Netz;Post;Internet;Verbunden;E-Mail;google;facebook;twitter;yahoo;web;online;chat;calendar;mail;contact;owncloud;kerberos;imap;smtp;pocket;readitlater;account; Keywords[el]=google;facebook;twitter;yahoo;ιστός;online;συζήτηση;ημερολόγιο;αλληλογραφίαl;επαφή;owncloud;kerberos;imap;smtp;pocket;readitlater;λογαριασμός; Keywords[es]=google;facebook;twitter;yahoo;web;online;chat;calendario;email;contacto;owncloud;kerberos;imap;smtp;pocket;readitlater;cuenta; Keywords[es_AR]=google;facebook;twitter;yahoo;web;online;chat;calendario;email;contacto;owncloud;kerberos;imap;smtp;pocket;readitlater;cuenta; Keywords[eu]=google;facebook;twitter;yahoo;web;linean;txata;egutegia;posta elektronikoa;kontaktuak;owncloud;kerberos;imap;smtp;pocket;readitlater;kontua; Keywords[fi]=google;facebook;twitter;yahoo;web;verkko;chat;kalenteri;posti;yhteydet;owncloud;kerberos;imap;smtp;pocket;readitlater;tili; Keywords[fr]=compte;google;facebook;twitter;yahoo;web;online;chat;calendar;mail;contact;owncloud;kerberos;imap;smtp;pocket;readitlater; Keywords[fr_CA]=compte;google;facebook;twitter;yahoo;web;online;chat;calendar;mail;contact;owncloud;kerberos;imap;smtp;pocket;readitlater; Keywords[he]=גוגל;פייסבוק;טוויטר;יאהו;רשת;מקוון;צ'ט;לוח-שנה;דואל;קשר;owncloud;kerberos;imap;smtp;pocket;readitlater;חשבון; Keywords[hr]=google;facebook;twitter;yahoo;web;mreža;razgovori;kalendar;pošta;kontakt;owncloud;kerberos;imap;smtp;pocket;readitlater;račun; Keywords[hu]=google;facebook;twitter;yahoo;web;online;chat;calendar;mail;contact;owncloud;kerberos;imap;smtp;pocket;readitlater;account;onlájn;csevegés;cset;naptár;kalendárium;névjegyek;kapcsolatok;hitelesítés;fiók;felhasználó; Keywords[ia]=google;facebook;twitter;yahoo;web;online;chat;calendario;e-mail;contacto;nube-proprie;kerberos;imap;smtp;pocket;lege-lo-postea;conto; Keywords[ie]=google;facebook;twitter;yahoo;web;online;chat;calendar;post;e-post;contacte;owncloud;kerberos;imap;smtp;pocket;readitlater;conto; Keywords[is]=Google;Facebook;Twitter;Yahoo;Vefur;Netið;Spjall;Dagatal;Póstur;Tengiliðir;ownCloud;Kerberos;IMAP;SMTP;Pocket;ReadItLater;aðgangur; Keywords[it]=google;facebook;twitter;yahoo;web;online;chat;calendario;e-mail;contatti;owncloud;kerberos;imap;smtp;pocket;readitlater;account; Keywords[ko]=구글;페이스북;트위터;야후;웹;온라인;채팅;달력;메일;연락처;owncloud;kerberos;imap;smtp;pocket;readitlater;계정; Keywords[lt]=google;facebook;twitter;yahoo;saitynas;internetas;pokalbiai;kalendorius;paštas;kontaktas;owncloud;kerberos;imap;smtp;pocket;readitlater;paskyra; Keywords[pl]=google;facebook;twitter;yahoo;web;online;czat;kalendarz;poczta;kontakt;owncloud;kerberos;imap;smtp;pocket;readitlater;konto; Keywords[pt]=conta google;facebook;twitter;yahoo;web;online;chat;calendário;e-mail;contactos;owncloud;kerberos;imap;smtp;pocket;readitlater; Keywords[pt_BR]=google;facebook;twitter;yahoo;web;online;chat;calendário;e-mail;contatos;owncloud;kerberos;imap;smtp;pocket;readitlater;conta; Keywords[sk]=google;facebook;twitter;yahoo;web;online;chat;rozhovor;kalendár;mail;pošta;kontakt;owncloud;kerberos;imap;smtp;pocket;readitlater;účet; Keywords[sr]=google;facebook;twitter;yahoo;web;online;chat;calendar;mail;contact;owncloud;kerberos;imap;smtp;pocket;readitlater;налог; Keywords[sr@ijekavianlatin]=google;facebook;twitter;yahoo;web;online;chat;calendar;mail;contact;owncloud;kerberos;imap;smtp;pocket;readitlater;налог; Keywords[sr@latin]=google;facebook;twitter;yahoo;web;online;chat;calendar;mail;contact;owncloud;kerberos;imap;smtp;pocket;readitlater;налог; Keywords[sv]=google;facebook;twitter;yahoo;webb;online;chatt;kalender;e-post;kontakt;owncloud;kerberos;imap;smtp;pocket;readitlater;konto; Keywords[tr]=google;facebook;twitter;yahoo;web;çevrimiçi;sohbet;takvim;eposta;iletişim;owncloud;kerberos;imap;smtp;pocket;readitlater;hesap; Keywords[zh_CN]=google;facebook;twitter;yahoo;网络;在线;聊天;日历;邮件;联络;owncloud;kerberos;imap;smtp;pocket;readitlater;帐号; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-panel.desktop000066400000000000000000000236551360505115200271750ustar00rootroot00000000000000[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[be]=Панэль Name[bg]=Панел Name[bn]=প্যানেল 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]=Tableau de bord Name[fr_CA]=Tableau de bord Name[ga]=Painéal Name[gd]=Panail Name[he]=פאנל Name[hi]=पट्टिका Name[ia]=Quadro Name[is]=Skjástika Name[it]=Pannello Name[ja]=パネル Name[kab]=tafelwit n yiri, tattayt, ukessar, ufella, ɣumm, tiddi, amrussu Name[km]=បន្ទះ Name[ko]=패널 Name[li]=Paneel Name[lt]=Skydelis Name[lv]=Panelis Name[ml]=പാളി 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@ijekavianlatin]=Панел Name[sr@latin]=Tabla Name[ta]=பலகை Name[te]=ప్యానల్ Name[tg]=Лавҳа Name[th]=แผง Name[ts]=Phenele Name[uk]=Панель Name[ur]=پینل Name[uz]=Панел Name[vi]=Bảng Name[zh_CN]=面板 Name[zh_HK]=面板 Name[zh_TW]=面板 Comment=Manage Cinnamon panel settings Comment[am]=የሲናሞን ክፍል ማሰናጃዎች አስተዳዳሪ Comment[ar]=إدارة إعدادات شريط Cinnamon Comment[ast]=Axustes del alministrador del panel Cinnamon Comment[az]="Cinnamon" panel quruluşlarını yönəlt Comment[be]=Кіраванне наладамі панэлі Cinnamon Comment[bg]=Управление на панела на 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[es]=Administrar configuración del panel de Cinnamon Comment[es_AR]=Administrar configuración del panel de Cinnamon Comment[eu]=Kudeatu Cinnamon panel-ezarpenak Comment[fi]=Muokkaa Cinnamonin paneelin asetuksia Comment[fr]=Gérer les paramètres du tableau de bord de Cinnamon Comment[fr_CA]=Gérer les paramètres du tableau de bord de Cinnamon Comment[gd]=Stiùirich na roghainnean panail aig Cinnamon Comment[gl]=Administra os axustes do panel de Cinnamon Comment[he]=נהל את תצורת הלוח של קינמון Comment[hr]=Upravljajte postavkama Cinnamon panela Comment[hu]=Cinnamon panel beállítások Comment[ia]=Gere le configuration del pannello de Cinnamon Comment[id]=Atur pengaturan panel Cinnamon Comment[is]=Sýsla með stillingar Cinnamon skjástika Comment[it]=Gestisci impostazioni del pannello Cinnamon Comment[kab]=Sefrek iɣewwaren n tfelwit n yiri n Cinnamon Comment[ko]=시나몬 패널설정 관리 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[pl]=Zarządzaj ustawieniami panelu Cinnamon Comment[pt]=Gerir as definições do painel do Cinnamon Comment[pt_BR]=Gerenciar as configurações do painel do Cinnamon Comment[ro]=Gestionează setările panoului Cinnamon Comment[ru]=Управление настройками панели Cinnamon Comment[sc]=Manìgia cunfiguratziones de sos pannellos de Cinnamon Comment[sk]=Spravuje nastavenia panelov prostredia Cinnamon Comment[sl]=Upravljajte z nastavitvami pulta Cinnamona Comment[sq]=Menaxhoni parametrat e panelit të Cinnamon Comment[sr]=Управљајте поставкама панела Цимета Comment[sr@ijekavianlatin]=Управљајте поставкама панела Цимета Comment[sr@latin]=Управљајте поставкама панела Цимета 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]=Синнамонда панел параметрларини бошқариш Comment[vi]=Quản lý thiết đặt bảng 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[az]=panel;hündürlük;aşağı;yuxarı;öz-gizləmə;ölçü;düzən; 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[es]=panel;altura;inferior;superior;autoocultar;tamaño;disposición; Keywords[es_AR]=panel;altura;inferior;superior;autoocultar;tamaño;disposición; Keywords[eu]=panela;altuera;behea;goia;ezkutatu automatikoki;tamaina;diseinua; Keywords[fi]=paneeli;korkeus;pohja;yläosa;automaattinen piilotus;koko;asettelu; Keywords[fr]=tableau de bord;hauteur;bas;haut;masquer;taille;disposition; Keywords[fr_CA]=tableau de bord;hauteur;bas;haut;masquer;tailler;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]=לוח;פאנל;גובה;תחתון;עליון;הסתרה אוטומטית;גודל;פריסה; 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[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[kab]=tafelwit n yiri;tattayt;ukessar;ufella;ɣumm;tiddi;amrussu; Keywords[ko]=패널;높이;아래;위;자동 숨김;크기;배치; Keywords[lt]=skydelis;aukštis;apačia;viršus;automatiškai slėpti;dydis;išdėstymas; 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;vormgeving; Keywords[pl]=panel;wysokość;przycisk;góra;automatyczne ukrywanie;rozmiar;układ; Keywords[pt]=painel;altura;fundo;superior;esconder automático;tamanho;layout; Keywords[pt_BR]=painel;altura;fundo;superior;auto-ocultar;tamanho;layout; Keywords[ro]=panou;înălțime;jos;sus;ascundere automată;dimensiune;aranjament; Keywords[ru]=панель;высота;внизу;вверху;автоскрытие;размер;слой; 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[sq]=paneli;lartësia;poshtë;lart;vetë-fshih;përmasat;faqosja; Keywords[sr]=панел;висина;доле;горе;аутоматско скривање;величина;распоред; Keywords[sr@ijekavianlatin]=панел;висина;доле;горе;аутоматско скривање;величина;распоред; Keywords[sr@latin]=панел;висина;доле;горе;аутоматско скривање;величина;распоред; 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]=панел;баландлик;паст;юқори;авто-беркитиш;ўлчам;жойлашув схемаси; Keywords[vi]=bảng;chiều cao;đáy;đỉnh;tự động ẩn;kích thước;bố trí; Keywords[zh_CN]=面板,高度,底部,顶部,自动隐藏,大小,布局; Keywords[zh_HK]=面板;高度;底部;頂部;自動隱藏;大小;佈局; Keywords[zh_TW]=面板;高度;底端;頂端;自動隱藏;尺寸;配置; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-power.desktop000066400000000000000000000270041360505115200272220ustar00rootroot00000000000000[Desktop Entry] Icon=cs-power Exec=cinnamon-settings power Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Power Management Name[am]=የሐይል አስተዳዳሪ Name[ar]=إدارة الطاقة Name[ast]=Alministración d'enerxía Name[az]=Güc Yönətməni Name[be]=Кіраваньне сілкаваннем Name[bg]=Управление на захранването 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]=Virranhallinta Name[fr]=Gestion d'alimentation Name[fr_CA]=Gestion de Courant Name[ga]=Bainisteoireacht Cumhachta Name[gd]=Stiùireadh na cumhachd Name[gl]=Xestión da enerxía Name[he]=צריכת חשמל Name[hr]=Upravljanje energijom Name[hu]=Energiakezelő Name[ia]=Gestion del energia Name[id]=Manajemen Daya Name[is]=Aflstjórnun Name[it]=Gestione dell'alimentazione Name[ja]=電源管理 Name[kab]=Asefrek n tfasa Name[ko]=전력 관리 Name[ku]=Gerînendeyê hêzê 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[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[sc]=Manìgiu energia Name[sk]=Správa napájania Name[sl]=Upravljanje porabe energije Name[sr]=Управљање напајањем Name[sr@ijekavianlatin]=Управљање напајањем Name[sr@latin]=Управљање напајањем Name[sv]=Strömhantering Name[ta]=மின்சக்தி மேலாண்மை Name[tg]=Идоракунии барқ Name[th]=การจัดการพลังงาน Name[tr]=Güç Yönetimi Name[uk]=Керування живленням Name[ur]=توانائی کا انتظام Name[uz]=Қувватни бошқариш Name[vi]=Quản lý Điện năng Name[zh_CN]=电源管理 Name[zh_HK]=電源管理 Name[zh_TW]=電源管理 Comment=Manage power settings Comment[am]=የ ሐይል ማሰናጃዎች አስተዳዳሪ Comment[ar]=إدارة إعدادات الطاقة Comment[ast]=Axustes del alministrador d'enerxía Comment[az]=Güc quruluşlarını yönəlt Comment[be]=Налады сілкавання Comment[bg]=Управление на настройките на захранването 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[es]=Administrar configuración de energía Comment[es_AR]=Administrar configuración de energía Comment[eu]=Kudeatu energia-ezarpenak Comment[fi]=Muuta virranhallinnan asetuksia 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[hr]=Upravljajte postavkama energije Comment[hu]=Energiabeállítások kezelése Comment[ia]=Gere le preferentias del energia Comment[id]=Atur pengaturan Power Comment[is]=Sýsla með orkusparnaðarstillingar Comment[it]=Gestisci impostazioni alimentazione Comment[kab]=Sefrek iɣewwaren n wučči Comment[ko]=전력 설정 관리 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[oc]=Gerir los paramètres d'alimentacion Comment[pl]=Zarządzaj ustawieniami zasilania Comment[pt]=Gerir as definições de energia Comment[pt_BR]=Gerenciar as configurações de energia Comment[ro]=Gestionează setările consumului Comment[ru]=Настройки питания 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@ijekavianlatin]=Управљање поставкама напајања Comment[sr@latin]=Управљање поставкама напајања Comment[sv]=Hantera ströminställningar Comment[tg]=Идоракунии танзимоти барқ Comment[th]=จัดการการตั้งค่าพลังงาน Comment[tr]=Güç ayarlarını yönet Comment[uk]=Керування налаштуваннями живлення Comment[ur]=توانائی کی ترتیبات کا انتظام Comment[uz]=Қувват параметрларини бошқариш Comment[vi]=Quản lý thiết đặt năng lượng 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[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[es]=energía;suspender;hibernar;portátil;escritorio;brillo;salvapantallas; Keywords[es_AR]=energía;suspender;hibernar;portátil;escritorio;brillo;salvapantallas; Keywords[eu]=energia;eseki;hibernatu;eramangarria;mahaigainekoa;distira;pantaila-babeslea; Keywords[fi]=virta;valmiustila;lepotila;kannettava;pöytätietokone;näytönsäästäjä; Keywords[fr]=alimentation;mise en veille;hibernation;ordinateur portable;ordinateur de bureau;luminosité;économiseur d'écran; Keywords[fr_CA]=alimentation;mise en veille;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[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;salva schermo; 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]=Accendi;Sospendi;Iberna;Laptop;Desktop;Luminosità;Screensaver; Keywords[kab]=tafasa;asewḥel;asgen;aselkim aziraz;aselkim n tnarit;tafat;amsekles n ugdil; Keywords[ko]=전원;대기;잠자기;랩톱;데스크톱;밝기;화면보호기; 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[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[sk]=za/vypnúť;uspať;hibernovať;notebook;plocha;jas;šetrič obrazovky; Keywords[sl]=energija;pripravljenost;mirovanje;prenosnik;namizje;svetlost;ohranjevalnik zaslona; Keywords[sr]=искључи;замрзни;обустави;преносни рачунар;рачунар;осветљење;чувар екрана; Keywords[sr@ijekavianlatin]=искључи;замрзни;обустави;преносни рачунар;рачунар;осветљење;чувар екрана; Keywords[sr@latin]=искључи;замрзни;обустави;преносни рачунар;рачунар;осветљење;чувар екрана; Keywords[sv]=ström;vänteläge;viloläge;bärbar dator;bordsdator;ljusstyrka;skärmsläckare; Keywords[tg]=барқ;таваққуф;гибернатсия;лэптоп;мизи корӣ;дурахшонӣ;пардаи экран; Keywords[th]=พลังงาน;พักเครื่อง;จำศีล;แล็ปท็อป;พื้นโต๊ะ;ความสว่าง;โปรแกรมรักษาหน้าจอ; Keywords[tr]=güç;uyku;askı;dizüstü;masaüstü;parlaklık;ekran koruyucu; Keywords[uk]=живлення;призупинення;гібернація;ноутбук;стільниця;яскравість;зберігач екрану; Keywords[uz]=қувват;вақтинча тўхтатиш;; Keywords[vi]=năng lượng;ngưng;ngủ đông;máy tính xách tay;máy bàn;độ sáng;bảo vệ màn hình; Keywords[zh_CN]=电源,待机,休眠,笔记本,台式机,亮度,屏保; Keywords[zh_HK]=電源;暫停;休眠;筆記型電腦;桌上型電腦;亮度;熒幕保護程式; Keywords[zh_TW]=電源;暫停;休眠;筆記型電腦;桌上型電腦;亮度;螢幕保護程式; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-privacy.desktop000066400000000000000000000173701360505115200275500ustar00rootroot00000000000000[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[az]=Gizlilik Name[bg]=Поверителност 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[fi]=Yksityisyys Name[fr]=Confidentialité Name[fr_CA]=Confidentialité Name[gd]=Prìobhaideachd Name[gl]=Intimidade Name[he]=פרטיות Name[hr]=Privatnost Name[hu]=Magánszféra Name[ia]=Confidentialitate Name[id]=Privasi Name[ie]=Privatie Name[is]=Friðhelgi Name[ja]=個人情報 Name[kab]=Tusligt Name[ko]=프라이버시 Name[ku]=Veşarî Name[lt]=Privatumas Name[ms]=Privasi Name[nb]=Personvern Name[nds]=Privatssphäre Name[nl]=Privéleven Name[oc]=Vida privada Name[pl]=Prywatność Name[pt]=Privacidade Name[pt_BR]=Privacidade Name[ro]=Confidențialitate Name[ru]=Конфиденциальность Name[sc]=Riservadesa Name[sk]=Súkromie Name[sl]=Zasebnost Name[sq]=Privatësia Name[sr]=Приватност Name[sr@ijekavianlatin]=Приватност Name[sr@latin]=Приватност Name[sv]=Sekretess Name[th]=ความเป็นส่วนตัว Name[tr]=Gizlilik Name[uk]=Конфіденційність Name[ur]=پرائیویسی Name[uz]=Маҳфийлик Name[vi]=Riêng tư Name[zh_CN]=隐私 Name[zh_HK]=私隱 Name[zh_TW]=隱私 Comment=Cinnamon privacy settings Comment[am]=ሲናሞን የ ግል ማሰናጃ Comment[ar]=إعدادات خصوصية Cinnamon Comment[ast]=Axustes de privacidá Cinnamon Comment[az]="Cinnamon" gizlilik quruluşları 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[es]=Opciones de privacidad de Cinnamon Comment[es_AR]=Opciones de privacidad de Cinnamon Comment[eu]=Cinnamon pribatutasunaren ezarpenak Comment[fi]=Cinnamonin tietosuoja-asetukset Comment[fr]=Paramètres de confidentialité de Cinnamon Comment[fr_CA]=Paramètres de confidentialité de Cinnamon Comment[gd]=Roghainnean prìobhaideachd Cinnamon Comment[gl]=Opciones de intimidade de Cinnamon Comment[he]=הגדרות הפרטיות של Cinnamo 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[lt]=Cinnamon privatumo nustatymai 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[oc]=Paramètres de confidencialitat de Cinnamon Comment[pl]=Ustawienia prywatności Cinnamon Comment[pt]=Configurações de privacidade do Cinnamon Comment[pt_BR]=Configurações de privacidade do Cinnamon Comment[ro]=Setări confidențialitate Cinnamon Comment[ru]=Настройки конфиденциальности 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@ijekavianlatin]=Управљање приватношћу Цимета Comment[sr@latin]=Управљање приватношћу Цимета Comment[sv]=Cinnamon integritetsinställningar Comment[th]=การตั้งค่าความเป็นส่วนตัวของ Cinnamon Comment[tr]=Cinnamon gizlilik ayarları Comment[uk]=Параметри конфіденційності Cinnamon Comment[ur]=سنامون پرائیویسی کی ترتیبات Comment[uz]=Синнамоннинг маҳфийлик параметрлари Comment[vi]=Thiết đặ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á;apocagüéi;gtk;priváu; Keywords[az]=gizlilik;sonuncu;gtk;özəl; 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[es]=privacidad;reciente;gtk;privado; Keywords[es_AR]=privacidad;reciente;gtk;privado; Keywords[eu]=pribatutasuna;azkenak;gtk;pribatua; Keywords[fi]=yksityisyys;viimeaikaiset;gtk;yksityinen; Keywords[fr]=confidentialité;récent;gtk;privé; Keywords[fr_CA]=confidentialité;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[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[kab]=tabadnit;melmi kan;gtk;uslig; Keywords[ko]=프라이버시;최근;gtk;비공개; Keywords[lt]=privatumas;paskiausi;gtk;privatu; 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[pl]=prywatność;ostatnie;gtk;prywatny; Keywords[pt]=privacidade;recente;gtk;privado; Keywords[pt_BR]=privacidade;recente;gtk;privado; Keywords[ro]=confidențialitate;recent;gtk;confidențial; Keywords[ru]=конфиденциальность;недавние;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@ijekavianlatin]=приватност;скорашње;гтк;мир; Keywords[sr@latin]=приватност;скорашње;гтк;мир; Keywords[sv]=integritet;senaste;gtk;privat; Keywords[th]=ความเป็นส่วนบุคคล;ล่าสุด;gtk;ส่วนบุคคล; Keywords[tr]=gizlilik;son dosyalar;gtk;özel; Keywords[uk]=конфіденційність;останні;GTK;приватне; Keywords[ur]=پرائیوسی، حالیہ، جی ٹی کے، پرائیویٹ، نجی; Keywords[uz]=маҳфийлик;яқиндаги;gtk;маҳфий; 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-4.4.8/files/usr/share/applications/cinnamon-settings-screensaver.desktop000066400000000000000000000177411360505115200304150ustar00rootroot00000000000000[Desktop Entry] Icon=cs-screensaver Exec=cinnamon-settings screensaver Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Screensaver Name[am]=መመልከቻ ማዳኛ Name[ar]=شاشة التوقف Name[az]=Göstərici-qoruyan Name[bg]=Предпазител на екрана 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[eu]=Pantaila-babeslea 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[hr]=Čuvar zaslona Name[hu]=Képernyővédő Name[ia]=Salva schermo Name[ie]=Garda-ecran Name[is]=Skjáhvíla Name[it]=Salvaschermo Name[ja]=スクリーンセーバー Name[kab]=Agdil n usuḍes Name[ko]=화면 보호기 Name[ku]=Parêzvana ekranê Name[lt]=Ekrano užsklanda Name[ms]=Penjimat Skrin Name[nb]=Skjermsparer Name[nds]=Bildschirmschoner Name[nl]=Schermbeveiliging 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[sc]=Sarva-ischermu Name[sk]=Šetrič obrazovky Name[sl]=Ohranjevalnik zaslona Name[sq]=Ruajtës ekrani Name[sr]=Чувар екрана Name[sr@ijekavianlatin]=Чувар екрана Name[sr@latin]=Чувар екрана Name[sv]=Skärmsläckare Name[th]=โปรแกรมรักษาหน้าจอ Name[tr]=Ekran koruyucu Name[uk]=Зберігач екрану Name[ur]=سکرین سیور Name[uz]=Экран-қулфлагич 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 alministrador de bloquéu de pantalla 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[es]=Configurar bloqueo de pantalla Comment[es_AR]=Configurar bloqueo de pantalla Comment[eu]=Kudeatu pantaila blokeatzearen ezarpenak Comment[fi]=Muokkaa näytön lukituksen asetuksia Comment[fr]=Gérer les paramètres de verrouillage d'écran Comment[fr_CA]=Gérer les paramètres de verrouillage d’écran Comment[gd]=Stiùirich roghainnean glasaidh na sgrìn Comment[gl]=Administra os axustes do bloqueo de pantalla Comment[he]=נהל הגדרות נעילת מסך Comment[hr]=Upravljajte postavkama zaključavanja zaslona Comment[hu]=Képernyőzárolás beállítások kezelése Comment[ia]=Gere le preferentias 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[kab]=Sefrek iɣewwaṛen n usewḥel n ugdil Comment[ko]=화면 잠금 설정 Comment[lt]=Tvarkyti ekrano užrakto nustatymus Comment[lv]=Pārvaldīt ekrāna bloķēšanas uzstādī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[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[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@ijekavianlatin]=Управљање поставкама закључавања екрана Comment[sr@latin]=Управљање поставкама закључавања екрана 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]=Экранни қулфлаш параметрларини бошқариш Comment[vi]=QUản lý thiết đặt khoá màn hình Comment[zh_CN]=管理锁屏设置 Comment[zh_HK]=管理熒幕鎖定設定 Comment[zh_TW]=管理螢幕鎖定設定 Keywords=screensaver;lock;away;message; Keywords[am]=መመልከቻ ማዳኛ: መቆለፊያ: የለሁም: መልእክት:; Keywords[ar]=حافظة الشاشة، القفل، بعيدًا، رسالة; Keywords[bg]=предпазител;заключване;отдалечен;съобщение; Keywords[ca]=estalvi de pantalla;bloqueig;absent;missatge; Keywords[ca@valencia]=estalvi de pantalla;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[es]=salvapantallas;bloqueo;ausente;mensaje; Keywords[es_AR]=salvapantallas;bloqueo;ausente;mensaje; Keywords[eu]=pantaila babeslea;blokeatu;kanpoan;mezua; Keywords[fi]=näytönsäästäjä;lukitse;poissa;viesti; Keywords[fr]=économiseur d'écran;verrouiller;loin;message; Keywords[fr_CA]=économiseur d'écran;verrouiller;loin;message; Keywords[he]=שומר-מסך;נעילה;ללא משתמש;הודעה; 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]=salva-schermo;blocar;foras;message; Keywords[is]=skjáhvíla;læsing;fjarvera;skilaboð; Keywords[kab]=Aḥerraz n ugalis;sewḥel;yebɛed;izen; Keywords[ko]=화면 보호기;잠금;자리 비움;메시지; Keywords[lt]=ekrano užsklanda;užraktas;žinutė;pranešimas;pasišalinimo;pasišalinęs; Keywords[nl]=schermbeveiliging;vergrendelen;weg;boodschap; 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[ru]=хранитель экрана;блокировка;бездействие;сообщение; Keywords[sk]=šetrič obrazovky;zámok;uzamknúť;preč;odísť;správa; Keywords[sr]=чувар екрана;закључај;одсутан;порука; Keywords[sr@ijekavianlatin]=чувар екрана;закључај;одсутан;порука; Keywords[sr@latin]=чувар екрана;закључај;одсутан;порука; Keywords[sv]=skärmsläckare;lås;borta;meddelande; Keywords[tr]=ekran koruyucu;kilit;dışarıda;mesaj; Keywords[uk]=зберігач екрану;блокування;бездіяльність;повідомлення; Keywords[zh_CN]=屏保,锁定,离开,消息; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-sound.desktop000066400000000000000000000146371360505115200272260ustar00rootroot00000000000000[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[az]=Səs Name[be]=Гук Name[bg]=Звук 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[fr]=Son Name[fr_CA]=Son Name[fy]=Lûd Name[ga]=Fuaim Name[gd]=Fuaim Name[gl]=Son Name[he]=שמע 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[kab]=Imesli Name[kk]=Дыбыс Name[ko]=소리 Name[ku]=Deng Name[lo]=ສຽງ Name[lt]=Garsas Name[lv]=Skaņa Name[ms]=Bunyi Name[nb]=Lyd Name[nds]=Klang Name[nl]=Geluid Name[oc]=Son Name[pa]=ਆਵਾਜ਼ Name[pl]=Dźwięk Name[pt]=Som Name[pt_BR]=Som Name[ro]=Sunet Name[ru]=Звук Name[sc]=Sonu Name[sk]=Zvuk Name[sl]=Zvok Name[sq]=Zëri Name[sr]=Звук Name[sr@ijekavianlatin]=Звук Name[sr@latin]=Звук Name[sv]=Ljud Name[ta]=ஒலி Name[tg]=Садо Name[th]=เสียง Name[tr]=Ses Name[uk]=Звук Name[ur]=آواز Name[uz]=Товуш Name[vi]=Âm thanh Name[zh_CN]=声音 Name[zh_HK]=聲音 Name[zh_TW]=音效 Comment=Manage sound settings Comment[am]=የ ድምፅ ማሰናጃ አስተዳዳሪ Comment[ar]=إدارة إعدادات الصوت Comment[az]=Səs quruluşlarını yönəlt Comment[bg]=Управление настройките на звука 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[es]=Gestionar opciones de sonido Comment[es_AR]=Gestionar opciones de sonido Comment[eu]=Kudeatu soinuaren ezarpenak Comment[fi]=Ääniasetusten hallinta Comment[fr]=Gérer les paramètres audio Comment[fr_CA]=Gérer les paramètres audio Comment[he]=נהל הגדרות קול Comment[hr]=Upravljanje postvkama zvuka Comment[hu]=Hangbeállítások Comment[ia]=Gerer le configurationes del sono Comment[is]=Sýsla með hljóðstillingar Comment[it]=Regolare le configurazioni del suono Comment[kab]=Sefrek iɣewwaren n imesli Comment[ko]=소리 설정 관리 Comment[lt]=Tvarkyti garso nustatymus Comment[nl]=Geluidinstellingen beheren 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[sc]=Manìgia cunfiguratziones de sonu Comment[sk]=Spravuje nastavenia zvuku Comment[sl]=Upravljaj nastavitve zvoka Comment[sr]=Управљајте подешавањима звука Comment[sr@ijekavianlatin]=Управљајте подешавањима звука Comment[sr@latin]=Управљајте подешавањима звука Comment[sv]=Hantera ljudinställningar Comment[th]=จัดการการตั้งค่าเสียง Comment[tr]=Ses ayarlarını yönet Comment[uk]=Керування налаштуваннями звуку Comment[ur]=آواز کی ترتیبات انتظام Comment[uz]=Товуш параметрларини бошқариш Comment[zh_CN]=管理声音设置 Comment[zh_HK]=管理聲音設定 Comment[zh_TW]=管理音效設定 Keywords=sound;media;music;speakers;audio; Keywords[am]=ድምፅ: መገናኛ: ሙዚቃ: ስፒከር: ድምፅ; Keywords[ar]=الصوت، الوسائط، الموسيقى، مكبرات الصوت، الصوت; Keywords[az]=səs;medya;çalğı;səsverənlər;səs; Keywords[bg]=звук;медия;музика;говорители;аудио; Keywords[ca]=so;mitjans;música;altaveus;àudio; Keywords[ca@valencia]=so;mitjans;música;altaveus;àudio; Keywords[cs]=zvuk;média;hudba;reproduktory;audio; Keywords[cy]=sain;cyfrwng;cerddoriaeth;uchelseinyddion;sain; Keywords[da]=lyd;medier;musik;højtalere;audio; Keywords[de]=Klang;Sound;Audio;Ton;Medien;Musik;Lautsprecher; Keywords[el]=ήχος;πολυμέσα;μουσική;ηχεία; Keywords[es]=sonido;medios;música;altavoces;audio; Keywords[es_AR]=sonido;medios;música;altavoces;audio; Keywords[eu]=soinua;multimedia;musika;bozgorailuak;audioa; Keywords[fi]=ääni;äänentoisto;media;musiikki;kaiutin;kaiuttimet;kuulokkeet;audio;sound;music;speakers; Keywords[fr]=son;média;musique;haut-parleurs;audio; Keywords[fr_CA]=son;média;musique;haut-parleurs;audio; Keywords[he]=קול;מדיה;מוזיקה;רמקולים;אודיו; Keywords[hr]=zvuk;medij;glazba;zvučnici;ton; Keywords[hu]=sound;media;music;speakers;audio;hang;média;zene;hangszórók; Keywords[ia]=sono;medios;musica;altoparlatores;audio; Keywords[is]=hljóð;margmiðlun;tónlist;hátalarar;hljóðkerfi; Keywords[it]=suono;media;musica;altoparlanti;audio; Keywords[kab]=imesli;amidya;aẓawan;imsmeɣren n imesli;ameslaw; Keywords[ko]=소리;미디어;음악;스피커;오디오; Keywords[lt]=garsas;medija;muzika;garsiakalbiai;audio; Keywords[nb]=lyd;media;musikk;høyttalere;audio; Keywords[nl]=geluid;media;muziek;luidsprekers;audio; Keywords[pl]=dźwięk;media;muzyka;głośniki;audio; Keywords[pt]=som;media;música;altifalantes;áudio; Keywords[pt_BR]=som;mídia;música;alto-falantes;áudio; Keywords[ro]=sunet;media;muzică;boxe;audio; Keywords[ru]=звук;медиа;музыка;колонки;аудио; Keywords[sk]=zvuk;médiá;hudba;reproduktory;audio; Keywords[sr]=звук;музика;звучници;аудио; Keywords[sr@ijekavianlatin]=звук;музика;звучници;аудио; Keywords[sr@latin]=звук;музика;звучници;аудио; Keywords[sv]=ljud;media;musik;högtalare;ljud; Keywords[th]=เสียง;สื่อ;เพลง;ลำโพง; Keywords[tr]=ses;ortam;müzik;hoparlör;çalma; Keywords[uk]=звук;медіа;музика;гучномовці;аудіо; Keywords[ur]=آواز، ساؤنڈ، میڈیا، سپیکر، آڈیو، موسیقی; Keywords[uz]=товуш;медиа;мусиқа;колонкалар;аудио; Keywords[zh_CN]=声音、多媒体、音乐、扬声器、音频; Keywords[zh_HK]=sound;media;music;speakers;audio;聲音;媒體;音樂;喇叭;音訊; Keywords[zh_TW]=音效、媒體、音樂、揚聲器、音訊; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-startup.desktop000066400000000000000000000223071360505115200275710ustar00rootroot00000000000000[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[az]=Uyğulamaların Başlanması Name[bg]=Автоматично стартирани програми Name[bn]=স্টার্টআপ অ্যাপ্লিকেশনসমূহের 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[fi]=Käynnistettävät sovellukset Name[fr]=Applications 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[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[kab]=Isnasen n usekker Name[ko]=시작 애플리케이션 Name[ku]=Bernameyên Destpêkê Name[lo]=ໂປຣແກຣມເລີ່ມລະບົບ Name[lt]=Paleisties programos Name[ms]=Aplikasi Permulaan Name[nb]=Oppstartsprogrammer Name[nds]=Systemstartprogramme Name[nl]=Opstarttoepassingen 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[sc]=Aplicatziones de aviada Name[sk]=Aplikácie po spustení Name[sl]=Začetni programi Name[sq]=Programet në nisje Name[sr]=Почетни програми Name[sr@ijekavianlatin]=Почетни програми Name[sr@latin]=Почетни програми Name[sv]=Uppstartsprogram Name[th]=โปรแกรมเริ่มวาระ Name[tr]=Başlangıç Uygulamaları Name[uk]=Автозапуск програм Name[ur]=کمپیوڑر آغاز کی ایپلی کیشنز Name[uz]=Авто-юкланувчи дастурлар 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[az]=Başlama uyğulamalarınızı yönəldin 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[es]=Gestionar las aplicaciones de inicio Comment[es_AR]=Gestionar las aplicaciones de inicio Comment[eu]=Kudeatu zure abioko aplikazioak Comment[fi]=Hallinnoi automaattisesti käynnistyviä sovelluksia Comment[fr]=Gérez vos applications au démarrage Comment[fr_CA]=Gérez vos applications au démarrage Comment[gd]=Stiùirich na h-aplacaidean tòiseachaidh agad Comment[gl]=Administrar os seus aplicativos do inicio Comment[he]=נהל את יישומי ההתחלה שלך Comment[hr]=Upravljajte vašim pokrenutim aplikacijama Comment[hu]=Bejelentkezéskor elindítandó alkalmazások Comment[ia]=Gere tu applicationes de lanceamento initial Comment[is]=Sýsla með forrit virkjuð í ræsingu Comment[it]=Gestisci le tue applicazioni di avvio Comment[kab]=Sefrek isnasen-inek n usekker Comment[ko]=여러분의 시작 애플리케이션을 관리하세요 Comment[lt]=Valdykite savo paleidžiamas programas Comment[ms]=Urus aplikasi permulaan anda Comment[nb]=Håndter dine oppstartsprogrammer Comment[nds]=Startanwendungen verwalten Comment[nl]=Beheer uw opstarttoepassingen Comment[oc]=Gerissètz vòstras aplicacions a l'aviada Comment[pl]=Zarządzaj programami startowymi Comment[pt]=Gerir as suas aplicações de arranque Comment[pt_BR]=Gerencie seus aplicativos da inicialização Comment[ro]=Gestionează aplicațiile lansate la pornire Comment[ru]=Управление автозапускаемыми приложениями Comment[sc]=Manìgia aplicatziones de aviada Comment[sk]=Spravuje vaše aplikácie po spustení Comment[sq]=Menaxhoni programet tuaja të nisjes Comment[sr]=Управљање почетним програмиам Comment[sr@ijekavianlatin]=Управљање почетним програмиам Comment[sr@latin]=Управљање почетним програмиам Comment[sv]=Hantera dina uppstartsprogram Comment[th]=จัดการโปรแกรมเริ่มวาระของคุณ Comment[tr]=Başlangıç uygulamalarınızı yönetin Comment[uk]=Керування автоматичним запуском програм Comment[ur]=کمپیوڑر آغاز کی ایپلی کیشنز کا انتطام کریں Comment[uz]=Авто-юкланувчи дастурларни бошқариш 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[bg]=стартиране;програми;boot;init;сесия;авто старт;приложения; Keywords[ca]=inici;programes;arrencada;inicialització;sessió;autoinici;aplicacions; Keywords[ca@valencia]=inici;programes;arrencada;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[es]=inicio;programas;arranque;inicialización;sesión;autoinicio;aplicaciones; Keywords[es_AR]=inicio;programas;arranque;inicialización;sesión;autoinicio;aplicaciones; Keywords[eu]=hasiera;programak;abioa;hasieraketa;saioa;abio automatikoa;aplikazioak; Keywords[fi]=käynnistäminen;ohjelmat;käynnistys;init;istunto;automaattinen käynnistys;sovellukset; Keywords[fr]=démarrage;programmes;initialisation;démarrage automatique;applications; Keywords[fr_CA]=démarrage;programmes;initialisation;démarrage automatique;applications; Keywords[he]=התחלה;תוכניות;עליה (בוט);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[is]=ræsing;forrit;ræsiforrit;init;seta;sjálfræsa;forrit; Keywords[kab]=asenker;iseγẓanen;boot;init;tiγimit;asenker awurman;isnasen; Keywords[ko]=시작;프로그램;boot;init;세션;자동 시작;앱; Keywords[lt]=paleidimas;paleistis;programos;init;inicijavimas;seansas;automatinis paleidimas; Keywords[nl]=opstart;programma's;opstarten;init;sessie;automatische start;toepassingen; Keywords[pl]=autouruchamianie;programy;uruchamianie;init;sesja;autostart;aplikacje; Keywords[pt]=iniciar;programas;arranque;init;sessão;início automatico;aplicações; Keywords[pt_BR]=início;programas;boot;init;sessão;autoinício;apps; Keywords[ru]=запуск;программы;загрузка;инициализация;сессия;автозапуск;приложения; Keywords[sk]=po spustení;spustenie;programy;zavedenie;init;relácia;sedenie;autoštart;aplikácie; Keywords[sr]=Покретање. програми;инит;сесије;аутоматско покретање;апликације; Keywords[sr@ijekavianlatin]=Покретање. програми;инит;сесије;аутоматско покретање;апликације; Keywords[sr@latin]=Покретање. програми;инит;сесије;аутоматско покретање;апликације; Keywords[sv]=uppstart;program;boota;init;session;autostart;appar; Keywords[tr]=başlangıç;programlar;açılış;oturum;otomatik başlat;uygulamalar; Keywords[uk]=запуск;програми;завантаження;ініціалізація;сесія;автозапуск;додатки; Keywords[zh_CN]=启动,程序,引导,初始化,会话,自动启动,应用程序; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-themes.desktop000066400000000000000000000220651360505115200273550ustar00rootroot00000000000000[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[az]=Örtüklər Name[be]=Тэмы Name[bg]=Теми Name[bn]=থীম 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[kab]=Isental Name[kk]=Нақыштар Name[km]=ស្បែក Name[ko]=테마 Name[ku]=Dirb Name[li]=Thema's Name[lo]=ລັກສະນະ Name[lt]=Temos Name[lv]=Motīvi Name[ml]=രംഗവിധാനങ്ങൾ 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@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]=Ташқи кўринишлар 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[az]=İş qoyacağının görünüşünü dəyişmək üçün örtükləri yönəldin Comment[be]=Кіраванне тэмамі знешняга выгляду працоўнага стала Comment[bg]=Управлявайте темите, за да промените вида на вашия работен плот 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[es]=Administrar temas para cambiar el aspecto del escritorio Comment[es_AR]=Administrar temas para cambiar el aspecto del escritorio Comment[eu]=Kudeatu gaiak zure mahaigainaren itxura aldatzeko Comment[fi]=Muuta työpöydän ulkonäköä teemojen avulla Comment[fr]=Gérer les thèmes pour changer l'apparence du 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[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[kab]=Sefrek isental iwakken ad tbeddeleḍ timeẓri n tnarit-inek Comment[ko]=테마 관리는 여러분의 컴퓨터를 달라 보이게 할 겁니다 Comment[lt]=Tvarkykite temas 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[pl]=Zarządzaj motywami, aby zmienić wygląd pulpitu Comment[pt]=Gerir temas para mudar como o seu ambiente de trabalho aparenta Comment[pt_BR]=Gerenciar temas para mudar aparência em sua área de trabalho Comment[ro]=Gestionează temele pentru a schimba aspectul desktopului Comment[ru]=Управление темами внешнего вида рабочего стола 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@ijekavianlatin]=Управљајте темама да измените изглед радне површи Comment[sr@latin]=Управљајте темама да измените изглед радне површи 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]=Иш столи кўриниши ўзгартириш учун ташқи кўриниш мавзуларини бошқариш Comment[vi]=Quản lý chủ đề để thay đổi dáng vẻ màn hình làm việc Comment[zh_CN]=管理主体以改变您桌面的外貌 Comment[zh_HK]=管理佈景主題以變更你的桌面外觀 Comment[zh_TW]=管理佈景主題以變更您的桌面外觀 Keywords=themes;style; Keywords[am]=ገጽታዎች ፡ ዘዴ; Keywords[ar]=الثيمات;الأسلوب; Keywords[ast]=temes;estilu; Keywords[az]=örtüklər;biçim; Keywords[be]=тэмы;стыль; Keywords[bg]=тема;стил; 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[es]=temas;estilo; Keywords[es_AR]=temas;estilo; Keywords[et]=teemad;stiil; Keywords[eu]=gaiak;estiloa; 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[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]=テーマ、スタイル; Keywords[ka]=თემები;სტილი; Keywords[kab]=Isental;aɣanib; Keywords[ko]=테마;스타일; Keywords[lt]=temos;stilius; Keywords[lv]=motīvi;stils; Keywords[ms]=tema;gaya; Keywords[nb]=temaer;stil; Keywords[nds]=Themen;Stil; Keywords[nl]=thema's;stijl; Keywords[om]=dhamsawwan;haalata; Keywords[pl]=motywy;style; Keywords[pt]=temas;estilo; Keywords[pt_BR]=temas;estilo; Keywords[ro]=teme;stil; Keywords[ru]=темы;стиль; Keywords[sc]=temas;istile; Keywords[sk]=motívy;témy;štýl; Keywords[sl]=teme;slog; Keywords[sq]=temat;stili; Keywords[sr]=тема;начин приказа; Keywords[sr@ijekavianlatin]=тема;начин приказа; Keywords[sr@latin]=тема;начин приказа; Keywords[sv]=tema;stil; Keywords[ta]=அலங்காரங்கள்;பாணி; Keywords[tg]=мавзӯъ;сабк; Keywords[th]=ชุดตกแต่ง;รูปแบบ; Keywords[tr]=temalar;stiller; Keywords[uk]=теми;стиль; Keywords[ur]=شکل(theme)، انداز (style); Keywords[uz]=ташқи кўриниш мавзулари;стил; Keywords[vi]=chủ đề;kiểu dáng; Keywords[zh_CN]=主题,样式; Keywords[zh_HK]=佈景主題;樣式; Keywords[zh_TW]=佈景主題;樣式; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-tiling.desktop000066400000000000000000000241451360505115200273570ustar00rootroot00000000000000[Desktop Entry] Icon=cs-tiling Exec=cinnamon-settings tiling Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Window Tiling Name[am]=መስኮት መከመሪያ Name[ar]=تباعد النافذة Name[az]=Pəncərə Döşəməsi Name[bg]=Показвай придвижването Name[ca]=Ajust de finestres Name[ca@valencia]=Ajust de finestres Name[cs]=Uspořádávání oken do dlaždic Name[cy]=Teilsio Ffenestri Name[da]=Side om side-placering Name[de]=Fensterkacheln Name[el]=Πλακίδια Παραθύρων Name[es]=Ajuste de ventanas Name[es_AR]=Ajuste de ventanas Name[eu]=Leihoa lauzatzea Name[fi]=Ikkunoiden ruudutus Name[fr]=Juxtaposition de fenêtres Name[fr_CA]=Alignement de fenêtres Name[gd]=Leacadh nan uinneagan Name[gl]=Xanelas en mosaico Name[he]=ריצוף חלונות Name[hr]=Slaganje prozora Name[hu]=Ablak mozaik Name[ia]=Quadrellatura de fenestra Name[is]=Flísalagning glugga Name[it]=Affiancamento finestre Name[kab]=Aswati n isfuyla Name[ko]=창 타일링 Name[lt]=Langų išdėliojimas Name[nb]=Vindusorganisering Name[nds]=Fensterkacheln Name[nl]=Tegelen van vensters Name[oc]=Juxtaposicion de fenèstras Name[pl]=Ułożenie okien Name[pt]=Arrumação de Janelas Name[pt_BR]=Janelas em mosaico e encaixes Name[ro]=Tiling fereastră Name[ru]=Оконная кладка Name[sk]=Dláždenie okien Name[sr]=Поплочавање прозора Name[sr@ijekavianlatin]=Поплочавање прозора Name[sr@latin]=Поплочавање прозора Name[sv]=Fönster sida-vid-sida Name[th]=การจัดวางหน้าต่าง Name[tr]=Pencere Döşeme Name[uk]=Віконна кладка Name[ur]=ونڈو ٹائلنگ Name[uz]=Ойнани Қисмлаш Name[vi]=Lát Cửa sổ Name[zh_CN]=窗口平铺 Name[zh_HK]=視窗平舖 Name[zh_TW]=視窗平舖 Comment=Manage window tiling preferences Comment[am]=የ መስኮት መደርደሪያ ምርጫዎች አስተዳዳሪ Comment[ar]=إدارة تفضيلات تباعد النافذة Comment[az]=Pəncərə döşəmə üstünlüklərini yönəlt Comment[be]=Кіраванне параметрамі мазаічнага размяшчэння вокнаў Comment[bg]=Управление подредбата на прозорците Comment[bs]=Upravljaj postavkama pločastog prikaza prozora Comment[ca]=Gestioneu les preferències de mosaic de finestres Comment[ca@valencia]=Gestioneu les preferències de mosaic de finestres Comment[cs]=Správa předvoleb uspořádávání oken do dlaždic Comment[cy]=Rheoli dewisiadau teilsio ffenestri Comment[da]=Administrér indstillinger for side om side-placering Comment[de]=Kacheleinstellungen der Fenster verwalten Comment[el]=Διαχείριση προτιμήσεων τοποθέτησης παραθύρων ως πλακίδια Comment[es]=Administrar las preferencias de ajuste de ventanas Comment[es_AR]=Administrar las preferencias de ajuste de ventanas Comment[eu]=Kudeatu leihoak lauzatzeko hobespenak Comment[fi]=Muokkaa ikkunoiden ruudutuksen asetuksia Comment[fr]=Gérer les préférences de juxtaposition des fenêtres Comment[fr_CA]=Gérer les préférences de juxtaposition des fenêtres Comment[gd]=Stiùirich roghainnean leacadh nan uinneagan Comment[gl]=Administra as preferencias do mosaixo de xanelas Comment[he]=נהל את העדפות ריצוף החלונות Comment[hr]=Upravljajte osobitostima slaganja prozora Comment[hu]=Ablak mozaik beállítások kezelése Comment[ia]=Gerer le preferentias del pavimentation del fenestra Comment[id]=Atur preferensi pengubinan jendela Comment[is]=Sýsla með kjörstillingar fyrir uppröðun glugga Comment[it]=Gestisci le preferenze di affiancamento delle finestre Comment[kab]=Sefrek ismenyifen n umlawy n isfuyla Comment[ko]=창 타일링 설정 관리하기 Comment[lt]=Tvarkyti langų išdėliojimo nuostatas Comment[ms]=Mengurus pilihan jubin tetingkap Comment[nb]=Håndter innstillinger for vindusorganisering Comment[nds]=Fensteranordnungseinstellungen verwalten Comment[nl]=Voorkeuren beheren voor het tegelen van vensters Comment[pl]=Zarządzaj preferencjami kafelkowania okien Comment[pt]=Gerir as definições de arrumação de janelas Comment[pt_BR]=Gerenciar as definições das janelas em mosaico Comment[ro]=Gestionează preferințele pentru tilingul ferestrelor Comment[ru]=Управление параметрами мозаичного размещения окон Comment[sk]=Spravuje predvoľby dláždenia okien Comment[sl]=Upravljajte z možnostmi razpostavljanja oken Comment[sr]=Управљање поставкама слагања прозора Comment[sr@ijekavianlatin]=Управљање поставкама слагања прозора Comment[sr@latin]=Управљање поставкама слагања прозора Comment[sv]=Hantera inställningar för radning av fönster Comment[tg]=Идоракунии хусусиятҳои лавҳабандии равзанаҳо Comment[th]=จัดการค่าปรับแต่งการจัดวางหน้าต่าง Comment[tr]=Pencere döşeme seçeneklerini yönet Comment[uk]=Керування прилипанням вікон Comment[ur]=ونڈو ٹائلنگ کی ترجیحات کا انتظام کریں Comment[uz]=Ойнани қисмлари учун параметрларни бошқариш Comment[vi]=Quản lý tuỳ thích lát cửa sổ Comment[zh_CN]=管理窗口平铺样式 Comment[zh_HK]=管理視窗平舖喜好設定 Comment[zh_TW]=管理視窗平舖偏好設定 Keywords=window;tile;flip;tiling;snap;snapping; Keywords[am]=መስኮት፡ መደርደሪያ ፡ መገልበጫ፡ መደርደሪያዎች፡ መቁረጫ፡ መቁረጫዎች; Keywords[ar]=النافذة، التجانب، الانعكاس، التباعد، الالتقاط، التقاط; Keywords[az]=pəncərə;döşək;çevirmək;döşəmə;çəkim;çəkilmə; Keywords[be]=акно;пазіцыя;прыцягненне;прымацаванне;абароненая пазіцыя;абароненае прымацаванне; Keywords[bg]=прозорец;подреждане;обръщане;прилепване; Keywords[bs]=prozor;složi;pomakni;slaganje;poravnaj;poravnanje; Keywords[ca]=finestra;rajola;voltejat;mosaic;clic;ajust a la quadrícula; Keywords[ca@valencia]=finestra;rajola;voltejat;mosaic;clic;ajust a la quadrícula; Keywords[cs]=okno;dlaždice;přetočení;uspořádávání;přichytit;přichycení; Keywords[cy]=ffenestr;teil;ffeil;teilsio;snap;snapio; Keywords[da]=vindue;flise;vend;side om side;fastgør;fastgørelse; Keywords[de]=Fenster;Kacheln;Umschalten;Kacheln;Einrasten;Einrasten; Keywords[el]=παράθυρο;πλακίδιο;αναστροφή;τοποθέτηση ως πλακίδια;λαβή;συγκράτηση; Keywords[es]=ventana;ajuste;volteado;ajustar;anclado;anclar; Keywords[es_AR]=ventana;ajuste;volteado;ajustar;anclado;anclar; Keywords[eu]=leihoa;lauza;irauli;lauzatzea;atxiki;atxikitzea; Keywords[fi]=ikkuna;ruutu;käännös;ruudutus;napsauttaa;napsautus; Keywords[fr]=fenêtre;juxtaposition;basculer;ajuster;ajustement; Keywords[fr_CA]=fenêtre;juxtaposition;basculer;aligner;alignement; Keywords[gd]=uinneag;leac;flipeadh;flip;leacadh;greimich;greimeachadh;window;tile;flip;tiling;snap;snapping; Keywords[gl]=xanela;baldosa;volteado;mosaico;axustar;axuste; Keywords[he]=חלון;אריח;להפוך;ריצוף;הצמד;הצמדה; Keywords[hr]=prozor;složi;pomakni;slaganje;poravnaj;poravnanje; Keywords[hu]=ablak;mozaik;forgatás;mozaikba rendezés;igazított;igazítás; Keywords[ia]=fenestra;quadrello;colpar legiermente;quadrellatura;fixar;fixation; Keywords[id]=jendela;mode ubin;balik;mengubin;jepit;menjepit; Keywords[is]=gluggi;flísar;fletta;flísaleggja;grip;grípa; Keywords[it]=finestra;affianca;vibra;disponi;aggancia;agganciamento; Keywords[ja]=ウィンドウ、タイル、フリップ、タイル表示、スナップ、スナップ化; Keywords[kab]=asfaylu;amlaway;qluqel;swati;aswati; Keywords[ko]=창;타일;뒤집기;타일링;스냅;스내핑; Keywords[lt]=langas;iškloti;išklojimas;priglausti;priglaudimas; Keywords[ms]=tetingkap;jubin;kalij;penjubinan;lekap;pelekapan; Keywords[nb]=vindu;flis;snu;flislegging;fest;feste; Keywords[nds]=Fenster;Kachel;schnipp;knicken;abgeknickt; Keywords[nl]=venster;tegelen;omdraaien;tegelen;uitlijnen; Keywords[om]=Foddaa;dalga tuula;fuggisa;dalga tuuluu;xaaxxuu;xaxxise; Keywords[pl]=okno;płytka;odwracanie;kafelkowanie;przystawka;przyciąganie; Keywords[pt]=janela;mosaico;inversão;ajuste;magnetismo;ajustar; Keywords[pt_BR]=janela;mosaico;flip;ativar mosaico;encaixe;ativar encaixe; Keywords[ro]=fereastră;tile;întoarce;tiling;snap;snapping; Keywords[ru]=окно;позиция;притяжение;прикрепление;защищенная позиция;защищенное прикрепление; Keywords[sk]=okno;dlaždice;pretočenie;dláždenie;prichytiť;prichytenie; Keywords[sl]=okno;ploščica;zrcali;razpostavljanje;pripni;pripenjanje; Keywords[sr]=прозор;сложи;преокрени;слагање;хватање;поравнање; Keywords[sr@ijekavianlatin]=прозор;сложи;преокрени;слагање;хватање;поравнање; Keywords[sr@latin]=прозор;сложи;преокрени;слагање;хватање;поравнање; Keywords[sv]=fönster;rada;vänd;radning;fästa;fästning; Keywords[tg]=равзана;лавҳа;табдил;лавҳабандӣ;часпонидан;часпиш; Keywords[th]=หน้าต่าง;การจัดวาง;พลิก;สแนป;การสแนป; Keywords[tr]=pencere;döşe;çevirme;döşeme;yasla;yaslama; Keywords[uk]=вікно;позиція;притягування;прикріплення;захищена позиція;захищене прикріплення; Keywords[ur]=ونڈو، عنوان، ٹائٹل، فلپ، ٹائلنگ، سنیپ; Keywords[uz]=ойна;қисм;буриш;қисмлаш;тасвир;тасвирга олиш; Keywords[vi]=cửa sổ;ô;lật;lát;bám;bám dính; Keywords[zh_CN]=window;tile;flip;tiling;snap;snapping;窗口;平铺;吸附; Keywords[zh_HK]=視窗;平舖;翻轉;平舖;吸附;吸附; Keywords[zh_TW]=視窗;平舖;翻躍;平舖;吸附;吸附; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-universal-access.desktop000066400000000000000000000267011360505115200313400ustar00rootroot00000000000000[Desktop Entry] Icon=cs-universal-access Exec=cinnamon-settings universal-access Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Accessibility Name[af]=Toeganklikheid Name[am]=በቀላሉ የሚደረስበት Name[ar]=سهولة الوصول Name[ast]=Accesibilidá Name[az]=Əlçatımlılıq Name[be]=Дадатковыя магчымасці Name[bg]=Достъпност Name[bn]=বিশেষ সুবিধা 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õlbustus 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[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[kab]=Tuffart Name[kk]=Қол жетерлілік Name[km]=មធ្យោបាយ​ងាយស្រួល Name[kn]=ನಿಲುಕಣೆ (ಆಕ್ಸೆಸಿಬಿಲಿಟಿ) Name[ko]=편리한 기능 Name[ku]=Gehînbarî Name[la]=Adcessibilitas Name[lo]=ການຊ່ວຍການເຂົ້າເຖິງ Name[lt]=Prieinamumas Name[lv]=Pieejamība Name[ml]=ഉപയോഗലഭ്യത 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@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]=Махсус имкониятлар 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[az]=Əlçatımlılıq özəlliklərini qur 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[eu]=Konfiguratu erabilerraztasun ezaugarriak Comment[fi]=Hallitse esteettömyysasetuksia Comment[fr]=Configuration des fonctionnalités d'accessibilité Comment[fr_CA]=Configuration des fonctionnalités d’accessibilité Comment[he]=הגדר פיצ'רים לנגישות 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[kab]=Aswalo n tmesɣent n tuffart Comment[ko]=편리한 기능 설정하기 Comment[lt]=Konfigūruoti prieinamumo ypatybes Comment[nap]=Configura 'e funzioni d'accessibilità Comment[nl]=Toegankelijkheidsfuncties instellen Comment[pl]=Konfiguruj funkcje ułatwienia dostępu Comment[pt]=Configurar as funções de acessibilidade Comment[pt_BR]=Configurar recursos de acessibilidade Comment[ro]=Configurează caracteristicile de accesibilitate Comment[ru]=Настройка специальных возможностей Comment[sc]=Propiedades de atzessibilidade Comment[sk]=Nastavuje funkcie zjednodušenia ovládania Comment[sl]=Konfiguriraj dostopnostne funkcije Comment[sr]=Подесите функције приступачности Comment[sr@ijekavianlatin]=Подесите функције приступачности Comment[sr@latin]=Подесите функције приступачности 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]=Қўшимча имкониятлар хоссаларини созлаш Comment[zh_CN]=配置辅助功能 Comment[zh_HK]=設定無障礙存取功能 Comment[zh_TW]=調整無障礙輔助功能 Keywords=magnifier;talk;access;zoom;keys;contrast; Keywords[am]=ማጉያ : መነጋገሪያ : ፍቃድ : ማሳያ : ቁልፎች : ማነፃፅሪያ; Keywords[ar]=المكبر، التحدث، الوصول، التكبير، المفاتيح، التباين; Keywords[ast]=lente;falar;accesu;zoom;tecles;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;zoom;teclas;contraste; Keywords[es_AR]=lupa;hablar;acceso;zoom;teclas;contraste; 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;parler;accès;zoom;clés;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[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;perbesar;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]=拡大鏡、トーク、アクセス、ズーム、キー、コントラスト; 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[pa]=ਮੈਗਨੀਫਾਇਰ;ਟਾੱਕ;ਅੱਕਸੈੱਸ;ਜ਼ੂਮ;ਚਾਬੀਆਂ;ਕੋਂਟਰਾਸਟ; Keywords[pl]=lupa;rozmowy;dostęp;powiększenie;klucze;kontrast; Keywords[pt]=amplificador;conversa;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[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[sr]=лупа;говор;приступ;увеличавање;дугмад;контраст; Keywords[sr@ijekavianlatin]=лупа;говор;приступ;увеличавање;дугмад;контраст; Keywords[sr@latin]=лупа;говор;приступ;увеличавање;дугмад;контраст; 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]=лупа;суҳбат;рухсат бериш;масштабни ўзгартириш;калитлар;контраст; 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-4.4.8/files/usr/share/applications/cinnamon-settings-user.desktop000066400000000000000000000226161360505115200270500ustar00rootroot00000000000000[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[az]=Oturum ayrıntıları Name[be]=Дэталі ўліковага запісу Name[bg]=Данни за акаунта 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 cuenta Name[es_AR]=Detalles de cuenta Name[et]=Konto üksikasjad Name[eu]=Kontuaren xehetasunak 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[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[kab]=Ifatusen n umiḍan Name[ko]=사용자 정보 Name[lt]=Paskyros informacija Name[lv]=Detalizēta informācija par kontu Name[ms]=Perincian akaun Name[nb]=Kontodetaljer Name[nds]=Konto - Einzelheiten Name[nl]=Accountdetails 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[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@ijekavianlatin]=Детаљи о налогу Name[sr@latin]=Детаљи о налогу Name[sv]=Kontodetaljer Name[ta]=கணக்கு விவரங்கள் Name[tg]=Тафсилоти ҳисоб Name[th]=รายละเอียดบัญชีผู้ใช้ Name[tr]=Hesap Ayrıntıları Name[uk]=Дані облікового запису Name[ur]=کھاتے کی تفصیلات دکھائیں Name[uz]=Аккаунт тавсилотлари 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 y contraseñ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]=Benutzereinstellungen und Passwort ändern Comment[el]=Αλλάξτε τις προτιμήσεις χρήστη σας και τον κωδικό πρόσβασης Comment[es]=Cambiar las preferencias de usuario y contraseña Comment[es_AR]=Cambiar las preferencias de usuario y contraseña Comment[eu]=Aldatu erabiltzailearen hobespenak eta pasahitza Comment[fi]=Muuta käyttäjäasetuksiasi ja salasanaasi Comment[fr]=Changez vos préférences utilisateur et votre mot de passe Comment[fr_CA]=Modifier vos paramètres 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[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[kab]=Snifel ismenyifen inek n useqdac akked wawal n uɛeddi Comment[ko]=사용자 설정과 비밀번호를 바꿉니다 Comment[lt]=Keisti naudotojo nuostatas ir slaptažodį Comment[lv]=Mainīt savas lietotāja vēlmes 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[pl]=Zmień swoje preferencje użytkownika i hasło Comment[pt]=Mudar as suas preferências de utilizador e palavra passe Comment[pt_BR]=Mudar senha e preferências do usuário Comment[ro]=Schimbați preferințele pentru utilizator și parolă Comment[ru]=Изменить пользовательские настройки и пароль 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@ijekavianlatin]=Промени поставке вашег налога и лозинку Comment[sr@latin]=Промени поставке вашег налога и лозинку Comment[sv]=Ändra dina användarinställnigar och lösenord Comment[tg]=Тағйир додани хусусиятҳо ва пароли корбар Comment[th]=เปลี่ยนการตั้งค่าผู้ใช้ขั้นสูงและรหัสผ่านของคุณ Comment[tr]=Kullanıcı tercihlerini/haklarını ve şifresini değiştir Comment[uk]=Змінити ваші налаштування користувача і пароль Comment[ur]=اپنی ترجیحات یا پاسورڈ بدلیں Comment[uz]=Параметрлар ва паролингизни ўзгартиринг 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[ar]=المستخدم، الحساب، المعلومات، التفاصيل، كلمة السر; Keywords[bg]=потребител;акаунт;информация;детайли;парола; 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[es]=usuario;cuenta;información;detalles;contraseña; Keywords[es_AR]=usuario;cuenta;información;detalles;contraseña; Keywords[eu]=erabiltzailea;kontua;informazioa;xehetasunak;pasahitza; Keywords[fi]=käyttäjä;tili;tiedot;yksityiskohdat;salasana; Keywords[fr]=utilisateur;compte;information;détails;mot de passe; Keywords[fr_CA]=utilisateur;compte;information;détails;mot de passe; Keywords[he]=משתמש;חשבון;מידע;פרטים;סיסמא; 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[is]=notandi;aðgangur;reikningur;notandaupplýsingar;nánar;lykilorð; Keywords[kab]=aseqdac;amiḍan;talɣut;talqayt;awal uffir; Keywords[ko]=사용자;계정;정보;자세한 내용;비밀번호; Keywords[lt]=naudotojas;paskyra;abonementas;informacija;išsamiau;slaptažodis; Keywords[nl]=gebruiker;account;informatie;details;wachtwoord; 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[sk]=používateľ;užívateľ;účet;informácie;informácia;podrobnosti;detaily;heslo; Keywords[sr]=корисник;налог;информације;детаљи;лозинка; Keywords[sr@ijekavianlatin]=корисник;налог;информације;детаљи;лозинка; Keywords[sr@latin]=корисник;налог;информације;детаљи;лозинка; Keywords[sv]=användaren;konto;information;detaljer;lösenord; Keywords[tr]=kullanıcı;hesap;bilgi;ayrıntı;şifre; Keywords[uk]=користувач;обліківка;інформація;деталі;пароль; Keywords[zh_CN]=用户,帐户,信息,详情,密码; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-users.desktop000066400000000000000000000224161360505115200272310ustar00rootroot00000000000000[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[az]=İşlədənlər, Birliklər Name[be]=Карыстальнікі і групы Name[bg]=Потребители и Групи Name[bn]=ব্যবহারকারীগণ এবং দলসমূহ 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[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]=Homines annuntiaturi et circli Name[li]=Gebroekers en groepe Name[lo]=ຜູ້ໃຊ້ແລະກຸ່ມ Name[lt]=Naudotojai ir grupės Name[lv]=Lietotāji un grupas 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[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[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@ijekavianlatin]=Корисници и групе Name[sr@latin]=Korisnici i grupe Name[sv]=Användare och grupper Name[ta]=பயனர்கள் மற்றும் குழுக்கள் 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]=Фойдаланувчилар ва гуруҳлар Name[vi]=Người dùng và Nhóm 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[az]=İşlədənləri, birlikləri artır ya da sil Comment[be]=Дадаць або выдаліць карыстальнікаў і групы Comment[bg]=Добавяне или премахване на потребители и групи Comment[bn]=ব্যবহারকারী এবং দল যোজন-বিয়োজন করুন 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[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]=Tambah atau hapus pemakai dan kelompoknya 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]=Addere aut delere homines annuntiaturi et circli 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[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 ou 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[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@ijekavianlatin]=Додајте или уклоните кориснике и групе Comment[sr@latin]=Dodajte ili uklonite korisnike i grupe Comment[sv]=Lägg till eller ta bort användare och grupper Comment[ta]=பயனர் மற்றும் குழுக்களை சேர் அல்லது நீக்கு Comment[tg]=Илова ё тоза кардани корбарон ва гурӯҳҳо Comment[th]=เพิ่มหรือลบผู้ใช้และกลุ่ม Comment[tl]=Magdagdag o magbawas ng mga user at pangkat Comment[tr]=Kullanıcıları ve grupları ekle ya da sil Comment[ug]=ئىشلەتكۈچى ۋە گۇرۇپپا قوش ياكى ئۆچۈر Comment[uk]=Додавання або вилучення записів користувачів та груп Comment[ur]=صارفین اور گروہ شامل کریں یا مٹائیں Comment[uz]=Фойдаланувчилар ва гуруҳларни қўшиш ёки олиб ташлаш Comment[vi]=Thêm hay loại bỏ người dùng và nhóm Comment[zh_CN]=添加或删除用户和组 Comment[zh_HK]=新增或移除使用者與羣組 Comment[zh_TW]=加入或移除使用者與群組 cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-windows.desktop000066400000000000000000000252631360505115200275650ustar00rootroot00000000000000[Desktop Entry] Icon=cs-windows Exec=cinnamon-settings windows Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Windows Name[am]=መስኮቶች Name[ar]=النوافذ Name[ast]=Ventanes Name[az]=Pəncərələr Name[be]=Вокны Name[bg]=Прозорци 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[eu]=Leihoak Name[fi]=Ikkunat Name[fil]=Mga dungawan Name[fr]=Fenêtres Name[fr_CA]=Fenêtres Name[ga]=Fuinneoga Name[gd]=Uinneagan Name[gl]=Xanelas Name[he]=חלונות Name[hr]=Prozori Name[hu]=Ablakok Name[ia]=Fenestras Name[id]=Jendela-jendela Name[ie]=Fenestres Name[is]=Gluggar Name[it]=Finestre Name[ja]=ウィンドウ Name[kab]=Isfuyla Name[ko]=창 Name[ku]=Pencere(Windows) Name[lo]=ໜ້າຕ່າງ Name[lt]=Langai Name[lv]=Logi Name[ms]=Tetingkap Name[nb]=Vinduer Name[nds]=Fenster Name[nl]=Vensters 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[sc]=Bentanas Name[sk]=Okná Name[sl]=Okna Name[sq]=Dritaret Name[sr]=Виндоус Name[sr@ijekavianlatin]=Виндоус Name[sr@latin]=Виндоус 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[az]=Pəncərə üstünlüklərini yönəlt Comment[be]=Кіраванне наладамі вокнаў Comment[bg]=Управление настройките на прозорците 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[es]=Administrar las preferencias de ventanas Comment[es_AR]=Administrar las preferencias de ventanas Comment[eu]=Kudeatu leiho-hobespenak Comment[fi]=Muokkaa ikkunoiden asetuksia Comment[fr]=Gérer les préférences de la fenêtre 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[hr]=Upravljajte osobitostima prozora Comment[hu]=Ablak beállítások kezelése Comment[ia]=Gerer le preferentias de fenestra Comment[id]=Atur preferensi jendela Comment[is]=Sýsla með kjörstillingar glugga Comment[it]=Gestisci preferenze finesta Comment[kab]=Sefrek ismenyifen n usfaylu Comment[ko]=창 설정을 관리합니다 Comment[lt]=Tvarkyti lango nuostatas Comment[lv]=Pārvaldīt logu preferences Comment[ms]=Mengurus pilihan tetingkap Comment[nb]=Håndter vindusinnstillinger Comment[nds]=Fenster-Einstellungen bearbeiten Comment[nl]=Venstervoorkeuren beheren 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[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@ijekavianlatin]=Управљање поставкама прозора Comment[sr@latin]=Управљање поставкама прозора Comment[sv]=Hantera fönsterinställningar Comment[tg]=Идоракунии хусусиятҳои равзана Comment[th]=จัดการค่าปรับแต่งหน้าต่าง Comment[tr]=Pencere tercihlerini yönet Comment[uk]=Керувати параметрами вікон Comment[ur]=ونڈو کی ترجیحات Comment[uz]=Ойна параметрларини бошқариш 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; Keywords[am]=መስኮቶች: አርእስት መደርደሪያ: ጠርዞች: መቀየሪያ: የ መስኮት ዝርዝር: ማስጠንቀቂያ: ትኩረት:; Keywords[ar]=النوافذ، شريط العنوان، الحافة، المحول، القائمة النافذة، انتباه، التركيز; Keywords[az]=pəncərə;başlıqyeri;qıraq;dəyişən;pəncərə ardımı;ilgi; Keywords[be]=вокны;загаловак;край;пераключацель;спіс вокнаў;увага;фокус; Keywords[bg]=прозорец;заглавна лента;ръб;превключване;списък с прозорци;внимание;фокус; Keywords[bs]=prozori;traka naslova;ivica;mjenjač;lista prozora;pažnja;fokus; Keywords[ca]=finestres;barra de títol;vora;interruptor;llista de finestres;atenció;enfocament; Keywords[ca@valencia]=finestres;barra de títol;vora;interruptor;llista de finestres;atenció;enfocament; Keywords[cs]=okna;nadpis;hrana;přepínač;seznam oken;pozornost;zaměřit; Keywords[cy]=ffenestri;bar teitl;ymyl;newidydd;rhestr ffenestr;sylw;canolbwyntio; Keywords[da]=vinduer;titellinje;kant;skifter;vinduesliste;opmærksomhed;fokus; Keywords[de]=Fenster;Titelleiste;Umrandung;Umschalter;Fensterliste;Aufmerksamkeit;Fokus; Keywords[el]=παράθυρα;γραμμή τίτλου;άκρη;διακόπτης;λίστα παραθύρων;προσοχή;εστίαση; Keywords[es]=ventanas;barra de título;borde;interruptor;lista de ventanas;atención;enfoque; Keywords[es_AR]=ventanas;barra de título;borde;interruptor;lista de ventanas;atención;enfoque; Keywords[eu]=leihoa;titulu-barra;ertza;aldatzailea;leiho-zerrenda;arreta;fokua; Keywords[fi]=ikkunat;otsikkopalkki;reuna;vaihtaja;ikkunalista;huomio;keskitys; Keywords[fr]=fenêtre;barre de titre;bord;commutateur;liste de fenêtre;attention;focus; Keywords[fr_CA]=fenêtres;barre de titre;bord;commutateur;liste de fenêtres;attention;focus; Keywords[ga]=fuinneoga;barra teidil;imeall;lascóir;liosta fuinneoige;aird;fócas; Keywords[gd]=uinneagan. bàr-tiotail;oir;suidsear;liosta nan uinneagan;aire;fòcas;windows;titlebar;edge;switcher;window list;attention;focus; Keywords[gl]=xanelas;barra de título;bordo;cambiador;lista de xanelas;atención;foco; Keywords[he]=חלון;לוח-כותרת;קצוות;מחליף;רשינת חלונות;תשומת לב;מיקוד; Keywords[hr]=prozori;naslovna traka;rub;prijelaz;popis prozora;upozorenje;fokus; Keywords[hu]=ablakok;címsor;él;váltó;ablaklista;figyelem;fókusz; Keywords[ia]=fenestras;barra de titulo;bordo;commutator;lista del fenestras;attention;foco; Keywords[id]=jendela;bar judul;ujung;pemindah;daftar jendela;perhatian;fokus; Keywords[is]=gluggar;titilslá;jaðar;skiptir;gluggalisti;kvaðning;athygli;fókus;virkni; Keywords[it]=finestre;barra del titolo;margine;switcher;elenco finestre;attenzione;focus; Keywords[ja]=ウィンドウ、タイトルバー、エッジ、スイッチャーウィンドウリスト、注意、フォーカス; Keywords[kab]=asfaylu;tafeggagt n uzwel;iri;asenfal;tabdart n usfaylu;lwelha;asaḍas; Keywords[ko]=창;제목;엣지;스위처;창 목록;집중;초점; Keywords[lv]=logi;virsraksta josla;mala;pārslēdzējs;logu saraksts;uzmanība;fokuss; Keywords[ms]=tetingkap;palang tajuk;pinggir;penukar;senarai tetingkap;perhatian;fokus; Keywords[nb]=vindu;tittellinje;kant;bryter;vindusliste;oppmerksomhet;fokus; Keywords[nl]=vensters;titelbalk;rand;wisselaar;vensterlijst;aandacht;scherpstelling; Keywords[om]=foddaawwan;kabala mataduree;qarree;jijjirtuu;tarree foddaa;hubadhu;xiyyeeffadhu; Keywords[pl]=okna;pasek tytułowy;krawędź;przełącznik;lista okien;uwaga;skupienie; Keywords[pt]=janelas;barra de título;limite;comutador;lista de janelas;foco; Keywords[pt_BR]=janelas;barra de título;margem;alternador;lista de janelas;atenção;foco; Keywords[ro]=ferestre;bară de titlu;margine;comutator;listă de ferestre;atenție;focus; Keywords[ru]=окна;заголовок;край;переключатель;список окон;внимание;фокус; Keywords[sc]=bentanas;barra de tìtulu;oru;cuncambiadore;lista de bentanas;atentzione;focus; Keywords[sk]=okná;nadpisy;strany;prepínáč;zoznam okien;pozornosť;zamerať; Keywords[sl]=okna;nazivna vrstica;rob;preklopnik;seznam oken;pozornost;žarišče; Keywords[sr]=прозори;насловна трака;ивица;измењивач;списак прозора;пажња;жижа; Keywords[sr@ijekavianlatin]=прозори;насловна трака;ивица;измењивач;списак прозора;пажња;жижа; Keywords[sr@latin]=прозори;насловна трака;ивица;измењивач;списак прозора;пажња;жижа; Keywords[sv]=fönster;titellist;kant;växlare;fönsterlist;uppmärksamhet;fokus; Keywords[ta]=சாளரங்கள்;தலைப்புபட்டி;முனை;மாற்றி;சாளர பட்டியல்;கவனம்;குவிப்பு; Keywords[tg]=равзанаҳо;навори унвон;канор;ивазкунанда;рӯйхати равзана;диққат;марказ; Keywords[th]=หน้าต่าง;แถบชื่อเรื่อง;ขอบเขต;ตัวสลับ;รายการหน้าต่าง;คำเตือน;โฟกัส; Keywords[tr]=pencereler;başlık çubuğu;kenar;değiştirici;pencere listesi;uyarı;odaklanma; Keywords[uk]=вікна;заголовок;край;перемикач;перелік вікон;увага;фокус; Keywords[ur]=ونڈو، ٹائٹل بار، دریجہ، کنارہ، سویچر، ونڈو فہرست، توجہ، فوکس; Keywords[uz]=ойналар;сарлавҳа жойи;чет;алмаштиргич;ойналар рўйхати;диққат;фокус; Keywords[vi]=cửa sổ;thanh tiêu đề;cạnh;bộ chuyển;danh sách cửa sổ;chú ý;tiêu điểm; Keywords[zh_CN]=windows;titlebar;edge;switcher;window list;attention;focus;窗口;标题栏;边缘;切换器;窗口列表;注意;焦点; Keywords[zh_HK]=視窗;標題列;邊緣;切換器;視窗清單;注意;焦點; Keywords[zh_TW]=視窗;標題列;邊緣;切換器;視窗列表;注意;焦點; cinnamon-4.4.8/files/usr/share/applications/cinnamon-settings-workspaces.desktop000066400000000000000000000223101360505115200302420ustar00rootroot00000000000000[Desktop Entry] Icon=cs-workspaces Exec=cinnamon-settings workspaces Type=Application OnlyShowIn=X-Cinnamon; Categories=Settings; Name=Workspaces Name[am]=የ ስራ ቦታዎች Name[ar]=مساحات العمل Name[ast]=Estayes de trabayu Name[az]=İş bölgələri Name[be]=Рабочыя месцы Name[bg]=Работни места 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ööruumid Name[eu]=Laneko areak 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[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[kab]=Tallunin n umahil Name[ko]=작업 공간 Name[ku]=Kargeh Name[lo]=ພື້ນທີ່ເຮັດວຽກ Name[lt]=Darbo sritys Name[lv]=Darbvietas Name[ms]=Ruang Kerja Name[nb]=Arbeidsområder Name[nds]=Arbeitsflächen Name[nl]=Werkbladen 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]=Spații de lucru Name[ru]=Рабочие области Name[sc]=Àreas de traballu Name[sk]=Pracovné priestory Name[sl]=Delovni prostor Name[sq]=Hapësirat e punës Name[sr]=Радни простори Name[sr@ijekavianlatin]=Радни простори Name[sr@latin]=Радни простори Name[sv]=Arbetsytor Name[ta]=பணியிடங்கள் Name[tg]=Фазоҳои корӣ Name[th]=พื้นที่ทำงาน Name[tr]=Çalışma Alanları Name[uk]=Робочі простори Name[ur]=ورک سپیسز Name[uz]=Иш жойлари 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[az]=İş bölgəsi üstünlüklərini yönəlt Comment[be]=Кіраванне наладамі працоўнага стала Comment[bg]=Управление на настройките за работни плотове 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 gweithfannau Comment[da]=Administrér arbejdsområdeindstillinger Comment[de]=Arbeitsflächeneinstellungen verwalten Comment[el]=Ρυθμίστε τους χώρους εργασίας Comment[es]=Administrar las preferencias de las áreas de trabajo Comment[es_AR]=Administrar las preferencias de las áreas de trabajo Comment[eu]=Kudeatu laneko areen hobespenak Comment[fi]=Hallitse työtilojen asetuksia Comment[fr]=Gérer les préférences de l'espace 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[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]=Gestione preferenze area di lavoro Comment[kab]=Sefrek ismenyifen n tallunt n umahil Comment[ko]=작업 공간 설정 관리 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[pl]=Zarządzaj preferencjami obszarów roboczych Comment[pt]=Gerir preferência do espaço de trabalho Comment[pt_BR]=Gerenciar preferências de espaço de trabalho Comment[ro]=Gestionează preferințele spațiului de lucru Comment[ru]=Настройки рабочих областей 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@ijekavianlatin]=Управљање поставкама радног простора Comment[sr@latin]=Управљање поставкама радног простора 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]=Иш жойи параметрларини бошқариш 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[az]=iş bölgəsi;osd;göstəriş;göstərən; Keywords[be]=рабочая вобласць;osd;экспазіцыя;манітор; 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[es]=área de trabajo;visualización en pantalla;expo;monitor; Keywords[es_AR]=área de trabajo;visualización en pantalla;expo;monitor; Keywords[eu]=laneko area;osd;expo;monitorea; Keywords[fi]=työtila;osd;esittelynäkymä;näyttö; Keywords[fr]=espace de travail;osd;expo;moniteur; Keywords[fr_CA]=espace de travail;osd;expo;moniteur; 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[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]=area kerja;osd;expo;monitor; Keywords[is]=vinnusvæði;stjórntexti;expo;skjár; Keywords[it]=area di lavoro;osd;expo;monitor; Keywords[ja]=ワークスペース、OSD、expo、モニタ; Keywords[kab]=tallunt n umahil;osd;expo;agdil; Keywords[ko]=작업 공간;osd;작업 공간 표시;살펴보기; Keywords[ms]=ruang kerja;osd;expo;monitor; Keywords[nds]=Arbeitsbereich;OSD;Expo;Monitor; Keywords[nl]=werkblad;osd;expo;beeldscherm; 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;exibição na tela;modo expo;monitor; Keywords[ro]=spațiu de lucru;osd;expo;monitor; Keywords[ru]=рабочая область;экранная индикация;expo;монитор; Keywords[sc]=àrea de traballu;osd;expo;ischermu; Keywords[sk]=pracovná plocha;osd;expo;monitor; Keywords[sl]=delovni prostor;osd;razstava;monitor; Keywords[sr]=радни простор;простирање;осд;екран; Keywords[sr@ijekavianlatin]=радни простор;простирање;осд;екран; Keywords[sr@latin]=радни простор;простирање;осд;екран; 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]=иш жойи;osd;экспо;монитор; 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-4.4.8/files/usr/share/applications/cinnamon-settings.desktop000066400000000000000000000152341360505115200260720ustar00rootroot00000000000000[Desktop Entry] Exec=cinnamon-settings Icon=preferences-system 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[az]=Qurmaca Quruluşları Name[be]=Сістэмныя налады Name[bg]=Системни настройки Name[bn]=সিস্টেমের সেটিং Name[bs]=Sistemske postavke Name[ca]=Ajusts del sistema Name[ca@valencia]=Ajusts del sistema Name[cs]=Nastavení systému Name[cy]=Gosodiadau 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]=Järjestelmäasetukset Name[fil]=Mga Setting ng System Name[fr]=Paramètres système Name[fr_CA]=Paramètres 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[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[ko]=시스템 설정 Name[ku]=Mîhengên pergalê Name[la]=computator commuta Name[li]=Systeeminsjtellinge Name[lo]=ການຕັ້ງຄ່າລະບົບ Name[lt]=Sistemos nustatymai Name[lv]=Sistēmas iestatījumi 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[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[sc]=Cunfiguratziones de sistema Name[si]=පද්ධති සැකසුම් Name[sk]=Systémové nastavenia Name[sl]=Sistemske nastavitve Name[sq]=Parametrat e sistemit Name[sr]=Подешавања система Name[sr@ijekavianlatin]=Подешавања система Name[sr@latin]=Sistemska podešavanja Name[sv]=Systeminställningar Name[ta]=கணினி அமைப்புகள் Name[tg]=Танзимоти низом Name[th]=ค่าตั้งระบบ Name[tl]=Mga Settings ukol sa Sistema Name[tr]=Sistem Ayarları Name[ug]=سىستېما تەڭشىكى Name[uk]=Системні налаштування Name[ur]=سسٹم کی ترتیبات Name[uz]=Тизим созламалари Name[vi]=Thiết lập Hệ thống 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[az]=Yönətmə Ortası Comment[be]=Цэнтр кіравання Comment[bg]=Контролен център Comment[bn]=নিয়ন্ত্রণ কেন্দ্র 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[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[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[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[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@ijekavianlatin]=Управљачки центар Comment[sr@latin]=Kontrolni centar Comment[sv]=Hantera inställningar Comment[ta]=கட்டுப்பாட்டு மையம் Comment[tg]=Маркази идоракунӣ Comment[th]=ศูนย์ควบคุม Comment[tl]=Sentro ng Kontrol Comment[tr]=Cinnamon Denetim Merkezi Comment[ug]=باشقۇرۇش مەركىزى Comment[uk]=Центр керування Comment[ur]=کنڑول مرکز Comment[uz]=Назорат маркази Comment[vi]=Trung tâm Điều khiển Comment[zh_CN]=控制中心 Comment[zh_HK]=控制中心 Comment[zh_TW]=控制中心 cinnamon-4.4.8/files/usr/share/applications/cinnamon2d.desktop000066400000000000000000000005531360505115200244600ustar00rootroot00000000000000[Desktop Entry] Type=Application Name=Cinnamon 2D Comment=Window management and application launching Exec=/usr/bin/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-4.4.8/files/usr/share/cinnamon/000077500000000000000000000000001360505115200201465ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/000077500000000000000000000000001360505115200216165ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/a11y@cinnamon.org/000077500000000000000000000000001360505115200250025ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/a11y@cinnamon.org/applet.js000066400000000000000000000230171360505115200266300ustar00rootroot00000000000000const 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_SCHEMA = 'org.cinnamon.desktop.a11y.keyboard'; 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 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.registerRole("a11y", metadata.uuid); this.set_applet_icon_symbolic_name("preferences-desktop-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); let stickyKeys = this._buildItem(_("Sticky Keys"), A11Y_SCHEMA, KEY_STICKY_KEYS_ENABLED); this.menu.addMenuItem(stickyKeys); let slowKeys = this._buildItem(_("Slow Keys"), A11Y_SCHEMA, KEY_SLOW_KEYS_ENABLED); this.menu.addMenuItem(slowKeys); let bounceKeys = this._buildItem(_("Bounce Keys"), A11Y_SCHEMA, KEY_BOUNCE_KEYS_ENABLED); this.menu.addMenuItem(bounceKeys); let mouseKeys = this._buildItem(_("Mouse Keys"), A11Y_SCHEMA, KEY_MOUSE_KEYS_ENABLED); this.menu.addMenuItem(mouseKeys); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addSettingsAction(_("Universal Access Settings"), 'universal-access'); this.a11y_settings = new Gio.Settings({ schema_id: A11Y_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.unregisterRole("a11y", this.metadata.uuid); } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonA11YApplet(metadata, orientation, panel_height, instance_id); } cinnamon-4.4.8/files/usr/share/cinnamon/applets/a11y@cinnamon.org/metadata.json000066400000000000000000000002471360505115200274600ustar00rootroot00000000000000{ "uuid": "a11y@cinnamon.org", "name": "Accessibility", "description": "Accessibility applet", "icon": "preferences-desktop-accessibility", "max-instances": -1 } cinnamon-4.4.8/files/usr/share/cinnamon/applets/calendar@cinnamon.org/000077500000000000000000000000001360505115200260005ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/calendar@cinnamon.org/applet.js000066400000000000000000000163401360505115200276270ustar00rootroot00000000000000const Applet = imports.ui.applet; const Gio = imports.gi.Gio; 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 CinnamonDesktop = imports.gi.CinnamonDesktop; String.prototype.capitalize = function() { return this.charAt(0).toUpperCase() + this.slice(1); } function _onVertSepRepaint (area) { let cr = area.get_context(); let themeNode = area.get_theme_node(); let [width, height] = area.get_surface_size(); let stippleColor = themeNode.get_color('-stipple-color'); let stippleWidth = themeNode.get_length('-stipple-width'); let x = Math.floor(width/2) + 0.5; cr.moveTo(x, 0); cr.lineTo(x, height); Clutter.cairo_set_source_color(cr, stippleColor); cr.setDash([1, 3], 1); // Hard-code for now cr.setLineWidth(stippleWidth); cr.stroke(); cr.$dispose(); }; 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'); // Date this._date = new St.Label(); this._date.style_class = 'datemenu-date-label'; this.menu.addActor(this._date); this.settings = new Settings.AppletSettings(this, "calendar@cinnamon.org", this.instance_id); // Calendar this._calendar = new Calendar.Calendar(this.settings); this.menu.addActor(this._calendar.actor); 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._dateFormatFull = CinnamonDesktop.WallClock.lctime_format("cinnamon", "%A, %B %-e, %Y"); this.settings.bind("use-custom-format", "use_custom_format", this._onSettingsChanged); this.settings.bind("custom-format", "custom_format", this._onSettingsChanged); /* 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 = new Gio.Settings({ schema_id: "org.cinnamon.desktop.interface" }); 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(); })); this.clock = new CinnamonDesktop.WallClock(); this.clock_notify_id = 0; // 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)); } } catch (e) { global.logError(e); } } _clockNotify(obj, pspec, data) { this._updateClockAndDate(); } on_applet_clicked(event) { this.menu.toggle(); } _onSettingsChanged() { this._updateFormatString(); this._updateClockAndDate(); } on_custom_format_button_pressed() { Util.spawnCommandLine("xdg-open http://www.foragoodstrftime.com/"); } _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) { if (!this.clock.set_format_string(this.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); } } _updateClockAndDate() { let label_string = this.clock.get_clock(); if (!this.use_custom_format) { label_string = label_string.capitalize(); } this.set_applet_label(label_string); /* Applet content - st_label_set_text and set_applet_tooltip both compare new to * existing strings before proceeding, so no need to check here also */ let dateFormattedFull = this.clock.get_clock_for_format(this._dateFormatFull).capitalize(); this._date.set_text(dateFormattedFull); this.set_applet_tooltip(dateFormattedFull); } 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._updateCalendar(); } on_applet_removed_from_panel() { 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._updateCalendar(); } })); } _updateCalendar () { let now = new Date(); this._calendar.setDate(now, 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-4.4.8/files/usr/share/cinnamon/applets/calendar@cinnamon.org/calendar.js000066400000000000000000000341221360505115200301110ustar00rootroot00000000000000// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- const Clutter = imports.gi.Clutter; const Gio = imports.gi.Gio; 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 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 _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': /* Transators: 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) { this._weekStart = Cinnamon.util_get_week_start(); this._weekdate = NaN; this._digitWidth = NaN; this.settings = settings; 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)); // 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 (); } _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._update(forceReload); this.emit('selected-date-changed', new Date(this._selectedDate)); } else { if (forceReload) this._update(forceReload); } } _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++) { // 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: 'calendar-day-base calendar-day-heading', 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.setDate(newDate, false); } _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++) children[i].destroy(); // 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 button = new St.Button({ label: iter.getDate().toString() }); button.reactive = false; let iterStr = iter.toUTCString(); button.connect('clicked', Lang.bind(this, function() { 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 (_sameDay(now, iter)) styleClass += ' calendar-today'; else if (iter.getMonth() != this._selectedDate.getMonth()) styleClass += ' calendar-other-month-day'; if (_sameDay(this._selectedDate, iter)) button.add_style_pseudo_class('active'); button.style_class = styleClass; let offsetCols = this.show_week_numbers ? 1 : 0; this.actor.add(button, { 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 }); } 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; } } } } } Signals.addSignalMethods(Calendar.prototype); cinnamon-4.4.8/files/usr/share/cinnamon/applets/calendar@cinnamon.org/metadata.json000066400000000000000000000002361360505115200304540ustar00rootroot00000000000000{ "uuid": "calendar@cinnamon.org", "name": "Calendar", "description": "The Cinnamon calendar applet", "icon": "x-office-calendar", "max-instances": -1 } cinnamon-4.4.8/files/usr/share/cinnamon/applets/calendar@cinnamon.org/settings-schema.json000066400000000000000000000021511360505115200317700ustar00rootroot00000000000000{ "section1": { "type": "section", "description": "Display" }, "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", "indent": true, "dependency" : "use-custom-format", "tooltip" : "Set your custom format here." }, "format-button" : { "type" : "button", "description" : "Show information on date format syntax", "indent": true, "dependency" : "use-custom-format", "callback" : "on_custom_format_button_pressed", "tooltip" : "Click this button to know more about the syntax for date formats." } } cinnamon-4.4.8/files/usr/share/cinnamon/applets/expo@cinnamon.org/000077500000000000000000000000001360505115200252025ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/expo@cinnamon.org/applet.js000066400000000000000000000025001360505115200270220ustar00rootroot00000000000000const 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-4.4.8/files/usr/share/cinnamon/applets/expo@cinnamon.org/icons/000077500000000000000000000000001360505115200263155ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/expo@cinnamon.org/icons/cinnamon-expo-symbolic.svg000066400000000000000000000004501360505115200334270ustar00rootroot00000000000000 cinnamon-4.4.8/files/usr/share/cinnamon/applets/expo@cinnamon.org/metadata.json000066400000000000000000000002321360505115200276520ustar00rootroot00000000000000{ "uuid": "expo@cinnamon.org", "name": "Expo", "description": "Click or hover to activate Expo view", "icon": "workspace-overview", "max-instances": -1 } cinnamon-4.4.8/files/usr/share/cinnamon/applets/expo@cinnamon.org/settings-schema.json000066400000000000000000000003421360505115200311720ustar00rootroot00000000000000{ "section1": { "type": "section", "description": "Behavior" }, "activate-on-hover": { "type": "switch", "default" : false, "description" : "Activate expo on hover" } } cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/000077500000000000000000000000001360505115200301525ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/appGroup.js000066400000000000000000001217141360505115200323130ustar00rootroot00000000000000const Cinnamon = imports.gi.Cinnamon; const Meta = imports.gi.Meta; const Clutter = imports.gi.Clutter; const St = imports.gi.St; const Main = imports.ui.main; const Tweener = imports.ui.tweener; const DND = imports.ui.dnd; const Tooltips = imports.ui.tooltips; const PopupMenu = imports.ui.popupMenu; const {SignalManager} = imports.misc.signalManager; const {each, findIndex, unref} = imports.misc.util; const {createStore} = imports.misc.state; const {AppMenuButtonRightClickMenu, HoverMenuController, AppThumbnailHoverMenu} = require('./menus'); const { FLASH_INTERVAL, MAX_BUTTON_WIDTH, BUTTON_BOX_ANIMATION_TIME, RESERVE_KEYS, TitleDisplay } = require('./constants'); // returns [x1,x2] so that the area between x1 and x2 is // centered in length const center = function(length, naturalLength) { let maxLength = Math.min(length, naturalLength); let x1 = Math.floor((length - maxLength) / 2); let x2 = x1 + maxLength; return [x1, x2]; }; const getFocusState = function(metaWindow) { if (!metaWindow || metaWindow.minimized) { return false; } if (metaWindow.appears_focused) { return true; } let transientHasFocus = false; metaWindow.foreach_transient(function(transient) { if (transient && transient.appears_focused) { transientHasFocus = true; return false; } return true; }); return transientHasFocus; }; class AppGroup { constructor(params) { this.state = params.state; this.listState = params.listState; 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: findIndex(this.state.autoStartApps, (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 }); this.groupState.connect({ isFavoriteApp: () => this.handleFavorite(true), getActor: () => this.actor, launchNewInstance: () => this.launchNewInstance(), checkFocusStyle: () => this.checkFocusStyle() }); this.signals = new SignalManager(null); // TODO: This needs to be in state so it can be updated more reliably. this.labelVisible = this.state.settings.titleDisplay !== TitleDisplay.None && this.state.isHorizontal; this.progress = 0; this.actor = new Cinnamon.GenericContainer({ name: 'appButton', style_class: 'grouped-window-list-item-box', important: true, reactive: true, 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, number label, and text label for titleDisplay this.iconBox = new St.Bin({name: 'appMenuIcon'}); this.actor.add_child(this.iconBox); this.setActorAttributes(null, params.metaWindow); this.badge = new St.BoxLayout({ style_class: 'grouped-window-list-badge', important: true, width: 12 * global.ui_scale, height: 12 * global.ui_scale, x_align: St.Align.START, y_align: St.Align.MIDDLE, show_on_set_parent: false, style: 'margin: 0;', }); this.numberLabel = new St.Label({ style: 'font-size: 10px;padding: 0px;', style_class: 'grouped-window-list-number-label', important: true, text: '', anchor_x: -3 * global.ui_scale, anchor_y: 1 + (global.ui_scale > 1 ? 2 : 0) }); this.numberLabel.clutter_text.ellipsize = false; this.badge.add(this.numberLabel, { x_align: St.Align.START, y_align: St.Align.START, }); this.actor.add_child(this.badge); this.label = new St.Label({ style_class: 'grouped-window-list-button-label', important: true, text: '', show_on_set_parent: this.state.settings.titleDisplay > 1 }); this.label.x_align = St.Align.START; 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.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.signals.connect(this._draggable, 'drag-end', (...args) => this.onDragEnd(...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() { let {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; let panelHeight = this.state.trigger('getPanelHeight'); // TODO: Button width should be applied to buttons if they don't have a label set, not based on // mode, but not currently sure how to unset the fixed width on the actor so it revert to a // resizable state without destroying it. Otherwise, buttons with labels don't have enough padding set. if (!this.state.isHorizontal || this.state.settings.titleDisplay === 1 || this.state.settings.titleDisplay === 3 && !this.labelVisible) { this.actor.width = panelHeight; } if (this.state.isHorizontal) { this.actor.height = panelHeight; } this.setIcon(metaWindow); this.updateIconBoxClip(); 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() { let direction = this.state.isHorizontal ? 'right' : 'bottom'; let existingStyle = this.actor.style ? this.actor.style : ''; this.actor.style = existingStyle + 'margin-' + direction + ':6px;'; } updateIconBoxClip() { let iconBottomClip = this.iconBox.style_length('app-icon-bottom-clip'); let allocation = this.iconBox.allocation; if (iconBottomClip > 0) { this.iconBox.set_clip( 0, 0, allocation.x2 - allocation.x1, allocation.y2 - allocation.y1 - iconBottomClip ); } else { this.iconBox.remove_clip(); } } 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 }); } let 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; let counter = 0; this.flashButton(counter); } flashButton(counter) { if (!this._needsAttention || !this.actor) return; // If the app was closed during a flash sequence, stop looping. if (!this.groupState.groupReady && this.groupState.isFavoriteApp) { this.actor.remove_style_class_name('grouped-window-list-item-demands-attention'); return; } this.actor.remove_style_pseudo_class('active'); this.actor.add_style_class_name('grouped-window-list-item-demands-attention'); if (counter < 4) { setTimeout(() => { if (this.actor && this.actor.has_style_class_name('grouped-window-list-item-demands-attention')) { this.actor.remove_style_class_name('grouped-window-list-item-demands-attention'); this.actor.add_style_pseudo_class('active'); } setTimeout(() => { this.flashButton(++counter); }, FLASH_INTERVAL); }, FLASH_INTERVAL); } } getPreferredWidth(actor, forHeight, alloc) { let [iconMinSize, iconNaturalSize] = this.iconBox.get_preferred_width(forHeight); let [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 = iconNaturalSize + 6; if (this.state.orientation === St.Side.TOP || this.state.orientation === St.Side.BOTTOM) { let max = this.labelVisible && 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 = 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) { let allocWidth = box.x2 - box.x1; let allocHeight = box.y2 - box.y1; let childBox = new Clutter.ActorBox(); let direction = this.actor.get_text_direction(); let spacing = 0; // Set the icon to be left-justified (or right-justified) and centered vertically let [minWidth, minHeight, naturalWidth, naturalHeight] = this.iconBox.get_preferred_size(); let yPadding = Math.floor(Math.max(0, allocHeight - naturalHeight) / 2); childBox.y1 = box.y1 + yPadding; childBox.y2 = childBox.y1 + Math.min(naturalHeight, allocHeight); if (this.labelVisible && this.groupState.metaWindows.length > 0) { if (direction === Clutter.TextDirection.LTR) { childBox.x1 = box.x1 + 6; } else { childBox.x1 = Math.max(box.x1, box.x2 - naturalWidth); } spacing = childBox.x1; childBox.x2 = Math.min(childBox.x1 + naturalWidth, box.x2); } else { let offset = 0; if (this.state.orientation === St.Side.LEFT) { offset += this.actor.style_length('border-left-width') * 2; } [childBox.x1, childBox.x2] = center(allocWidth + offset, naturalWidth); } this.iconBox.allocate(childBox, flags); let windowCountFactor = this.groupState.windowCount > 9 ? 1.5 : 2; let badgeOffset = 2 * global.ui_scale; childBox.x1 = childBox.x1 - badgeOffset; childBox.x2 = childBox.x1 + (this.numberLabel.width * windowCountFactor); childBox.y1 = Math.max(childBox.y1 - badgeOffset, 0); childBox.y2 = childBox.y1 + this.badge.get_preferred_height(childBox.get_width())[1]; this.badge.allocate(childBox, flags); if (this.labelVisible) { let iconSize = this.state.trigger('getPanelIconSize') * global.ui_scale; spacing = iconSize - spacing; [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); } // Call set_icon_geometry for support of Cinnamon's minimize animation if (this.groupState.metaWindows.length > 0 && this.actor.realized) { let rect = new Meta.Rectangle(); [rect.x, rect.y] = this.actor.get_transformed_position(); [rect.width, rect.height] = this.actor.get_transformed_size(); each(this.groupState.metaWindows, (metaWindow) => { if (metaWindow) { metaWindow.set_icon_geometry(rect); } }); } if (this.progressOverlay.visible) this.allocateProgress(childBox, flags); } showLabel(animate = false) { if (this.labelVisible || !this.label || !this.state.isHorizontal || this.label.is_finalized() || !this.label.realized) { return; } let width = MAX_BUTTON_WIDTH * global.ui_scale; this.labelVisible = true; if (this.label.text == null) { this.label.set_text(''); } // TODO: This should be set by the theme. this.label.set_style('padding-right: 4px;'); if (!animate) { this.label.show(); this.label.width = width; return; } Tweener.addTween(this.label, { width, time: BUTTON_BOX_ANIMATION_TIME, transition: 'easeOutQuad', onComplete: () => { 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.labelVisible = 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() { if (this.state.panelEditMode) return false; if (this.hoverMenu) this.hoverMenu.onMenuLeave(); this.resetHoverStatus(); this.checkFocusStyle(); } checkFocusStyle() { if (this.actor.is_finalized()) return; let focused = false; each(this.groupState.metaWindows, function(metaWindow) { if (getFocusState(metaWindow)) { focused = true; return false; } }); 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() { let {metaWindows} = this.groupState; let total = 0; let count = 0; each(metaWindows, function(metaWindow) { let {progress} = metaWindow; if (progress < 1) return; total += progress; count++; }); return total / count; } allocateProgress(childBox = null, flags = 0) { if (!childBox) childBox = new Clutter.ActorBox(); childBox.x1 = 0; childBox.y1 = 0; childBox.x2 = Math.max((this.actor.width) * (this.progress / 100.0), 1.0); childBox.y2 = this.actor.height; this.progressOverlay.allocate(childBox, flags); } onProgressChange(metaWindow) { let 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) { let {appId, metaWindows, lastFocused} = this.groupState; if (hasFocus === undefined) { hasFocus = this.listState.lastFocusedApp === appId; } // If any of the windows associated with our app have focus, // we should set ourselves to active if (hasFocus) { this.listState.trigger('updateFocusState', appId); this.actor.add_style_pseudo_class('focus'); if (this.actor.has_style_class_name('grouped-window-list-item-demands-attention')) { this.actor.remove_style_class_name('grouped-window-list-item-demands-attention'); } 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; } let windows = this.groupState.metaWindows; for (let i = 0, len = windows.length; i < len; i++) { if (windows[i] === metaWindow) { // 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.hoverMenu) this.groupState.trigger('hoverMenuClose'); } onDragEnd() { if (this.rightClickMenu) this.rightClickMenu.close(false); if (this.hoverMenu) this.hoverMenu.close(false); this.listState.trigger('updateAppGroupIndexes', this.groupState.appId); this.state.trigger('clearDragPlaceholder'); } onDragCancelled() { if (this.rightClickMenu) this.rightClickMenu.close(false); if (this.hoverMenu) this.hoverMenu.close(false); this.state.trigger('clearDragPlaceholder'); } handleDragOver(source, actor, x, y, time) { if (!this.state.settings.enableDragging || source instanceof AppGroup || this.state.panelEditMode) { return DND.DragMotionResult.CONTINUE; } let 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.listState.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 true; } 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.numberLabel.text = (number + 1).toString(); this.badge.show(); } launchNewInstance() { this.groupState.app.open_new_window(-1); this.animate(); } onAppButtonRelease(actor, event) { this.state.trigger('clearDragPlaceholder'); let button = event.get_button(); let nWindows = this.groupState.metaWindows.length; let modifiers = Cinnamon.get_event_state(event); let ctrlPressed = (modifiers & Clutter.ModifierType.CONTROL_MASK); let shiftPressed = (modifiers & Clutter.ModifierType.SHIFT_MASK); let 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) ); let 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; } let 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.overlayPreview) { 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) { this.state.trigger('cycleWindows', null, this.actor._delegate); 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.listState.trigger('closeAllRightClickMenus', () => { this.listState.trigger('closeAllHoverMenus', () => { this.rightClickMenu.open(); }); }); } else { this.listState.trigger('closeAllRightClickMenus', this.listState.trigger('closeAllHoverMenus')); } } if (this.hoverMenu) this.hoverMenu.onButtonPress(); } onAppButtonPress(actor, event) { let button = event.get_button(); 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.listState.trigger('closeAllHoverMenus'); } this.windowHandle(); this.appKeyTimeout = setTimeout(() => { if (this.groupState.thumbnailMenuEntered) { clearTimeout(this.appKeyTimeout); this.appKeyTimeout = 0; return; } 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(); } let ws = this.groupState.lastFocused.get_workspace().index(); if (ws !== global.screen.get_active_workspace_index()) { global.screen.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) { let {metaWindows, trigger, set} = this.groupState; let 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, 'icon-changed', (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); } this.calcWindowNumber(); 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 appList 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.listState) return; this.listState.trigger('windowRemoved', metaWindow); this.listState.trigger('windowAdded', metaWindow); } onWindowTitleChanged(metaWindow, refresh) { if (this.groupState.willUnmount || !this.state.settings) { return; } let 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) { each(this.hoverMenu.appThumbnails, (thumbnail) => { if (thumbnail.metaWindow === metaWindow) { thumbnail.labelContainer.child.set_text(metaWindow.title); return false; } }); } this.groupState.set({ appName: this.groupState.app.get_name() }); this.handleButtonLabel(metaWindow); } onFocusWindowChange(metaWindow) { if (this.groupState.metaWindows.length === 0) return; let hasFocus = getFocusState(metaWindow); if (hasFocus && this.groupState.hasOwnProperty('lastFocused')) { this.listState.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.listState.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; let windowCount = this.groupState.metaWindows ? this.groupState.metaWindows.length : 0; this.numberLabel.text = windowCount.toString(); this.groupState.set({windowCount}); if (this.state.settings.numDisplay) { if (windowCount <= 1) { this.badge.hide(); } else { this.badge.show(); } } else { this.badge.hide(); } } handleTitleDisplayChange() { each(this.groupState.metaWindows, (win) => { this.onWindowTitleChanged(win, true); this.handleButtonLabel(win); }); } animate() { let 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); Tweener.addTween(this.iconBox, { opacity: 70, time: 0.2, transition: 'linear', onCompleteScope: this, onComplete() { Tweener.addTween(this.iconBox, { opacity: 255, time: 0.2, transition: 'linear' }); } }); } else if (effect === 3) { this.iconBox.set_pivot_point(0.5, 0.5); Tweener.addTween(this.iconBox, { scale_x: 0.8, scale_y: 0.8, time: 0.2, transition: 'easeOutQuad', onComplete: () => { Tweener.addTween(this.iconBox, { scale_x: 1.0, scale_y: 1.0, time: 0.2, transition: 'easeOutQuad' }); } }); } } destroy(skipRefCleanup) { this.signals.disconnectAllSignals(); this.groupState.set({willUnmount: true}); if (this.rightClickMenu) { if (this.rightClickMenu.isOpen) { this.rightClickMenu.close(); } this.rightClickMenu.destroy(); } if (this.hoverMenu) this.hoverMenu.destroy(); this.listState.trigger('removeChild', this.actor); this.actor.destroy(); if (!skipRefCleanup) { this.groupState.destroy(); unref(this, RESERVE_KEYS); } } } module.exports = AppGroup; cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/appList.js000066400000000000000000000336721360505115200321370ustar00rootroot00000000000000const Clutter = imports.gi.Clutter; const Gio = imports.gi.Gio; const {SignalManager} = imports.misc.signalManager; const {each, filter, findIndex, find, unref} = imports.misc.util; const {createStore} = imports.misc.state; const AppGroup = require('./appGroup'); const {RESERVE_KEYS} = require('./constants'); class AppList { constructor(params) { this.state = params.state; this.state.connect({ orientation: () => this.on_orientation_changed(false) }); this.listState = createStore({ workspaceIndex: params.index, lastFocusedApp: null }); this.listState.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) => { each(this.appList, (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.appList = []; this.lastFocusedApp = null; // Connect all the signals this.signals.connect(global.screen, 'window-workspace-changed', (...args) => this.windowWorkspaceChanged(...args)); this.signals.connect(this.metaWorkspace, 'window-removed', (...args) => this.windowRemoved(...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; each(this.appList, function(appGroup) { if (appGroup.groupState.appId !== appId) return; windowCount += appGroup.groupState.metaWindows.length; }); return windowCount; } closeAllHoverMenus(cb) { for (let i = 0, len = this.appList.length; i < len; i++) { let {hoverMenu, groupState} = this.appList[i]; if (hoverMenu && hoverMenu.isOpen) { groupState.set({thumbnailMenuEntered: false}); hoverMenu.close(true); } } if (typeof cb === 'function') cb(); } closeAllRightClickMenus(cb) { for (let i = 0, len = this.appList.length; i < len; i++) { if (typeof this.appList[i].rightClickMenu !== 'undefined' && this.appList[i].rightClickMenu.isOpen) { this.appList[i].rightClickMenu.close(); } } if (typeof cb === 'function') cb(); } onAppKeyPress(number) { if (!this.appList[number - 1]) return; this.appList[number - 1].onAppKeyPress(number); } onNewAppKeyPress(number) { if (number > this.appList.length) return; this.appList[number - 1].launchNewInstance(); } showAppsOrder() { for (let i = 0, len = this.appList.length; i < len; i++) { this.appList[i].showOrderLabel(i); } setTimeout(() => this.calcAllWindowNumbers(), this.state.settings.showAppsOrderTimeout); } cycleMenus(r = 0) { if (r > this.appList.length) { this.state.set({lastCycled: -1}); return; } let {lastCycled} = this.state; this.lastCycledTime = Date.now(); this.closeAllHoverMenus(); if (lastCycled < 0) { lastCycled = findIndex(this.appList, (app) => { return app.groupState.appId === this.listState.lastFocusedApp; }); } if (lastCycled < 0 || lastCycled > this.appList.length - 1) lastCycled = 0; this.appList[lastCycled].groupState.set({thumbnailMenuEntered: true}); if (!this.appList[lastCycled].hoverMenu) this.appList[lastCycled].initThumbnailMenu(); this.appList[lastCycled].hoverMenu.open(true); lastCycled++; this.state.set({lastCycled}); if (this.appList[lastCycled - 1].groupState.metaWindows.length === 0) { this.cycleMenus(r + 1); } let lastCycledTime = this.lastCycledTime; setTimeout(() => { if (lastCycledTime === this.lastCycledTime) { this.state.set({lastCycled: -1}); } }, 2000) } // Gets a list of every app on the current workspace getSpecialApps() { this.specialApps = []; let apps = Gio.app_info_get_all(); for (let i = 0, len = apps.length; i < len; i++) { let wmClass = apps[i].get_startup_wm_class(); if (wmClass) { let id = apps[i].get_id(); this.specialApps.push({id, wmClass}); } } } refreshList() { for (let i = 0, len = this.appList.length; i < len; i++) { this.appList[i].destroy(); this.appList[i] = null; } this.appList = []; this.getSpecialApps(); 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++) { let app = appSystem.lookup_app(favorites[i].id); if (!app) continue; let appWindows = filter(app.get_windows(), (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) { each(this.appList, (appGroup) => { if (appGroup.groupState.metaWindows) { appGroup.onWindowDemandsAttention(window); } if (appGroup.hoverMenu && appGroup.hoverMenu.isOpen) { each(appGroup.hoverMenu.appThumbnails, (thumbnail) => { thumbnail.onWindowDemandsAttention(window); return false; }); } }); } shouldWindowBeAdded(metaWindow) { return (this.state.settings.showAllWorkspaces || metaWindow.is_on_all_workspaces() || metaWindow.get_workspace() === this.metaWorkspace) && !metaWindow.is_skip_taskbar() && this.state.monitorWatchList.indexOf(metaWindow.get_monitor()) > -1; } windowWorkspaceChanged(screen, 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('getAppFromWMClass', this.specialApps, metaWindow); } if (!app) { let tracker = this.state.trigger('getTracker'); if (tracker) { app = tracker.get_window_app(metaWindow); } } if (!app || (!isFavoriteApp && metaWindow && this.state.monitorWatchList.indexOf(metaWindow.get_monitor()) === -1)) { return; } let appId = app.get_id(), refApp = -1, refWindow = -1, transientFavorite = false; each(this.appList, (appGroup, i) => { if (app === appGroup.groupState.app) { refApp = i; } let ref = appGroup.groupState.metaWindows.indexOf(metaWindow); if (ref > -1) { if (refApp === -1 || !this.state.settings.groupApps) { refApp = i; } refWindow = ref; return false; } }); if (!this.state.settings.groupApps && !isFavoriteApp) { let refFav = findIndex(this.state.trigger('getFavorites'), (favorite) => { return favorite.app === app; }); if (refFav > -1) transientFavorite = true; } let initApp = () => { let appGroup = new AppGroup({ state: this.state, listState: this.listState, app, isFavoriteApp, metaWorkspace, metaWindow, appId }); this.actor.add_child(appGroup.actor); this.appList.push(appGroup); appGroup.windowAdded(metaWindow); }; if (refApp === -1) { initApp(metaWindow); } else if (metaWindow) { if (this.state.settings.groupApps) { this.appList[refApp].windowAdded(metaWindow); } else if (transientFavorite && this.appList[refApp].groupState.metaWindows.length === 0) { this.appList[refApp].windowAdded(metaWindow); } else if (refWindow === -1) { initApp(); } } } calcAllWindowNumbers() { for (let i = 0, len = this.appList.length; i < len; i++) { this.appList[i].calcWindowNumber(this.appList[i].groupState.metaWindows); } } updateAppGroupIndexes() { const newAppList = []; let children = this.actor.get_children(); for (let i = 0; i < children.length; i++) { let appGroup = find(this.appList, (appGroup) => appGroup.actor === children[i]); if (appGroup) { newAppList.push(appGroup); } } this.appList = newAppList; } windowRemoved(metaWorkspace, metaWindow) { if (!this.state) return; if ((metaWindow.is_on_all_workspaces() || 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; this.state.removingWindowFromWorkspaces = true; this.state.trigger('removeWindowFromAllWorkspaces', metaWindow); return; } let refApp = -1, refWindow = -1; each(this.appList, (appGroup, i) => { let shouldReturn = false; each(appGroup.groupState.metaWindows, (win, z) => { if (win === metaWindow) { refApp = i; refWindow = z; shouldReturn = this.state.settings.groupApps; return false; } }); if (shouldReturn) { return false; } }); if (refApp > -1) { this.appList[refApp].windowRemoved(metaWorkspace, metaWindow, refWindow, (appId, isFavoriteApp) => { isFavoriteApp = isFavoriteApp && (this.state.settings.groupApps || this.getWindowCount(appId) === 0); if (isFavoriteApp) { this.appList[refApp].groupState.set({groupReady: false, lastFocused: null}); this.appList[refApp].actor.set_style_pseudo_class('closed'); this.appList[refApp].actor.remove_style_class_name('grouped-window-list-item-demands-attention'); this.appList[refApp].setActiveStatus(false); if (this.state.settings.titleDisplay > 1) { this.appList[refApp].hideLabel(); } return; } this.appList[refApp].destroy(true); this.appList[refApp] = undefined; this.appList.splice(refApp, 1); }); } } destroy() { this.signals.disconnectAllSignals(); for (let i = 0, len = this.appList.length; i < len; i++) { this.appList[i].destroy(); } this.listState.destroy(); this.manager = null; this.actor.destroy(); unref(this, RESERVE_KEYS); } } module.exports = AppList; cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/applet.js000066400000000000000000001117161360505115200320040ustar00rootroot00000000000000const Gio = imports.gi.Gio; const Gtk = imports.gi.Gtk; const GLib = imports.gi.GLib; const Gdk = imports.gi.Gdk; 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 {AppletSettings} = imports.ui.settings; const {SignalManager} = imports.misc.signalManager; const {each, find, findIndex, filter, throttle, unref, trySpawnCommandLine} = imports.misc.util; const {createStore} = imports.misc.state; const AppList = require('./appList'); 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'); if (signals.isConnected('changed::pinned-apps', settings)) { signals.disconnect('changed::pinned-apps', settings); } let cb = () => this.onFavoritesChange(); signals.connect(settings, 'changed::pinned-apps', cb); this._favorites = []; let ids = []; ids = settings.getValue('pinned-apps'); for (let i = 0, len = ids.length; i < len; i++) { let refFav = findIndex(this._favorites, (item) => item.id === ids[i]); if (refFav === -1) { let app = appSystem.lookup_app(ids[i]); this._favorites.push({ id: ids[i], app: app }); } } } triggerUpdate(appId, isFavoriteApp) { let currentAppList = this.params.state.trigger('getCurrentAppList'); if (!currentAppList) return; let refApp = findIndex(currentAppList.appList, (appGroup) => appGroup.groupState.appId === appId); if (refApp === -1) return; // A pinned app with no windows open was unpinned - remove it if (!isFavoriteApp && currentAppList.appList[refApp] && currentAppList.appList[refApp].groupState.metaWindows.length === 0) { currentAppList.appList[refApp].destroy(true); currentAppList.appList[refApp] = undefined; currentAppList.appList.splice(refApp, 1); } else { // Otherwise, synchronize its pinned state currentAppList.appList[refApp].groupState.set({isFavoriteApp}); } } saveFavorites() { let uniqueSet = new Set(); let 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('refreshAllAppLists'); } 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; } if (!opts.pos) { opts.pos = -1; } let newFavorite = { id: opts.appId, app: opts.app }; let refFavorite = findIndex(this._favorites, function(favorite) { return 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. let currentAppList = this.params.state.trigger('getCurrentAppList'); let children = currentAppList.actor.get_children(); let newFavorites = []; let refActorFound = false; each(children, (actor, i) => { let appGroup = find(currentAppList.appList, function(appGroup) { return appGroup.actor === actor; }); if (!appGroup) return; let {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(); return true; } moveFavoriteToPos(opts, oldIndex) { if (!oldIndex || !this.params.state.settings.groupApps) { oldIndex = findIndex(this._favorites, function(favorite) { return favorite.id === opts.appId; }); } let newIndex = opts.pos; if (oldIndex > -1 && newIndex > oldIndex) { newIndex = newIndex - 1; } this._favorites.splice(newIndex, 0, this._favorites.splice(oldIndex, 1)[0]); this._favorites = filter(this._favorites, function(favorite) { return favorite && favorite.app != null; }); this.saveFavorites(); } removeFavorite(appId) { let refFav = findIndex(this._favorites, (favorite) => favorite.id === appId); this.triggerUpdate(appId, false); this._favorites.splice(refFav, 1); this.saveFavorites(); 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.appLists = []; // 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.screen.get_active_workspace_index(), panelEditMode: global.settings.get_boolean('panel-edit-mode'), menuOpen: false, dragPlaceholder: null, dragPlaceholderPos: -1, animatingPlaceholdersCount: 0, appletReady: false, willUnmount: false, settings: {}, homeDir: GLib.get_home_dir(), overlayPreview: 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(), getAppFromWMClass: (specialApps, metaWindow) => this.getAppFromWMClass(specialApps, metaWindow), getTracker: () => this.tracker, addWindowToAllWorkspaces: (win, app, isFavoriteApp) => { each(this.appLists, function(appList) { appList.windowAdded(appList.metaWorkspace, win, app, isFavoriteApp); }); this.state.addingWindowToWorkspaces = false; }, removeWindowFromAllWorkspaces: (win) => { each(this.appLists, function(appList) { appList.windowRemoved(appList.metaWorkspace, win); }); this.state.removingWindowFromWorkspaces = false; }, removeWindowFromOtherWorkspaces: (win) => { each(this.appLists, (appList) => { if (appList.listState.workspaceIndex === this.state.currentWs) { return; } appList.windowRemoved(appList.metaWorkspace, win); }); this.state.removingWindowFromWorkspaces = false; }, refreshCurrentAppList: () => this.refreshCurrentAppList(), refreshAllAppLists: () => this.refreshAllAppLists(), getCurrentAppList: () => this.getCurrentAppList(), clearDragPlaceholder: () => this.clearDragPlaceholder(), 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.getAutoStartApps(); this.onSwitchWorkspace = throttle(this.onSwitchWorkspace, 100, true); 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.screen, 'workspace-removed', (...args) => this.onWorkspaceRemoved(...args)); this.signals.connect(global.screen, 'window-monitor-changed', (...args) => this.onWindowMonitorChanged(...args)); this.signals.connect(global.screen, 'monitors-changed', (...args) => this.on_applet_instances_changed(...args)); this.signals.connect(global.screen, '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.overview, 'showing', (...args) => this.onOverviewShow(...args)); this.signals.connect(Main.overview, 'hiding', (...args) => this.onOverviewHide(...args)); this.signals.connect(Main.expo, 'showing', (...args) => this.onOverviewShow(...args)); this.signals.connect(Main.expo, 'hiding', (...args) => this.onOverviewHide(...args)); this.signals.connect(Main.themeManager, 'theme-set', (...args) => this.refreshCurrentAppList(...args)); } bindSettings() { let settingsProps = [ {key: 'group-apps', value: 'groupApps', cb: this.refreshCurrentAppList}, {key: 'enable-app-button-dragging', value: 'enableDragging', cb: null}, {key: 'launcher-animation-effect', value: 'launcherAnimationEffect', cb: null}, {key: 'pinned-apps', value: 'pinnedApps', cb: null}, {key: 'middle-click-action', value: 'middleClickAction', cb: null}, {key: 'left-click-action', value: 'leftClickAction', cb: null}, {key: 'show-apps-order-hotkey', value: 'showAppsOrderHotkey', cb: this.bindAppKeys}, {key: 'show-apps-order-timeout', value: 'showAppsOrderTimeout', cb: null}, {key: 'cycleMenusHotkey', value: 'cycleMenusHotkey', cb: this.bindAppKeys}, {key: 'enable-hover-peek', value: 'enablePeek', cb: null}, {key: 'onclick-thumbnails', value: 'onClickThumbs', cb: null}, {key: 'hover-peek-opacity', value: 'peekOpacity', cb: null}, {key: 'hover-peek-time-in', value: 'peekTimeIn', cb: null}, {key: 'hover-peek-time-out', value: 'peekTimeOut', cb: null}, {key: 'thumbnail-timeout', value: 'thumbTimeout', cb: null}, {key: 'thumbnail-size', value: 'thumbSize', cb: this.updateThumbnailSize}, {key: 'thumbnail-scroll-behavior', value: 'thumbnailScrollBehavior', cb: null}, {key: 'sort-thumbnails', value: 'sortThumbs', cb: this.updateVerticalThumbnailState}, { key: 'highlight-last-focused-thumbnail', value: 'highlightLastFocusedThumbnail', cb: this.updateVerticalThumbnailState }, {key: 'vertical-thumbnails', value: 'verticalThumbs', cb: this.updateVerticalThumbnailState}, {key: 'show-thumbnails', value: 'showThumbs', cb: this.updateVerticalThumbnailState}, {key: 'animate-thumbnails', value: 'animateThumbs', cb: null}, {key: 'number-display', value: 'numDisplay', cb: this.updateWindowNumberState}, {key: 'title-display', value: 'titleDisplay', cb: this.updateTitleDisplay}, {key: 'scroll-behavior', value: 'scrollBehavior', cb: null}, {key: 'show-recent', value: 'showRecent', cb: null}, {key: 'autostart-menu-item', value: 'autoStart', cb: null}, {key: 'launch-new-instance-menu-item', value: 'launchNewInstance', cb: null}, {key: 'monitor-move-all-windows', value: 'monitorMoveAllWindows', cb: null}, {key: 'show-all-workspaces', value: 'showAllWorkspaces', cb: this.refreshAllAppLists} ]; for (let i = 0, len = settingsProps.length; i < len; i++) { this.settings.bind( settingsProps[i].key, settingsProps[i].value, settingsProps[i].cb ? (...args) => settingsProps[i].cb.call(this, ...args) : null ); } this.state.set({lastTitleDisplay: this.state.settings.titleDisplay}); } on_applet_added_to_panel() { if (this.state.appletReady && this.state.panelEditMode) { return; } this.bindAppKeys(); this.state.set({appletReady: true}); } on_applet_instances_changed(instance) { if (!this.state.appletReady) { return; } this.numberOfMonitors = null; this.updateMonitorWatchlist(); if (instance && instance.instance_id === this.instance_id) { this.onSwitchWorkspace(); } else { this.refreshCurrentAppList(); } } on_panel_edit_mode_changed() { this.state.set({panelEditMode: !this.state.panelEditMode}); each(this.appLists, (workspace) => { each(workspace.appList, (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(); for (let i = 0, len = this.appLists.length; i < len; i++) { if (this.appLists[i]) { this.appLists[i].destroy(); } } this.settings.finalize(); unref(this, RESERVE_KEYS); } 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(screen, metaWindow, metaWorkspace) { if (this.state.monitorWatchList.length !== this.numberOfMonitors) { let appList = this.getCurrentAppList(); appList.windowRemoved(metaWorkspace, metaWindow); appList.windowAdded(metaWorkspace, metaWindow); } } bindAppKeys() { this.unbindAppKeys(); for (let i = 1; i < 10; i++) { this.bindAppKey(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)); Main.keybindingManager.addHotKey('launch-new-app-key-' + i, '' + i, () => this.onNewAppKeyPress(i) ); } onAppKeyPress(number) { this.getCurrentAppList().onAppKeyPress(number); } onNewAppKeyPress(number) { this.getCurrentAppList().onNewAppKeyPress(number); } showAppsOrder() { this.getCurrentAppList().showAppsOrder(); } cycleMenus() { this.getCurrentAppList().cycleMenus(); } handleMonitorWindowsPrefsChange(value) { } updateMonitorWatchlist() { if (!this.numberOfMonitors) { this.numberOfMonitors = Gdk.Screen.get_default().get_n_monitors(); } let onPrimary = this.panel.monitorIndex === Main.layoutManager.primaryIndex; let instances = Main.AppletManager.getRunningInstancesForUuid(this.state.uuid); let {monitorWatchList} = this.state; /* Simple cases */ 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}); } refreshCurrentAppList() { let appList = this.appLists[this.state.currentWs]; if (appList) setTimeout(() => appList.refreshList(), 0); } refreshAllAppLists() { each(this.appLists, function(appList) { setTimeout(() => appList.refreshList(), 0); }); } updateFavorites() { this.pinnedFavorites.reload(); this.refreshCurrentAppList(); } updateThumbnailSize() { each(this.appLists, (workspace) => { each(workspace.appList, (appGroup) => { if (appGroup.hoverMenu) appGroup.hoverMenu.updateThumbnailSize(); }); }); } updateActorAttributes(iconSize) { each(this.appLists, (workspace) => { if (!workspace) return; each(workspace.appList, (appGroup) => { appGroup.setActorAttributes(iconSize); }); }); } updateWindowNumberState() { each(this.appLists, (workspace) => { workspace.calcAllWindowNumbers(); }); } updateAttentionState(display, window) { each(this.appLists, (workspace) => { workspace.updateAttentionState(display, window); }); } onWindowCreated(display, window) { each(this.appLists, (workspace) => { workspace.windowAdded(window.get_workspace(), window); }); } updateVerticalThumbnailState() { each(this.appLists, (workspace) => { each(workspace.appList, (appGroup) => { if (appGroup && appGroup.hoverMenu) { appGroup.hoverMenu.setVerticalSetting(); } }); }); } updateTitleDisplay(titleDisplay) { if (titleDisplay === TitleDisplay.None || this.state.lastTitleDisplay === TitleDisplay.None) { this.refreshCurrentAppList(); } each(this.appLists, (workspace) => { each(workspace.appList, (appGroup) => { if (titleDisplay === TitleDisplay.Focused) { appGroup.hideLabel(false); } appGroup.handleTitleDisplayChange(); }); }); this.state.set({lastTitleDisplay: titleDisplay}); } getAppFromWMClass(specialApps, metaWindow) { let startupClass = (wmClass) => { let app = null; for (let i = 0, len = specialApps.length; i < len; i++) { if (specialApps[i].wmClass === wmClass) { app = this.appSystem.lookup_app(specialApps[i].id); if (app) { app.wmClass = wmClass; } } } return app; }; return startupClass(metaWindow.get_wm_class_instance()); } getCurrentAppList() { if (typeof this.appLists[this.state.currentWs] !== 'undefined') { return this.appLists[this.state.currentWs]; } else if (typeof this.appLists[0] !== 'undefined') { return this.appLists[0]; } else { return null; } } getAutoStartApps() { let info, autoStartDir; let getChildren = () => { let 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) { let name = info.get_name(); let 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 ((this.state.settings.scrollBehavior === 1 && this.state.settings.leftClickAction !== 3) || (e && sourceFromAppGroup && !this.state.settings.thumbnailScrollBehavior)) { return; } this.state.set({scrollActive: true}); 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 = this.appLists[this.state.currentWs].listState.lastFocusedApp; if (!lastFocusedApp) { lastFocusedApp = this.appLists[this.state.currentWs].appList[0].groupState.appId } let focusedIndex = findIndex(this.appLists[this.state.currentWs].appList, function(appGroup) { return appGroup.groupState.metaWindows.length > 0 && appGroup.groupState.appId === lastFocusedApp; }); z = direction === 0 ? focusedIndex - 1 : focusedIndex + 1; count = this.appLists[this.state.currentWs].appList.length - 1; } else { if (!source.groupState || source.groupState.metaWindows.length < 1) { return; } let focusedIndex = findIndex(source.groupState.metaWindows, function(metaWindow) { return metaWindow === source.groupState.lastFocused; }); z = direction === 0 ? focusedIndex - 1 : focusedIndex + 1; count = source.groupState.metaWindows.length - 1; } let limit = count * 2; while ((isAppScroll && (!this.appLists[this.state.currentWs].appList[z] || !this.appLists[this.state.currentWs].appList[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; } } let _window = isAppScroll ? this.appLists[this.state.currentWs].appList[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 (!source.actor) return DND.DragMotionResult.CONTINUE; let appList = this.appLists[this.state.currentWs]; let children = appList.actor.get_children(); let windowPos = children.indexOf(source.actor); let isForeign = typeof source.groupState === 'undefined'; let pos = 0; let isHorizontal = appList.actor.height > appList.actor.width; let axis = isHorizontal ? [y, 'y1'] : [x, 'x1']; each(children, (child, i) => { if (axis[0] > children[i].get_allocation_box()[axis[1]] + children[i].width / 2) { pos = i; } }); if (pos !== this.state.dragPlaceholderPos) { this.state.dragPlaceholderPos = pos; // Don't allow positioning before or after self if (windowPos !== -1 && pos === windowPos) { if (this.state.dragPlaceholder) { this.state.dragPlaceholder.animateOutAndDestroy(); this.state.animatingPlaceholdersCount++; this.state.dragPlaceholder.actor.connect('destroy', () => this.state.animatingPlaceholdersCount--); } this.state.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.state.dragPlaceholder) { this.state.dragPlaceholder.actor.destroy(); fadeIn = false; } else { fadeIn = true; } let iconSize = this.getPanelIconSize(); this.state.dragPlaceholder = new DND.GenericDragPlaceholderItem(); this.state.dragPlaceholder.child.width = iconSize; this.state.dragPlaceholder.child.height = iconSize; // For menu items, don't insert actors at specific indices, // they will get attached to the end of the list anyway. if (!isForeign) { appList.actor.insert_child_at_index( this.state.dragPlaceholder.actor, this.state.dragPlaceholderPos ); } if (fadeIn) this.state.dragPlaceholder.animateIn(); } 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, x) { if (!this.state.settings.enableDragging || this.state.panelEditMode) { return false; } if (typeof source.groupState === 'undefined') { let appId = source.isDraggableApp ? source.get_app_id() : source.getId(); if (appId) { this.acceptNewLauncher(appId); return true; } return false; } let currentAppList = this.getCurrentAppList(); let pos = this.state.dragPlaceholderPos; this.clearDragPlaceholder(); // For getting the fallback position, possibly dead code if (pos === -1) { let children = currentAppList.actor.get_children(); let _pos = 0; for (let i = 0, len = children.length; i < len; i++) { if (x > children[i].get_allocation_box().x1 + children[i].width / 2) { _pos = i; } } if (_pos !== this.state.dragPlaceholderPos) { pos = _pos; } } Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { // Move the button currentAppList.actor.set_child_at_index(source.actor, pos); currentAppList.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()) { let opts = { appId: source.groupState.appId, app: source.groupState.app, pos }; let refFav = findIndex(this.pinnedFavorites._favorites, (favorite) => favorite.id === source.groupState.appId); if (refFav > -1) { this.pinnedFavorites.moveFavoriteToPos(opts); } } return false; }); return true; } clearDragPlaceholder() { if (this.state.dragPlaceholder) { this.state.dragPlaceholder.animateOutAndDestroy(); this.state.dragPlaceholder = null; this.state.dragPlaceholderPos = -1; } } acceptNewLauncher(path) { this.pinnedFavorites.addFavorite({appId: path, pos: -1}); // Need to determine why the favorites setting signal doesn't emit outside the applet actions this.updateFavorites(); } onWorkspaceRemoved(metaScreen, index) { if (this.appLists.length <= index) { return; } let removedLists = []; for (let i = 0; i < this.appLists.length; i++) { let workspaceIndex = this.appLists[i].metaWorkspace.index(); if (workspaceIndex === -1) { this.appLists[i].destroy(); this.appLists[i] = null; removedLists.push(i); } else { this.appLists[i].index = workspaceIndex; } } for (let i = 0; i < removedLists.length; i++) { this.appLists.splice(removedLists[i], 1); } this.state.set({currentWs: global.screen.get_active_workspace_index()}); } onSwitchWorkspace() { setTimeout(() => this._onSwitchWorkspace(), 0); } _onSwitchWorkspace() { if (!this.state) return; this.state.set({currentWs: global.screen.get_active_workspace_index()}); let metaWorkspace = global.screen.get_workspace_by_index(this.state.currentWs); // If the workspace we switched to isn't in our list, // we need to create an AppList for it let refWorkspace = findIndex( this.appLists, (item) => item.metaWorkspace && item.metaWorkspace === metaWorkspace ); if (refWorkspace === -1) { this.appLists.push( new AppList({ metaWorkspace: metaWorkspace, state: this.state, index: this.state.currentWs }) ); refWorkspace = this.appLists.length - 1; } this.actor.remove_all_children(); this.actor.add_child(this.appLists[refWorkspace].actor); } onWindowSkipTaskbarChanged(screen, metaWindow) { let appList = this.getCurrentAppList(); if (metaWindow.is_skip_taskbar()) { appList.windowRemoved(appList.metaWorkspace, metaWindow); return; } appList.windowAdded(appList.metaWorkspace, metaWindow); } onUIScaleChange() { this.state.set({thumbnailCloseButtonOffset: global.ui_scale > 1 ? -10 : 0}); this.refreshAllAppLists(); } onOverviewShow() { this.actor.hide(); } onOverviewHide() { this.actor.show(); } } function main(metadata, orientation, panel_height, instance_id) { return new GroupedWindowListApplet(metadata, orientation, panel_height, instance_id); } cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/constants.js000066400000000000000000000044311360505115200325260ustar00rootroot00000000000000const 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: 0.15, MAX_BUTTON_WIDTH: 150, // Pixels FLASH_INTERVAL: 500, RESERVE_KEYS: ['willUnmount'], ICON_NAMES: { area_shot: 'screenshot-area', base: 'x-office-database', big_picture: 'view-fullscreen', calc: 'x-office-spreadsheet', community: 'system-users', compose: 'text-editor', contacts: 'x-office-address-book', document: 'document-new', draw: 'x-office-drawing', friends: 'user-available', fullscreen: 'view-fullscreen', impress: 'x-office-presentation', library: 'accessories-dictionary', math: 'x-office-math', mute: 'audio-volume-muted', new_document: 'document-new', new_private_window: 'view-private', new_root_window: 'dialog-password', news: 'news', new_window: 'window-new', next: 'media-skip-forward', open_computer: 'computer', open_home: 'user-home', open_trash: 'user-trash', play: 'media-playback-start', play_pause: 'media-playback-start', prefs: 'preferences-other', previous: 'media-skip-backward', screen_shot: 'screenshot-fullscreen', screenshots: 'applets-screenshooter', servers: 'network-server', settings: 'preferences-other', ssa: 'screenshot-area', ssf: 'screenshot-fullscreen', ssw: 'screenshot-window', stop_quit: 'media-playback-stop', store: 'store', window: 'window-new', window_shot: 'screenshot-window', writer: 'x-office-document', }, TitleDisplay: { None: 1, App: 2, Title: 3, Focused: 4 }, FavType: { favorites: 0, pinnedApps: 1, none: 2 }, autoStartStrDir: './.config/autostart', }; module.exports = constants; cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons/000077500000000000000000000000001360505115200312655ustar00rootroot00000000000000news-symbolic.svg000066400000000000000000000037371360505115200345340ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons image/svg+xml pin-symbolic.svg000066400000000000000000000046521360505115200343430ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons image/svg+xml screenshot-area-symbolic.svg000066400000000000000000000071571360505115200366430ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons image/svg+xml screenshot-fullscreen-symbolic.svg000066400000000000000000000056711360505115200400740ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons image/svg+xml screenshot-window-symbolic.svg000066400000000000000000000061471360505115200372400ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons image/svg+xml store-symbolic.svg000066400000000000000000000103311360505115200347000ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons image/svg+xml unpin-symbolic.svg000066400000000000000000000046351360505115200347070ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons image/svg+xml view-private-symbolic.svg000066400000000000000000000060421360505115200361720ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons image/svg+xml window-new-symbolic.svg000066400000000000000000000055461360505115200356560ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons image/svg+xml x-office-database-symbolic.svg000066400000000000000000000044511360505115200370140ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons image/svg+xml x-office-math-symbolic.svg000066400000000000000000000055021360505115200361770ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/icons image/svg+xml cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/menus.js000066400000000000000000001377321360505115200316540ustar00rootroot00000000000000const Clutter = imports.gi.Clutter; const Meta = imports.gi.Meta; const St = imports.gi.St; const Gio = imports.gi.Gio; const AppletManager = imports.ui.appletManager; const Main = imports.ui.main; const Tweener = imports.ui.tweener; const PopupMenu = imports.ui.popupMenu; const Applet = imports.ui.applet; const SignalManager = imports.misc.signalManager; const {each, findIndex, tryFn, unref, trySpawnCommandLine, spawn_async} = imports.misc.util; const { CLOSE_BTN_SIZE, CLOSED_BUTTON_STYLE, OPACITY_OPAQUE, RESERVE_KEYS, ICON_NAMES, 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 tweenConfig = { time: peekTime * 0.001, transition: 'easeOutQuad', opacity: opacity > 255 ? 255 : opacity }; if (typeof cb === 'function') { tweenConfig.onComplete = cb; } Tweener.addTween(window_actor, tweenConfig); }; 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) { let metaWindows = this.groupState.metaWindows.slice(); while (metaWindows.length > 0) { let 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; let hasWindows = this.groupState.metaWindows.length > 0; let isWindowBacked = this.groupState.app.is_window_backed(); let 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) { let 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.screen.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); let connectWorkspaceEvent = (ws, j) => { this.signals.connect(ws, 'activate', () => { this.groupState.lastFocused.change_workspace(global.screen.get_workspace_by_index(j)); }); }; 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 menuItem = createMenuItem({label: _(name)}); let 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 let subMenu = new PopupMenu.PopupSubMenuMenuItem(_('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: 'system-run'}); 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) { // Places if (this.groupState.appId === 'nemo.desktop' || this.groupState.appId === 'nemo-home.desktop') { let subMenu = new PopupMenu.PopupSubMenuMenuItem(_('Places')); this.addMenuItem(subMenu); let defualtPlaces = this.listDefaultPlaces(); let bookmarks = this.listBookmarks(); let devices = this.listDevices(); let places = defualtPlaces.concat(bookmarks).concat(devices); let handlePlaceLaunch = (item, i) => { this.signals.connect(item, 'activate', () => places[i].launch()); }; for (let i = 0, len = places.length; i < len; i++) { item = createMenuItem({label: _(places[i].name), icon: 'folder'}); handlePlaceLaunch(item, i); subMenu.menu.addMenuItem(item); } this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); } // Recent Files let recentItems = this.state.trigger('getRecentItems'); let items = []; for (let i = 0, len = recentItems.length; i < len; i++) { let mimeType = recentItems[i].get_mime_type(); let 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) { let subMenu = new PopupMenu.PopupSubMenuMenuItem(_('Recent')); this.addMenuItem(subMenu); let num = 10; if (itemsLength > num) { itemsLength = num; } let 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()); } } // Actions tryFn(() => { if (!this.groupState.appInfo) return; let actions = this.groupState.appInfo.list_actions(); if (actions) { this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); let handleAction = (action) => { let actionID = ''; if (action.toUpperCase() === action) { actionID = action.toLowerCase(); } else { // first letter lowercase, replace uppercase with _+lowercase actionID = action.charAt(0).toLowerCase() + action.slice(1); actionID = actionID.replace(/([A-Z])/g, '_$1').toLowerCase(); } actionID = actionID.replace(/-/g, '_'); let icon = 'application-x-executable'; if (ICON_NAMES.hasOwnProperty(actionID)) { icon = ICON_NAMES[actionID]; } 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 (this.state.settings.launchNewInstance && (!actions || actions.length === 0) && !isWindowBacked) { item = createMenuItem({label: _('New Window'), icon: 'window-new'}); this.signals.connect(item, 'activate', () => this.groupState.trigger('launchNewInstance')); this.addMenuItem(item); if (!actions || actions.length === 0) { 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) { let 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) { let 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); if (this.groupState.metaWindows && this.groupState.metaWindows.length > 1) { // Close others item = createMenuItem({label: _('Close others'), icon: 'window-close'}); this.signals.connect(item, 'activate', () => { each(this.groupState.metaWindows, (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}); if (!isOpening) return; this.removeAll(); this.populateMenu(); } 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 { let 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() { let proc = this.groupState.lastFocused.get_pid(); let 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('refreshCurrentAppList'); }, 2000); } }); } listDefaultPlaces(pattern) { let defaultPlaces = Main.placesManager.getDefaultPlaces(); let res = []; for (let i = 0, len = defaultPlaces.length; i < len; i++) { if (!pattern || defaultPlaces[i].name.toLowerCase().indexOf(pattern) !== -1) { res.push(defaultPlaces[i]); } } return res; } listBookmarks(pattern) { let bookmarks = Main.placesManager.getBookmarks(); let res = []; for (let i = 0, len = bookmarks.length; i < len; i++) { if (!pattern || bookmarks[i].name.toLowerCase().indexOf(pattern) !== -1) { res.push(bookmarks[i]); } } return res; } listDevices(pattern) { let devices = Main.placesManager.getMounts(); let res = []; for (let i = 0, len = devices.length; i < len; i++) { if (!pattern || devices[i].name.toLowerCase().indexOf(pattern) !== -1) { res.push(devices[i]); } } return res; } 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: () => { if (this.state.overlayPreview) { 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.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 }); let 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; // Cluter.CrossingEvent will always fire on every child actor of the actor connected to the signal, so we have // to filter the bogus child hover events so the hoverpeek effect only occurs once while inside this.actor. this.actor.add_style_pseudo_class('selected'); this.button.set_opacity(255); if (!e) return; let actorString = e.get_source().toString(); if (actorString.indexOf('this.actor') > -1 && (!this.lastEnterActor || (this.lastEnterActor.indexOf('StButton') === -1) && this.lastEnterActor.indexOf('ClutterClone') === -1)) { if (this.state.overlayPreview) { this.destroyOverlayPreview(); } this.hoverPeek(this.state.settings.peekOpacity); } this.lastEnterActor = actorString; } onLeave() { this.entered = false; this.stopClick = false; this.actor.remove_style_pseudo_class('selected'); this.onFocusWindowChange(); this.button.set_opacity(0); } onWindowDemandsAttention(window) { if (this._needsAttention) { return false; } this._needsAttention = true; if (this.metaWindow === window) { this.actor.add_style_class_name('grouped-window-list-thumbnail-alert'); return true; } return false; } 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.hoverPeek(OPACITY_OPAQUE); 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) { let 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; } let 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.signals.disconnect('size-changed', this.metaWindowActor); } else { this.metaWindowActor = this.metaWindow.get_compositor_private(); } if (this.metaWindowActor && !this.metaWindowActor.is_finalized()) { this.signals.connect(this.metaWindowActor, 'size-changed', () => this.refreshThumbnail()); let windowTexture = this.metaWindowActor.get_texture(); if (!windowTexture) return; let [width, height] = windowTexture.get_size(); let 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) { this.thumbnailActor.height = height; this.thumbnailActor.width = width; this.thumbnailActor.child.source = windowTexture; this.thumbnailActor.child.width = width; this.thumbnailActor.child.height = height; } else { this.thumbnailActor.child = new Clutter.Clone({ source: windowTexture, reactive: true, width, height }); } } else if (this.groupState.isFavoriteApp) { this.groupState.trigger('removeThumbnailFromMenu', this.metaWindow); } } refreshThumbnail() { if (this.willUnmount || !this.groupState || !this.groupState.app || !this.groupState.metaWindows || !this.metaWindow) { return; } let monitor = this.state.trigger('getPanelMonitor'); if (!monitor) return; if (!this.thumbnailActor || this.thumbnailActor.is_finalized()) return; let 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 padding = this.thumbnailActor.style_length('padding'); let margin = this.thumbnailActor.style_length('margin'); let i = 0; while (((thumbnailSize + this.thumbnailPadding + padding + margin) * this.groupState.windowCount > 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. let verticalThumbs = ((thumbnailSize + this.thumbnailPadding + padding + margin) * this.groupState.windowCount) > monitorSize; let currentVerticalThumbsState = this.groupState.verticalThumbs; this.groupState.set({verticalThumbs}); if (verticalThumbs !== currentVerticalThumbsState) return; let scaledWidth = thumbnailWidth * global.ui_scale; this.thumbnailActor.width = scaledWidth; this.container.style = `width: ${Math.floor(thumbnailWidth - 16)}px;`; if (this.groupState.verticalThumbs || (this.state.settings.verticalThumbs && this.state.settings.showThumbs)) { this.thumbnailActor.height = thumbnailHeight; } else if (this.state.settings.verticalThumbs) { this.thumbnailActor.height = 0; } this.labelContainer.child.text = this.metaWindow.title || ''; this.getThumbnail(thumbnailWidth, thumbnailHeight); } hoverPeek(opacity) { if (!this.state.settings.enablePeek || this.state.overlayPreview || this.state.scrollActive || (this.metaWindowActor && this.metaWindowActor.is_finalized())) { return; } if (!this.metaWindowActor) { this.metaWindowActor = this.metaWindow.get_compositor_private(); } this.state.set({ overlayPreview: new Clutter.Clone({ source: this.metaWindowActor.get_texture(), opacity: 0 }) }); let [x, y] = this.metaWindowActor.get_position(); this.state.overlayPreview.set_position(x, y); global.overlay_group.add_child(this.state.overlayPreview); global.overlay_group.set_child_above_sibling(this.state.overlayPreview, null); setOpacity(this.state.settings.peekTimeIn, this.state.overlayPreview, opacity); } destroyOverlayPreview() { if (!this.state.overlayPreview) return; if (this.state.settings.peekTimeOut) { setOpacity( this.state.settings.peekTimeOut, this.state.overlayPreview, 0, () => this._destroyOverlayPreview() ); } else { this._destroyOverlayPreview(); } } _destroyOverlayPreview() { global.overlay_group.remove_child(this.state.overlayPreview); this.state.overlayPreview.destroy(); this.state.set({overlayPreview: null}); } destroy() { this.willUnmount = true; if (!this.groupState) return; 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.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(); let draggedOverActor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y); let 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 = findIndex(this.appThumbnails, (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 let {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(); let 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; } each(this.appThumbnails, function(thumbnail) { if (thumbnail.thumbnailActor === draggedOverActor) { Main.activateWindow(thumbnail.metaWindow, global.get_current_time()); return false; } }); }, 50); } else if (this.interval) { clearInterval(this.interval); } } }); this.appThumbnails = []; this.queuedWindows = []; this.fullyRefreshThumbnails(); } addQueuedThumbnails() { if (this.queuedWindows.length === 0) return; each(this.queuedWindows, (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) { let 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) { let {orientation} = this.state; let {vertical} = this.box; let symbol = e.get_key_symbol(); let i = findIndex(this.appThumbnails, (item) => item.entered === true); let entered = i > -1; if (!entered) { i = findIndex(this.appThumbnails, function(thumbnail) { return 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 && 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; }); } let refThumb = findIndex(this.appThumbnails, (thumbnail) => thumbnail.metaWindow === metaWindow); if (!this.appThumbnails[refThumb] && refThumb === -1) { let 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(); 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); } } cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/metadata.json000066400000000000000000000003621360505115200326260ustar00rootroot00000000000000{ "name": "Grouped window list", "role": "panellauncher", "uuid": "grouped-window-list@cinnamon.org", "description": "Main Cinnamon window list with app grouping", "icon": "gnome-window-manager", "max-instances": -1 } settings-schema.json000066400000000000000000000166451360505115200341000ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org{ "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" ] }, "appButtonsSection": { "type" : "section", "title" : "Application Buttons", "keys": [ "title-display", "launcher-animation-effect", "number-display", "pinned-apps", "enable-app-button-dragging" ] }, "hotKeysSection": { "type" : "section", "title" : "Hot Keys", "keys": [ "cycleMenusHotkey", "show-apps-order-hotkey", "show-apps-order-timeout" ] }, "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", "launch-new-instance-menu-item", "monitor-move-all-windows" ] } }, "number-display": { "type": "checkbox", "default": true, "description": "Show window count numbers" }, "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 } }, "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 } }, "pinned-apps": { "type": "generic", "default": ["firefox.desktop", "org.gnome.Terminal.desktop", "nemo.desktop"] }, "group-apps": { "type": "checkbox", "default": true, "description": "Group windows by application" }, "show-all-workspaces": { "type": "checkbox", "default": false, "description": "Show windows from all workspaces" }, "enable-app-button-dragging": { "type": "checkbox", "default": true, "description": "Enable app button dragging" }, "launcher-animation-effect": { "type": "combobox", "default": 3, "description": "Launcher animation", "options": { "None": 1, "Fade": 2, "Scale": 3 } }, "cycleMenusHotkey": { "type": "keybinding", "default": "space", "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" }, "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 } }, "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" }, "show-recent": { "type": "checkbox", "default": true, "description": "Show recent items" }, "autostart-menu-item": { "type": "checkbox", "default": false, "description": "Show autostart option" }, "launch-new-instance-menu-item": { "type": "checkbox", "default": true, "description": "Show new window option", "tooltip": "Shows the \"New Window\" option in an app's context menu if it doesn't already have one from the app's own action menu items." }, "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." }, "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" } }cinnamon-4.4.8/files/usr/share/cinnamon/applets/grouped-window-list@cinnamon.org/utils.py000077500000000000000000000067121360505115200316750ustar00rootroot00000000000000#!/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 not '.exe' 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-4.4.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/000077500000000000000000000000001360505115200256555ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/applet.js000066400000000000000000000352151360505115200275060ustar00rootroot00000000000000const Applet = imports.ui.applet; const Gio = imports.gi.Gio; const Lang = imports.lang; const St = imports.gi.St; const Tooltips = imports.ui.tooltips; const PopupMenu = imports.ui.popupMenu; const GnomeSession = imports.misc.gnomeSession; const INHIBIT_IDLE_FLAG = 8; const INHIBIT_SLEEP_FLAG = 4; class InhibitSwitch extends PopupMenu.PopupBaseMenuItem { constructor(applet) { super(); this._applet = applet; this.label = new St.Label({ text: _("Power management") }); this._statusIcon = new St.Icon({ style_class: 'popup-menu-icon', icon_type: St.IconType.SYMBOLIC, icon_name: "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.set_applet_icon_symbolic_name('inhibit-active'); this._applet.set_applet_tooltip(_("Power management: inhibited")); } else { this._applet.set_applet_icon_symbolic_name('inhibit'); 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, "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_icon_symbolic_name('inhibit'); 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.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.menu.addMenuItem(this.notificationsSwitch); 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); } } on_applet_clicked(event) { this.menu.toggle(); } on_applet_removed_from_panel() { 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(); } get inhibitors() { return this._inhibitorMenuSection; } } function main(metadata, orientation, panel_height, instanceId) { return new CinnamonInhibitApplet(metadata, orientation, panel_height, instanceId); } cinnamon-4.4.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/icons/000077500000000000000000000000001360505115200267705ustar00rootroot00000000000000inhibit-active-symbolic.svg000066400000000000000000000014411360505115200341500ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/icons Gnome Symbolic Icon Theme cinnamon-4.4.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/icons/inhibit-symbolic.svg000066400000000000000000000013431360505115200327570ustar00rootroot00000000000000 Gnome Symbolic Icon Theme cinnamon-4.4.8/files/usr/share/cinnamon/applets/inhibit@cinnamon.org/metadata.json000066400000000000000000000003741360505115200303340ustar00rootroot00000000000000{ "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-4.4.8/files/usr/share/cinnamon/applets/keyboard@cinnamon.org/000077500000000000000000000000001360505115200260275ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/keyboard@cinnamon.org/applet.js000066400000000000000000000241141360505115200276540ustar00rootroot00000000000000const Applet = imports.ui.applet; const XApp = imports.gi.XApp; const Lang = imports.lang; const St = imports.gi.St; const Main = imports.ui.main; const PopupMenu = imports.ui.popupMenu; const Util = imports.misc.util; const Mainloop = imports.mainloop; const Gio = imports.gi.Gio; const Cairo = imports.cairo; const PANEL_EDIT_MODE_KEY = "panel-edit-mode"; class EmblemedIcon { constructor(path, id, style_class) { this.path = path; this.id = id; this.actor = new St.DrawingArea({ style_class: style_class }); this.actor.connect("style-changed", Lang.bind(this, this._style_changed)); this.actor.connect("repaint", Lang.bind(this, this._repaint)); } _style_changed(actor) { let icon_size = 0.5 + this.actor.get_theme_node().get_length("icon-size"); this.actor.natural_width = this.actor.natural_height = icon_size; } _repaint(actor) { let cr = actor.get_context(); let [w, h] = actor.get_surface_size(); cr.save(); let surf = St.TextureCache.get_default().load_file_to_cairo_surface(this.path); let factor = w / surf.getWidth(); let true_width = surf.getWidth() * factor; let true_height = surf.getHeight() * factor; let y_offset = 0; let x_offset = 0; if (surf.getWidth() >= surf.getHeight()) { x_offset = 0; y_offset = ((h * (1 / factor)) - surf.getHeight()) / 2; } else { x_offset = ((w * (1 / factor)) - surf.getWidth()) / 2; y_offset = 0; } let true_x_offset = (w - true_width) / 2; let true_y_offset = (h - true_height) / 2; cr.scale(factor, factor); cr.setSourceSurface(surf, x_offset, y_offset); cr.getSource().setFilter(Cairo.Filter.BEST); cr.setOperator(Cairo.Operator.SOURCE); cr.paint(); cr.restore(); XApp.KbdLayoutController.render_cairo_subscript(cr, true_x_offset + (true_width / 2), true_y_offset + (true_height / 2), true_width / 2, true_height / 2, this.id); cr.$dispose(); } /* Monkey patch St.Icon functions used in js/ui/applet.js IconApplet so we can use its _setStyle() function for figuring out how big we should be */ get_icon_type() { return St.IconType.FULLCOLOR; } set_icon_size(size) { this.actor.width = this.actor.height = size; } set_style_class_name(name) { return; } } class LayoutMenuItem extends PopupMenu.PopupBaseMenuItem { constructor(config, id, indicator, long_name) { super(); this._config = config; this._id = id; 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._config.set_current_group(this._id); } } class CinnamonKeyboardApplet 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.registerRole("keyboard", 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'); this._layoutItems = [ ]; this.im_running = false; this.show_flags = false; this.use_upper = false; this.use_variants = false; this.desktop_settings = new Gio.Settings({ schema_id: "org.cinnamon.desktop.interface" }); this.desktop_settings.connect("changed::keyboard-layout-show-flags", Lang.bind(this, this._syncConfig)); this.desktop_settings.connect("changed::keyboard-layout-use-upper", Lang.bind(this, this._syncConfig)); this.desktop_settings.connect("changed::keyboard-layout-prefer-variant-names", Lang.bind(this, this._syncConfig)); global.settings.connect('changed::' + PANEL_EDIT_MODE_KEY, Lang.bind(this, this._onPanelEditModeChanged)); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addAction(_("Show Keyboard Layout"), Lang.bind(this, function() { Main.overview.hide(); Util.spawn(['gkbd-keyboard-display', '-g', String(this._config.get_current_group() + 1)]); })); this.menu.addAction(_("Show Character Table"), Lang.bind(this, function() { Main.overview.hide(); Util.spawn(['gucharmap']); })); this.menu.addSettingsAction(_("Keyboard Settings"), 'keyboard'); Gio.DBus.session.watch_name("org.fcitx.Fcitx", Gio.BusNameWatcherFlags.NONE, Lang.bind(this, this._itemAppeared), Lang.bind(this, this._itemVanished)); } catch (e) { global.logError(e); } } _onPanelEditModeChanged() { if (global.settings.get_boolean(PANEL_EDIT_MODE_KEY)) { if (!this.actor.visible) { this.set_applet_icon_symbolic_name("input-keyboard"); this.actor.show(); } } else { this._syncConfig(); } } on_applet_added_to_panel() { this._config = new XApp.KbdLayoutController(); if (global.settings.get_boolean(PANEL_EDIT_MODE_KEY)) { this._syncConfig(); this._onPanelEditModeChanged(); } else { this._syncConfig(); } this._config.connect('layout-changed', Lang.bind(this, this._syncGroup)); this._config.connect('config-changed', Lang.bind(this, this._syncConfig)); } on_applet_clicked(event) { this.menu.toggle(); } _itemAppeared(proxy, busName, owner) { this.im_running = true; this._syncConfig(); } _itemVanished(proxy, busName) { this.im_running = false; this._syncConfig(); } _syncConfig() { for (let i = 0; i < this._layoutItems.length; i++) this._layoutItems[i].destroy(); this._selectedLayout = null; this._layoutItems = [ ]; if (!this._config.get_enabled()) { this.menu.close(); this.actor.hide(); return; } this.show_flags = this.desktop_settings.get_boolean("keyboard-layout-show-flags"); this.use_upper = this.desktop_settings.get_boolean("keyboard-layout-use-upper"); this.use_variants = this.desktop_settings.get_boolean("keyboard-layout-prefer-variant-names"); this.actor.show(); let groups = this._config.get_all_names(); for (let i = 0; i < groups.length; i++) { let handled = false; let actor = null; if (this.show_flags) { let name = this._config.get_icon_name_for_group(i); let file = Gio.file_new_for_path("/usr/share/iso-flag-png/" + name + ".png"); if (file.query_exists(null)) { actor = new EmblemedIcon(file.get_path(), this._config.get_flag_id_for_group(i), "popup-menu-icon").actor; handled = true; } } if (!handled) { let name; if (this.use_variants) { name = this._config.get_variant_label_for_group(i); } else { name = this._config.get_short_group_label_for_group(i); } name = this.use_upper ? name.toUpperCase() : name; actor = new St.Label({ text: name }); } let item = new LayoutMenuItem(this._config, i, actor, groups[i]); this._layoutItems.push(item); this.menu.addMenuItem(item, i); } Mainloop.idle_add(Lang.bind(this, this._syncGroup)); } _syncGroup() { let selected = this._config.get_current_group(); if (this._selectedLayout) { this._selectedLayout.setShowDot(false); this._selectedLayout = null; } let item = this._layoutItems[selected]; item.setShowDot(true); this._selectedLayout = item; this.set_applet_tooltip(this._config.get_current_name()); let handled = false; if (this.show_flags) { let name = this._config.get_current_icon_name(); let file = Gio.file_new_for_path("/usr/share/iso-flag-png/" + name + ".png"); if (file.query_exists(null)) { this._applet_icon = new EmblemedIcon(file.get_path(), this._config.get_current_flag_id(), "applet-icon"); this._applet_icon_box.set_child(this._applet_icon.actor); this._applet_icon_box.show(); this._setStyle(); this.set_applet_label(""); handled = true; } } if (!handled) { let name; if (this.use_variants) { name = this._config.get_current_variant_label(); } else { name = this._config.get_current_short_group_label(); } name = this.use_upper ? name.toUpperCase() : name; this.set_applet_label(name); this._applet_icon_box.hide(); } if (this.im_running) { this.actor.hide(); } } on_applet_removed_from_panel() { Main.systrayManager.unregisterRole("keyboard", this.metadata.uuid); } }; function main(metadata, orientation, panel_height, instance_id) { return new CinnamonKeyboardApplet(metadata, orientation, panel_height, instance_id); } cinnamon-4.4.8/files/usr/share/cinnamon/applets/keyboard@cinnamon.org/metadata.json000066400000000000000000000002131360505115200304760ustar00rootroot00000000000000{ "uuid": "keyboard@cinnamon.org", "name": "Keyboard", "description": "Keyboard layout", "icon": "cs-keyboard", "max-instances": -1 } cinnamon-4.4.8/files/usr/share/cinnamon/applets/menu@cinnamon.org/000077500000000000000000000000001360505115200251735ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/menu@cinnamon.org/appUtils.js000066400000000000000000000055271360505115200273430ustar00rootroot00000000000000const Cinnamon = imports.gi.Cinnamon; const CMenu = imports.gi.CMenu; const Util = imports.misc.util; let appsys = Cinnamon.AppSystem.get_default(); // sort apps by their latinised name function appSort(a, b) { a = Util.latinise(a[0].get_name().toLowerCase()); b = Util.latinise(b[0].get_name().toLowerCase()); return a > b; } // sort cmenu directories with admin and prefs categories last function dirSort(a, b) { let menuIdA = a.get_menu_id().toLowerCase(); let menuIdB = b.get_menu_id().toLowerCase(); let prefCats = ["administration", "preferences"]; let prefIdA = prefCats.indexOf(menuIdA); let prefIdB = prefCats.indexOf(menuIdB); if (prefIdA < 0 && prefIdB >= 0) { return -1; } if (prefIdA >= 0 && prefIdB < 0) { return 1; } let nameA = a.get_name().toLowerCase(); let nameB = b.get_name().toLowerCase(); if (nameA > nameB) { return 1; } if (nameA < nameB) { return -1; } return 0; } /* 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-4.4.8/files/usr/share/cinnamon/applets/menu@cinnamon.org/applet.js000066400000000000000000003420571360505115200270310ustar00rootroot00000000000000const Applet = imports.ui.applet; const Mainloop = imports.mainloop; const Lang = imports.lang; 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 AppFavorites = imports.ui.appFavorites; const Gtk = imports.gi.Gtk; const Atk = imports.gi.Atk; const Gio = imports.gi.Gio; 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 MAX_FAV_ICON_SIZE = 32; const CATEGORY_ICON_SIZE = 22; const APPLICATION_ICON_SIZE = 22; const INITIAL_BUTTON_LOAD = 30; const NUM_SYSTEM_BUTTONS = 3; const MAX_BUTTON_WIDTH = "max-width: 20em;"; 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(); // the magic formula that determines the size of favorite and system buttons function getFavIconSize() { let monitorHeight = Main.layoutManager.primaryMonitor.height; let real_size = (0.7 * monitorHeight) / (global.settings.get_strv('favorite-apps').length + NUM_SYSTEM_BUTTONS); let icon_size = 0.6 * real_size / global.ui_scale; return Math.min(icon_size, MAX_FAV_ICON_SIZE); } const RefreshFlags = Object.freeze({ APP: 0b00001, FAV: 0b00010, PLACE: 0b00100, RECENT: 0b01000, SYSTEM: 0b10000 }); const REFRESH_ALL_MASK = 0b11111; /* 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)); } getNextVisible(curChild) { return this.getVisibleItem(this.array.indexOf(curChild) + 1); } getPrevVisible(curChild) { return this.getVisibleItem(this.array.indexOf(curChild) - 1); } getFirstVisible() { return this.array[0]; } getLastVisible() { return this.array[this.array.length - 1]; } getVisibleIndex(curChild) { return this.array.indexOf(curChild); } getVisibleItem(index) { let len = this.array.length; index = ((index % len) + len) % len; return this.array[index]; } getNumVisibleChildren() { return this.array.length; } getAbsoluteIndexOfChild(child) { return this.container.get_children().indexOf(child); } } /** * SimpleMenuItem type strings in use: * ------------------------------------------------- * app ApplicationButton * category CategoryButton * fav FavoritesButton * no-recent "No recent documents" button * none Default type * place PlaceButton * recent RecentsButton * 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 recieves 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, style: MAX_BUTTON_WIDTH, 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.label = null; this.icon = null; 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', Lang.bind(this, this._onButtonReleaseEvent)); this._signals.connect(this.actor, 'key-press-event', Lang.bind(this, this._onKeyPressEvent)); } } } _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.KP_Enter)) { this.activate(); return Clutter.EVENT_STOP; } return Clutter.EVENT_PROPAGATE; } /** * Adds an StIcon as the next child, acessible 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); } /** * Removes the icon previously added with addIcon() */ removeIcon() { if (!this.icon) return; this.icon.destroy(); this.icon = null; } /** * 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, y_expand: true, y_align: Clutter.ActorAlign.CENTER }); if (styleClass) this.label.set_style_class_name(styleClass); this.label.clutter_text.ellipsize = Pango.EllipsizeMode.END; this.actor.add_actor(this.label); } /** * Removes the label previously added with addLabel() */ removeLabel() { if (!this.label) return; this.label.destroy(); this.label = null; } /** * Adds a ClutterActor as the next child. * * @param {ClutterActor} child */ addActor(child) { this.actor.add_actor(child); } /** * Removes a ClutterActor. * * @param {ClutterActor} child */ removeActor(child) { this.actor.remove_actor(child); } destroy(actorDestroySignal=false) { this._signals.disconnectAllSignals(); if (this.label) this.label.destroy(); if (this.icon) this.icon.destroy(); if (!actorDestroySignal) this.actor.destroy(); delete this.actor._delegate; delete this.actor; delete this.label; 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); } activate (event) { 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+"/"+this._appButton.app.get_id()); 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()); break; case "remove_from_favorites": AppFavorites.getAppFavorites().removeFavorite(this._appButton.app.get_id()); break; case "uninstall": Util.spawnCommandLine("/usr/bin/cinnamon-remove-application '" + this._appButton.app.get_app_info().get_filename() + "'"); break; case "run_with_nvidia_gpu": Util.spawnCommandLine("optirun gtk-launch " + this._appButton.app.get_id()); break; default: return true; } 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 }); } 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; menuItem = new ApplicationContextMenuItem(this, _("Add to panel"), "add_to_panel", "list-add"); menu.addMenuItem(menuItem); if (USER_DESKTOP_PATH){ menuItem = new ApplicationContextMenuItem(this, _("Add to desktop"), "add_to_desktop", "computer"); menu.addMenuItem(menuItem); } if (AppFavorites.getAppFavorites().isFavorite(this.app.get_id())){ menuItem = new ApplicationContextMenuItem(this, _("Remove from favorites"), "remove_from_favorites", "starred"); menu.addMenuItem(menuItem); } else { menuItem = new ApplicationContextMenuItem(this, _("Add to favorites"), "add_to_favorites", "non-starred"); menu.addMenuItem(menuItem); } if (this.applet._canUninstallApps) { menuItem = new ApplicationContextMenuItem(this, _("Uninstall"), "uninstall", "edit-delete"); menu.addMenuItem(menuItem); } if (this.applet._isBumblebeeInstalled) { menuItem = new ApplicationContextMenuItem(this, _("Run with NVIDIA GPU"), "run_with_nvidia_gpu", "cpu"); menu.addMenuItem(menuItem); } } } class TransientButton extends SimpleMenuItem { constructor(applet, pathOrCommand) { super(applet, { description: pathOrCommand, type: 'transient', styleClass: 'menu-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); if (applet.showApplicationIcons) { 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: APPLICATION_ICON_SIZE, 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: APPLICATION_ICON_SIZE, 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, 'menu-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(['gvfs-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, 'menu-application-button'); this.category = []; this.icon = this.app.create_icon_texture(APPLICATION_ICON_SIZE); this.addActor(this.icon); if (!applet.showApplicationIcons) this.icon.visible = false; this.addLabel(this.name, 'menu-application-button-label'); this._draggable = DND.makeDraggable(this.actor); this._signals.connect(this._draggable, 'drag-end', Lang.bind(this, this._onDragEnd)); this.isDraggableApp = true; } get_app_id() { return this.app.get_id(); } getDragActor() { return this.app.create_icon_texture(getFavIconSize()); } // 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.favoritesBox._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: 'menu-application-button', provider: provider, result: result }); if (applet.showApplicationIcons) { if (result.icon) { this.icon = result.icon; } else if (result.icon_app) { this.icon = result.icon_app.create_icon_texture(APPLICATION_ICON_SIZE); } 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: APPLICATION_ICON_SIZE}); } if (this.icon) this.addActor(this.icon); } this.addLabel(result.label, 'menu-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); super(applet, { name: place.name, description: selectedAppId, type: 'place', styleClass: 'menu-application-button', place: place }); this.icon = place.iconFactory(APPLICATION_ICON_SIZE); if (this.icon) this.addActor(this.icon); else this.addIcon(APPLICATION_ICON_SIZE, 'folder'); if (!applet.showApplicationIcons) this.icon.visible = false; this.addLabel(this.name, 'menu-application-button-label'); } activate() { this.place.launch(); this.applet.menu.close(); } } class RecentContextMenuItem extends PopupMenu.PopupBaseMenuItem { constructor(recentButton, label, is_default, cbParams, callback) { super({focusOnHover: false}); this._recentButton = recentButton; this._cbParams = cbParams; this._callback = callback; this.label = new St.Label({ text: label }); this.addActor(this.label); if (is_default) this.label.style = "font-weight: bold;"; } activate (event) { this._callback(...this._cbParams); return false; } } class RecentButton extends SimpleMenuItem { constructor(applet, recent) { let fileIndex = recent.uriDecoded.indexOf("file:///"); let selectedAppUri = fileIndex === -1 ? "" : recent.uriDecoded.substr(fileIndex + 7); super(applet, { name: recent.name, description: selectedAppUri, type: 'recent', styleClass: 'menu-application-button', withMenu: true, mimeType: recent.mimeType, uri: recent.uri, uriDecoded: recent.uriDecoded }); this.icon = recent.createIcon(APPLICATION_ICON_SIZE); this.addActor(this.icon); if (!applet.showApplicationIcons) this.icon.visible = false; this.addLabel(this.name, 'menu-application-button-label'); } 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); } } hasLocalPath(file) { return file.is_native() || file.get_path() != null; } populateMenu(menu) { let menuItem; menuItem = new PopupMenu.PopupMenuItem(_("Open with"), { reactive: false }); menuItem.actor.style = "font-weight: bold"; menu.addMenuItem(menuItem); let file = Gio.File.new_for_uri(this.uri); let default_info = Gio.AppInfo.get_default_for_type(this.mimeType, !this.hasLocalPath(file)); let infoLaunchFunc = (info, file) => { info.launch([file], null); this.applet.toggleContextMenu(this); this.applet.menu.close(); }; if (default_info) { menuItem = new RecentContextMenuItem(this, default_info.get_display_name(), false, [default_info, file], infoLaunchFunc); menu.addMenuItem(menuItem); } let infos = Gio.AppInfo.get_all_for_type(this.mimeType); for (let i = 0; i < infos.length; i++) { let info = infos[i]; file = Gio.File.new_for_uri(this.uri); if (!this.hasLocalPath(file) && !info.supports_uris()) continue; if (info.equal(default_info)) continue; menuItem = new RecentContextMenuItem(this, info.get_display_name(), false, [info, file], infoLaunchFunc); menu.addMenuItem(menuItem); } if (GLib.find_program_in_path ("nemo-open-with") != null) { menuItem = new RecentContextMenuItem(this, _("Other application..."), false, [], () => { Util.spawnCommandLine("nemo-open-with " + this.uri); this.applet.toggleContextMenu(this); this.applet.menu.close(); }); menu.addMenuItem(menuItem); } } } class CategoryButton extends SimpleMenuItem { constructor(applet, categoryId, label, icon) { super(applet, { name: label || _("All Applications"), type: 'category', styleClass: 'menu-category-button', categoryId: categoryId }); this.actor.accessible_role = Atk.Role.LIST_ITEM; if (typeof icon === 'string') this.addIcon(CATEGORY_ICON_SIZE, icon); else if (icon) this.addIcon(CATEGORY_ICON_SIZE, null, icon); if (this.icon && !applet.showCategoryIcons) this.icon.visible = false; this.addLabel(this.name, 'menu-category-button-label'); } } class FavoritesButton extends GenericApplicationButton { constructor(applet, app) { super(applet, app, 'fav', false, 'menu-favorites-button'); this.icon = app.create_icon_texture(getFavIconSize()); this.addActor(this.icon); this._draggable = DND.makeDraggable(this.actor); this._signals.connect(this._draggable, 'drag-end', Lang.bind(this, this._onDragEnd)); 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: 'menu-favorites-button' }); this.addIcon(getFavIconSize(), iconName); } } class CategoriesApplicationsBox { constructor() { this.actor = new St.BoxLayout(); 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 FavoritesBox { constructor() { this.actor = new St.BoxLayout({ vertical: true }); 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', Lang.bind(this, function() { 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, Lang.bind(this, function () { 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.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); this.settings = new Settings.AppletSettings(this, "menu@cinnamon.org", instance_id); this.settings.bind("show-places", "showPlaces", () => this.queueRefresh(RefreshFlags.PLACE)); 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('menu-background'); this.menu.connect('open-state-changed', Lang.bind(this, this._onOpenStateChanged)); this.settings.bind("menu-custom", "menuCustom", this._updateIconAndLabel); this.settings.bind("menu-icon", "menuIcon", this._updateIconAndLabel); this.settings.bind("menu-label", "menuLabel", this._updateIconAndLabel); this.settings.bind("overlay-key", "overlayKey", this._updateKeybinding); this.settings.bind("show-category-icons", "showCategoryIcons", () => this._updateShowIcons(this.categoriesBox, this.showCategoryIcons)); this.settings.bind("show-application-icons", "showApplicationIcons", () => this._updateShowIcons(this.applicationsBox, this.showApplicationIcons)); this.settings.bind("favbox-show", "favBoxShow", this._favboxtoggle); this.settings.bind("enable-animation", "enableAnimation", null); this.settings.bind("favbox-min-height", "favBoxMinHeight", this._recalc_height); this._updateKeybinding(); Main.themeManager.connect("theme-set", Lang.bind(this, this._updateIconAndLabel)); this._updateIconAndLabel(); this._searchInactiveIcon = new St.Icon({ style_class: 'menu-search-entry-icon', icon_name: 'edit-find', icon_type: St.IconType.SYMBOLIC }); this._searchActiveIcon = new St.Icon({ style_class: 'menu-search-entry-icon', icon_name: 'edit-clear', icon_type: St.IconType.SYMBOLIC }); this._searchIconClickedId = 0; this._applicationsButtons = []; this._favoritesButtons = []; this._placesButtons = []; this._transientButtons = []; this.recentButton = null; this._recentButtons = []; this._categoryButtons = []; this._searchProviderButtons = []; this._selectedItemIndex = null; this._previousSelectedActor = null; this._previousVisibleIndex = null; this._previousTreeSelectedActor = 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._isBumblebeeInstalled = GLib.file_test("/usr/bin/optirun", 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)); AppFavorites.getAppFavorites().connect('changed', () => this.queueRefresh(RefreshFlags.FAV)); 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)); this._fileFolderAccessActive = false; this._pathCompleter = new Gio.FilenameCompleter(); this._pathCompleter.set_dirs_only(false); this.lastAcResults = []; this.settings.bind("search-filesystem", "searchFilesystem"); this.contextMenu = null; this.lastSelectedCategory = null; // 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 specificed 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); } _updateShowIcons(container, show) { Util.each(container.get_children(), c => { let b = c._delegate; if (!(b instanceof SimpleMenuItem)) return; if (b.icon) b.icon.visible = show; }) } _updateKeybinding() { Main.keybindingManager.addHotKey("overlay-key-" + this.instance_id, this.overlayKey, Lang.bind(this, function() { if (!Main.overview.visible && !Main.expo.visible) this.menu.toggle_with_options(this.enableAnimation); })); } 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.FAV) === RefreshFlags.FAV) this._refreshFavs(); if ((m & RefreshFlags.SYSTEM) === RefreshFlags.SYSTEM) this._refreshSystemButtons(); if ((m & RefreshFlags.PLACE) === RefreshFlags.PLACE) this._refreshPlaces(); if ((m & RefreshFlags.RECENT) === RefreshFlags.RECENT) this._refreshRecent(); this.refreshMask = 0; // recent category is always last if (this.recentButton) this.categoriesBox.set_child_at_index(this.recentButton.actor, -1); // places is before recents, or last in list if recents is disabled/not generated if (this.placesButton) { if (this.recentButton) this.categoriesBox.set_child_below_sibling(this.placesButton.actor, this.recentButton.actor); else this.categoriesBox.set_child_at_index(this.placesButton.actor, -1); } this._resizeApplicationsBox(); } 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(); } }); } _recalc_height() { let scrollBoxHeight = (this.leftBox.get_allocation_box().y2-this.leftBox.get_allocation_box().y1) - (this.searchBox.get_allocation_box().y2-this.searchBox.get_allocation_box().y1); this.applicationsScrollBox.style = "height: "+scrollBoxHeight / global.ui_scale +"px;"; let monitor = Main.layoutManager.monitors[this.panel.monitorIndex]; let minSize = Math.max(this.favBoxMinHeight * global.ui_scale, this.categoriesBox.height - this.systemButtonsBox.height); let maxSize = monitor.height - (this.systemButtonsBox.height * 2); let size = Math.min(minSize, maxSize); this.favoritesScrollBox.set_height(size); } on_orientation_changed (orientation) { this._updateIconAndLabel(); } on_applet_removed_from_panel () { Main.keybindingManager.removeHotKey("overlay-key-" + this.instance_id); } // settings button callback _launch_editor() { Util.spawnCommandLine("cinnamon-menu-editor"); } 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._selectedItemIndex = null; this._activeContainer = null; this._activeActor = null; this.lastSelectedCategory = null; 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 = "menu-category-button-selected"; Mainloop.idle_add(Lang.bind(this, this._initial_cat_selection, n)); } else { this.actor.remove_style_pseudo_class('active'); if (this.searchActive) { this.resetSearch(); } this.selectedAppTitle.set_text(""); this.selectedAppDescription.set_text(""); this._previousTreeSelectedActor = null; this._previousSelectedActor = null; this.closeContextMenu(false); this._clearAllSelections(true); this._scrollToButton(null, this.favoritesScrollBox); this.destroyVectorBox(); } } _initial_cat_selection (start_index) { let n = this._applicationsButtons.length; for (let i = start_index; i < n; i++) { this._applicationsButtons[i].actor.show(); } } destroy() { this.actor._delegate = null; this.menu.destroy(); this.actor.destroy(); this.emit('destroy'); } _favboxtoggle() { if (!this.favBoxShow) { this.leftPane.hide(); } else { this.leftPane.show(); } } _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 menu.actor.set_style_class_name('menu-context-menu'); menu.connect('open-state-changed', Lang.bind(this, this._contextMenuOpenStateChanged)); 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.Escape || (ctrlKey && (symbol === Clutter.KEY_Return || symbol === Clutter.KP_Enter))) { this.toggleContextMenu(button); return; } let minIndex = 0; let goUp = symbol === Clutter.KEY_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.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.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; let index = 0; this.appBoxIter.reloadVisible(); this.catBoxIter.reloadVisible(); this.favBoxIter.reloadVisible(); this.sysBoxIter.reloadVisible(); let keyCode = event.get_key_code(); let modifierState = Cinnamon.get_event_state(event); /* 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 true; } index = this._selectedItemIndex; 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_Down: case Clutter.KEY_Return: case Clutter.KP_Enter: case Clutter.KEY_Menu: case Clutter.KEY_Page_Up: case Clutter.KEY_Page_Down: case Clutter.Escape: this._navigateContextMenu(this._activeContextMenuParent, symbol, ctrlKey); break; case Clutter.KEY_Right: case Clutter.KEY_Left: case Clutter.Tab: case Clutter.ISO_Left_Tab: continueNavigation = true; break; } if (!continueNavigation) return true; } let navigationKey = true; let whichWay = "none"; switch (symbol) { case Clutter.KEY_Up: whichWay = "up"; if (this._activeContainer === this.favoritesBox && ctrlKey && (this.favoritesBox.get_child_at_index(index))._delegate instanceof FavoritesButton) navigationKey = false; break; case Clutter.KEY_Down: whichWay = "down"; if (this._activeContainer === this.favoritesBox && ctrlKey && (this.favoritesBox.get_child_at_index(index))._delegate instanceof FavoritesButton) navigationKey = false; break; case Clutter.KEY_Page_Up: whichWay = "top"; break; case Clutter.KEY_Page_Down: whichWay = "bottom"; break; case Clutter.KEY_Right: if (!this.searchActive) whichWay = "right"; if (this._activeContainer === this.applicationsBox) whichWay = "none"; else if (this._activeContainer === this.categoriesBox && this.noRecentDocuments && (this.categoriesBox.get_child_at_index(index))._delegate.categoryId === "recent") whichWay = "none"; break; case Clutter.KEY_Left: if (!this.searchActive) whichWay = "left"; if (this._activeContainer === this.favoritesBox || this._activeContainer === this.systemButtonsBox) whichWay = "none"; else if (!this.favBoxShow && (this._activeContainer === this.categoriesBox || this._activeContainer === null)) whichWay = "none"; break; case Clutter.Tab: if (!this.searchActive) whichWay = "right"; else navigationKey = false; break; case Clutter.ISO_Left_Tab: if (!this.searchActive) whichWay = "left"; else navigationKey = false; break; default: navigationKey = false; } if (navigationKey) { switch (this._activeContainer) { case null: switch (whichWay) { case "up": this._activeContainer = this.categoriesBox; item_actor = this.catBoxIter.getLastVisible(); this._scrollToButton(); break; case "down": this._activeContainer = this.categoriesBox; item_actor = this.catBoxIter.getFirstVisible(); item_actor = this.catBoxIter.getNextVisible(item_actor); this._scrollToButton(); break; case "right": this._activeContainer = this.applicationsBox; item_actor = this.appBoxIter.getFirstVisible(); this._scrollToButton(); break; case "left": if (this.favBoxShow) { this._activeContainer = this.favoritesBox; item_actor = this.favBoxIter.getFirstVisible(); } else { this._activeContainer = this.applicationsBox; item_actor = this.appBoxIter.getFirstVisible(); this._scrollToButton(); } break; case "top": this._activeContainer = this.categoriesBox; item_actor = this.catBoxIter.getFirstVisible(); this._scrollToButton(); break; case "bottom": this._activeContainer = this.categoriesBox; item_actor = this.catBoxIter.getLastVisible(); this._scrollToButton(); break; } break; case this.categoriesBox: switch (whichWay) { case "up": this._previousTreeSelectedActor = this.categoriesBox.get_child_at_index(index); this._previousTreeSelectedActor._delegate.isHovered = false; item_actor = this.catBoxIter.getPrevVisible(this._activeActor); this._scrollToButton(); break; case "down": this._previousTreeSelectedActor = this.categoriesBox.get_child_at_index(index); this._previousTreeSelectedActor._delegate.isHovered = false; item_actor = this.catBoxIter.getNextVisible(this._activeActor); this._scrollToButton(); break; case "right": if ((this.categoriesBox.get_child_at_index(index))._delegate.categoryId === "recent" && this.noRecentDocuments) { if(this.favBoxShow) { this._previousSelectedActor = this.categoriesBox.get_child_at_index(index); item_actor = this.favBoxIter.getFirstVisible(); } else { item_actor = this.categoriesBox.get_child_at_index(index); } } else { item_actor = (this._previousVisibleIndex != null) ? this.appBoxIter.getVisibleItem(this._previousVisibleIndex) : this.appBoxIter.getFirstVisible(); } break; case "left": if(this.favBoxShow) { this._previousSelectedActor = this.categoriesBox.get_child_at_index(index); item_actor = this.favBoxIter.getFirstVisible(); this._scrollToButton(null, this.favoritesScrollBox); } else { if ((this.categoriesBox.get_child_at_index(index))._delegate.categoryId === "recent" && this.noRecentDocuments) { item_actor = this.categoriesBox.get_child_at_index(index); } else { item_actor = (this._previousVisibleIndex != null) ? this.appBoxIter.getVisibleItem(this._previousVisibleIndex) : this.appBoxIter.getFirstVisible(); } } break; case "top": this._previousTreeSelectedActor = this.categoriesBox.get_child_at_index(index); this._previousTreeSelectedActor._delegate.isHovered = false; item_actor = this.catBoxIter.getFirstVisible(); this._scrollToButton(); break; case "bottom": this._previousTreeSelectedActor = this.categoriesBox.get_child_at_index(index); this._previousTreeSelectedActor._delegate.isHovered = false; item_actor = this.catBoxIter.getLastVisible(); this._scrollToButton(); break; } break; case this.applicationsBox: switch (whichWay) { case "up": this._previousSelectedActor = this.applicationsBox.get_child_at_index(index); item_actor = this.appBoxIter.getPrevVisible(this._previousSelectedActor); this._previousVisibleIndex = this.appBoxIter.getVisibleIndex(item_actor); this._scrollToButton(item_actor._delegate); break; case "down": this._previousSelectedActor = this.applicationsBox.get_child_at_index(index); item_actor = this.appBoxIter.getNextVisible(this._previousSelectedActor); this._previousVisibleIndex = this.appBoxIter.getVisibleIndex(item_actor); this._scrollToButton(item_actor._delegate); break; case "right": this._previousSelectedActor = this.applicationsBox.get_child_at_index(index); item_actor = (this._previousTreeSelectedActor != null) ? this._previousTreeSelectedActor : this.catBoxIter.getFirstVisible(); this._previousTreeSelectedActor = item_actor; index = item_actor.get_parent()._vis_iter.getAbsoluteIndexOfChild(item_actor); if (this.favBoxShow) { this._buttonEnterEvent(item_actor._delegate); this._previousSelectedActor = this.categoriesBox.get_child_at_index(index); item_actor = this.favBoxIter.getFirstVisible(); } break; case "left": this._previousSelectedActor = this.applicationsBox.get_child_at_index(index); item_actor = (this._previousTreeSelectedActor != null) ? this._previousTreeSelectedActor : this.catBoxIter.getFirstVisible(); this._previousTreeSelectedActor = item_actor; break; case "top": item_actor = this.appBoxIter.getFirstVisible(); this._previousVisibleIndex = this.appBoxIter.getVisibleIndex(item_actor); this._scrollToButton(item_actor._delegate); break; case "bottom": item_actor = this.appBoxIter.getLastVisible(); this._previousVisibleIndex = this.appBoxIter.getVisibleIndex(item_actor); this._scrollToButton(item_actor._delegate); break; } break; case this.favoritesBox: switch (whichWay) { case "up": this._previousSelectedActor = this.favoritesBox.get_child_at_index(index); if (this._previousSelectedActor === this.favBoxIter.getFirstVisible()) { item_actor = this.sysBoxIter.getLastVisible(); } else { item_actor = this.favBoxIter.getPrevVisible(this._previousSelectedActor); this._scrollToButton(item_actor._delegate, this.favoritesScrollBox); } break; case "down": this._previousSelectedActor = this.favoritesBox.get_child_at_index(index); if (this._previousSelectedActor === this.favBoxIter.getLastVisible()) { item_actor = this.sysBoxIter.getFirstVisible(); } else { item_actor = this.favBoxIter.getNextVisible(this._previousSelectedActor); this._scrollToButton(item_actor._delegate, this.favoritesScrollBox); } break; case "right": item_actor = (this._previousTreeSelectedActor != null) ? this._previousTreeSelectedActor : this.catBoxIter.getFirstVisible(); this._previousTreeSelectedActor = item_actor; break; case "left": item_actor = (this._previousTreeSelectedActor != null) ? this._previousTreeSelectedActor : this.catBoxIter.getFirstVisible(); this._previousTreeSelectedActor = item_actor; index = item_actor.get_parent()._vis_iter.getAbsoluteIndexOfChild(item_actor); this._buttonEnterEvent(item_actor._delegate); item_actor = (this._previousVisibleIndex != null) ? this.appBoxIter.getVisibleItem(this._previousVisibleIndex) : this.appBoxIter.getFirstVisible(); break; case "top": item_actor = this.favBoxIter.getFirstVisible(); break; case "bottom": item_actor = this.favBoxIter.getLastVisible(); break; } break; case this.systemButtonsBox: switch (whichWay) { case "up": this._previousSelectedActor = this.systemButtonsBox.get_child_at_index(index); if (this._previousSelectedActor === this.sysBoxIter.getFirstVisible()) { item_actor = this.favBoxIter.getLastVisible(); this._scrollToButton(item_actor._delegate, this.favoritesScrollBox); } else { item_actor = this.sysBoxIter.getPrevVisible(this._previousSelectedActor); } break; case "down": this._previousSelectedActor = this.systemButtonsBox.get_child_at_index(index); if (this._previousSelectedActor === this.sysBoxIter.getLastVisible()) { item_actor = this.favBoxIter.getFirstVisible(); this._scrollToButton(null, this.favoritesScrollBox); } else { item_actor = this.sysBoxIter.getNextVisible(this._previousSelectedActor); } break; case "right": item_actor = (this._previousTreeSelectedActor != null) ? this._previousTreeSelectedActor : this.catBoxIter.getFirstVisible(); this._previousTreeSelectedActor = item_actor; break; case "left": item_actor = (this._previousTreeSelectedActor != null) ? this._previousTreeSelectedActor : this.catBoxIter.getFirstVisible(); this._previousTreeSelectedActor = item_actor; index = item_actor.get_parent()._vis_iter.getAbsoluteIndexOfChild(item_actor); this._buttonEnterEvent(item_actor._delegate); item_actor = (this._previousVisibleIndex != null) ? this.appBoxIter.getVisibleItem(this._previousVisibleIndex) : this.appBoxIter.getFirstVisible(); break; case "top": item_actor = this.sysBoxIter.getFirstVisible(); break; case "bottom": item_actor = this.sysBoxIter.getLastVisible(); break; } break; default: break; } if (!item_actor) return false; index = item_actor.get_parent()._vis_iter.getAbsoluteIndexOfChild(item_actor); } else { if ((this._activeContainer && this._activeContainer !== this.categoriesBox) && (symbol === Clutter.KEY_Return || symbol === Clutter.KP_Enter)) { if (!ctrlKey) { item_actor = this._activeContainer.get_child_at_index(this._selectedItemIndex); item_actor._delegate.activate(); } else if (ctrlKey && this._activeContainer === this.applicationsBox) { item_actor = this.applicationsBox.get_child_at_index(this._selectedItemIndex); this.toggleContextMenu(item_actor._delegate); } return true; } else if (this._activeContainer === this.applicationsBox && symbol === Clutter.KEY_Menu) { item_actor = this.applicationsBox.get_child_at_index(this._selectedItemIndex); this.toggleContextMenu(item_actor._delegate); return true; } else if (!this.searchActive && this._activeContainer === this.favoritesBox && symbol === Clutter.Delete) { item_actor = this.favoritesBox.get_child_at_index(this._selectedItemIndex); if (item_actor._delegate instanceof FavoritesButton) { let favorites = AppFavorites.getAppFavorites().getFavorites(); let numFavorites = favorites.length; AppFavorites.getAppFavorites().removeFavorite(item_actor._delegate.app.get_id()); if (this._selectedItemIndex == (numFavorites-1)) item_actor = this.favoritesBox.get_child_at_index(this._selectedItemIndex-1); else item_actor = this.favoritesBox.get_child_at_index(this._selectedItemIndex); } } else if (this._activeContainer === this.favoritesBox && (symbol === Clutter.KEY_Down || symbol === Clutter.KEY_Up) && ctrlKey && (this.favoritesBox.get_child_at_index(index))._delegate instanceof FavoritesButton) { item_actor = this.favoritesBox.get_child_at_index(this._selectedItemIndex); let id = item_actor._delegate.app.get_id(); let appFavorites = AppFavorites.getAppFavorites(); let favorites = appFavorites.getFavorites(); let numFavorites = favorites.length; let favPos = 0; if (this._selectedItemIndex == (numFavorites-1) && symbol === Clutter.KEY_Down) favPos = 0; else if (this._selectedItemIndex == 0 && symbol === Clutter.KEY_Up) favPos = numFavorites-1; else if (symbol === Clutter.KEY_Down) favPos = this._selectedItemIndex + 1; else favPos = this._selectedItemIndex - 1; appFavorites.moveFavoriteToPos(id, favPos); item_actor = this.favoritesBox.get_child_at_index(favPos); this._scrollToButton(item_actor._delegate, this.favoritesScrollBox); } else if (this.searchFilesystem && (this._fileFolderAccessActive || symbol === Clutter.slash)) { if (symbol === Clutter.Return || symbol === Clutter.KP_Enter) { if (this._run(this.searchEntry.get_text())) { this.menu.close(); } return true; } if (symbol === Clutter.Escape) { this.searchEntry.set_text(''); this._fileFolderAccessActive = false; } if (symbol === Clutter.slash) { // Need preload data before get completion. GFilenameCompleter load content of parent directory. // Parent directory for /usr/include/ is /usr/. So need to add fake name('a'). let text = this.searchEntry.get_text().concat('/a'); let prefix; if (!text.includes(' ')) prefix = text; else prefix = text.substr(text.lastIndexOf(' ') + 1); this._getCompletion(prefix); return false; } if (symbol === Clutter.Tab) { let text = actor.get_text(); let prefix; if (!text.includes(' ')) prefix = text; else prefix = text.substr(text.lastIndexOf(' ') + 1); let postfix = this._getCompletion(prefix); if (postfix != null && postfix.length > 0) { actor.insert_text(postfix, -1); actor.set_cursor_position(text.length + postfix.length); if (postfix[postfix.length - 1] == '/') this._getCompletion(text + postfix + 'a'); } return true; } if (symbol === Clutter.ISO_Left_Tab) { return true; } return false; } else if (symbol === Clutter.Tab || symbol === Clutter.ISO_Left_Tab) { return true; } else { return false; } } this.selectedAppTitle.set_text(""); this.selectedAppDescription.set_text(""); this._selectedItemIndex = index; if (!item_actor || item_actor === this.searchEntry) { return false; } this._buttonEnterEvent(item_actor._delegate); return true; } _buttonEnterEvent(button) { let parent = button.actor.get_parent(); if (this._activeContainer === this.categoriesBox && parent !== this._activeContainer) { this._previousTreeSelectedActor = this._activeActor; this._previousSelectedActor = null; } if (this._previousTreeSelectedActor && this._activeContainer !== this.categoriesBox && parent !== this._activeContainer && button !== this._previousTreeSelectedActor && !this.searchActive) { this._previousTreeSelectedActor.style_class = "menu-category-button"; } if (parent != this._activeContainer && parent._vis_iter) { parent._vis_iter.reloadVisible(); } let _maybePreviousActor = this._activeActor; if (_maybePreviousActor && this._activeContainer !== this.categoriesBox) { this._previousSelectedActor = _maybePreviousActor; this._clearPrevSelection(); } if (parent === this.categoriesBox && !this.searchActive) { this._previousSelectedActor = _maybePreviousActor; this._clearPrevCatSelection(); } this._activeContainer = parent; this._activeActor = button.actor; if (this._activeContainer._vis_iter) { this._selectedItemIndex = this._activeContainer._vis_iter.getAbsoluteIndexOfChild(this._activeActor); } let isFav = false; if (button instanceof CategoryButton) { if (this.searchActive) return; button.isHovered = true; this._clearPrevCatSelection(button.actor); this._select_category(button.categoryId); this.makeVectorBox(button.actor); } else { this._previousVisibleIndex = parent._vis_iter.getVisibleIndex(button.actor); isFav = button instanceof FavoritesButton || button instanceof SystemButton; if (!isFav) this._clearPrevSelection(button.actor); this.selectedAppTitle.set_text(button.name); this.selectedAppDescription.set_text(button.description); } if (isFav) button.actor.add_style_pseudo_class("hover"); else button.actor.set_style_class_name(`${button.styleClass}-selected`); } _buttonLeaveEvent (button) { if (button instanceof CategoryButton) { if (this._previousTreeSelectedActor === null) { this._previousTreeSelectedActor = button.actor; } else { let prevIdx = this.catBoxIter.getVisibleIndex(this._previousTreeSelectedActor); let nextIdx = this.catBoxIter.getVisibleIndex(button.actor); if (Math.abs(prevIdx - nextIdx) <= 1) { this._previousTreeSelectedActor = button.actor; } } button.isHovered = false; } else { this._previousSelectedActor = button.actor; this.selectedAppTitle.set_text(""); this.selectedAppDescription.set_text(""); // category unselects are handled when the category actually changes if (button instanceof FavoritesButton || button instanceof SystemButton) button.actor.remove_style_pseudo_class("hover"); else button.actor.set_style_class_name(button.styleClass); } } _clearPrevSelection(actor) { if (this._previousSelectedActor && !this._previousSelectedActor.is_finalized() && this._previousSelectedActor != actor) { if (this._previousSelectedActor._delegate instanceof FavoritesButton || this._previousSelectedActor._delegate instanceof SystemButton) this._previousSelectedActor.remove_style_pseudo_class("hover"); else if (!(this._previousSelectedActor._delegate instanceof CategoryButton)) this._previousSelectedActor.style_class = "menu-application-button"; } } _clearPrevCatSelection(actor) { if (this._previousTreeSelectedActor && this._previousTreeSelectedActor != actor) { this._previousTreeSelectedActor.style_class = "menu-category-button"; if (this._previousTreeSelectedActor._delegate) { this._buttonLeaveEvent(this._previousTreeSelectedActor._delegate); } if (actor !== undefined) { this._previousVisibleIndex = null; this._previousTreeSelectedActor = actor; } } else { this.categoriesBox.get_children().forEach(child => child.style_class = "menu-category-button"); } } /* * The vectorBox overlays the the categoriesBox to aid in navigation from categories to apps * by preventing misselections. It is set to the same size as the categoriesOverlayBox and * categoriesBox. * * The actor is a quadrilateral that we turn into a triangle by setting the A and B vertices to * the same position. The size and origin of the vectorBox are calculated in _getVectorInfo(). * Using those properties, the bounding box is sized as (w, h) and the triangle is defined as * follows: * _____ * | /|D * | / | AB: (mx, my) * | A/ | C: (w, h) * | B\ | D: (w, 0) * | \ | * |____\|C */ _getVectorInfo() { let [mx, my, mask] = global.get_pointer(); let [bx, by] = this.categoriesOverlayBox.get_transformed_position(); let [bw, bh] = this.categoriesOverlayBox.get_transformed_size(); let xformed_mx = mx - bx; let xformed_my = my - by; if (xformed_mx < 0 || xformed_mx > bw || xformed_my < 0 || xformed_my > bh) { return null; } return { mx: xformed_mx, my: xformed_my, w: this.categoriesOverlayBox.width, h: this.categoriesOverlayBox.height }; } makeVectorBox(actor) { this.destroyVectorBox(actor); let vi = this._getVectorInfo(); if (!vi) return; if (this.vectorBox) { this.vectorBox.visible = true; } else { this.vectorBox = new St.Polygon({ debug: false, reactive: true }); this.categoriesOverlayBox.add_actor(this.vectorBox); this.vectorBox.connect("leave-event", Lang.bind(this, this.destroyVectorBox)); this.vectorBox.connect("motion-event", Lang.bind(this, this.maybeUpdateVectorBox)); } Object.assign(this.vectorBox, { width: vi.w, height: vi.h, ulc_x: vi.mx, ulc_y: vi.my, llc_x: vi.mx, llc_y: vi.my, urc_x: vi.w, urc_y: 0, lrc_x: vi.w, lrc_y: vi.h }); this.actor_motion_id = actor.connect("motion-event", Lang.bind(this, this.maybeUpdateVectorBox)); this.current_motion_actor = actor; } maybeUpdateVectorBox() { if (this.vector_update_loop) { Mainloop.source_remove(this.vector_update_loop); this.vector_update_loop = 0; } this.vector_update_loop = Mainloop.timeout_add(50, Lang.bind(this, this.updateVectorBox)); } updateVectorBox(actor) { if (!this.current_motion_actor) return; let vi = this._getVectorInfo(); if (vi) { this.vectorBox.ulc_x = vi.mx; this.vectorBox.llc_x = vi.mx; this.vectorBox.queue_repaint(); } else { this.destroyVectorBox(actor); } this.vector_update_loop = 0; return false; } destroyVectorBox(actor) { if (!this.vectorBox) return; if (this.vector_update_loop) { Mainloop.source_remove(this.vector_update_loop); this.vector_update_loop = 0; } if (this.actor_motion_id > 0 && this.current_motion_actor != null) { this.current_motion_actor.disconnect(this.actor_motion_id); this.actor_motion_id = 0; this.current_motion_actor = null; this.vectorBox.visible = false; } } _refreshPlaces () { for (let i = 0; i < this._placesButtons.length; i ++) { this._placesButtons[i].actor.destroy(); } this._placesButtons = []; if (!this.showPlaces) { for (let i = 0; i < this._categoryButtons.length; i++) { if (this._categoryButtons[i].categoryId === 'place') { this._categoryButtons[i].destroy(); this._categoryButtons.splice(i, 1); this.placesButton = null; break; } } return; } // Now generate Places category and places buttons and add to the list if (!this.placesButton) { this.placesButton = new CategoryButton(this, 'place', _('Places'), 'folder'); this._categoryButtons.push(this.placesButton); this.categoriesBox.add_actor(this.placesButton.actor); } // places go after applications. we add them in reverse starting below the last ApplicationButton let sibling = this._applicationsButtons[this._applicationsButtons.length - 1].actor; let places = Main.placesManager.getAllPlaces(); for (let i = places.length - 1; i >= 0; i--) { let button = new PlaceButton(this, places[i]); this._placesButtons.push(button); this.applicationsBox.insert_child_below(button.actor, sibling); button.actor.visible = this.menu.isOpen; sibling = button.actor; } this._resizeApplicationsBox(); } _refreshRecent () { for (let i = 0; i < this._recentButtons.length; i++) { this._recentButtons[i].destroy(); } this._recentButtons = []; if (!this.showRecents || !this.privacy_settings.get_boolean(REMEMBER_RECENT_KEY)) { for (let i = 0; i < this._categoryButtons.length; i++) { if (this._categoryButtons[i].categoryId === 'recent') { this._categoryButtons[i].destroy(); this._categoryButtons.splice(i, 1); this.recentButton = null; break; } } 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; Util.each(recents, (info) => { let button = new RecentButton(this, info); this._recentButtons.push(button); this.applicationsBox.add_actor(button.actor); button.actor.visible = this.menu.isOpen; }); let button = new SimpleMenuItem(this, { name: _("Clear list"), description: ("Clear all recent documents"), type: 'recent-clear', styleClass: 'menu-application-button' }); button.addIcon(APPLICATION_ICON_SIZE, 'edit-clear', null, true); button.addLabel("", 'menu-application-button-label'); button.label.clutter_text.set_markup(`${button.name}`); button.activate = () => { this.menu.close(); (new Gtk.RecentManager()).purge_items(); }; if (!this.showApplicationIcons) button.icon.visible = false; this._recentButtons.push(button); this.applicationsBox.add_actor(button.actor); button.actor.visible = this.menu.isOpen; } else { this.noRecentDocuments = true; let button = new SimpleMenuItem(this, { name: _("No recent documents"), type: 'no-recent', styleClass: 'menu-application-button', reactive: false, activatable: false }); button.addLabel(button.name, 'menu-application-button-label'); this._recentButtons.push(button); this.applicationsBox.add_actor(button.actor); button.actor.visible = this.menu.isOpen; } this._resizeApplicationsBox(); } _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 (b === this._allAppsCategoryButton || ['place', 'recent'].includes(b.categoryId)) continue; this._categoryButtons[i].destroy(); this._categoryButtons.splice(i, 1); } this._applicationsButtons.forEach(button => button.destroy()); this._applicationsButtons = []; if (!this._allAppsCategoryButton) { this._allAppsCategoryButton = new CategoryButton(this); 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 Util.each(dirs, (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; } // we expect this array to be in the same order as the child list this._applicationsButtons.reverse(); this._appsWereRefreshed = true; } _refreshFavs() { //Remove all favorites this.favoritesBox.destroy_all_children(); //Load favorites again this._favoritesButtons = []; let launchers = global.settings.get_strv('favorite-apps'); for ( let i = 0; i < launchers.length; ++i ) { let app = appsys.lookup_app(launchers[i]); if (app) { let button = new FavoritesButton(this, app); this._favoritesButtons[app] = button; this.favoritesBox.add(button.actor, { y_align: St.Align.END, y_fill: false }); } } } _refreshSystemButtons() { // Remove all system buttons this.systemButtonsBox.destroy_all_children(); // Load system buttons again let button; //Lock screen button = new SystemButton(this, "system-lock-screen", _("Lock screen"), _("Lock the screen")); button.activate = () => { this.menu.close(); 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.systemButtonsBox.add(button.actor, { y_align: St.Align.END, y_fill: false }); //Logout button button = new SystemButton(this, "system-log-out", _("Logout"), _("Leave the session")); button.activate = () => { this.menu.close(); this._session.LogoutRemote(0); }; this.systemButtonsBox.add(button.actor, { y_align: St.Align.END, y_fill: false }); //Shutdown button button = new SystemButton(this, "system-shutdown", _("Quit"), _("Shutdown the computer")); button.activate = () => { this.menu.close(); this._session.ShutdownRemote(); }; this.systemButtonsBox.add(button.actor, { y_align: St.Align.END, y_fill: false }); } _scrollToButton(button, scrollBox = null) { if (!scrollBox) scrollBox = this.applicationsScrollBox; 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); } } _display() { this._activeContainer = null; this._activeActor = null; this.vectorBox = null; this.actor_motion_id = 0; this.vector_update_loop = null; this.current_motion_actor = null; let section = new PopupMenu.PopupMenuSection(); this.menu.addMenuItem(section); this.leftPane = new St.BoxLayout({ vertical: true }); this.leftBox = new St.BoxLayout({ style_class: 'menu-favorites-box', vertical: true }); this._session = new GnomeSession.SessionManager(); this._screenSaverProxy = new ScreenSaver.ScreenSaverProxy(); this.leftPane.add(this.leftBox, { y_align: St.Align.END, y_fill: false }); this._favboxtoggle(); let rightPane = new St.BoxLayout({ vertical: true }); this.searchBox = new St.BoxLayout({ style_class: 'menu-search-box' }); this.searchEntry = new St.Entry({ name: 'menu-search-entry', hint_text: _("Type to search..."), track_hover: true, can_focus: true }); this.searchEntry.set_secondary_icon(this._searchInactiveIcon); this.searchBox.add(this.searchEntry, {x_fill: true, x_align: St.Align.START, y_align: St.Align.MIDDLE, y_fill: false, expand: true}); this.searchActive = false; this.searchEntryText = this.searchEntry.clutter_text; this.searchEntryText.connect('text-changed', Lang.bind(this, this._onSearchTextChanged)); this.searchEntryText.connect('key-press-event', Lang.bind(this, this._onMenuKeyPress)); this._previousSearchPattern = ""; this.categoriesApplicationsBox = new CategoriesApplicationsBox(); rightPane.add_actor(this.searchBox); rightPane.add_actor(this.categoriesApplicationsBox.actor); this.categoriesOverlayBox = new Clutter.Actor(); this.categoriesBox = new St.BoxLayout({ style_class: 'menu-categories-box', vertical: true, accessible_role: Atk.Role.LIST }); this.categoriesOverlayBox.add_actor(this.categoriesBox); this.applicationsScrollBox = new St.ScrollView({ x_fill: true, y_fill: false, y_align: St.Align.START, style_class: 'vfade menu-applications-scrollbox' }); this.favoritesScrollBox = new St.ScrollView({ x_fill: true, y_fill: false, y_align: St.Align.START, style_class: 'vfade menu-favorites-scrollbox' }); this.a11y_settings = new Gio.Settings({ schema_id: "org.cinnamon.desktop.a11y.applications" }); this.a11y_settings.connect("changed::screen-magnifier-enabled", Lang.bind(this, this._updateVFade)); this.a11y_mag_settings = new Gio.Settings({ schema_id: "org.cinnamon.desktop.a11y.magnifier" }); this.a11y_mag_settings.connect("changed::mag-factor", Lang.bind(this, this._updateVFade)); this._updateVFade(); this.settings.bind("enable-autoscroll", "autoscroll_enabled", this._update_autoscroll); this._update_autoscroll(); let vscroll = this.applicationsScrollBox.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; })); this.applicationsBox = new St.BoxLayout({ style_class: 'menu-applications-inner-box', vertical:true }); this.applicationsBox.add_style_class_name('menu-applications-box'); //this is to support old themes this.applicationsScrollBox.add_actor(this.applicationsBox); this.applicationsScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); this.categoriesApplicationsBox.actor.add_actor(this.categoriesOverlayBox); this.categoriesApplicationsBox.actor.add_actor(this.applicationsScrollBox); this.favoritesBox = new FavoritesBox().actor; this.favoritesScrollBox.add_actor(this.favoritesBox); this.favoritesScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.NEVER); this.leftBox.add(this.favoritesScrollBox, { y_align: St.Align.END, y_fill: false }); this.systemButtonsBox = new St.BoxLayout({ vertical: true }); this.leftBox.add(this.systemButtonsBox, { y_align: St.Align.END, y_fill: false }); this.mainBox = new St.BoxLayout({ style_class: 'menu-applications-outer-box', vertical:false }); this.mainBox.add_style_class_name('menu-applications-box'); //this is to support old themes this.mainBox.add(this.leftPane, { span: 1 }); this.mainBox.add(rightPane, { span: 1 }); this.mainBox._delegate = null; this.selectedAppBox = new St.BoxLayout({ style_class: 'menu-selected-app-box', vertical: true }); if (this.selectedAppBox.peek_theme_node() == null || this.selectedAppBox.get_theme_node().get_length('height') == 0) this.selectedAppBox.set_height(30 * global.ui_scale); this.selectedAppTitle = new St.Label({ style_class: 'menu-selected-app-title', text: "" }); this.selectedAppBox.add_actor(this.selectedAppTitle); this.selectedAppDescription = new St.Label({ style_class: 'menu-selected-app-description', text: "" }); this.selectedAppBox.add_actor(this.selectedAppDescription); this.selectedAppBox._delegate = null; section.actor.add(this.mainBox); section.actor.add_actor(this.selectedAppBox); 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.favBoxIter = new VisibleChildIterator(this.favoritesBox); this.favoritesBox._vis_iter = this.favBoxIter; this.sysBoxIter = new VisibleChildIterator(this.systemButtonsBox); this.systemButtonsBox._vis_iter = this.sysBoxIter; Mainloop.idle_add(Lang.bind(this, function() { this._clearAllSelections(true); })); this.menu.actor.connect("allocation-changed", Lang.bind(this, this._on_allocation_changed)); } _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.applicationsScrollBox.style_class = "menu-applications-scrollbox"; this.favoritesScrollBox.style_class = "menu-favorites-scrollbox"; } else { this.applicationsScrollBox.style_class = "vfade menu-applications-scrollbox"; this.favoritesScrollBox.style_class = "vfade menu-favorites-scrollbox"; } } _update_autoscroll() { this.applicationsScrollBox.set_auto_scrolling(this.autoscroll_enabled); this.favoritesScrollBox.set_auto_scrolling(this.autoscroll_enabled); } _on_allocation_changed(box, flags, data) { this._recalc_height(); } _clearAllSelections(hide_apps) { let actors = this.applicationsBox.get_children(); for (let i = 0; i < actors.length; i++) { let actor = actors[i]; actor.style_class = "menu-application-button"; if (hide_apps) { actor.hide(); } } actors = this.categoriesBox.get_children(); for (let i = 0; i < actors.length; i++){ let actor = actors[i]; actor.style_class = "menu-category-button"; actor.show(); } actors = this.favoritesBox.get_children(); for (let i = 0; i < actors.length; i++){ let actor = actors[i]; actor.remove_style_pseudo_class("hover"); actor.show(); } actors = this.systemButtonsBox.get_children(); for (let i = 0; i < actors.length; i++){ let actor = actors[i]; actor.remove_style_pseudo_class("hover"); actor.show(); } } _select_category (name) { if (name === this.lastSelectedCategory) return; this.lastSelectedCategory = name; this._displayButtons(name || 'app'); this.closeContextMenu(false); } closeContextMenu(animate) { if (!this.contextMenu || !this.contextMenu.isOpen) return; if (animate) this.contextMenu.toggle(); else this.contextMenu.close(); } _resizeApplicationsBox() { let width = -1; Util.each(this.applicationsBox.get_children(), c => { let [min, nat] = c.get_preferred_width(-1.0); if (nat > width) width = nat; }); this.applicationsBox.set_width(width + 42); // The answer to life... } /** * 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. */ Util.each(this.applicationsBox.get_children(), c => { let b = c._delegate; if (!(b instanceof SimpleMenuItem)) return; // destroy temporary buttons if (b.type === 'transient' || b.type === 'search-provider') { b.destroy(); return; } if (category) { c.visible = b.type.includes(category) || b.type === 'app' && b.category.includes(category); } else { c.visible = buttons.includes(b); } }); // reset temporary button storage this._transientButtons = []; this._searchProviderButtons = []; if (autoCompletes) { Util.each(autoCompletes, 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("menu-category-button"); if (icon) { icon.set_opacity(255); } } else { button.set_style_class_name("menu-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 == '' || searchString == this.searchEntry.hint_text); if (!this.searchActive && !searchActive) return; if (searchString == this._previousSearchPattern) return; this._previousSearchPattern = searchString; this.searchActive = searchActive; this._fileFolderAccessActive = searchActive && this.searchFilesystem; 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 = "menu-category-button-selected"; this._activeContainer = null; this.selectedAppTitle.set_text(""); this.selectedAppDescription.set_text(""); } } _matchNames(buttons, pattern){ let res = []; let exactMatch = null; for (let i = 0; i < buttons.length; i++) { let name = buttons[i].name; let lowerName = name.toLowerCase(); if (lowerName.includes(pattern)) res.push(buttons[i]); if (!exactMatch && lowerName === pattern) exactMatch = buttons[i]; } return [res, exactMatch]; } _listApplications(pattern){ if (!pattern) return [[], null]; let res = []; let exactMatch = null; let regexpPattern = new RegExp("\\b" + Util.escapeRegExp(pattern)); for (let i in this._applicationsButtons) { let app = this._applicationsButtons[i].app; let latinisedLowerName = Util.latinise(app.get_name().toLowerCase()); if (latinisedLowerName.match(regexpPattern) !== null) { res.push(this._applicationsButtons[i]); if (!exactMatch && latinisedLowerName === pattern) exactMatch = this._applicationsButtons[i]; } } if (!exactMatch) { for (let i in this._applicationsButtons) { let app = this._applicationsButtons[i].app; if ((Util.latinise(app.get_name().toLowerCase()).split(' ').some(word => word.startsWith(pattern))) || // match on app name (app.get_keywords() && Util.latinise(app.get_keywords().toLowerCase()).split(';').some(keyword => keyword.startsWith(pattern))) || // match on keyword (app.get_description() && Util.latinise(app.get_description().toLowerCase()).split(' ').some(word => word.startsWith(pattern))) || // match on description (app.get_id() && Util.latinise(app.get_id().slice(0, -8).toLowerCase()).startsWith(pattern))) { // match on app ID res.push(this._applicationsButtons[i]); } } } return [res, exactMatch]; } _doSearch(rawPattern){ let pattern = Util.latinise(rawPattern.toLowerCase()); this._searchTimeoutId = 0; this._activeContainer = null; this._activeActor = null; this._selectedItemIndex = null; this._previousTreeSelectedActor = null; this._previousSelectedActor = null; let [buttons, exactMatch] = this._listApplications(pattern); let result = this._matchNames(this._placesButtons, pattern); buttons = buttons.concat(result[0]); exactMatch = exactMatch || result[1]; result = this._matchNames(this._recentButtons, pattern); buttons = buttons.concat(result[0]); exactMatch = exactMatch || result[1]; var acResults = []; // search box autocompletion results if (this.searchFilesystem) { // Don't use the pattern here, as filesystem is case sensitive acResults = this._getCompletions(rawPattern); } this._displayButtons(null, buttons, acResults); if (buttons.length || acResults.length) { this.appBoxIter.reloadVisible(); let item_actor = exactMatch ? exactMatch.actor : this.appBoxIter.getFirstVisible(); this._selectedItemIndex = this.appBoxIter.getAbsoluteIndexOfChild(item_actor); this._activeContainer = this.applicationsBox; this._scrollToButton(item_actor._delegate); this._buttonEnterEvent(item_actor._delegate); } else { this.selectedAppTitle.set_text(""); this.selectedAppDescription.set_text(""); } SearchProviderManager.launch_all(pattern, Lang.bind(this, function(provider, results) { try { for (var i in results) { if (results[i].type != 'software') { let button = new SearchProviderResultButton(this, provider, results[i]); this._searchProviderButtons.push(button); this.applicationsBox.add_actor(button.actor); if (this._selectedItemIndex === null) { this.appBoxIter.reloadVisible(); let item_actor = this.appBoxIter.getFirstVisible(); this._selectedItemIndex = this.appBoxIter.getAbsoluteIndexOfChild(item_actor); this._activeContainer = this.applicationsBox; if (item_actor && item_actor != this.searchEntry) { this._buttonEnterEvent(item_actor._delegate); } } } } } catch(e) { global.log(e); } })); return false; } _getCompletion (text) { if (!text.includes('/') || text.endsWith('/')) return ''; return this._pathCompleter.get_completion_suffix(text); } _getCompletions (text) { if (!text.includes('/')) return []; return this._pathCompleter.get_completions(text); } _run (input) { this._commandError = false; if (input) { let path = null; if (input.startsWith('/')) { path = input; } else { if (input.startsWith('~')) input = input.slice(1); path = GLib.get_home_dir() + '/' + input; } if (GLib.file_test(path, GLib.FileTest.EXISTS)) { let file = Gio.file_new_for_path(path); try { Gio.app_info_launch_default_for_uri(file.get_uri(), global.create_app_launch_context()); } catch (e) { // The exception from gjs contains an error string like: // Error invoking Gio.app_info_launch_default_for_uri: No application // is registered as handling this file // We are only interested in the part after the first colon. //let message = e.message.replace(/[^:]*: *(.+)/, '$1'); return false; } } else { return false; } } return true; } }; function main(metadata, orientation, panel_height, instance_id) { return new CinnamonMenuApplet(orientation, panel_height, instance_id); } cinnamon-4.4.8/files/usr/share/cinnamon/applets/menu@cinnamon.org/metadata.json000066400000000000000000000002151360505115200276440ustar00rootroot00000000000000{ "uuid": "menu@cinnamon.org", "name": "Menu", "description": "Main Cinnamon menu", "icon": "applications-other", "max-instances": -1 } cinnamon-4.4.8/files/usr/share/cinnamon/applets/menu@cinnamon.org/settings-schema.json000066400000000000000000000110301360505115200311570ustar00rootroot00000000000000{ "layout" : { "type" : "layout", "pages" : ["panel", "menu"], "panel" : { "type" : "page", "title" : "Panel", "sections" : ["panel-appear", "panel-behave"] }, "menu" : { "type" : "page", "title" : "Menu", "sections" : ["menu-layout", "menu-behave"] }, "panel-appear" : { "type" : "section", "title" : "Appearance", "keys" : ["menu-custom", "menu-icon", "menu-label"] }, "panel-behave" : { "type" : "section", "title" : "Behavior", "keys" : ["overlay-key", "activate-on-hover", "hover-delay", "enable-animation"] }, "menu-layout" : { "type" : "section", "title" : "Layout and content", "keys" : ["show-category-icons", "show-application-icons", "favbox-show", "favbox-min-height", "show-places", "show-recents", "menu-editor-button"] }, "menu-behave" : { "type" : "section", "title" : "Behavior", "keys" : ["enable-autoscroll", "search-filesystem"] } }, "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", "tooltip" : "Check this to specify a custom icon and label" }, "menu-icon" : { "type" : "iconfilechooser", "default" : "cinnamon-symbolic", "description" : "Icon", "tooltip" : "Select an icon to show in the panel.", "default_icon" : "cinnamon-symbolic", "dependency" : "menu-custom", "indent" : true }, "menu-label" : { "type" : "entry", "default" : "Menu", "description" : "Text", "tooltip" : "Enter custom text to show in the panel.", "dependency" : "menu-custom", "indent": true }, "favbox-min-height" : { "type": "spinbutton", "default" : 300, "min" : 50, "max" : 1000, "step" : 10, "units" : "px", "dependency" : "favbox-show", "description" : "Minimum height of the favorites section", "tooltip" : "The minimum size allocated for the favorites section (this has an impact on the overall height of the menu)." }, "show-category-icons" : { "type" : "switch", "default" : true, "description" : "Show category icons", "tooltip" : "Choose whether or not to show icons on categories." }, "show-application-icons" : { "type" : "switch", "default" : true, "description" : "Show application icons", "tooltip" : "Choose whether or not to show icons on applications." }, "favbox-show" : { "type" : "switch", "default" : true, "description" : "Show favorites and session buttons", "tooltip" : "Choose whether or not to show the left pane of the menu." }, "show-places" : { "type" : "switch", "default" : true, "description": "Show bookmarks and places", "tooltip": "Choose whether or not to show bookmarks and places in the menu." }, "show-recents" : { "type" : "switch", "default" : true, "description": "Show recents", "tooltip": "Choose whether or not to show recents in the menu." }, "enable-autoscroll" : { "type" : "switch", "default" : true, "description": "Enable autoscrolling in application list", "tooltip": "Choose whether or not to enable smooth autoscrolling in the application list." }, "search-filesystem" : { "type" : "switch", "default" : false, "description": "Enable filesystem path entry in search box", "tooltip": "Allows path entry in the menu search box." }, "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." } } cinnamon-4.4.8/files/usr/share/cinnamon/applets/network@cinnamon.org/000077500000000000000000000000001360505115200257205ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/network@cinnamon.org/applet.js000066400000000000000000002525331360505115200275550ustar00rootroot00000000000000const Applet = imports.ui.applet; const GLib = imports.gi.GLib; 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 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' }; 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; // 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 'network-workgroup'; else if (this.bestAP._secType != NMAccessPointSecurity.UNKNOWN && this.bestAP._secType != NMAccessPointSecurity.NONE) return 'network-wireless-signal-' + signalToIcon(this.bestAP.strength) + '-secure'; else return '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); log(this._setEnabledFunc); 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 conneciton 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) 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); }, _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"); 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 '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); } 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) { // Disable autoconnections this._autoConnectionName = null; this.category = NMConnectionCategory.VPN; 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._activeConnection; }, setActiveConnection: function(activeConnection) { 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) { if (apObj.item) apObj.item.destroy(); 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 = 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()) { menuPos += (this._activeConnectionItem ? 1 : 0); this._createNetworkItem(apObj, menuPos); } } }, _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, '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)"), 'network-wireless-connected', { reactive: false }); } this._activeConnectionItem.setShowDot(true); }, _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) 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: '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.registerRole("network", metadata.uuid); Main.systrayManager.registerRole("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('network-offline'); NM.Client.new_async(null, Lang.bind(this, this._clientGot)); } catch (e) { global.logError(e); } }, _clientGot: function(obj, result) { try { this._client = NM.Client.new_finish(result); 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-connection-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.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 = DEFAULT_PERIODIC_UPDATE_FREQUENCY_SECONDS; 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._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(); }, _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. */ 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 i = 0; i < this._activeConnections.length; i++) { let a = this._activeConnections[i]; if (newActiveConnections.indexOf(a) == -1) // connection is removed closedConnections.push(a); } for (let i = 0; i < closedConnections.length; i++) { let active = closedConnections[i]; if (active._primaryDevice) { active._primaryDevice.setActiveConnection(null); active._primaryDevice = null; } if (active._inited) { active.disconnect(active._notifyStateId); //active.disconnect(active._notifyDefaultId); //active.disconnect(active._notifyDefault6Id); active._inited = false; } } this._activeConnections = newActiveConnections; this._mainConnection = null; let activating = null; let activated = null; let default_ip4 = null; let default_ip6 = null; for (let i = 0; i < this._activeConnections.length; i++) { let a = this._activeConnections[i]; if (!a._inited) { //a._notifyDefaultId = a.connect('notify::default', Lang.bind(this, this._updateIcon)); //a._notifyDefault6Id = a.connect('notify::default6', Lang.bind(this, this._updateIcon)); 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) { // 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 a._primaryDevice = this._devices.vpn.device; if (a._primaryDevice) a._primaryDevice.setActiveConnection(a); if (a.state == NM.ActiveConnectionState.ACTIVATED && a._primaryDevice && a._primaryDevice._notification) { a._primaryDevice._notification.destroy(); a._primaryDevice._notification = null; } } } 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 { 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(); }, _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('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('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('network-cellular-acquiring'); this.set_applet_tooltip(_("Connecting to the cellular network...")); break; case NMConnectionCategory.WIRELESS: this._setIcon('network-wireless-acquiring'); this.set_applet_tooltip(_("Connecting to the wireless network...")); break; case NMConnectionCategory.WIRED: this._setIcon('network-wired-acquiring'); this.set_applet_tooltip(_("Connecting to the wired network...")); break; case NMConnectionCategory.VPN: this._setIcon('network-vpn-acquiring'); this.set_applet_tooltip(_("Connecting to the VPN...")); break; default: // fallback to a generic connected icon // (it could be a private connection of some other user) this._setIcon('network-wired-acquiring'); this.set_applet_tooltip(_("Connecting to the network...")); } } else { let dev; 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('network-wireless-connected'); this.set_applet_tooltip(_("Connected to the wireless network")); } else { this._setIcon('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: this._setIcon('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('network-cellular-connected'); this.set_applet_tooltip(_("Connected to the cellular network")); break; } this._setIcon('network-cellular-signal-' + signalToIcon(dev.mobileDevice.signal_quality)); this.set_applet_tooltip(_("Connected to the cellular network")); break; case NMConnectionCategory.VPN: this._setIcon('network-vpn'); this.set_applet_tooltip(_("Connected to the VPN")); break; default: // fallback to a generic connected icon // (it could be a private connection of some other user) this._setIcon('network-wired'); this.set_applet_tooltip(_("Connected to the network")); 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(); if (this._updateFrequencySeconds != new_delay) { this._restartPeriodicUpdateTimer(new_delay); } else { return GLib.SOURCE_CONTINUE; } return GLib.SOURCE_REMOVE; }, _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.unregisterRole("network", this.metadata.uuid); Main.systrayManager.unregisterRole("nm-applet", this.metadata.uuid); 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-4.4.8/files/usr/share/cinnamon/applets/network@cinnamon.org/icons/000077500000000000000000000000001360505115200270335ustar00rootroot00000000000000network-wireless-signal-excellent-secure-symbolic.svg000066400000000000000000000124601360505115200413630ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/network@cinnamon.org/icons image/svg+xml Gnome Symbolic Icons network-wireless-signal-good-secure-symbolic.svg000066400000000000000000000124771360505115200403400ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/network@cinnamon.org/icons image/svg+xml Gnome Symbolic Icons network-wireless-signal-none-secure-symbolic.svg000066400000000000000000000125421360505115200403400ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/network@cinnamon.org/icons image/svg+xml Gnome Symbolic Icons network-wireless-signal-ok-secure-symbolic.svg000066400000000000000000000125101360505115200400050ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/network@cinnamon.org/icons image/svg+xml Gnome Symbolic Icons network-wireless-signal-weak-secure-symbolic.svg000066400000000000000000000125301360505115200403250ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/network@cinnamon.org/icons image/svg+xml Gnome Symbolic Icons cinnamon-4.4.8/files/usr/share/cinnamon/applets/network@cinnamon.org/metadata.json000066400000000000000000000002211360505115200303660ustar00rootroot00000000000000{ "uuid": "network@cinnamon.org", "name": "Network Manager", "description": "Network manager applet", "icon": "preferences-system-network" } cinnamon-4.4.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/000077500000000000000000000000001360505115200271005ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/applet.js000066400000000000000000000265431360505115200307350ustar00rootroot00000000000000const 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 NotificationDestroyedReason = imports.ui.messageTray.NotificationDestroyedReason; const Settings = imports.ui.settings; const Gettext = imports.gettext.domain("cinnamon-applets"); 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); // 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)); 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; } _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(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); 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.expand(); 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 notication panel. notification.expand(); 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('clicked', Lang.bind(this, this._item_clicked, false)); notification.connect('destroy', Lang.bind(this, this._item_clicked, true)); notification._timeLabel.show(); this.update_list(); } _item_clicked(notification, destroyed) { let i = this.notifications.indexOf(notification); if (i != -1) { this.notifications.splice(i, 1); if (!destroyed) { notification.destroy(NotificationDestroyedReason.DISMISSED); } } 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()); // 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(); } } 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(); } _show_hide_tray() { // Show or hide the notification tray. 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); } 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._update_timestamp(); this.menu.toggle(); } _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('%T'); } else { str = orig_time.toLocaleFormat('%r'); } switch (true) { case (diff <= 15): { str += " (" + _("just now") + ")"; break; } case (diff > 15 && diff <= 59): { str += " (" + Gettext.ngettext("%d second ago", "%d seconds ago", diff).format(diff) + ")"; break; } case (diff > 59 && diff <= 3540): { let diff_minutes = Math.floor(diff / 60); str += " (" + Gettext.ngettext("%d minute ago", "%d minutes ago", diff_minutes).format(diff_minutes) + ")"; break; } } return str; } cinnamon-4.4.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/icons/000077500000000000000000000000001360505115200302135ustar00rootroot00000000000000alt-critical-notif-symbolic.svg000066400000000000000000000031661360505115200361670ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/icons image/svg+xml critical-notif-symbolic.svg000066400000000000000000000033661360505115200354130ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/icons image/svg+xml empty-notif-symbolic.svg000066400000000000000000000027151360505115200347540ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/icons image/svg+xml low-notif-symbolic.svg000066400000000000000000000041131360505115200344110ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/icons image/svg+xml normal-notif-symbolic.svg000066400000000000000000000041671360505115200351110ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/icons image/svg+xml cinnamon-4.4.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/metadata.json000066400000000000000000000002721360505115200315540ustar00rootroot00000000000000{ "uuid": "notifications@cinnamon.org", "name": "Notifications", "description": "Click to display and manage system notifications", "role": "notifications", "icon": "cs-notifications" } cinnamon-4.4.8/files/usr/share/cinnamon/applets/notifications@cinnamon.org/settings-schema.json000066400000000000000000000011471360505115200330740ustar00rootroot00000000000000{ "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." } } cinnamon-4.4.8/files/usr/share/cinnamon/applets/on-screen-keyboard@cinnamon.org/000077500000000000000000000000001360505115200277165ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/on-screen-keyboard@cinnamon.org/applet.js000066400000000000000000000023021360505115200315360ustar00rootroot00000000000000const Applet = imports.ui.applet; const Gio = imports.gi.Gio; const Lang = imports.lang; 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', Lang.bind(this, this.update_status)); this.update_status(); } on_applet_clicked(event) { Main.keyboard.toggle(); } 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")); } else { this.set_applet_icon_symbolic_name('on-screen-keyboard-disabled'); this.set_applet_tooltip(_("Click to enable the on-screen keyboard")); } } } function main(metadata, orientation, panel_height, instanceId) { return new CinnamonOnScreenKeyboardApplet(metadata, orientation, panel_height, instanceId); } cinnamon-4.4.8/files/usr/share/cinnamon/applets/on-screen-keyboard@cinnamon.org/icons/000077500000000000000000000000001360505115200310315ustar00rootroot00000000000000on-screen-keyboard-disabled-symbolic.svg000066400000000000000000000052611360505115200405520ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/on-screen-keyboard@cinnamon.org/icons image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme on-screen-keyboard-symbolic.svg000066400000000000000000000020631360505115200370020ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/on-screen-keyboard@cinnamon.org/icons image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-4.4.8/files/usr/share/cinnamon/applets/on-screen-keyboard@cinnamon.org/metadata.json000066400000000000000000000002511360505115200323670ustar00rootroot00000000000000{ "uuid": "on-screen-keyboard@cinnamon.org", "name": "On-Screen keyboard", "icon": "keyboard", "description": "A Cinnamon applet to launch the on-screen keyboard" } cinnamon-4.4.8/files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/000077500000000000000000000000001360505115200273105ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/applet.js000066400000000000000000000574521360505115200311500ustar00rootroot00000000000000const 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 Lang = imports.lang; const Gio = imports.gi.Gio; const PopupMenu = imports.ui.popupMenu; const GLib = imports.gi.GLib; const Tooltips = imports.ui.tooltips; const DND = imports.ui.dnd; const Tweener = imports.ui.tweener; 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_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"), "media-playback-start", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', Lang.bind(this, this._onLaunchActivate)); this.addMenuItem(item); item = new PopupMenu.PopupIconMenuItem(_("Add"), "list-add", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', Lang.bind(this, this._onAddActivate)); this.addMenuItem(item); item = new PopupMenu.PopupIconMenuItem(_("Edit"), "document-properties", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', Lang.bind(this, this._onEditActivate)); this.addMenuItem(item); item = new PopupMenu.PopupIconMenuItem(_("Remove"), "window-close", 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(_("Preferences")); this.addMenuItem(subMenu); item = new PopupMenu.PopupIconMenuItem(_("About..."), "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..."), "system-run", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', Lang.bind(this._launcher.launchersBox, this._launcher.launchersBox.configureApplet)); subMenu.menu.addMenuItem(item); this.remove_item = new PopupMenu.PopupIconMenuItem(_("Remove '%s'").format(_("Panel launchers")), "edit-delete", St.IconType.SYMBOLIC); subMenu.menu.addMenuItem(this.remove_item); } _onLaunchActivate(item, event) { this._launcher.launch(); } _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); Tweener.addTween(this.icon, { scale_x: 0.7, scale_y: 0.7, time: 0.2, transition: 'easeOutQuad', onComplete() { Tweener.addTween(this.icon, { scale_x: 1.0, scale_y: 1.0, time: 0.2, transition: 'easeOutQuad', onComplete() { this._animateIcon(step + 1); }, onCompleteScope: this }); }, onCompleteScope: this }); } launch() { if (this.isCustom()) { this.appinfo.launch([], null); } else { this.app.open_new_window(-1); } this._animateIcon(0); } launchAction(name) { this.getAppInfo().launch_action(name, null); 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 maxHeight = this._iconBox.height - node.get_vertical_padding(); let maxWidth = this._iconBox.width - node.get_horizontal_padding(); let smallestDim = Math.min(maxHeight, maxWidth) / global.ui_scale; if (smallestDim < this.icon.get_icon_size()) { this.icon.set_icon_size(smallestDim); } } 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] : [this.applet.icon_size, 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(); let dropIndex = Math.round(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); } actor.destroy(); 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 = Gio.DesktopAppInfo.new_from_filename(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); } 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 -f" + launcher.getId() + " " + this.settings.file.get_path()); } else { Util.spawnCommandLine("cinnamon-desktop-editor -mcinnamon-launcher " + 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-4.4.8/files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/metadata.json000066400000000000000000000003221360505115200317600ustar00rootroot00000000000000{ "uuid": "panel-launchers@cinnamon.org", "name": "Panel launchers", "description": "Launch applications from the panel", "icon": "cinnamon-panel-launcher", "role": "panellauncher", "max-instances": -1 } cinnamon-4.4.8/files/usr/share/cinnamon/applets/panel-launchers@cinnamon.org/settings-schema.json000066400000000000000000000005551360505115200333060ustar00rootroot00000000000000{ "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-4.4.8/files/usr/share/cinnamon/applets/power@cinnamon.org/000077500000000000000000000000001360505115200253635ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/power@cinnamon.org/applet.js000066400000000000000000000604261360505115200272160ustar00rootroot00000000000000const 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 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 PANEL_EDIT_MODE_KEY = "panel-edit-mode"; // TODO: why aren't we using introspection - upower-glib? const UPDeviceType = { UNKNOWN: 0, AC_POWER: 1, BATTERY: 2, UPS: 3, MONITOR: 4, MOUSE: 5, KEYBOARD: 6, PDA: 7, PHONE: 8, MEDIA_PLAYER: 9, TABLET: 10, COMPUTER: 11 }; const UPDeviceState = { UNKNOWN: 0, CHARGING: 1, DISCHARGING: 2, EMPTY: 3, FULLY_CHARGED: 4, PENDING_CHARGE: 5, PENDING_DISCHARGE: 6 }; const UPDeviceLevel = { UNKNOWN: 0, NONE: 1, LOW: 3, CRITICAL: 4, NORMAL: 6, HIGH: 7, FULL: 8 }; 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 deviceTypeToString(type) { switch (type) { case UPDeviceType.AC_POWER: return _("AC adapter"); case UPDeviceType.BATTERY: return _("Laptop battery"); case UPDeviceType.UPS: return _("UPS"); case UPDeviceType.MONITOR: return _("Monitor"); case UPDeviceType.MOUSE: return _("Mouse"); case UPDeviceType.KEYBOARD: return _("Keyboard"); case UPDeviceType.PDA: return _("PDA"); case UPDeviceType.PHONE: return _("Cell phone"); case UPDeviceType.MEDIA_PLAYER: return _("Media player"); case UPDeviceType.TABLET: return _("Tablet"); case UPDeviceType.COMPUTER: return _("Computer"); default: return _("Unknown"); } } function deviceToIcon(type, icon) { switch (type) { case UPDeviceType.MONITOR: return ("video-display"); case UPDeviceType.MOUSE: return ("input-mouse"); case UPDeviceType.KEYBOARD: return ("input-keyboard"); case UPDeviceType.PHONE: case UPDeviceType.MEDIA_PLAYER: return ("phone-apple-iphone"); case UPDeviceType.TABLET: return ("input-tablet"); case UPDeviceType.COMPUTER: return ("computer"); default: if (icon) { return icon; } else { return ("battery-full"); } } } class DeviceItem extends PopupMenu.PopupBaseMenuItem { constructor(device, status, aliases) { super({reactive: false}); let [device_id, vendor, model, device_type, 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 = deviceTypeToString(device_type); 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 = deviceToIcon(device_type, 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)); try { this._proxy.GetStepRemote((step) => { this._step = (step / 100); }); } catch(e) { this._step = .05; } })); } _dbusAcquired(b, error) { if(error) return; 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); } /* Overriding PopupSliderMenuItem so we can modify the scroll step */ _onScrollEvent(actor, event) { let direction = event.get_scroll_direction(); if (direction == Clutter.ScrollDirection.DOWN) { this._value = Math.max(0, this._value - this._step); } else if (direction == Clutter.ScrollDirection.UP) { this._value = Math.min(1, this._value + this._step); } this._slider.queue_repaint(); this.emit('value-changed', this._value); } } 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.registerRole("power", metadata.uuid); Main.systrayManager.registerRole("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.01); this.keyboard = new BrightnessSlider(this, _("Keyboard backlight"), "keyboard-brightness", KeyboardBusName, 0); this.menu.addMenuItem(this.brightness); this.menu.addMenuItem(this.keyboard); 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)); Interfaces.getDBusProxyAsync("org.cinnamon.SettingsDaemon.Power", Lang.bind(this, function(proxy, error) { 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(); })); 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("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_type, 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.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 (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); } } return status; } on_panel_height_changed() { if (this._proxy) this._devicesChanged(); } showDeviceInPanel(device) { let [device_id, vendor, model, device_type, 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('battery-full'); let gicon = Gio.icon_new_for_string(icon); this._applet_icon.gicon = gicon; } } else { if (this.panel_icon_name != 'battery-full') { this.panel_icon_name = 'battery-full'; this.set_applet_icon_symbolic_name('battery-full'); } } if (device_type == UPDeviceType.BATTERY) { if (percentage > 20) { this._applet_icon.set_style_class_name('system-status-icon'); } else if (percentage > 5) { this._applet_icon.set_style_class_name('system-status-icon warning'); } else { this._applet_icon.set_style_class_name('system-status-icon error'); } } else { this._applet_icon.set_style_class_name ('system-status-icon'); } } _devicesChanged() { this._devices = []; this._primaryDevice = 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_type, 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 = []; if (!error) { let devices = result[0]; let position = 0; for (let i = 0; i < devices.length; i++) { let [device_id, vendor, model, device_type, icon, percentage, state, battery_level, seconds] = devices[i]; // Ignore AC_POWER devices if (device_type == UPDeviceType.AC_POWER) continue; // Ignore devices which state is unknown if (state == UPDeviceState.UNKNOWN) continue; let stats = "%s (%d%%)".format(deviceTypeToString(device_type), percentage); devices_stats.push(stats); this._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_type == UPDeviceType.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); this._deviceItems.push(item); position++; } } else { global.log(error); } // 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; if (this._primaryDevice != null && (!this.showmulti || this._devices.length === 1)) { this.showDeviceInPanel(this._primaryDevice); } else { if (this._devices.length == 1) { this.showDeviceInPanel(this._devices[0]); } else if (this._devices.length > 1) { // Show a summary let labelText = ""; if (this.labelinfo !== "nothing") { for (let i = 0; i < this._devices.length; i++) { labelText += i + ': '; let [, , , , , percentage, , , seconds] = this._devices[i]; 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) + ")"; } if (i !== this._devices.length - 1) { 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('battery-full'); let gicon = Gio.icon_new_for_string(icon); this._applet_icon.gicon = gicon; } } else { if (this.panel_icon_name != 'battery-full') { this.panel_icon_name = 'battery-full'; this.set_applet_icon_symbolic_name('battery-full'); } } } 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 = 'display-brightness'; this.set_applet_icon_symbolic_name('display-brightness'); } else if (this.keyboard.actor.visible) { // Show the brightness info this.set_applet_tooltip(_("Keyboard backlight")); this.panel_icon_name = 'keyboard-brightness'; this.set_applet_icon_symbolic_name('keyboard-brightness'); } else { // Disable the applet this.set_applet_enabled(false); } } } })); } on_applet_removed_from_panel() { Main.systrayManager.unregisterId(this.metadata.uuid); } } function main(metadata, orientation, panel_height, instanceId) { return new CinnamonPowerApplet(metadata, orientation, panel_height, instanceId); } cinnamon-4.4.8/files/usr/share/cinnamon/applets/power@cinnamon.org/metadata.json000066400000000000000000000002051360505115200300330ustar00rootroot00000000000000{ "uuid": "power@cinnamon.org", "name": "Power Manager", "description": "Cinnamon power management applet", "icon": "cs-power" } cinnamon-4.4.8/files/usr/share/cinnamon/applets/power@cinnamon.org/settings-schema.json000066400000000000000000000011441360505115200313540ustar00rootroot00000000000000{ "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-4.4.8/files/usr/share/cinnamon/applets/printers@cinnamon.org/000077500000000000000000000000001360505115200260755ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/printers@cinnamon.org/applet.js000066400000000000000000000266031360505115200277270ustar00rootroot00000000000000const 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); 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('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(); } _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"), '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, 'emblem-documents', St.IconType.SYMBOLIC); if(out2.toString() == printer.toString()) { printerItem.addActor(new St.Icon({ style_class: 'popup-menu-icon', icon_name: '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"), '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/lpq', '-a'], 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, 'edit-delete', St.IconType.SYMBOLIC); if(out2[out2.indexOf(job) - 2] == 'active') { jobItem.addActor(new St.Icon({ style_class: 'popup-menu-icon', icon_name: '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, '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('printer-warning'); } else if(this.jobsCount > 0) { this.set_applet_icon_symbolic_name('printer-printing'); } else { this.set_applet_icon_symbolic_name('printer'); } })); })) })) })) })) } }; function main(metadata, orientation, panel_height, instance_id) { return new CinnamonPrintersApplet(metadata, orientation, panel_height, instance_id); } cinnamon-4.4.8/files/usr/share/cinnamon/applets/printers@cinnamon.org/cancel-print-dialog.py000066400000000000000000000021621360505115200322640ustar00rootroot00000000000000#!/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-4.4.8/files/usr/share/cinnamon/applets/printers@cinnamon.org/lpstat-a.py000066400000000000000000000003111360505115200301670ustar00rootroot00000000000000#!/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-4.4.8/files/usr/share/cinnamon/applets/printers@cinnamon.org/metadata.json000066400000000000000000000002101360505115200305410ustar00rootroot00000000000000{ "uuid": "printers@cinnamon.org", "name": "Printers", "description": "Manage print jobs", "icon": "printer", "max-instances": -1 }cinnamon-4.4.8/files/usr/share/cinnamon/applets/printers@cinnamon.org/settings-schema.json000066400000000000000000000006121360505115200320650ustar00rootroot00000000000000{ "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-4.4.8/files/usr/share/cinnamon/applets/recent@cinnamon.org/000077500000000000000000000000001360505115200255075ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/recent@cinnamon.org/applet.js000066400000000000000000000124311360505115200273330ustar00rootroot00000000000000const 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 }); 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("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(Gtk.PolicyType.NEVER, Gtk.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: '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-4.4.8/files/usr/share/cinnamon/applets/recent@cinnamon.org/metadata.json000066400000000000000000000002631360505115200301630ustar00rootroot00000000000000{ "uuid": "recent@cinnamon.org", "name": "Recent documents", "description": "Access the documents you recently opened", "icon": "document-open-recent", "max-instances": -1 } cinnamon-4.4.8/files/usr/share/cinnamon/applets/removable-drives@cinnamon.org/000077500000000000000000000000001360505115200274755ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/removable-drives@cinnamon.org/applet.js000066400000000000000000000057361360505115200313330ustar00rootroot00000000000000const 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) { super(); this.place = place; this.label = new St.Label({ text: place.name }); this.addActor(this.label); let ejectIcon = new St.Icon({ icon_name: '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.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("drive-harddisk"); 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])); any = true; } } this.actor.visible = any; } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonRemovableDrivesApplet(orientation, panel_height, instance_id); } cinnamon-4.4.8/files/usr/share/cinnamon/applets/removable-drives@cinnamon.org/metadata.json000066400000000000000000000002431360505115200321470ustar00rootroot00000000000000{ "uuid": "removable-drives@cinnamon.org", "name": "Removable drives", "description": "Access removable drives", "icon": "media-eject", "max-instances": -1 } cinnamon-4.4.8/files/usr/share/cinnamon/applets/scale@cinnamon.org/000077500000000000000000000000001360505115200253165ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/scale@cinnamon.org/applet.js000066400000000000000000000025141360505115200271430ustar00rootroot00000000000000const 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-4.4.8/files/usr/share/cinnamon/applets/scale@cinnamon.org/icons/000077500000000000000000000000001360505115200264315ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/scale@cinnamon.org/icons/cinnamon-scale-symbolic.svg000066400000000000000000000010571360505115200336630ustar00rootroot00000000000000 cinnamon-4.4.8/files/usr/share/cinnamon/applets/scale@cinnamon.org/metadata.json000066400000000000000000000002271360505115200277720ustar00rootroot00000000000000{ "uuid": "scale@cinnamon.org", "name": "Scale", "description": "Click or hover to activate Scale view", "icon": "cs-overview", "max-instances": -1 } cinnamon-4.4.8/files/usr/share/cinnamon/applets/scale@cinnamon.org/settings-schema.json000066400000000000000000000001731360505115200313100ustar00rootroot00000000000000{ "activate-on-hover": { "type": "switch", "default" : false, "description" : "Activate scale on hover" } } cinnamon-4.4.8/files/usr/share/cinnamon/applets/separator@cinnamon.org/000077500000000000000000000000001360505115200262275ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/separator@cinnamon.org/applet.js000066400000000000000000000032771360505115200300630ustar00rootroot00000000000000const 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-4.4.8/files/usr/share/cinnamon/applets/separator@cinnamon.org/metadata.json000066400000000000000000000002601360505115200307000ustar00rootroot00000000000000{ "uuid": "separator@cinnamon.org", "name": "Separator", "description": "A separator icon which can be added multiple times", "icon": "list-remove", "max-instances": -1 } cinnamon-4.4.8/files/usr/share/cinnamon/applets/settings-example@cinnamon.org/000077500000000000000000000000001360505115200275205ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/settings-example@cinnamon.org/CustomWidget.py000066400000000000000000000014751360505115200325170ustar00rootroot00000000000000#!/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-4.4.8/files/usr/share/cinnamon/applets/settings-example@cinnamon.org/applet.js000066400000000000000000000141101360505115200313400ustar00rootroot00000000000000const Applet = imports.ui.applet; 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 Tweener = imports.ui.tweener; 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("tween-function", "tween_function", 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.addHotKey("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(); })); //animate icon Tweener.addTween(this._applet_icon, { margin_left: 10, time: 0.5, transition: this.tween_function, onComplete() { Tweener.addTween(this._applet_icon, { margin_left: 0, time: 0.5, transition: this.tween_function }); }, onCompleteScope: this }); } 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 } } 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-4.4.8/files/usr/share/cinnamon/applets/settings-example@cinnamon.org/metadata.json000066400000000000000000000003701360505115200321730ustar00rootroot00000000000000{ "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-4.4.8/files/usr/share/cinnamon/applets/settings-example@cinnamon.org/settings-schema.json000066400000000000000000000243741360505115200335230ustar00rootroot00000000000000{ "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", "section4", "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"] }, "section4": { "type": "section", "title": "Animation settings", "keys": ["tween-function", "effect-style"] }, "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 aditional 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", "indent": true, "dependency" : "use-custom-label", "tooltip" : "Set your custom label here. This field is unavailable unless the switch above is enabled" }, "tween-function" : { "type" : "tween", "default" : "EaseNone", "description" : "Animation type", "tooltip": "A tween chooser has as value a string, which you can pass as transition to Tweener.addTween()" }, "effect-style" : { "type" : "effect", "description" : "Effect type", "default" : "none", "possible" : ["none", "scale", "fade", "blend", "move", "flyUp", "flyDown", "traditional"] }, "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" : false, "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-4.4.8/files/usr/share/cinnamon/applets/settings@cinnamon.org/000077500000000000000000000000001360505115200260675ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/settings@cinnamon.org/applet.js000066400000000000000000000024761360505115200277230ustar00rootroot00000000000000const 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 = "go-next"; break; case St.Side.RIGHT: icon_name = "go-previous"; break; case St.Side.TOP: icon_name = "go-down"; break; case St.Side.BOTTOM: default: icon_name = "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-4.4.8/files/usr/share/cinnamon/applets/settings@cinnamon.org/metadata.json000066400000000000000000000002331360505115200305400ustar00rootroot00000000000000{ "uuid": "settings@cinnamon.org", "name": "Settings Applet", "description": "Cinnamon Settings", "icon": "preferences-system", "max-instances": -1 } cinnamon-4.4.8/files/usr/share/cinnamon/applets/show-desktop@cinnamon.org/000077500000000000000000000000001360505115200266565ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/show-desktop@cinnamon.org/applet.js000066400000000000000000000112331360505115200305010ustar00rootroot00000000000000const Applet = imports.ui.applet; const { AppletSettings } = imports.ui.settings; // Needed for settings API const Mainloop = imports.mainloop; const Tweener = imports.ui.tweener; const Main = imports.ui.main; const PopupMenu = imports.ui.popupMenu; const St = imports.gi.St; const Clutter = imports.gi.Clutter; const Lang = imports.lang; const SignalManager = imports.misc.signalManager; 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]; if(window.get_title() == "Desktop"){ Tweener.addTween(compositor, { opacity: 255, time: time, transition: "easeOutSine" }); } if (this.peek_blur && compositor.eff) { compositor.remove_effect(compositor.eff); } } Tweener.addTween(global.window_group, { opacity: 255, time: time, transition: "easeOutSine" }); } _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")) { Tweener.addTween(global.window_group, {opacity: this.peek_opacity, time: 0.275, transition: "easeInSine"}); let windows = global.get_window_actors(); for (let i = 0; i < windows.length; i++) { let compositor = windows[i]; if (this.peek_blur) { if (!compositor.eff) compositor.eff = new Clutter.BlurEffect(); compositor.add_effect_with_name('peek-blur', compositor.eff); } } this._did_peek = true; } this._peek_timeout_id = 0; return false; })); } } _on_leave(event) { if (this._did_peek) { this.show_all_windows(0.2); 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.screen.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-4.4.8/files/usr/share/cinnamon/applets/show-desktop@cinnamon.org/metadata.json000066400000000000000000000002311360505115200313250ustar00rootroot00000000000000{ "uuid": "show-desktop@cinnamon.org", "name": "Show desktop", "description": "Minimize all windows", "icon": "user-desktop", "max-instances": -1 } cinnamon-4.4.8/files/usr/share/cinnamon/applets/show-desktop@cinnamon.org/settings-schema.json000066400000000000000000000020411360505115200326440ustar00rootroot00000000000000{ "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", "indent" : true, "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", "indent" : true, "description": "Hover delay", "tooltip": "Delay before Peek shows desktop" }, "peek-opacity": { "type": "scale", "default" : 10, "min" : 0, "max" : 255, "step" : 10, "dependency" : "peek-at-desktop", "indent" : true, "description" : "Window opacity", "tooltip" : "Change the opacity of windows when peeking at the desktop" } } cinnamon-4.4.8/files/usr/share/cinnamon/applets/slideshow@cinnamon.org/000077500000000000000000000000001360505115200262305ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/slideshow@cinnamon.org/applet.js000066400000000000000000000135371360505115200300640ustar00rootroot00000000000000const 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"), "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"), "preferences-desktop-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-4.4.8/files/usr/share/cinnamon/applets/slideshow@cinnamon.org/icons/000077500000000000000000000000001360505115200273435ustar00rootroot00000000000000slideshow-disabled-symbolic.svg000066400000000000000000000060711360505115200353760ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/slideshow@cinnamon.org/icons Gnome Symbolic Icon Theme image/svg+xml Gnome Symbolic Icon Theme slideshow-pause-symbolic.svg000066400000000000000000000061631360505115200347460ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/slideshow@cinnamon.org/icons Gnome Symbolic Icon Theme image/svg+xml Gnome Symbolic Icon Theme slideshow-play-symbolic.svg000066400000000000000000000060101360505115200345650ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/slideshow@cinnamon.org/icons Gnome Symbolic Icon Theme image/svg+xml Gnome Symbolic Icon Theme cinnamon-4.4.8/files/usr/share/cinnamon/applets/slideshow@cinnamon.org/metadata.json000066400000000000000000000002441360505115200307030ustar00rootroot00000000000000{ "uuid":"slideshow@cinnamon.org", "name":"Slideshow Controls", "description":"Basic controls for the Cinnamon slideshow", "icon":"preferences-desktop-wallpaper" } cinnamon-4.4.8/files/usr/share/cinnamon/applets/sound@cinnamon.org/000077500000000000000000000000001360505115200253575ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/sound@cinnamon.org/applet.js000077500000000000000000001634001360505115200272110ustar00rootroot00000000000000const Applet = imports.ui.applet; 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 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 = ['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 MAXIMUM_VOLUME_KEY = "maximum-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("disabled", !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()); this.app_icon = app_icon; if (this.app_icon == null) { this.iconName = this.isMic ? "microphone-sensitivity-muted" : "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.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); } _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.emit('value-changed', this._value); } _onKeyPressEvent(actor, event) { let 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; 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); this.emit('drag-end'); 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); 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? "microphone-sensitivity-" + icon : "audio-volume-" + icon; } } class Seeker extends Slider.Slider { constructor(mediaServerPlayer, props, playerName) { super(0, true); 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 true; } return false; } _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.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 > 16) { name = name.substring(0, 16) + "... "; } // Special cases if(name === "Banshee") { iconName = "banshee"; } else if (name === "Spotify") { iconName = "spotify"; } if(name === "VBox") { name = "Virtualbox"; iconName = "virtualbox"; } else if (iconName === "audio") { iconName = "audio-x-generic"; } let slider = new VolumeSlider(applet, stream, name, iconName); 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 let 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 }); playerBox.add_actor(this.playerIcon); playerBox.add_actor(this.playerLabel); if (this._mediaServer.CanRaise) { let btn = new ControlButton("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); playerBox.add_actor(btn.actor); } if (this._mediaServer.CanQuit) { let btn = new ControlButton("window-close", _("Quit Player"), () => { this._mediaServer.QuitRemote(); this._applet.menu.close(); }, true); playerBox.add_actor(btn.actor); } this.vertBox.add_actor(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); // 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: "system-users", style_class: 'popup-menu-icon' }); this.artistLabel = new St.Label({text:this._artist}); 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: "audio-x-generic", style_class: 'popup-menu-icon' }); this.titleLabel = new St.Label({text:this._title}); 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("media-skip-backward", _("Previous"), () => this._mediaServerPlayer.PreviousRemote()); this._playButton = new ControlButton("media-playback-start", _("Play"), () => this._mediaServerPlayer.PlayPauseRemote()); this._stopButton = new ControlButton("media-playback-stop", _("Stop"), () => this._mediaServerPlayer.StopRemote()); this._nextButton = new ControlButton("media-skip-forward", _("Next"), () => this._mediaServerPlayer.NextRemote()); this.trackInfo.add_actor(trackControls); this.controls = new St.BoxLayout(); 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); if (this._mediaServerPlayer.LoopStatus) { this._loopButton = new ControlButton("media-playlist-consecutive", _("Consecutive Playing"), () => this._toggleLoopStatus()); this._loopButton.actor.visible = this._applet.extendedPlayerControl; this.controls.add_actor(this._loopButton.getActor()); this._setLoopStatus(this._mediaServerPlayer.LoopStatus); } if (this._mediaServerPlayer.Shuffle !== undefined) { this._shuffleButton = new ControlButton("media-playlist-shuffle", _("No Shuffle"), () => this._toggleShuffle()); this._shuffleButton.actor.visible = this._applet.extendedPlayerControl; this.controls.add_actor(this._shuffleButton.getActor()); this._setShuffle(this._mediaServerPlayer.Shuffle); } // 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()); }); //get the desktop entry and pass it to the applet this._prop.GetRemote(MEDIA_PLAYER_2_NAME, "DesktopEntry", (result, error) => { if (!error) this._applet.passDesktopEntry(result[0].unpack()); }); } _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"); } } 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._name === "spotify" ) { artUrl = artUrl.replace("/thumb/", "/300/"); // Spotify 0.9.x artUrl = artUrl.replace("/image/", "/300/"); // Spotify 0.27.x } 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 { 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("media-playback-pause", _("Pause")); this.playerIcon.set_icon_name("media-playback-start"); this._applet.setAppletTextIcon(this, true); this._seeker.play(); } else if (status == "Paused") { this._playButton.setData("media-playback-start", _("Play")); this.playerIcon.set_icon_name("media-playback-pause"); this._applet.setAppletTextIcon(this, false); this._seeker.pause(); } else if (status == "Stopped") { this._playButton.setData("media-playback-start", _("Play")); this.playerIcon.set_icon_name("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) { if(status === "None") this._loopButton.setData("media-playlist-consecutive-symbolic", _("Consecutive Playing")); else if(status === "Track") this._loopButton.setData("media-playlist-repeat-song", _("Repeat Single")); else if(status === "Playlist") this._loopButton.setData("media-playlist-repeat", _("Repeat All")); this._loopButton.setActive(status !== "None"); } _toggleShuffle() { this._mediaServerPlayer.Shuffle = !this._mediaServerPlayer.Shuffle; } _setShuffle(status) { this._shuffleButton.setData("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) { this.coverBox.remove_actor(this.cover); 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}); cover_path = null; } else { if (this._applet.keepAlbumAspectRatio) { this.cover = new Clutter.Texture({width: 300, keep_aspect_ratio: true, filter_quality: 2, filename: cover_path}); } else { this.cover = new Clutter.Texture({width: 300, height: 300, keep_aspect_ratio: false, filter_quality: 2, filename: cover_path}); } } this.coverBox.add_actor(this.cover); this.coverBox.set_child_below_sibling(this.cover, this.trackInfo); this._applet.setAppletTextIcon(this, cover_path); } onSettingsChanged() { this._loopButton.actor.visible = this._applet.extendedPlayerControl; this._shuffleButton.actor.visible = this._applet.extendedPlayerControl; } 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.addActor(this._icon, { expand: false }); } //note: shadows base method and prevents "activate" emission activate(event, keepMenu) { this._app.activate_full(-1, event.get_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("horizontalScroll", "horizontalScroll") this.settings.bind("showalbum", "showalbum", this.on_settings_changed); this.settings.bind("truncatetext", "truncatetext", this.on_settings_changed); this.settings.bind("keepAlbumAspectRatio", "keepAlbumAspectRatio", 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.menuManager = new PopupMenu.PopupMenuManager(this); this.menu = new Applet.AppletPopupMenu(this, orientation); this.menuManager.addMenu(this.menu); this.set_applet_icon_symbolic_name('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._volumeMax = this._sound_settings.get_int(MAXIMUM_VOLUME_KEY) / 100 * this._control.get_vol_max_norm(); this._volumeNorm = this._control.get_vol_max_norm(); this._streams = []; this._devices = []; this._recordingAppsNum = 0; this._output = null; this._outputMutedId = 0; this._outputIcon = "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, "audio-volume-muted", St.IconType.SYMBOLIC); this.mute_in_switch = new PopupMenu.PopupSwitchIconMenuItem(_("Mute input"), false, "microphone-sensitivity-none", St.IconType.SYMBOLIC); this._applet_context_menu.addMenuItem(this.mute_out_switch); this._applet_context_menu.addMenuItem(this.mute_in_switch); 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()); if (this._volumeMax > this._volumeNorm) { this._outputVolumeSection.set_mark(this._volumeNorm / this._volumeMax); } this._sound_settings.connect("changed::" + MAXIMUM_VOLUME_KEY, () => this._on_sound_settings_change()); } _on_sound_settings_change () { this._volumeMax = this._sound_settings.get_int(MAXIMUM_VOLUME_KEY) / 100 * this._control.get_vol_max_norm(); if (this._volumeMax > this._volumeNorm) { this._outputVolumeSection.set_mark(this._volumeNorm / this._volumeMax); } else { 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(); this._changeActivePlayer(this._activePlayer); } on_applet_removed_from_panel () { if (this.hideSystray) this.unregisterSystrayIcons(); if (this._iconTimeoutId) { Mainloop.source_remove(this._iconTimeoutId); } this._dbus.disconnectSignal(this._ownerChangedId); for(let i in this._players) this._players[i].destroy(); } on_applet_clicked(event) { 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; if (this._input.is_muted) { this._input.change_is_muted(false); this.mute_in_switch.setToggleState(false); } else { this._input.change_is_muted(true); this.mute_in_switch.setToggleState(true); } } _onScrollEvent(actor, event) { let direction = event.get_scroll_direction(); let currentVolume = this._output.volume; 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._iconTimeoutId = null; 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 (this.showalbum) { if (path && player && (player === true || player._playerStatus == 'Playing')) { this.setIcon(path, "player-path"); } else { this.setIcon('media-optical-cd-audio', 'player-name'); } } else { this.setIcon('audio-x-generic', 'player-name'); } } setAppletText(player) { let title_text = ""; if (this.showtrack && player && player._playerStatus == 'Playing') { title_text = player._title + ' - ' + player._artist; if (this.truncatetext < title_text.length) { title_text = title_text.substr(0, this.truncatetext) + "..."; } } this.set_applet_label(title_text); } setAppletTextIcon(player, icon) { if (player && player._owner != this._activePlayer) return; this.setAppletIcon(player, icon); this.setAppletText(player); } _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(); } } _switchPlayer(owner) { if(this._players[owner]) { // The player exists, switch to it this._changeActivePlayer(owner); this._updatePlayerMenuItems(); this.setAppletTextIcon(); } 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(); } } _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 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); // The launch player list this._launchPlayerItem = new PopupMenu.PopupSubMenuMenuItem(_("Launch player")); this.menu.addMenuItem(this._launchPlayerItem); this._updateLaunchPlayer(); //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); } } else { this._launchPlayerItem.actor.hide(); } } _updatePlayerMenuItems() { if (this.playerControl && this._activePlayer) { this._launchPlayerItem.actor.hide(); 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(); } } } _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, 1); } this._updatePlayerMenuItems(); } _notifyVolumeChange(stream) { Main.soundManager.playVolume('volume', stream.decibel); } _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.set_applet_tooltip(_("Volume") + ": " + percentage); } _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("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(); } } _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._streams.splice(i, 1); break; } } } registerSystrayIcons() { for (let i = 0; i < players_with_seek_support.length; i++) { Main.systrayManager.registerRole(players_with_seek_support[i], this.metadata.uuid); } for (let i = 0; i < players_without_seek_support.length; i++) { Main.systrayManager.registerRole(players_without_seek_support[i], this.metadata.uuid); } } unregisterSystrayIcons() { Main.systrayManager.unregisterId(this.metadata.uuid); } } function main(metadata, orientation, panel_height, instanceId) { return new CinnamonSoundApplet(metadata, orientation, panel_height, instanceId); } cinnamon-4.4.8/files/usr/share/cinnamon/applets/sound@cinnamon.org/metadata.json000066400000000000000000000002221360505115200300260ustar00rootroot00000000000000{ "uuid": "sound@cinnamon.org", "name": "Sound", "description": "A Cinnamon applet to control sound and music", "icon": "audio-volume-high" } cinnamon-4.4.8/files/usr/share/cinnamon/applets/sound@cinnamon.org/settings-schema.json000066400000000000000000000040631360505115200313530ustar00rootroot00000000000000{ "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", "indent": true }, "_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", "indent": true }, "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" }, "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" }, "keepAlbumAspectRatio": { "type": "switch", "default": true, "description": "Keep album art aspect ratio", "dependency": "playerControl" }, "hideSystray" : { "type" : "switch", "description" : "Hide system tray icons for compatible players", "default": true } } cinnamon-4.4.8/files/usr/share/cinnamon/applets/spacer@cinnamon.org/000077500000000000000000000000001360505115200255045ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/spacer@cinnamon.org/applet.js000066400000000000000000000036271360505115200273370ustar00rootroot00000000000000const 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-4.4.8/files/usr/share/cinnamon/applets/spacer@cinnamon.org/metadata.json000066400000000000000000000002421360505115200301550ustar00rootroot00000000000000{ "uuid": "spacer@cinnamon.org", "name": "Spacer", "description": "Add some space between your other applets", "icon": "view-restore", "max-instances": -1 } cinnamon-4.4.8/files/usr/share/cinnamon/applets/spacer@cinnamon.org/settings-schema.json000066400000000000000000000003551360505115200315000ustar00rootroot00000000000000{ "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-4.4.8/files/usr/share/cinnamon/applets/systray@cinnamon.org/000077500000000000000000000000001360505115200257455ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/systray@cinnamon.org/applet.js000066400000000000000000000267231360505115200276020ustar00rootroot00000000000000const Lang = imports.lang; const St = imports.gi.St; const Clutter = imports.gi.Clutter; 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 NO_RESIZE_ROLES = ['shutter', 'filezilla']; // Override the factory and create an AppletPopupMenu instead of a PopupMenu class IndicatorMenuFactory extends PopupMenu.PopupMenuFactory { constructor() { super(); } _createShellItem(factoryItem, launcher, orientation) { // Decide whether it's a submenu or not let shellItem = null; let item_type = factoryItem.getFactoryType(); if (item_type == PopupMenu.FactoryClassTypes.RootMenuClass) shellItem = new Applet.AppletPopupMenu(launcher, orientation); if (item_type == PopupMenu.FactoryClassTypes.SubMenuMenuItemClass) shellItem = new PopupMenu.PopupSubMenuMenuItem("FIXME"); else if (item_type == PopupMenu.FactoryClassTypes.MenuSectionMenuItemClass) shellItem = new PopupMenu.PopupMenuSection(); else if (item_type == PopupMenu.FactoryClassTypes.SeparatorMenuItemClass) shellItem = new PopupMenu.PopupSeparatorMenuItem(''); else if (item_type == PopupMenu.FactoryClassTypes.MenuItemClass) shellItem = new PopupMenu.PopupIndicatorMenuItem("FIXME"); return shellItem; } } 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); let manager; this.orientation = orientation; this.icon_size = this.getPanelIconSize(St.IconType.FULLCOLOR) * global.ui_scale; if (this.orientation == St.Side.TOP || this.orientation == St.Side.BOTTOM) { manager = new Clutter.BoxLayout( { spacing: 4, orientation: Clutter.Orientation.HORIZONTAL }); } else { manager = new Clutter.BoxLayout( { spacing: 4, orientation: Clutter.Orientation.VERTICAL }); } this.update_na_tray_orientation(); this.manager = manager; this.manager_container = new Clutter.Actor( { layout_manager: manager } ); this.actor.add_actor (this.manager_container); this.manager_container.show(); this._shellIndicators = []; this.menuFactory = new IndicatorMenuFactory(); this.menuManager = new PopupMenu.PopupMenuManager(this); this._signalAdded = 0; this._signalRemoved = 0; } _addIndicatorSupport() { let manager = Main.indicatorManager; // Blacklist some of the icons // quassel: The proper icon in Quassel is "QuasselIRC", // this is a fallback icon which Quassel launches when it fails to detect // our indicator support (i.e. when Cinnamon is restarted for instance) // The problem is.. Quassel doesn't kill that icon when it creates QuasselIRC again.. manager.insertInBlackList("quassel"); let currentIndicators = manager.getIndicatorIds(); for (let pos in currentIndicators) { if (!manager.isInBlackList(currentIndicators[pos])) { let appIndicator = manager.getIndicatorById(currentIndicators[pos]); this._onIndicatorAdded(manager, appIndicator); } } if (this._signalAdded == 0) this._signalAdded = manager.connect('indicator-added', Lang.bind(this, this._onIndicatorAdded)); if (this._signalRemoved == 0) this._signalRemoved = manager.connect('indicator-removed', Lang.bind(this, this._onIndicatorRemoved)); } _removeIndicatorSupport() { if (this.signalAdded) { Main.indicatorManager.disconnect(this.signalAdded); this.signalAdded = 0; } if (this.signalRemoved) { Main.indicatorManager.disconnect(this.signalRemoved); this.signalRemoved = 0; } for (let i = 0; i < this._shellIndicators.length; i++) { this._shellIndicators[i].instance.destroy(); } this._shellIndicators = []; } _onIndicatorAdded(manager, appIndicator) { if (!(appIndicator.id in this._shellIndicators)) { let indicatorActor = appIndicator.getActor(this.icon_size / global.ui_scale, this.orientation); this._shellIndicators.push({ id: appIndicator.id, instance: indicatorActor }); this._signalManager.connect(indicatorActor.actor, 'destroy', this._onIndicatorIconDestroy, this); this._signalManager.connect(indicatorActor.actor, 'enter-event', this._onEnterEvent, this); this._signalManager.connect(indicatorActor.actor, 'leave-event', this._onLeaveEvent, this); this.manager_container.add_actor(indicatorActor.actor); appIndicator.createMenuClientAsync(Lang.bind(this, function(client) { if (client != null) { let newMenu = client.getShellMenu(); if (!newMenu) { newMenu = this.menuFactory.buildShellMenu(client, indicatorActor, this.orientation); this.menuManager.addMenu(newMenu); } indicatorActor.setMenu(newMenu); } })); } } _onEnterEvent(actor, event) { this.set_applet_tooltip(actor._delegate.getToolTip()); } _onLeaveEvent(actor, event) { this.set_applet_tooltip(""); } _onIndicatorIconDestroy(actor) { for (let i = 0; i < this._shellIndicators.length; i++) { if (this._shellIndicators[i].instance.actor == actor) { this._shellIndicators.splice(this._shellIndicators.indexOf(this._shellIndicators[i]), 1); break; } } } _onIndicatorRemoved(manager, appIndicator) { for (let i = 0; i < this._shellIndicators.length; i++) { if (this._shellIndicators[i].id === appIndicator.id) { this._shellIndicators[i].instance.destroy(); this._shellIndicators.splice(this._shellIndicators.indexOf(this._shellIndicators[i]), 1); break; } } } on_applet_clicked(event) { } on_orientation_changed(neworientation) { if (neworientation == St.Side.TOP || neworientation == St.Side.BOTTOM) { this.manager.set_vertical(false); } else { this.manager.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._removeIndicatorSupport(); } on_applet_added_to_panel() { if (!global.trayReloading) { Main.statusIconDispatcher.start(this.actor.get_parent().get_parent()); } 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._addIndicatorSupport(); if (global.trayReloading) { global.trayReloading = false; Main.statusIconDispatcher.redisplay(); } } on_panel_icon_size_changed(size) { this.icon_size = size * global.ui_scale; Main.statusIconDispatcher.redisplay(); for (let i = 0; i < this._shellIndicators.length; i++) { let indicator = Main.indicatorManager.getIndicatorById(this._shellIndicators[i].id); if (indicator) { this._shellIndicators[i].instance.setSize(this.icon_size); } } } _onBeforeRedisplay() { // Mark all icons as obsolete // There might still be pending delayed operations to insert/resize of them // And that would crash Cinnamon let children = this.manager_container.get_children().filter(function(child) { // We are only interested in the status icons and apparently we can not ask for // child instanceof CinnamonTrayIcon. return (child.toString().indexOf("CinnamonTrayIcon") != -1); }); for (let i = 0; i < children.length; i++) { children[i].destroy(); } } _onTrayIconAdded(o, icon, role) { try { let hiddenIcons = Main.systrayManager.getRoles(); if (hiddenIcons.indexOf(role) != -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 parent = icon.get_parent(); if (parent) parent.remove_child(icon); this._insertStatusItem(role, icon); } catch (e) { global.logError(e); } } _onTrayIconRemoved(o, icon) { if (icon.get_parent() === this.manager_container) { this.manager_container.remove_child(icon); } icon.destroy(); } _insertStatusItem(role, icon) { if (icon.is_finalized()) { return; } this.manager_container.insert_child_at_index(icon, 0); if (["skypeforlinux"].indexOf(role) != -1) { let size = 16 * global.ui_scale; icon.set_size(size, size); global.log("Resize " + role + " with hardcoded size (" + icon.get_width() + "x" + icon.get_height() + "px)"); } else { this._resizeStatusItem(role, icon); } } _resizeStatusItem(role, icon) { if (NO_RESIZE_ROLES.indexOf(role) > -1) { global.log("Not resizing " + role + " as it's known to be buggy (" + icon.get_width() + "x" + icon.get_height() + "px)"); } else { icon.set_size(this.icon_size, this.icon_size); global.log("Resized " + role + " with normalized size (" + icon.get_width() + "x" + icon.get_height() + "px)"); //Note: dropbox doesn't scale, even though we resize it... } } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonSystrayApplet(orientation, panel_height, instance_id); } cinnamon-4.4.8/files/usr/share/cinnamon/applets/systray@cinnamon.org/metadata.json000066400000000000000000000002601360505115200304160ustar00rootroot00000000000000{ "uuid": "systray@cinnamon.org", "name": "System Tray", "icon": "applications-system", "role": "tray", "description": "An applet which hosts all the system tray icons" } cinnamon-4.4.8/files/usr/share/cinnamon/applets/trash@cinnamon.org/000077500000000000000000000000001360505115200253505ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/trash@cinnamon.org/applet.js000066400000000000000000000056451360505115200272050ustar00rootroot00000000000000const St = imports.gi.St; const ModalDialog = imports.ui.modalDialog; const Gio = imports.gi.Gio; 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("user-trash"); this.set_applet_tooltip(_("Trash")); this.trash_path = 'trash:///'; this.trash_directory = Gio.file_new_for_uri(this.trash_path); this._initContextMenu(); this.trash_changed_timeout = 0; this._onTrashChange(); this.monitor = this.trash_directory.monitor_directory(0, null); this.monitor.connect('changed', Lang.bind(this, this._onTrashChange)); } _initContextMenu() { this.empty_item = new PopupMenu.PopupIconMenuItem(_("Empty Trash"), "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"), "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(); } _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.timeout_add_seconds(1, Lang.bind(this, this._onTrashChangeTimeout)); } _onTrashChangeTimeout() { this.trash_changed_timeout = 0; if (this.trash_directory.query_exists(null)) { let children = this.trash_directory.enumerate_children('standard::*', Gio.FileQueryInfoFlags.NONE, null); if (children.next_file(null) == null) { this.set_applet_icon_symbolic_name("user-trash"); } else { this.set_applet_icon_symbolic_name("user-trash-full"); } children.close(null); } } _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-4.4.8/files/usr/share/cinnamon/applets/trash@cinnamon.org/metadata.json000066400000000000000000000002701360505115200300220ustar00rootroot00000000000000{ "uuid": "trash@cinnamon.org", "name": "Trash", "description": "Control the trash from the panel", "icon": "user-trash", "localedir": "/usr/share/locale", "max-instances": -1 } cinnamon-4.4.8/files/usr/share/cinnamon/applets/user@cinnamon.org/000077500000000000000000000000001360505115200252055ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/user@cinnamon.org/applet.js000066400000000000000000000164471360505115200270440ustar00rootroot00000000000000const 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; class CinnamonUserApplet extends Applet.TextIconApplet { constructor(orientation, panel_height, instance_id) { super(orientation, panel_height, instance_id); this.setAllowedLayout(Applet.AllowedLayout.BOTH); this._session = new GnomeSession.SessionManager(); this._screenSaverProxy = new ScreenSaver.ScreenSaverProxy(); this.settings = new Settings.AppletSettings(this, "user@cinnamon.org", instance_id); this.set_applet_icon_symbolic_name("avatar-default"); 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); let userBox = new St.BoxLayout({ style_class: 'user-box', reactive: true, vertical: false }); this._userIcon = new St.Bin({ style_class: 'user-icon'}); this.settings.bind("display-name", "disp_name", this._updateLabel); 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"), "preferences-system", 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"), "system-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"), "system-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"), "system-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"), "system-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..."), "logout", 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..."), "system-shutdown", St.IconType.SYMBOLIC); item.connect('activate', Lang.bind(this, function() { this._session.ShutdownRemote(); })); this.menu.addMenuItem(item); 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)); this._onUserChanged(); this.set_show_label_in_vertical_panels(false); } on_applet_clicked(event) { this.menu.toggle(); } _updateLabel() { if (this.disp_name) { this.set_applet_label(this._user.get_real_name()); } else { this.set_applet_label(""); } } _onUserChanged() { if (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) { let iconFileName = this._user.get_icon_file(); let iconFile = Gio.file_new_for_path(iconFileName); let icon; if (iconFile.query_exists(null)) { icon = new Gio.FileIcon({file: iconFile}); } else { icon = new Gio.ThemedIcon({name: 'avatar-default'}); } let img = St.TextureCache.get_default().load_gicon(null, icon, 48); this._userIcon.set_child (img); this._userIcon.show(); } this._updateLabel(); } } 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-4.4.8/files/usr/share/cinnamon/applets/user@cinnamon.org/icons/000077500000000000000000000000001360505115200263205ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/user@cinnamon.org/icons/logout-symbolic.svg000066400000000000000000000061521360505115200321750ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-4.4.8/files/usr/share/cinnamon/applets/user@cinnamon.org/icons/switch-user-symbolic.svg000066400000000000000000000025201360505115200331340ustar00rootroot00000000000000 image/svg+xml Gnome Symbolic Icon Theme Gnome Symbolic Icon Theme cinnamon-4.4.8/files/usr/share/cinnamon/applets/user@cinnamon.org/metadata.json000066400000000000000000000003531360505115200276610ustar00rootroot00000000000000{ "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-4.4.8/files/usr/share/cinnamon/applets/user@cinnamon.org/settings-schema.json000066400000000000000000000001711360505115200311750ustar00rootroot00000000000000{ "display-name" : { "type" : "switch", "default" : false, "description": "Display user name on panel" } } cinnamon-4.4.8/files/usr/share/cinnamon/applets/user@cinnamon.org/stylesheet.css000066400000000000000000000002741360505115200301130ustar00rootroot00000000000000.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-4.4.8/files/usr/share/cinnamon/applets/window-list@cinnamon.org/000077500000000000000000000000001360505115200265075ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/window-list@cinnamon.org/applet.js000066400000000000000000001465401360505115200303440ustar00rootroot00000000000000/* 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 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 MAX_TEXT_LENGTH = 1000; const FLASH_INTERVAL = 500; 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; let x = this.windowActor; 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(windowTexture); this.thumbnail = new Clutter.Clone({ source: windowTexture, width: width, height: height }); this._sizeChangedId = this.windowActor.connect('size-changed', () => { let [width, height] = this._getScaledTextureSize(windowTexture); 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, alert) { 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.alert = alert; this.labelVisible = false; this._signals = new SignalManager.SignalManager(); 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, '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._signals.connect(this._iconBox, 'style-changed', Lang.bind(this, this._onIconBoxStyleChanged)); this._signals.connect(this._iconBox, 'notify::allocation', Lang.bind(this, this._updateIconBoxClipAndGeometry)); this.actor.add_actor(this._iconBox); this._label = new St.Label(); this.actor.add_actor(this._label); this.updateLabelVisible(); this._iconBottomClip = 0; 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.metaWindow.connect("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.alert) { 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.setDisplayTitle(); this.onFocus(); this.setIcon(); if (this.alert) 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-type", this.setDisplayTitle, this); this._signals.connect(this.metaWindow, "icon-changed", 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.usePreview) 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(); // 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(); let tracker = Cinnamon.WindowTracker.get_default(); let app = tracker.get_window_app(this.metaWindow); if (!title) title = app ? 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._tooltip.set_text) this._tooltip.set_text(title); if (this.metaWindow.minimized) { title = "["+ title +"]"; } else if (this.metaWindow.tile_type == Meta.WindowTileType.TILED) { title = "|"+ title; } else if (this.metaWindow.tile_type == Meta.WindowTileType.SNAPPED) { title = "||"+ title; } this._label.set_text(title); } destroy() { this._signals.disconnectAllSignals(); this._tooltip.destroy(); if (!this.alert) { this.rightClickMenu.destroy(); this._menuManager.destroy(); } this.actor.destroy(); } _hasFocus() { if (this.metaWindow.minimized) return false; if (this.metaWindow.has_focus()) return true; let transientHasFocus = false; this.metaWindow.foreach_transient(function(transient) { if (transient.has_focus()) { transientHasFocus = true; return false; } return true; }); return transientHasFocus; } 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.alert) { 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.alert) { 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.alert && 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'); } } _onIconBoxStyleChanged() { let node = this._iconBox.get_theme_node(); this._iconBottomClip = node.get_length('app-icon-bottom-clip'); this._updateIconBoxClipAndGeometry(); } _updateIconBoxClipAndGeometry() { let allocation = this._iconBox.allocation; if (this._iconBottomClip > 0) this._iconBox.set_clip(0, 0, allocation.x2 - allocation.x1, allocation.y2 - allocation.y1 - this._iconBottomClip); else this._iconBox.remove_clip(); 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); } _getPreferredWidth(actor, forHeight, alloc) { let [minSize, naturalSize] = this._iconBox.get_preferred_width(forHeight); // minimum size just enough for icon if we ever get that many apps going alloc.min_size = naturalSize; 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 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(150 * global.ui_scale, naturalSize + spacing + lnaturalSize); } else { alloc.natural_size = 150 * global.ui_scale; } } else { alloc.natural_size = this._applet._panelHeight; } } _getPreferredHeight(actor, forWidth, alloc) { let [minSize1, naturalSize1] = this._iconBox.get_preferred_height(forWidth); if (this.labelVisible) { 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; let childBox = 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 (this.labelVisible) { 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); if (this.labelVisible) { [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.orientation == St.Side.TOP || this._applet.orientation == St.Side.BOTTOM) { this._label.show(); this.labelVisible = true; } else { this._label.hide(); this.labelVisible = false; } } setIcon() { let tracker = Cinnamon.WindowTracker.get_default(); let app = tracker.get_window_app(this.metaWindow); this.icon_size = this._applet.icon_size; let icon = app ? 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) return; let counter = 0; let sc = "window-list-item-demands-attention"; Mainloop.timeout_add(FLASH_INTERVAL, () => { if (!this._needsAttention) 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); let result = counter < 4; counter++; return result; }); } }; 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.screen.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.screen.get_workspace_by_index(j)); }); item.menu.addMenuItem(ws); } } } // Preferences let subMenu = new PopupMenu.PopupSubMenuMenuItem(_("Preferences")); this.addMenuItem(subMenu); item = new PopupMenu.PopupIconMenuItem(_("About..."), "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..."), "system-run", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', Lang.bind(this._launcher._applet, this._launcher._applet.configureApplet)); subMenu.menu.addMenuItem(item); item = new PopupMenu.PopupIconMenuItem(_("Remove 'Window list'"), "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"), "application-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"), "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"), "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"), "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"), "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"), "view-fullscreen", St.IconType.SYMBOLIC); this._signals.connect(item, 'activate', function() { mw.maximize(Meta.MaximizeFlags.HORIZONTAL | Meta.MaximizeFlags.VERTICAL); }); } this.addMenuItem(item); item = new PopupMenu.PopupIconMenuItem(_("Close"), "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("buttons-use-entire-space", "buttonsUseEntireSpace", this._refreshAllItems); this.settings.bind("window-preview", "usePreview", this._onPreviewChanged); this.settings.bind("window-preview-show-label", "showLabel", this._onPreviewChanged); this.settings.bind("window-preview-scale", "previewScale", this._onPreviewChanged); this.signals.connect(global.screen, 'window-added', this._onWindowAddedAsync, this); this.signals.connect(global.screen, 'window-monitor-changed', this._onWindowMonitorChanged, this); this.signals.connect(global.screen, 'window-workspace-changed', this._onWindowWorkspaceChanged, this); this.signals.connect(global.screen, 'window-skip-taskbar-changed', this._onWindowSkipTaskbarChanged, this); this.signals.connect(global.screen, '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(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; } on_applet_removed_from_panel() { this.signals.disconnectAllSignals(); this.settings.finalize(); } 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(); } } _updateSpacing() { let themeNode = this.actor.get_theme_node(); let spacing = themeNode.get_length('spacing'); this.manager.set_spacing(spacing * global.ui_scale); } _onWindowAddedAsync(screen, metaWindow, monitor) { Mainloop.timeout_add(20, Lang.bind(this, this._onWindowAdded, screen, metaWindow, monitor)); } _onWindowAdded(screen, metaWindow, monitor) { if (this._shouldAdd(metaWindow)) this._addWindow(metaWindow, false); } _onWindowMonitorChanged(screen, metaWindow, monitor) { if (this._shouldAdd(metaWindow)) this._addWindow(metaWindow, false); else this._removeWindow(metaWindow); } _refreshItemByMetaWindow(metaWindow) { let window = this._windows.find(win => (win.metaWindow == metaWindow)); if (window) this._refreshItem(window); } _onWindowWorkspaceChanged(screen, metaWindow, metaWorkspace) { this._refreshItemByMetaWindow(metaWindow); } _onWindowAppChanged(tracker, metaWindow) { this._refreshItemByMetaWindow(metaWindow); } _onWindowSkipTaskbarChanged(screen, metaWindow) { if (metaWindow && metaWindow.is_skip_taskbar()) { this._removeWindow(metaWindow); return; } this._onWindowAdded(screen, 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; // Asks AppMenuButton to flash. Returns false if already flashing if (!this._windows[i].getAttention()) return; if (window.get_workspace() != global.screen.get_active_workspace()) this._addWindow(window, true); } _refreshItem(window) { window.actor.visible = (window.metaWindow.get_workspace() == global.screen.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.alert) window.actor.visible = !window.actor.visible; if (window.actor.visible) window.setIcon(); } _refreshAllItems() { for (let window of this._windows) { this._refreshItem(window); } } _reTitleItems() { for (let window of this._windows) { window.setDisplayTitle(); } } _updateWatchedMonitors() { let n_mons = Gdk.Screen.get_default().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 this.manager_container.width; this._dragPlaceholderPos = -1 for (let i = children.length - 1; i >= 0; i--) { if (!children[i].visible) continue; if (isVertical) { if (y > children[i].get_allocation_box().y1) { this._dragPlaceholderPos = i; break; } } else if (x > children[i].get_allocation_box().x1) { this._dragPlaceholderPos = i; break; } } 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); 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; } } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonWindowListApplet(orientation, panel_height, instance_id); } cinnamon-4.4.8/files/usr/share/cinnamon/applets/window-list@cinnamon.org/metadata.json000066400000000000000000000002441360505115200311620ustar00rootroot00000000000000{ "uuid": "window-list@cinnamon.org", "name": "Window list", "description": "Main Cinnamon window list", "icon": "gnome-window-manager", "max-instances": -1 } cinnamon-4.4.8/files/usr/share/cinnamon/applets/window-list@cinnamon.org/settings-schema.json000066400000000000000000000035121360505115200325010ustar00rootroot00000000000000{ "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" }, "buttons-use-entire-space": { "type": "switch", "default": false, "description": "Window buttons can have different sizes and use the entire space available" }, "window-preview": { "type": "switch", "default": true, "description": "Show window thumbnails on hover" }, "window-preview-show-label": { "type": "switch", "default": true, "description": "Show title above thumbnail", "dependency": "window-preview" }, "window-preview-scale": { "type": "radiogroup", "default": 1, "description": "Thumbnail size", "options": { "Small": 0.75, "Medium": 1, "Large": 1.25, "Largest": 1.5 }, "dependency": "window-preview" } } cinnamon-4.4.8/files/usr/share/cinnamon/applets/windows-quick-list@cinnamon.org/000077500000000000000000000000001360505115200300045ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/windows-quick-list@cinnamon.org/applet.js000066400000000000000000000132541360505115200316340ustar00rootroot00000000000000const 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; 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._menu = new Applet.AppletPopupMenu(this, orientation); this.menuManager = new PopupMenu.PopupMenuManager(this); this.menuManager.addMenu(this._menu); this.subMenuItemWrapper = new PopupMenu.PopupSubMenuMenuItem(null); this.subMenuItemWrapper.actor.set_style_class_name(''); this.subMenuItemWrapper.menu.actor.set_style_class_name(''); this.menu = this.subMenuItemWrapper.menu; this._menu.addMenuItem(this.subMenuItemWrapper); } updateMenu() { this.menu.removeAll(); let empty_menu = true; let tracker = Cinnamon.WindowTracker.get_default(); for (let wks = 0; wks < global.screen.n_workspaces; ++wks) { // construct a list with all windows let workspace_name = Main.getWorkspaceName(wks); let metaWorkspace = global.screen.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 item = new PopupMenu.PopupMenuItem(metaWindow.get_title()); item.label.add_style_class_name('window-sticky'); item.connect( 'activate', Lang.bind(this, function() { this.activateWindow(metaWorkspace, metaWindow); }) ); item._window = sticky_windows[i]; let app = tracker.get_window_app(item._window); item._icon = app.create_icon_texture_for_window(24, item._window); item.addActor(item._icon, {align: St.Align.END}); this.menu.addMenuItem(item); empty_menu = false; } this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); } if (windows.length) { if (wks > 0) { this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); } if (global.screen.n_workspaces > 1) { let item = new PopupMenu.PopupMenuItem(workspace_name); item.actor.reactive = false; item.actor.can_focus = false; item.label.add_style_class_name('popup-subtitle-menu-item'); if (wks == global.screen.get_active_workspace().index()) { item.setShowDot(true); } this.menu.addMenuItem(item); empty_menu = false; } for (let i = 0; i < windows.length; ++i) { let metaWindow = windows[i]; let metaWindowTitle = metaWindow.get_title(); let item = new PopupMenu.PopupMenuItem(metaWindowTitle); item.label.set_style("max-width:30em;"); item.label.ellipsize = Pango.EllipsizeMode.END; item.connect( 'activate', Lang.bind(this, function() { this.activateWindow(metaWorkspace, metaWindow); }) ); item._window = metaWindow; let app = tracker.get_window_app(item._window); item._icon = app.create_icon_texture_for_window(24, item._window); item.addActor(item._icon, {align: St.Align.END}); this.menu.addMenuItem(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.menu.addMenuItem(item); } } activateWindow(metaWorkspace, metaWindow) { if (this._menu.isOpen) { this._menu.toggle_with_options(false); } this.menu.toggle(); 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); this._menu.close(false); } else { this.updateMenu(); this._menu.open(false); this.menu.open(true); } } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonWindowsQuickListApplet(metadata, orientation, panel_height, instance_id); } cinnamon-4.4.8/files/usr/share/cinnamon/applets/windows-quick-list@cinnamon.org/icons/000077500000000000000000000000001360505115200311175ustar00rootroot00000000000000windows-quick-list-symbolic.svg000066400000000000000000000003651360505115200371610ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/windows-quick-list@cinnamon.org/icons cinnamon-4.4.8/files/usr/share/cinnamon/applets/windows-quick-list@cinnamon.org/metadata.json000066400000000000000000000002641360505115200324610ustar00rootroot00000000000000{ "uuid": "windows-quick-list@cinnamon.org", "name": "Windows Quick List", "description": "Quickly access windows from all workspaces", "icon": "view-list", "max-instances": -1 } cinnamon-4.4.8/files/usr/share/cinnamon/applets/workspace-switcher@cinnamon.org/000077500000000000000000000000001360505115200300535ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/workspace-switcher@cinnamon.org/applet.js000066400000000000000000000363531360505115200317100ustar00rootroot00000000000000const 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 MIN_SWITCH_INTERVAL_MS = 220; class WorkspaceButton { constructor(index, applet) { this.index = index; this.applet = applet; this.workspace = global.screen.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); } 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.screen.get_active_workspace_index()) { this.activate(true); } } onClicked(actor, event) { if (event.get_button() == 1) { Main.wm.moveToWorkspace(this.workspace); } } update() { // defined in subclass } activate(active) { // Defined in subclass } destroy() { this.ws_signals.disconnectAllSignals(); this._tooltip.destroy(); this.actor.destroy(); } } 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, important: true }); this.graphArea = new St.DrawingArea({ style_class: 'windows', important: true }); this.actor.add_actor(this.graphArea); this.panelApplet = applet; this.graphArea.set_size(1, 1); this.graphArea.connect('repaint', Lang.bind(this, this.onRepaint)); } 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); } } setGraphSize () { this.workspace_size = new Meta.Rectangle(); this.workspace.get_work_area_all_monitors(this.workspace_size); let height, width; if (this.panelApplet.orientation == St.Side.LEFT || this.panelApplet.orientation == St.Side.RIGHT) { width = this.panelApplet._panelHeight - this.getSizeAdjustment(this.panelApplet.actor, true) - this.getSizeAdjustment(this.actor, true); this.scaleFactor = this.workspace_size.width / width; height = Math.round(this.workspace_size.height / this.scaleFactor); } else { height = this.panelApplet._panelHeight - this.getSizeAdjustment(this.panelApplet.actor, false) - this.getSizeAdjustment(this.actor, false); this.scaleFactor = this.workspace_size.height / height; width = Math.round(this.workspace_size.width / this.scaleFactor); } this.graphArea.set_size(width, height); } scale (windows_rect, workspace_rect) { let scaled_rect = new Meta.Rectangle(); scaled_rect.x = Math.round((windows_rect.x - workspace_rect.x) / this.scaleFactor); scaled_rect.y = Math.round((windows_rect.y - workspace_rect.y) / this.scaleFactor); scaled_rect.width = Math.round(windows_rect.width / this.scaleFactor); scaled_rect.height = Math.round(windows_rect.height / this.scaleFactor); return scaled_rect; } sortWindowsByUserTime (win1, win2) { let t1 = win1.get_user_time(); let t2 = win2.get_user_time(); return (t2 < t1) ? 1 : -1; } paintWindow(metaWindow, themeNode, cr) { let windowBackgroundColor; let windowBorderColor; let scaled_rect = this.scale(metaWindow.get_outer_rect(), this.workspace_size); if (metaWindow.has_focus()) { windowBorderColor = themeNode.get_color('-active-window-border'); windowBackgroundColor = themeNode.get_color('-active-window-background'); } else { windowBorderColor = themeNode.get_color('-inactive-window-border'); windowBackgroundColor = themeNode.get_color('-inactive-window-background'); } Clutter.cairo_set_source_color(cr, windowBorderColor); cr.rectangle(scaled_rect.x, scaled_rect.y, scaled_rect.width, scaled_rect.height); cr.strokePreserve(); Clutter.cairo_set_source_color(cr, windowBackgroundColor); cr.fill(); } 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(); let graphThemeNode = this.graphArea.get_theme_node(); let cr = area.get_context(); cr.setLineWidth(1); // construct a list with all windows let windows = this.workspace.list_windows(); windows = windows.filter( Main.isInteresting ); windows = windows.filter( function(w) { return !w.is_skip_taskbar() && !w.minimized; }); windows.sort(this.sortWindowsByUserTime); if (windows.length) { let focusWindow = null; for (let i = 0; i < windows.length; ++i) { let metaWindow = windows[i]; if (metaWindow.has_focus()) { focusWindow = metaWindow; continue; } this.paintWindow(metaWindow, graphThemeNode, cr); } if (focusWindow) { this.paintWindow(focusWindow, graphThemeNode, cr); } } cr.$dispose(); } update() { this.graphArea.queue_repaint(); } activate(active) { if (active) this.actor.add_style_pseudo_class('active'); else this.actor.remove_style_pseudo_class('active'); } } 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 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 = 0; if (global.display.focus_window) this._focusWindow = global.display.focus_window.get_compositor_private(); this.settings = new Settings.AppletSettings(this, metadata.uuid, instance_id); this.settings.bind("display_type", "display_type", this.queueCreateButtons); this.actor.connect('scroll-event', this.hook.bind(this)); this.queueCreateButtons(); global.screen.connect('notify::n-workspaces', Lang.bind(this, this.onNumberOfWorkspacesChanged)); global.screen.connect('workareas-changed', Lang.bind(this, this.queueCreateButtons)); 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)"), "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"), "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"), "list-remove", St.IconType.SYMBOLIC); this.removeWorkspaceMenuItem.connect('activate', Lang.bind(this, function() { this.removeWorkspace(); })); this._applet_context_menu.addMenuItem(this.removeWorkspaceMenuItem); this.removeWorkspaceMenuItem.setSensitive(global.screen.n_workspaces > 1); } onNumberOfWorkspacesChanged() { this.removeWorkspaceMenuItem.setSensitive(global.screen.n_workspaces > 1); this.queueCreateButtons(); } removeWorkspace (){ if (global.screen.n_workspaces <= 1) { return; } this.workspace_index = global.screen.get_active_workspace_index(); let removeAction = Lang.bind(this, function() { Main._removeWorkspace(global.screen.get_active_workspace()); }); if (!Main.hasDefaultWorkspaceName(this.workspace_index)) { let prompt = _("Are you sure you want to remove workspace \"%s\"?\n\n").format( Main.getWorkspaceName(this.workspace_index)); let confirm = new ModalDialog.ConfirmDialog(prompt, removeAction); confirm.open(); } else { removeAction(); } } _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) { 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 ellapsed 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) { if (direction == 0) Main.wm.actionMoveWorkspaceLeft(); else if (direction == 1) 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.screen.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.get_compositor_private()) return; this.signals.disconnect("position-changed"); this.signals.disconnect("size-changed"); if (!global.display.focus_window) return; this._focusWindow = global.display.focus_window.get_compositor_private(); this.signals.connect(this._focusWindow, "position-changed", Lang.bind(this, this._onPositionChanged), this); this.signals.connect(this._focusWindow, "size-changed", Lang.bind(this, this._onPositionChanged), this); this._onPositionChanged(); } _onPositionChanged() { let button = this.buttons[global.screen.get_active_workspace_index()]; button.update(); } on_applet_removed_from_panel() { this.signals.disconnectAllSignals(); } } function main(metadata, orientation, panel_height, instance_id) { return new CinnamonWorkspaceSwitcher(metadata, orientation, panel_height, instance_id); } cinnamon-4.4.8/files/usr/share/cinnamon/applets/workspace-switcher@cinnamon.org/metadata.json000066400000000000000000000002651360505115200325310ustar00rootroot00000000000000{ "uuid": "workspace-switcher@cinnamon.org", "name": "Workspace switcher", "description": "Select the workspace from the panel", "icon": "cs-workspaces", "max-instances": -1 } cinnamon-4.4.8/files/usr/share/cinnamon/applets/workspace-switcher@cinnamon.org/settings-schema.json000066400000000000000000000006661360505115200340540ustar00rootroot00000000000000{ "display_type": { "type": "combobox", "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.", "default": "visual", "options" : { "A visual representation of the workspaces": "visual", "Simple buttons": "buttons" } } } cinnamon-4.4.8/files/usr/share/cinnamon/applets/xapp-status@cinnamon.org/000077500000000000000000000000001360505115200265205ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/xapp-status@cinnamon.org/applet.js000077500000000000000000000336351360505115200303600ustar00rootroot00000000000000const 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 SignalManager = imports.misc.signalManager; const Gtk = imports.gi.Gtk; const XApp = imports.gi.XApp; const GLib = imports.gi.GLib; 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 XAppStatusIcon { constructor(applet, proxy) { this.name = proxy.get_name(); this.applet = applet; this.proxy = proxy; this.iconName = null; this.tooltipText = ""; this.actor = new St.BoxLayout({ style_class: "applet-box", reactive: true, 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 = new St.Icon(); this.label = new St.Label({ 'y-align': St.Align.END, }); this.actor.add_actor(this.icon); this.actor.add_actor(this.label); 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('enter-event', Lang.bind(this, this.onEnterEvent)); this.actor.connect('leave-event', Lang.bind(this, this.onLeaveEvent)); 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); } 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) { if (iconName.match(/symbolic/)) { this.icon.set_icon_type(St.IconType.SYMBOLIC); } else { this.icon.set_icon_type(St.IconType.FULLCOLOR); } this.iconName = iconName; this.icon.set_icon_size(this.applet.getPanelIconSize(this.icon.get_icon_type())); if (iconName.includes("/")) { let file = Gio.File.new_for_path(iconName); let gicon = Gio.FileIcon.new(file); this.icon.set_gicon(gicon); } else { this.icon.set_icon_name(iconName); } this.icon.show(); } else { this.iconName = null; this.icon.hide(); } } setTooltipText(tooltipText) { if (tooltipText) { this.tooltipText = tooltipText; } else { this.tooltipText = ""; } } 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.applet.set_applet_tooltip(this.tooltipText); } onLeaveEvent(actor, event) { this.applet.set_applet_tooltip(""); } 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.applet.set_applet_tooltip(""); 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; } destroy() { this.proxy.disconnect(this._proxy_prop_change_id); this._proxy_prop_change_id = 0; } } 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.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.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); } onMonitorIconAdded(monitor, icon_proxy) { let proxy_name = icon_proxy.get_name(); if (this.statusIcons[proxy_name]) { 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} (${proxy_name})`); this.addStatusIcon(icon_proxy); } onMonitorIconRemoved(monitor, icon_proxy) { let proxy_name = icon_proxy.get_name(); if (!this.statusIcons[proxy_name]) { if (this.ignoredProxies[proxy_name]) { delete this.ignoredProxies[proxy_name]; } return; } global.log(`Removing XAppStatusIcon: ${icon_proxy.name} (${proxy_name})`); 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 proxy_name = icon_proxy.get_name(); let statusIcon = new XAppStatusIcon(this, icon_proxy); this.manager_container.insert_child_at_index(statusIcon.actor, 0); this.statusIcons[proxy_name] = statusIcon; this.sortIcons(); } removeStatusIcon(icon_proxy) { let proxy_name = icon_proxy.get_name(); if (!this.statusIcons[proxy_name]) { return; } this.manager_container.remove_child(this.statusIcons[proxy_name].actor); this.statusIcons[proxy_name].destroy(); delete this.statusIcons[proxy_name]; this.sortIcons(); } ignoreStatusIcon(icon_proxy) { let proxy_name = icon_proxy.get_name(); if (this.ignoredProxies[proxy_name]) { return; } this.ignoredProxies[proxy_name] = icon_proxy; } shouldIgnoreStatusIcon(icon_proxy) { let hiddenIcons = Main.systrayManager.getRoles(); if (hiddenIcons.indexOf(icon_proxy.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, b.proxy.name); } sortIcons() { 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); } } refreshIcons() { for (let owner in this.statusIcons) { let icon = this.statusIcons[owner]; icon.refresh(); } } icon_size_changed() { this.refreshIcons(); } on_icon_theme_changed() { this.refreshIcons(); } 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.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-4.4.8/files/usr/share/cinnamon/applets/xapp-status@cinnamon.org/metadata.json000077500000000000000000000003541360505115200312000ustar00rootroot00000000000000{ "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, "version": "1.0" }cinnamon-4.4.8/files/usr/share/cinnamon/applets/xrandr@cinnamon.org/000077500000000000000000000000001360505115200255255ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/applets/xrandr@cinnamon.org/applet.js000066400000000000000000000111431360505115200273500ustar00rootroot00000000000000/* -*- 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 N_ = function(e) { return e; }; const possibleRotations = [ CinnamonDesktop.RRRotation.ROTATION_0, CinnamonDesktop.RRRotation.ROTATION_90, CinnamonDesktop.RRRotation.ROTATION_180, CinnamonDesktop.RRRotation.ROTATION_270 ]; let rotations = [ [CinnamonDesktop.RRRotation.ROTATION_0, N_("Normal")], [CinnamonDesktop.RRRotation.ROTATION_90, N_("Left")], [CinnamonDesktop.RRRotation.ROTATION_270, N_("Right")], [CinnamonDesktop.RRRotation.ROTATION_180, 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("preferences-desktop-display"); this.set_applet_tooltip(_("Display")); this.menuManager = new PopupMenu.PopupMenuManager(this); this.menu = new Applet.AppletPopupMenu(this, orientation); this.menuManager.addMenu(this.menu); Interfaces.getDBusProxyAsync("org.cinnamon.SettingsDaemon.XRANDR_2", Lang.bind(this, function(proxy, error) { this._proxy = proxy; })); try { this._screen = new CinnamonDesktop.RRScreen({ gdk_screen: Gdk.Screen.get_default() }); this._screen.init(null); } catch(e) { // an error means there is no XRandR extension global.logError(e); this.actor.hide(); return; } this._createMenu(); this._screen.connect('changed', Lang.bind(this, this._randrEvent)); } on_applet_clicked(event) { this.menu.toggle(); } _randrEvent() { this.menu.removeAll(); this._createMenu(); } _createMenu() { let config = CinnamonDesktop.RRConfig.new_current(this._screen); let outputs = config.get_outputs(); for (let i = 0; i < outputs.length; i++) { if (outputs[i].is_connected()) this._addOutputItem(config, outputs[i]); } this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addAction(_("Configure display settings..."), function() { GLib.spawn_command_line_async('cinnamon-settings display'); }); } _addOutputItem(config, output) { let item = new PopupMenu.PopupMenuItem("%s (%s)".format(output.get_display_name(), output.get_name())); item.label.add_style_class_name('display-subtitle'); item.actor.reactive = false; item.actor.can_focus = false; this.menu.addMenuItem(item); let allowedRotations = this._getAllowedRotations(config, output); let currentRotation = output.get_rotation(); for (let i = 0; i < rotations.length; i++) { let [bitmask, name] = rotations[i]; if (bitmask & allowedRotations) { let item = new PopupMenu.PopupMenuItem(_(name)); if (bitmask & currentRotation) item.setShowDot(true); item.connect('activate', Lang.bind(this, function(item, event) { /* ensure config is saved so we get a backup if anything goes wrong */ config.save(); output.set_rotation(bitmask); try { config.save(); this._proxy.ApplyConfigurationRemote(0, event.get_time()); } catch (e) { global.logError('Could not save monitor configuration', e); } })); this.menu.addMenuItem(item); } } } _getAllowedRotations(config, output) { let retval = 0; let current = output.get_rotation(); for (let i = 0; i < possibleRotations.length; i++) { output.set_rotation(possibleRotations[i]); if (config.applicable(this._screen)) { retval |= possibleRotations[i]; } } output.set_rotation(current); if (retval.length === 0) { // what, no rotation? // what's current then? retval = current; } return retval; } }; function main(metadata, orientation, panel_height, instance_id) { return new CinnamonXrandrApplet(orientation, panel_height, instance_id); } cinnamon-4.4.8/files/usr/share/cinnamon/applets/xrandr@cinnamon.org/metadata.json000066400000000000000000000002631360505115200302010ustar00rootroot00000000000000{ "uuid": "xrandr@cinnamon.org", "name": "Display", "description": "XRandR monitor control applet", "icon": "preferences-desktop-display", "localedir": "/usr/share/locale" } cinnamon-4.4.8/files/usr/share/cinnamon/applets/xrandr@cinnamon.org/stylesheet.css000066400000000000000000000000551360505115200304300ustar00rootroot00000000000000.display-subtitle { font-weight: bold; } cinnamon-4.4.8/files/usr/share/cinnamon/bumpmaps/000077500000000000000000000000001360505115200217725ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/bumpmaps/birdnfish.png000066400000000000000000000070521360505115200244540ustar00rootroot00000000000000PNG  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-4.4.8/files/usr/share/cinnamon/bumpmaps/hex.png000066400000000000000000000003111360505115200232570ustar00rootroot00000000000000PNG  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-4.4.8/files/usr/share/cinnamon/cinnamon-dbus-command000077500000000000000000000124331360505115200242500ustar00rootroot00000000000000#!/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("\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): 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) i += 1 variant_string += ")" parsed_args = [] for arg_as_str in in_args: try: parsed_args.append(eval(arg_as_str)) except: parsed_args.append(arg_as_str) 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-4.4.8/files/usr/share/cinnamon/cinnamon-desktop-editor/000077500000000000000000000000001360505115200247035ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/cinnamon-desktop-editor/cinnamon-desktop-editor.py000077500000000000000000000417271360505115200320300ustar00rootroot00000000000000#!/usr/bin/python3 import sys import os import gettext import glob from optparse import OptionParser import shutil import subprocess from setproctitle import setproctitle import gi gi.require_version("Gtk", "3.0") gi.require_version("CMenu", "3.0") gi.require_version("XApp", "1.0") from gi.repository import GLib, Gtk, Gio, CMenu, GdkPixbuf, XApp sys.path.insert(0, '/usr/share/cinnamon/cinnamon-menu-editor') from cme import util 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(home, ".cinnamon", "panel-launchers") EXTENSIONS = (".png", ".xpm", ".svg") DEFAULT_ICON_NAME = "cinnamon-panel-launcher" def escape_space(string): return string.replace(" ", "\ ") def ask(msg): dialog = Gtk.MessageDialog(None, Gtk.DialogFlags.DESTROY_WITH_PARENT, Gtk.MessageType.QUESTION, Gtk.ButtonsType.YES_NO, None) dialog.set_default_size(400, 200) 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): 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.icon_chooser = self.builder.get_object('icon-chooser') self.icon_chooser.get_dialog().set_property("allow-paths", True) self.build_ui() self.item_path = item_path self.load() self.check_custom_path() self.resync_validity() 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_string(DESKTOP_GROUP, name) 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) 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) self.dialog.destroy() 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 is not "" 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_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(), 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 is not "") 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') file = Gio.file_parse_name(name) if not 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 is not "" 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_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(), 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() 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") (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] 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) 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")) for launcher in 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-4.4.8/files/usr/share/cinnamon/cinnamon-desktop-editor/directory-editor.ui000066400000000000000000000175131360505115200305410ustar00rootroot00000000000000 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-4.4.8/files/usr/share/cinnamon/cinnamon-desktop-editor/launcher-editor.ui000066400000000000000000000267501360505115200303410ustar00rootroot00000000000000 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 1 Name: 0 0 1 1 True False 1 Command: 0 1 1 1 True False 1 Comment: 0 2 1 1 True True True True 1 0 1 1 True False 10 True True True True True 0 Browse True True True False True 1 1 1 1 1 True True True 1 2 1 1 Launch in Terminal? True True False 0 True 1 3 1 1 True True end 1 True True 1 cancel ok cinnamon-4.4.8/files/usr/share/cinnamon/cinnamon-looking-glass/000077500000000000000000000000001360505115200245175ustar00rootroot00000000000000cinnamon-4.4.8/files/usr/share/cinnamon/cinnamon-looking-glass/cinnamon-looking-glass.py000077500000000000000000000520501360505115200314470ustar00rootroot00000000000000#!/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 dbus import dbus.service from dbus.mainloop.glib import DBusGMainLoop 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" 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(["glass.log", "~/.cinnamon/glass.log"]) self.store.append(["custom", "