From 4f5035bd7e2562084457963c15a4727c0e7d20b3 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 12 Jun 2014 03:02:57 +0400 Subject: [PATCH 001/224] reorganize build --- .gitignore | 15 +- LICENSE | 339 ++++++++++++++++++ Makefile.am | 31 -- autogen.sh | 22 -- config/.gitignore | 2 - configure.ac | 73 ---- data/.gitignore | 3 - data/Makefile.am | 36 -- data/metadata.json.in | 13 - deploy.sh | 5 + .../convenience.js | 0 .../extension.js | 0 .../icons}/sensors-fan-symbolic.svg | 0 .../icons}/sensors-temperature-symbolic.svg | 0 .../icons}/sensors-voltage-symbolic.svg | 0 .../metadata.json | 9 + .../prefs.js | 0 ...gnome.shell.extensions.sensors.gschema.xml | 2 +- .../utilities.js | 0 m4/.gitignore | 1 - makeZip.sh | 7 + po/.gitignore | 5 - po/LINGUAS | 6 - po/POTFILES.in | 3 - po/de.po | 121 ------- po/es.po | 120 ------- po/fr.po | 120 ------- po/gnome-shell-extension-sensors.pot | 118 ------ po/it.po | 121 ------- po/tr.po | 119 ------ po/zh_CN.po | 120 ------- src/Makefile.am | 10 - 32 files changed, 362 insertions(+), 1059 deletions(-) create mode 100644 LICENSE delete mode 100644 Makefile.am delete mode 100755 autogen.sh delete mode 100644 config/.gitignore delete mode 100644 configure.ac delete mode 100644 data/.gitignore delete mode 100644 data/Makefile.am delete mode 100644 data/metadata.json.in create mode 100755 deploy.sh rename {src => freon@UshakovVasilii_Github.yahoo.com}/convenience.js (100%) rename {src => freon@UshakovVasilii_Github.yahoo.com}/extension.js (100%) rename {data => freon@UshakovVasilii_Github.yahoo.com/icons}/sensors-fan-symbolic.svg (100%) rename {data => freon@UshakovVasilii_Github.yahoo.com/icons}/sensors-temperature-symbolic.svg (100%) rename {data => freon@UshakovVasilii_Github.yahoo.com/icons}/sensors-voltage-symbolic.svg (100%) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/metadata.json rename {src => freon@UshakovVasilii_Github.yahoo.com}/prefs.js (100%) rename data/org.gnome.shell.extensions.sensors.gschema.xml.in => freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml (95%) rename {src => freon@UshakovVasilii_Github.yahoo.com}/utilities.js (100%) delete mode 100644 m4/.gitignore create mode 100755 makeZip.sh delete mode 100644 po/.gitignore delete mode 100644 po/LINGUAS delete mode 100644 po/POTFILES.in delete mode 100644 po/de.po delete mode 100644 po/es.po delete mode 100644 po/fr.po delete mode 100644 po/gnome-shell-extension-sensors.pot delete mode 100644 po/it.po delete mode 100644 po/tr.po delete mode 100644 po/zh_CN.po delete mode 100644 src/Makefile.am diff --git a/.gitignore b/.gitignore index 867e0ee..c4c4ffc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1 @@ -*~ -*.swp -autom4te.cache -configure -Makefile.in -Makefile -sensors.shell-extension.zip -gnome-shell-extension-sensors-1.3.tar.gz -gnome-shell-extension-sensors-1.3.tar.xz -aclocal.m4 -config.log -config.status -.build/ -ChangeLog +*.zip diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d7f1051 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ +GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser 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. + + {description} + Copyright (C) {year} {fullname} + + 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., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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. + + {signature of Ty Coon}, 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 Lesser General +Public License instead of this License. diff --git a/Makefile.am b/Makefile.am deleted file mode 100644 index 82a87ed..0000000 --- a/Makefile.am +++ /dev/null @@ -1,31 +0,0 @@ -ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} - -SUBDIRS = src data po - -uuid = "temperature@xtranophilist" - -localprefix = $(HOME)/.local/share/gnome-shell/extensions - -zip-file: sensors.shell-extension.zip - -sensors.shell-extension.zip: all - $(MKDIR_P) $(builddir)/.build - $(MAKE) install DESTDIR="$(abs_builddir)/.build" - $(AM_V_at)cp -r "$(builddir)/.build$(datadir)/gnome-shell/extensions/$(uuid)" "$(builddir)/.build" - $(AM_V_at)cp -r "$(builddir)/.build$(datadir)/locale" "$(builddir)/.build/$(uuid)" - $(AM_V_at)cp -r "$(builddir)/.build$(datadir)/glib-2.0/schemas" "$(builddir)/.build/$(uuid)" - $(AM_V_at)cp -r "$(builddir)/.build$(datadir)/icons" "$(builddir)/.build/$(uuid)" - $(AM_V_at)glib-compile-schemas "$(builddir)/.build/$(uuid)/schemas" - $(AM_V_at)(cd "$(builddir)/.build/$(uuid)/"; zip -qr "$(abs_builddir)/sensors.shell-extension.zip" .) - -clean-local: - $(AM_V_at)-rm -rf $(builddir)/sensors.shell-extension.zip - -distclean-local: - $(AM_V_at)-rm -rf $(builddir)/.build - -local-install: sensors.shell-extension.zip - $(AM_V_at)-rm -rf "$(localprefix)/$(uuid)" - $(MKDIR_P) "$(localprefix)/$(uuid)" - $(AM_V_at)(cd $(localprefix)/$(uuid); unzip -q "$(abs_builddir)/sensors.shell-extension.zip") - diff --git a/autogen.sh b/autogen.sh deleted file mode 100755 index 0ab57c9..0000000 --- a/autogen.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -# Run this to generate all the initial makefiles, etc. - -srcdir=`dirname $0` -test -z "$srcdir" && srcdir=. - -PKG_NAME="gnome-shell-extension-sensors" - -touch ChangeLog - -test -f $srcdir/configure.ac || { - echo -n "**Error**: Directory "\`$srcdir\'" does not look like the" - echo " top-level gnome-shell-extensions directory" - exit 1 -} - -which gnome-autogen.sh || { - echo "You need to install gnome-common from GNOME Git (or from" - echo "your OS vendor's package manager)." - exit 1 -} -. gnome-autogen.sh diff --git a/config/.gitignore b/config/.gitignore deleted file mode 100644 index 022060c..0000000 --- a/config/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -install-sh -missing diff --git a/configure.ac b/configure.ac deleted file mode 100644 index 463c634..0000000 --- a/configure.ac +++ /dev/null @@ -1,73 +0,0 @@ -AC_PREREQ(2.63) -dnl be carefull, the version needs to be in sync with your gnome shell version -AC_INIT([gnome-shell-extension-sensors],[1.3],[https://github.com/xtranophilist/gnome-shell-extension-sensors/issues]) - -AC_CONFIG_MACRO_DIR([m4]) -AC_CONFIG_AUX_DIR([config]) - -AM_INIT_AUTOMAKE([1.10 dist-xz foreign]) - -m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) - -AC_PROG_SED - -GETTEXT_PACKAGE=gnome-shell-extension-sensors -AC_SUBST(GETTEXT_PACKAGE) -AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", - [The prefix for our gettext translation domains.]) -IT_PROG_INTLTOOL(0.26) - -PKG_PROG_PKG_CONFIG([0.22]) - -GLIB_GSETTINGS - -AC_ARG_WITH(desktop-dir, [ --with-desktop-dir=PATH where to install desktop files (default=PREFIX/share)]) - -if test "x$with_desktop_dir" != x; then - DESKTOP_DATADIR=$with_desktop_dir -else - DESKTOP_DATADIR="$datadir" -fi - -AM_CONDITIONAL(DESKTOP_DATADIR, test "x$with_desktop_dir" != xno) -AC_SUBST(DESKTOP_DATADIR) - -AC_ARG_WITH([local-install], - [AS_HELP_STRING([--with-local-install], - [install schemas and translations in a subdir of the extension (default is no)])], - [use_local_install=$withval], - [use_local_install=no]) - -AC_SUBST(use_local_install) -AM_CONDITIONAL(LOCAL_INSTALL, test "x${use_local_install}" == "xyes") - -extensiontopdir=${datadir}/gnome-shell/extensions/weather@gnome-shell-extensions.gnome.org - -dnl This is beyond ugly. Suggestions accepted. -if test "x${use_local_install}" == "xyes"; then - AC_SUBST(gsettingsschemadir, [${extensiontopdir}/schemas]) - AC_SUBST(LOCALEDIR, [${extensiontopdir}/locale]) -else - AC_SUBST(LOCALEDIR, [${datadir}/locale]) -fi - -dnl Please keep this sorted alphabetically. -AC_CONFIG_FILES([ - Makefile - data/Makefile - po/Makefile.in - src/Makefile -]) -AC_OUTPUT - -dnl 'Fugly hack' doesn't get close to describe this. I don't know how else -dnl to change the directory for translations. -if test "x${use_local_install}" == "xyes"; then - ${SED} -i -e "s%itlocaledir = .*%itlocaledir = ${extensiontopdir}/locale%g" po/Makefile -fi - -if test "x$use_local_install" == "xyes"; then - echo - echo "The schemas and translations will be installed in subdirectories of the extension." - echo -fi diff --git a/data/.gitignore b/data/.gitignore deleted file mode 100644 index 67c4c72..0000000 --- a/data/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -org.gnome.shell.extensions.sensors.gschema.valid -org.gnome.shell.extensions.sensors.gschema.xml -metadata.json diff --git a/data/Makefile.am b/data/Makefile.am deleted file mode 100644 index 2fb0bf1..0000000 --- a/data/Makefile.am +++ /dev/null @@ -1,36 +0,0 @@ -extensionurl = https://github.com/xtranophilist/gnome-shell-extension-sensors - -# Change these to modify how installation is performed -topextensiondir = $(datadir)/gnome-shell/extensions - -uuid = temperature@xtranophilist - -extensiondir = $(topextensiondir)/$(uuid) - -nodist_extension_DATA = metadata.json $(EXTRA_EXTENSION) - -EXTRA_DIST = metadata.json.in - -metadata.json: metadata.json.in $(top_builddir)/config.status - $(AM_V_GEN) sed -e "s|[@]LOCALEDIR@|$(datadir)/locale|" \ - -e "s|[@]GETTEXT_PACKAGE@|$(GETTEXT_PACKAGE)|" \ - -e "s|[@]uuid@|$(uuid)|" \ - -e "s|[@]url@|$(extensionurl)|" $< > $@ - -CLEANFILES = metadata.json - -icondir = $(datadir)/icons/hicolor/scalable/status - -icon_DATA = \ - sensors-fan-symbolic.svg \ - sensors-temperature-symbolic.svg \ - sensors-voltage-symbolic.svg - -gschemas_in = org.gnome.shell.extensions.sensors.gschema.xml.in - -@INTLTOOL_XML_NOMERGE_RULE@ - -gsettings_SCHEMAS = $(gschemas_in:.xml.in=.xml) @GSETTINGS_RULES@ - -EXTRA_DIST += $(gschemas_in) -CLEANFILES += $(gschemas_in:.xml.in=.valid) $(gsettings_SCHEMAS) diff --git a/data/metadata.json.in b/data/metadata.json.in deleted file mode 100644 index d6eb3bc..0000000 --- a/data/metadata.json.in +++ /dev/null @@ -1,13 +0,0 @@ -{ - "description": "Shows CPU temperature, HDD temperature, voltage and fan RPM", - "name": "Sensors", - "settings-schema": "org.gnome.shell.extensions.sensors", - "gettext-domain": "@GETTEXT_PACKAGE@", - "shell-version": [ - "3.10", - "3.12" - ], - "localedir": "@LOCALEDIR@", - "url": "@url@", - "uuid": "@uuid@" - } diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 0000000..b292548 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +NAME=freon@UshakovVasilii_Github.yahoo.com +rm -rf ~/.local/share/gnome-shell/extensions/$NAME +cp -r $NAME ~/.local/share/gnome-shell/extensions/. diff --git a/src/convenience.js b/freon@UshakovVasilii_Github.yahoo.com/convenience.js similarity index 100% rename from src/convenience.js rename to freon@UshakovVasilii_Github.yahoo.com/convenience.js diff --git a/src/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js similarity index 100% rename from src/extension.js rename to freon@UshakovVasilii_Github.yahoo.com/extension.js diff --git a/data/sensors-fan-symbolic.svg b/freon@UshakovVasilii_Github.yahoo.com/icons/sensors-fan-symbolic.svg similarity index 100% rename from data/sensors-fan-symbolic.svg rename to freon@UshakovVasilii_Github.yahoo.com/icons/sensors-fan-symbolic.svg diff --git a/data/sensors-temperature-symbolic.svg b/freon@UshakovVasilii_Github.yahoo.com/icons/sensors-temperature-symbolic.svg similarity index 100% rename from data/sensors-temperature-symbolic.svg rename to freon@UshakovVasilii_Github.yahoo.com/icons/sensors-temperature-symbolic.svg diff --git a/data/sensors-voltage-symbolic.svg b/freon@UshakovVasilii_Github.yahoo.com/icons/sensors-voltage-symbolic.svg similarity index 100% rename from data/sensors-voltage-symbolic.svg rename to freon@UshakovVasilii_Github.yahoo.com/icons/sensors-voltage-symbolic.svg diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json new file mode 100644 index 0000000..72921a5 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -0,0 +1,9 @@ +{ + "shell-version": ["3.10","3.12"], + "uuid": "freon@UshakovVasilii_Github.yahoo.com", + "name": "Freon", + "description": "Shows CPU temperature, HDD temperature, voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", + "settings-schema": "org.gnome.shell.extensions.freon", + "gettext-domain": "freon", + "url": "https://github.com/UshakovVasilii/gnome-shell-extension-freon" + } diff --git a/src/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js similarity index 100% rename from src/prefs.js rename to freon@UshakovVasilii_Github.yahoo.com/prefs.js diff --git a/data/org.gnome.shell.extensions.sensors.gschema.xml.in b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml similarity index 95% rename from data/org.gnome.shell.extensions.sensors.gschema.xml.in rename to freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml index cad396b..a02bd82 100644 --- a/data/org.gnome.shell.extensions.sensors.gschema.xml.in +++ b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml @@ -1,7 +1,7 @@ - + 15 diff --git a/src/utilities.js b/freon@UshakovVasilii_Github.yahoo.com/utilities.js similarity index 100% rename from src/utilities.js rename to freon@UshakovVasilii_Github.yahoo.com/utilities.js diff --git a/m4/.gitignore b/m4/.gitignore deleted file mode 100644 index 9f841b0..0000000 --- a/m4/.gitignore +++ /dev/null @@ -1 +0,0 @@ -intltool.m4 diff --git a/makeZip.sh b/makeZip.sh new file mode 100755 index 0000000..6cd5d0b --- /dev/null +++ b/makeZip.sh @@ -0,0 +1,7 @@ +#!/bin/sh +NAME=freon@UshakovVasilii_Github.yahoo.com +cd $NAME +zip -r $NAME.zip * +cd .. +mv $NAME/$NAME.zip . + diff --git a/po/.gitignore b/po/.gitignore deleted file mode 100644 index 9c6e309..0000000 --- a/po/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -stamp-it -POTFILES -Makefile.in.in -*.gmo -*.mo diff --git a/po/LINGUAS b/po/LINGUAS deleted file mode 100644 index f3da9a9..0000000 --- a/po/LINGUAS +++ /dev/null @@ -1,6 +0,0 @@ -de -es -fr -it -tr -zh_CN diff --git a/po/POTFILES.in b/po/POTFILES.in deleted file mode 100644 index e91461b..0000000 --- a/po/POTFILES.in +++ /dev/null @@ -1,3 +0,0 @@ -src/extension.js -src/prefs.js -src/utilities.js diff --git a/po/de.po b/po/de.po deleted file mode 100644 index 51abb3d..0000000 --- a/po/de.po +++ /dev/null @@ -1,121 +0,0 @@ -# German translations for gnome-shell-extension-sensors package -# German messages for gnome-shell-extension-sensors. -# Copyright (C) 2013 THE gnome-shell-extension-sensors'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gnome-shell-extension-sensors package. -# Marcel Metz , 2013. -# -msgid "" -msgstr "" -"Project-Id-Version: gnome-shell-extension-sensors 1.3\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-05-25 18:09+0200\n" -"PO-Revision-Date: 2013-05-25 12:50+0200\n" -"Last-Translator: Marcel Metz \n" -"Language-Team: German\n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. Add average and maximum entries -#: ../src/extension.js:153 ../src/prefs.js:102 -msgid "Average" -msgstr "Durchschnitt" - -#: ../src/extension.js:154 ../src/prefs.js:103 -msgid "Maximum" -msgstr "Spitzenwert" - -#: ../src/extension.js:161 -#, c-format -msgid "%drpm" -msgstr "" - -#: ../src/extension.js:167 -#, c-format -msgid "%s%.2fV" -msgstr "" - -#: ../src/extension.js:170 -msgid "N/A" -msgstr "" - -#: ../src/extension.js:185 -msgid "Error" -msgstr "Fehler" - -#: ../src/extension.js:189 -msgid "Please run sensors-detect as root." -msgstr "Bitte führen sie sensors-detect als root aus." - -#: ../src/extension.js:190 -msgid "Please install lm_sensors." -msgstr "Bitte installieren sie lm_sensors" - -#: ../src/extension.js:190 -msgid "If this doesn't help, click here to report with your sensors output!" -msgstr "" -"Wenn dies nicht hilft, klicken sie hier um das Problem mit einer Ausgabe von " -"sensors zu melden" - -#: ../src/extension.js:204 -msgid "Sensors Settings" -msgstr "Einstellungen für Sensoren" - -#: ../src/prefs.js:33 -msgid "Poll sensors every (in seconds)" -msgstr "Lese Sensoren alle (in Sekunden)" - -#: ../src/prefs.js:41 -msgid "Temperature unit" -msgstr "Temperatureinheit" - -#: ../src/prefs.js:42 -msgid "Centigrade" -msgstr "Grad" - -#: ../src/prefs.js:43 -msgid "Fahrenheit" -msgstr "" - -#: ../src/prefs.js:56 -msgid "Display temperature unit" -msgstr "Zeige Temperatureinheit an" - -#: ../src/prefs.js:57 -msgid "Show temperature unit in panel and menu." -msgstr "Zeige die Temperatureinheit im Panel und im Menü an." - -#: ../src/prefs.js:61 -msgid "Display decimal value" -msgstr "Zeige Nachkommawerte an" - -#: ../src/prefs.js:62 -msgid "Show one digit after decimal." -msgstr "Zeige eine Nachkommastelle an." - -#: ../src/prefs.js:66 -msgid "Display drive temperature" -msgstr "Zeige Laufwerkstemperatur an" - -#: ../src/prefs.js:70 -msgid "Display fan speed" -msgstr "Zeige Lüfterdrehzahl an" - -#: ../src/prefs.js:74 -msgid "Display power supply voltage" -msgstr "Zeige Netzteilspannung an" - -#: ../src/prefs.js:129 -msgid "Sensor in panel" -msgstr "Sensor im Panel" - -#: ../src/prefs.js:133 -msgid "Display sensor label" -msgstr "Zeige Sensorenbezeichnung" - -#: ../src/utilities.js:157 -#, c-format -msgid "Drive %s" -msgstr "Laufwerk %s" diff --git a/po/es.po b/po/es.po deleted file mode 100644 index 5679f42..0000000 --- a/po/es.po +++ /dev/null @@ -1,120 +0,0 @@ -# Spanish translations for gnome-shell-extension-sensors package -# Spanish messages for gnome-shell-extension-sensors. -# Copyright (C) 2013 THE gnome-shell-extension-sensors'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gnome-shell-extension-sensors package. -# Marcel Metz , 2013. -# -msgid "" -msgstr "" -"Project-Id-Version: gnome-shell-extension-sensors 1.3\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-05-25 18:09+0200\n" -"PO-Revision-Date: 2013-05-25 12:50+0200\n" -"Last-Translator: UnsolvedCypher \n" -"Language-Team: Spanish\n" -"Language: es\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. Add average and maximum entries -#: ../src/extension.js:153 ../src/prefs.js:102 -msgid "Average" -msgstr "Promedio" - -#: ../src/extension.js:154 ../src/prefs.js:103 -msgid "Maximum" -msgstr "Máximo" - -#: ../src/extension.js:161 -#, c-format -msgid "%drpm" -msgstr "" - -#: ../src/extension.js:167 -#, c-format -msgid "%s%.2fV" -msgstr "" - -#: ../src/extension.js:170 -msgid "N/A" -msgstr "" - -#: ../src/extension.js:185 -msgid "Error" -msgstr "Error" - -#: ../src/extension.js:189 -msgid "Please run sensors-detect as root." -msgstr "Por favor ejecute sensors-detect como root." - -#: ../src/extension.js:190 -msgid "Please install lm_sensors." -msgstr "Por favor instale lm-sensors." - -#: ../src/extension.js:190 -msgid "If this doesn't help, click here to report with your sensors output!" -msgstr "" -"Si esto no ayuda, haz clic aquí para reportar un error con salida del sensor." - -#: ../src/extension.js:204 -msgid "Sensors Settings" -msgstr "Ajustes del sensor" - -#: ../src/prefs.js:33 -msgid "Poll sensors every (in seconds)" -msgstr "Sondear los sensores cada (en segundos)" - -#: ../src/prefs.js:41 -msgid "Temperature unit" -msgstr "Unidad de temperatura" - -#: ../src/prefs.js:42 -msgid "Centigrade" -msgstr "Centígrados" - -#: ../src/prefs.js:43 -msgid "Fahrenheit" -msgstr "Fahrenheit" - -#: ../src/prefs.js:56 -msgid "Display temperature unit" -msgstr "Monstrar unidad de temperatura" - -#: ../src/prefs.js:57 -msgid "Show temperature unit in panel and menu." -msgstr "Monstrar unidad de temperatura en panel y menú" - -#: ../src/prefs.js:61 -msgid "Display decimal value" -msgstr "Monstrar el valor decimal" - -#: ../src/prefs.js:62 -msgid "Show one digit after decimal." -msgstr "Monstrar un dígito después del decimal" - -#: ../src/prefs.js:66 -msgid "Display drive temperature" -msgstr "Monstrar la temperatura de disco duro" - -#: ../src/prefs.js:70 -msgid "Display fan speed" -msgstr "Monstrar velocidad del ventilador" - -#: ../src/prefs.js:74 -msgid "Display power supply voltage" -msgstr "Monstrar voltaje de la fuente de poder" - -#: ../src/prefs.js:129 -msgid "Sensor in panel" -msgstr "Sensor en panel" - -#: ../src/prefs.js:133 -msgid "Display sensor label" -msgstr "Monstrar etiquetas del sensores" - -#: ../src/utilities.js:157 -#, c-format -msgid "Drive %s" -msgstr "Disco %s" diff --git a/po/fr.po b/po/fr.po deleted file mode 100644 index a02cbbc..0000000 --- a/po/fr.po +++ /dev/null @@ -1,120 +0,0 @@ -# French translation for gnome-shell-extension-sensors package -# Copyright (C) 2014 THE gnome-shell-extension-sensors'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gnome-shell-extension-sensors package. -# Pablo Martin-Gomez , 2014 - -msgid "" -msgstr "" -"Project-Id-Version: gnome-shell-extension-sensors\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-05-25 18:09+0200\n" -"PO-Revision-Date: 2014-01-24 22:57+0100\n" -"Last-Translator: Pablo Martin-Gomez \n" -"Language-Team: French\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.5.4\n" -"Language: fr\n" - -#. Add average and maximum entries -#: ../src/extension.js:153 ../src/prefs.js:102 -msgid "Average" -msgstr "Moyenne" - -#: ../src/extension.js:154 ../src/prefs.js:103 -msgid "Maximum" -msgstr "Maximum" - -#: ../src/extension.js:161 -#, c-format -msgid "%drpm" -msgstr "%d tr/min" - -#: ../src/extension.js:167 -#, c-format -msgid "%s%.2fV" -msgstr "" - -#: ../src/extension.js:170 -msgid "N/A" -msgstr "" - -#: ../src/extension.js:185 -msgid "Error" -msgstr "Erreur" - -#: ../src/extension.js:189 -msgid "Please run sensors-detect as root." -msgstr "Veuillez exécuter sensors-detect en tant que root." - -#: ../src/extension.js:190 -msgid "Please install lm_sensors." -msgstr "Veuillez installer lm_sensors." - -#: ../src/extension.js:190 -msgid "If this doesn't help, click here to report with your sensors output!" -msgstr "" -"Si cela n’aide pas, cliquez ici pour envoyer un rapport avec la sortie de " -"vos capteurs !" - -#: ../src/extension.js:204 -msgid "Sensors Settings" -msgstr "Paramètres des capteurs" - -#: ../src/prefs.js:33 -msgid "Poll sensors every (in seconds)" -msgstr "Interroge les capteurs toutes les (en secondes)" - -#: ../src/prefs.js:41 -msgid "Temperature unit" -msgstr "Unité de température" - -#: ../src/prefs.js:42 -msgid "Centigrade" -msgstr "Centigrade" - -#: ../src/prefs.js:43 -msgid "Fahrenheit" -msgstr "Fahrenheit" - -#: ../src/prefs.js:56 -msgid "Display temperature unit" -msgstr "Afficher l’unité de température" - -#: ../src/prefs.js:57 -msgid "Show temperature unit in panel and menu." -msgstr "Affiche l’unité de température sur le panel et dans le menu." - -#: ../src/prefs.js:61 -msgid "Display decimal value" -msgstr "Afficher les valeurs décimales" - -#: ../src/prefs.js:62 -msgid "Show one digit after decimal." -msgstr "Affiche un chiffre après la virgule." - -#: ../src/prefs.js:66 -msgid "Display drive temperature" -msgstr "Afficher la température du disque" - -#: ../src/prefs.js:70 -msgid "Display fan speed" -msgstr "Afficher la vitesse du ventilateur" - -#: ../src/prefs.js:74 -msgid "Display power supply voltage" -msgstr "Afficher la tension de l'alimentation" - -#: ../src/prefs.js:129 -msgid "Sensor in panel" -msgstr "Capteur sur le panel" - -#: ../src/prefs.js:133 -msgid "Display sensor label" -msgstr "Afficher l’étiquette du capteur" - -#: ../src/utilities.js:157 -#, c-format -msgid "Drive %s" -msgstr "Disque %s" diff --git a/po/gnome-shell-extension-sensors.pot b/po/gnome-shell-extension-sensors.pot deleted file mode 100644 index 637e0a7..0000000 --- a/po/gnome-shell-extension-sensors.pot +++ /dev/null @@ -1,118 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-05-25 18:09+0200\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" - -#. Add average and maximum entries -#: ../src/extension.js:153 ../src/prefs.js:102 -msgid "Average" -msgstr "" - -#: ../src/extension.js:154 ../src/prefs.js:103 -msgid "Maximum" -msgstr "" - -#: ../src/extension.js:161 -#, c-format -msgid "%drpm" -msgstr "" - -#: ../src/extension.js:167 -#, c-format -msgid "%s%.2fV" -msgstr "" - -#: ../src/extension.js:170 -msgid "N/A" -msgstr "" - -#: ../src/extension.js:185 -msgid "Error" -msgstr "" - -#: ../src/extension.js:189 -msgid "Please run sensors-detect as root." -msgstr "" - -#: ../src/extension.js:190 -msgid "Please install lm_sensors." -msgstr "" - -#: ../src/extension.js:190 -msgid "If this doesn't help, click here to report with your sensors output!" -msgstr "" - -#: ../src/extension.js:204 -msgid "Sensors Settings" -msgstr "" - -#: ../src/prefs.js:33 -msgid "Poll sensors every (in seconds)" -msgstr "" - -#: ../src/prefs.js:41 -msgid "Temperature unit" -msgstr "" - -#: ../src/prefs.js:42 -msgid "Centigrade" -msgstr "" - -#: ../src/prefs.js:43 -msgid "Fahrenheit" -msgstr "" - -#: ../src/prefs.js:56 -msgid "Display temperature unit" -msgstr "" - -#: ../src/prefs.js:57 -msgid "Show temperature unit in panel and menu." -msgstr "" - -#: ../src/prefs.js:61 -msgid "Display decimal value" -msgstr "" - -#: ../src/prefs.js:62 -msgid "Show one digit after decimal." -msgstr "" - -#: ../src/prefs.js:66 -msgid "Display drive temperature" -msgstr "" - -#: ../src/prefs.js:70 -msgid "Display fan speed" -msgstr "" - -#: ../src/prefs.js:74 -msgid "Display power supply voltage" -msgstr "" - -#: ../src/prefs.js:129 -msgid "Sensor in panel" -msgstr "" - -#: ../src/prefs.js:133 -msgid "Display sensor label" -msgstr "" - -#: ../src/utilities.js:157 -#, c-format -msgid "Drive %s" -msgstr "" diff --git a/po/it.po b/po/it.po deleted file mode 100644 index 407f4fd..0000000 --- a/po/it.po +++ /dev/null @@ -1,121 +0,0 @@ -# Spanish translations for gnome-shell-extension-sensors package -# Spanish messages for gnome-shell-extension-sensors. -# Copyright (C) 2013 THE gnome-shell-extension-sensors'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gnome-shell-extension-sensors package. -# Marcel Metz , 2013. -# -msgid "" -msgstr "" -"Project-Id-Version: gnome-shell-extension-sensors 1.3\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-05-25 18:09+0200\n" -"PO-Revision-Date: 2013-05-28 09:01+0100\n" -"Last-Translator: Alessandro Casale \n" -"Language-Team: Italian\n" -"Language: it\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#. Add average and maximum entries -#: ../src/extension.js:153 ../src/prefs.js:102 -msgid "Average" -msgstr "Media" - -#: ../src/extension.js:154 ../src/prefs.js:103 -msgid "Maximum" -msgstr "Massima" - -#: ../src/extension.js:161 -#, c-format -msgid "%drpm" -msgstr "" - -#: ../src/extension.js:167 -#, c-format -msgid "%s%.2fV" -msgstr "" - -#: ../src/extension.js:170 -msgid "N/A" -msgstr "" - -#: ../src/extension.js:185 -msgid "Error" -msgstr "Errore" - -#: ../src/extension.js:189 -msgid "Please run sensors-detect as root." -msgstr "Lanciare sensors-detect come utente root." - -#: ../src/extension.js:190 -msgid "Please install lm_sensors." -msgstr "Installare pacchetto lm-sensors." - -#: ../src/extension.js:190 -msgid "If this doesn't help, click here to report with your sensors output!" -msgstr "" -" In caso di problemi, premi qui per inviare un report con l'output dei " -"sensori!" - -#: ../src/extension.js:204 -msgid "Sensors Settings" -msgstr "Impostazioni sensori" - -#: ../src/prefs.js:33 -msgid "Poll sensors every (in seconds)" -msgstr "Controlla sensori ogni (in secondi)" - -#: ../src/prefs.js:41 -msgid "Temperature unit" -msgstr "Unità di temperatura" - -#: ../src/prefs.js:42 -msgid "Centigrade" -msgstr "Centigradi" - -#: ../src/prefs.js:43 -msgid "Fahrenheit" -msgstr "Fahrenheit" - -#: ../src/prefs.js:56 -msgid "Display temperature unit" -msgstr "Visualizza unità di temperatura" - -#: ../src/prefs.js:57 -msgid "Show temperature unit in panel and menu." -msgstr "Visualizza unità di temperatura nel pannello e nel menu." - -#: ../src/prefs.js:61 -msgid "Display decimal value" -msgstr "Visualizza cifra decimale" - -#: ../src/prefs.js:62 -msgid "Show one digit after decimal." -msgstr "Visualizza una cifra dopo la virgola" - -#: ../src/prefs.js:66 -msgid "Display drive temperature" -msgstr "Visualizza temperatura degli hard disk" - -#: ../src/prefs.js:70 -msgid "Display fan speed" -msgstr "Visualizza velocità delle ventole" - -#: ../src/prefs.js:74 -msgid "Display power supply voltage" -msgstr "Visualizza tensioni di alimentazione" - -#: ../src/prefs.js:129 -msgid "Sensor in panel" -msgstr "Sensore sul pannello" - -#: ../src/prefs.js:133 -msgid "Display sensor label" -msgstr "Visualizza etichetta" - -#: ../src/utilities.js:157 -#, c-format -msgid "Drive %s" -msgstr "Disco %s" diff --git a/po/tr.po b/po/tr.po deleted file mode 100644 index d871ae7..0000000 --- a/po/tr.po +++ /dev/null @@ -1,119 +0,0 @@ -# Turkish translation for gnome-shell-extension-sersors package. -# Copyright (C) 2013 gnome-shell-extension-sensors'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gnome-shell-extension-sensors package. -# Osman Karagöz , 2013. -# -msgid "" -msgstr "" -"Project-Id-Version: 1.3\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-05-25 18:09+0200\n" -"PO-Revision-Date: 2013-06-12 16:11+0300\n" -"Last-Translator: Osman Karagöz \n" -"Language-Team: Turkish <>\n" -"Language: tr\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Gtranslator 2.91.6\n" - -#. Add average and maximum entries -#: ../src/extension.js:153 ../src/prefs.js:102 -msgid "Average" -msgstr "Ortalama" - -#: ../src/extension.js:154 ../src/prefs.js:103 -msgid "Maximum" -msgstr "En Yüksek" - -#: ../src/extension.js:161 -#, c-format -msgid "%drpm" -msgstr "%drpm" - -#: ../src/extension.js:167 -#, c-format -msgid "%s%.2fV" -msgstr "%s%.2fV" - -#: ../src/extension.js:170 -msgid "N/A" -msgstr "YOK" - -#: ../src/extension.js:185 -msgid "Error" -msgstr "Hata" - -#: ../src/extension.js:189 -msgid "Please run sensors-detect as root." -msgstr "Lütfen sensors-detect komutunu root olarak çalıştırın." - -#: ../src/extension.js:190 -msgid "Please install lm_sensors." -msgstr "Lütfen lm_sensors paketini kurun." - -#: ../src/extension.js:190 -msgid "If this doesn't help, click here to report with your sensors output!" -msgstr "Eğer bu yardımcı olmazsa buraya tıklayıp sensors çıktınızı rapor edin!" - -#: ../src/extension.js:204 -msgid "Sensors Settings" -msgstr "Sensors Ayarları" - -#: ../src/prefs.js:33 -msgid "Poll sensors every (in seconds)" -msgstr "Güncelleme sıklığı (saniye olarak)" - -#: ../src/prefs.js:41 -msgid "Temperature unit" -msgstr "Sıcaklık birimi" - -#: ../src/prefs.js:42 -msgid "Centigrade" -msgstr "Santigrad" - -#: ../src/prefs.js:43 -msgid "Fahrenheit" -msgstr "Fahrenhayt" - -#: ../src/prefs.js:56 -msgid "Display temperature unit" -msgstr "Sıcaklık birimini göster" - -#: ../src/prefs.js:57 -msgid "Show temperature unit in panel and menu." -msgstr "Penalde ve menüde sıcaklık birimini göster." - -#: ../src/prefs.js:61 -msgid "Display decimal value" -msgstr "Ondalık birim göster" - -#: ../src/prefs.js:62 -msgid "Show one digit after decimal." -msgstr "Ondalık noktasından sonra bir sayı gösterir." - -#: ../src/prefs.js:66 -msgid "Display drive temperature" -msgstr "Sürücü sıcaklığını göster" - -#: ../src/prefs.js:70 -msgid "Display fan speed" -msgstr "Fan hızını göster" - -#: ../src/prefs.js:74 -msgid "Display power supply voltage" -msgstr "Güç kaynağı potansiyel farkını göster" - -#: ../src/prefs.js:129 -msgid "Sensor in panel" -msgstr "Paneldeki sensör" - -#: ../src/prefs.js:133 -msgid "Display sensor label" -msgstr "Sensör etiketini göster" - -#: ../src/utilities.js:157 -#, c-format -msgid "Drive %s" -msgstr "Sürücü %s" diff --git a/po/zh_CN.po b/po/zh_CN.po deleted file mode 100644 index 6c753a0..0000000 --- a/po/zh_CN.po +++ /dev/null @@ -1,120 +0,0 @@ -# German translations for gnome-shell-extension-sensors package -# German messages for gnome-shell-extension-sensors. -# Copyright (C) 2013 THE gnome-shell-extension-sensors'S COPYRIGHT HOLDER -# This file is distributed under the same license as the gnome-shell-extension-sensors package. -# Marcel Metz , 2013. -# -msgid "" -msgstr "" -"Project-Id-Version: gnome-shell-extension-sensors 1.3\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2013-05-25 18:09+0200\n" -"PO-Revision-Date: 2013-11-30 21:46+0800\n" -"Last-Translator: Marcel Metz \n" -"Language-Team: Chinese \n" -"Language: zh_CN\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 1.5.7\n" - -#. Add average and maximum entries -#: ../src/extension.js:153 ../src/prefs.js:102 -msgid "Average" -msgstr "平均值" - -#: ../src/extension.js:154 ../src/prefs.js:103 -msgid "Maximum" -msgstr "最大值" - -#: ../src/extension.js:161 -#, c-format -msgid "%drpm" -msgstr "" - -#: ../src/extension.js:167 -#, c-format -msgid "%s%.2fV" -msgstr "" - -#: ../src/extension.js:170 -msgid "N/A" -msgstr "不可用" - -#: ../src/extension.js:185 -msgid "Error" -msgstr "错误" - -#: ../src/extension.js:189 -msgid "Please run sensors-detect as root." -msgstr "请以管理员权限运行sensors-detect." - -#: ../src/extension.js:190 -msgid "Please install lm_sensors." -msgstr "请安装lm_sensors." - -#: ../src/extension.js:190 -msgid "If this doesn't help, click here to report with your sensors output!" -msgstr "如果这没有帮助,请点击这里反馈您的传感器输出信息!" - -#: ../src/extension.js:204 -msgid "Sensors Settings" -msgstr "传感器的设置" - -#: ../src/prefs.js:33 -msgid "Poll sensors every (in seconds)" -msgstr "检测传感器的频率(以秒为单位)" - -#: ../src/prefs.js:41 -msgid "Temperature unit" -msgstr "温度单位" - -#: ../src/prefs.js:42 -msgid "Centigrade" -msgstr "摄氏温度" - -#: ../src/prefs.js:43 -msgid "Fahrenheit" -msgstr "华氏温度" - -#: ../src/prefs.js:56 -msgid "Display temperature unit" -msgstr "显示温度单位" - -#: ../src/prefs.js:57 -msgid "Show temperature unit in panel and menu." -msgstr "在面板和菜单中显示温度单位." - -#: ../src/prefs.js:61 -msgid "Display decimal value" -msgstr "显示十进制值" - -#: ../src/prefs.js:62 -msgid "Show one digit after decimal." -msgstr "显示小数点后一位数." - -#: ../src/prefs.js:66 -msgid "Display drive temperature" -msgstr "显示驱动温度" - -#: ../src/prefs.js:70 -msgid "Display fan speed" -msgstr "显示风扇转速" - -#: ../src/prefs.js:74 -msgid "Display power supply voltage" -msgstr "显示电源电压" - -#: ../src/prefs.js:129 -msgid "Sensor in panel" -msgstr "传感器面板" - -#: ../src/prefs.js:133 -msgid "Display sensor label" -msgstr "显示传感器标签" - -#: ../src/utilities.js:157 -#, c-format -msgid "Drive %s" -msgstr "驱动器 %s" diff --git a/src/Makefile.am b/src/Makefile.am deleted file mode 100644 index ba82226..0000000 --- a/src/Makefile.am +++ /dev/null @@ -1,10 +0,0 @@ -# Change these to modify how installation is performed -topextensiondir = $(datadir)/gnome-shell/extensions - -uuid = temperature@xtranophilist - -extensiondir = $(topextensiondir)/$(uuid) - -dist_extension_DATA = extension.js convenience.js prefs.js utilities.js - -nodist_extension_DATA = $(EXTRA_EXTENSION) From 4f069f7ab8685efa1a1036ce23f0485ce849a249 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 12 Jun 2014 14:32:49 +0400 Subject: [PATCH 002/224] Fix problem with D-Bus proxy xml --- .../utilities.js | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/utilities.js b/freon@UshakovVasilii_Github.yahoo.com/utilities.js index 4240159..9659477 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/utilities.js +++ b/freon@UshakovVasilii_Github.yahoo.com/utilities.js @@ -7,18 +7,18 @@ const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); const _ = Gettext.gettext; const UDisksDriveProxy = Gio.DBusProxy.makeProxyWrapper( - - - - -); +''\ +' '\ +' '\ +' '\ +''); const UDisksDriveAtaProxy = Gio.DBusProxy.makeProxyWrapper( - - - - -); +''\ +' '\ +' '\ +' '\ +''); function detectSensors() { let path = GLib.find_program_in_path('sensors'); From 969a64533c05dd5725c3114bd42f13a5dbf187b9 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 12 Jun 2014 14:35:56 +0400 Subject: [PATCH 003/224] Fix problem wit multiple disk --- freon@UshakovVasilii_Github.yahoo.com/utilities.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/utilities.js b/freon@UshakovVasilii_Github.yahoo.com/utilities.js index 9659477..33e6a48 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/utilities.js +++ b/freon@UshakovVasilii_Github.yahoo.com/utilities.js @@ -163,20 +163,16 @@ function parseVoltageLine(label, value) { function parseHddTempOutput(txt, sep) { let hddtemp_output = []; - if (txt.indexOf((sep+sep), txt.length - (sep+sep).length) >= 0) - { + if (txt.indexOf(sep+sep) > 0) { hddtemp_output = txt.split(sep+sep); - } - else - { + } else { hddtemp_output = txt.split("\n"); } hddtemp_output = hddtemp_output.filter(function(e){ return e; }); let sensors = new Array(); - for each(let line in hddtemp_output) - { + for each(let line in hddtemp_output) { let sensor = new Array(); let fields = line.split(sep).filter(function(e){ return e; }); sensor['label'] = _("Drive %s").format(fields[0].split('/').pop()); From 469d6d24f2b146b6bd92a81360bf0fa8075ad5e0 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 12 Jun 2014 14:40:05 +0400 Subject: [PATCH 004/224] Fix problem with setting page --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 12 +++--------- freon@UshakovVasilii_Github.yahoo.com/prefs.js | 2 +- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 626f139..02991a6 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -189,9 +189,6 @@ const SensorsMenuButton = new Lang.Class({ section.addMenuItem(item); } - let _appSys = Shell.AppSystem.get_default(); - let _gsmPrefs = _appSys.lookup_app('gnome-shell-extension-prefs.desktop'); - // separator section.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); @@ -200,14 +197,11 @@ const SensorsMenuButton = new Lang.Class({ // Label to switch columns and not totally break the layout. item.actor.add(new St.Label({ text: '' })); item.actor.add(new St.Label({ text: _("Sensors Settings") })); + item.connect('activate', function () { - if (_gsmPrefs.get_state() == _gsmPrefs.SHELL_APP_STATE_RUNNING){ - _gsmPrefs.activate(); - } else { - _gsmPrefs.launch(global.display.get_current_time_roundtrip(), - [metadata.uuid],-1,null); - } + Util.spawn(["gnome-shell-extension-prefs", metadata.uuid]); }); + section.addMenuItem(item); }else{ this.statusLabel.set_text(_("Error")); diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 2ba004b..0e79637 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -77,7 +77,7 @@ const SensorsPrefsWidget = new GObject.Class({ let counter = 3; - for (boolSetting in boolSettings){ + for (let boolSetting in boolSettings) { let setting = boolSettings[boolSetting]; let settingLabel = new Gtk.Label({ label: setting.label }); let settingSwitch = new Gtk.Switch({active: this._settings.get_boolean(setting.name)}); From f5055c948f74021fa197b3fee66eb7dbdaebc206 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 12 Jun 2014 15:42:11 +0400 Subject: [PATCH 005/224] Fix some problems, rename objects --- .../convenience.js | 40 +++++++----- .../extension.js | 61 +++++++++++------- .../metadata.json | 2 +- .../prefs.js | 8 +-- .../schemas/gschemas.compiled | Bin 0 -> 740 bytes ...gnome.shell.extensions.sensors.gschema.xml | 2 +- .../utilities.js | 20 +++--- 7 files changed, 78 insertions(+), 55 deletions(-) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled diff --git a/freon@UshakovVasilii_Github.yahoo.com/convenience.js b/freon@UshakovVasilii_Github.yahoo.com/convenience.js index b24f16e..bbc8608 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/convenience.js +++ b/freon@UshakovVasilii_Github.yahoo.com/convenience.js @@ -1,8 +1,32 @@ /* -*- mode: js; js-basic-offset: 4; indent-tabs-mode: nil -*- */ +/* + Copyright (c) 2011-2012, Giovanni Campagna + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the GNOME nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ const Gettext = imports.gettext; const Gio = imports.gi.Gio; -const Gtk = imports.gi.Gtk; const Config = imports.misc.config; const ExtensionUtils = imports.misc.extensionUtils; @@ -30,20 +54,6 @@ function initTranslations(domain) { Gettext.bindtextdomain(domain, Config.LOCALEDIR); } -/** - * initIcons: - * - * Initialize Gtk to load icons from extensionsdir/icons. - */ -function initIcons() { - let extension = ExtensionUtils.getCurrentExtension(); - - let theme = Gtk.IconTheme.get_default(); - let iconDir = extension.dir.get_child('icons'); - if(iconDir.query_exists(null)) - theme.append_search_path(iconDir.get_path()); -} - /** * getSettings: * @schema: (optional): the GSettings schema id diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 02991a6..c6f7198 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -5,22 +5,23 @@ const PopupMenu = imports.ui.popupMenu; const Main = imports.ui.main; const Util = imports.misc.util; const Mainloop = imports.mainloop; +const Shell = imports.gi.Shell; +const Clutter = imports.gi.Clutter; +const Gio = imports.gi.Gio; + const Me = imports.misc.extensionUtils.getCurrentExtension(); const Convenience = Me.imports.convenience; -const Shell = imports.gi.Shell; const Utilities = Me.imports.utilities; const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); const _ = Gettext.gettext; -const Clutter = imports.gi.Clutter; let settings; -let metadata = Me.metadata; -const SensorsItem = new Lang.Class({ - Name: 'SensorsItem', +const FreonItem = new Lang.Class({ + Name: 'FreonItem', Extends: PopupMenu.PopupBaseMenuItem, - _init: function(type, label, value) { + _init: function(gIcon, label, value) { this.parent(); this.connect('activate', function () { settings.set_string('main-sensor', label); @@ -28,7 +29,7 @@ const SensorsItem = new Lang.Class({ this._label = label; this._value = value; - this.actor.add(new St.Icon({ style_class: 'system-status-icon', icon_name: 'sensors-'+type+'-symbolic' })); + this.actor.add(new St.Icon({ style_class: 'system-status-icon', gicon : gIcon})); this.actor.add(new St.Label({text: label})); this.actor.add(new St.Label({text: value}), {align: St.Align.END}); }, @@ -49,8 +50,8 @@ const SensorsItem = new Lang.Class({ }, }); -const SensorsMenuButton = new Lang.Class({ - Name: 'SensorsMenuButton', +const FreonMenuButton = new Lang.Class({ + Name: 'FreonMenuButton', Extends: PanelMenu.Button, @@ -60,6 +61,10 @@ const SensorsMenuButton = new Lang.Class({ this._sensorsOutput = ''; this._hddtempOutput = ''; + this._temperatureGIcon = Gio.icon_new_for_string(Me.path + '/icons/sensors-temperature-symbolic.svg'); + this._voltageGIcon = Gio.icon_new_for_string(Me.path + '/icons/sensors-voltage-symbolic.svg'); + this._fanGIcon = Gio.icon_new_for_string(Me.path + '/icons/sensors-fan-symbolic.svg'); + this.statusLabel = new St.Label({ text: '\u2026', y_expand: true, y_align: Clutter.ActorAlign.CENTER }); this.menu.removeAll(); @@ -91,6 +96,15 @@ const SensorsMenuButton = new Lang.Class({ }, _onDestroy: function(){ + for each (let proxy in this.udisksProxies){ + if(proxy.drive){ + proxy.drive.run_dispose(); + } + if(proxy.ata){ + proxy.ata.run_dispose(); + } + } + Mainloop.source_remove(this._eventLoop); this.menu.removeAll(); settings.disconnect(this._settingsChanged); @@ -152,33 +166,33 @@ const SensorsMenuButton = new Lang.Class({ if (temp['temp'] > max) max = temp['temp']; - sensorsList.push(new SensorsItem('temperature', temp['label'], this._formatTemp(temp['temp']))); + sensorsList.push(new FreonItem(this._temperatureGIcon, temp['label'], this._formatTemp(temp['temp']))); } if (tempInfo.length > 0){ sensorsList.push(new PopupMenu.PopupSeparatorMenuItem()); // Add average and maximum entries - sensorsList.push(new SensorsItem('temperature', _("Average"), this._formatTemp(sum/tempInfo.length))); - sensorsList.push(new SensorsItem('temperature', _("Maximum"), this._formatTemp(max))); + sensorsList.push(new FreonItem(this._temperatureGIcon, _("Average"), this._formatTemp(sum/tempInfo.length))); + sensorsList.push(new FreonItem(this._temperatureGIcon, _("Maximum"), this._formatTemp(max))); if(fanInfo.length > 0 || voltageInfo.length > 0) sensorsList.push(new PopupMenu.PopupSeparatorMenuItem()); } for each (let fan in fanInfo){ - sensorsList.push(new SensorsItem('fan', fan['label'], _("%drpm").format(fan['rpm']))); + sensorsList.push(new FreonItem(this._fanGIcon, fan['label'], _("%drpm").format(fan['rpm']))); } if (fanInfo.length > 0 && voltageInfo.length > 0){ sensorsList.push(new PopupMenu.PopupSeparatorMenuItem()); } for each (let voltage in voltageInfo){ - sensorsList.push(new SensorsItem('voltage', voltage['label'], _("%s%.2fV").format(((voltage['volt'] >= 0) ? '+' : '-'), voltage['volt']))); + sensorsList.push(new FreonItem(this._voltageGIcon, voltage['label'], _("%s%.2fV").format(((voltage['volt'] >= 0) ? '+' : '-'), voltage['volt']))); } this.statusLabel.set_text(_("N/A")); // Just in case for each (let item in sensorsList) { - if(item instanceof SensorsItem) { + if(item instanceof FreonItem) { if (settings.get_string('main-sensor') == item.getLabel()) { // Configure as main sensor and set panel string @@ -199,11 +213,11 @@ const SensorsMenuButton = new Lang.Class({ item.actor.add(new St.Label({ text: _("Sensors Settings") })); item.connect('activate', function () { - Util.spawn(["gnome-shell-extension-prefs", metadata.uuid]); + Util.spawn(["gnome-shell-extension-prefs", Me.metadata.uuid]); }); section.addMenuItem(item); - }else{ + } else { this.statusLabel.set_text(_("Error")); let item = new PopupMenu.PopupMenuItem( @@ -212,7 +226,7 @@ const SensorsMenuButton = new Lang.Class({ : _("Please install lm_sensors.")) + "\n" + _("If this doesn\'t help, click here to report with your sensors output!") ); item.connect('activate',function() { - Util.spawn(["xdg-open", "http://github.com/xtranophilist/gnome-shell-extension-sensors/issues/"]); + Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/issues"]); }); section.addMenuItem(item); } @@ -240,20 +254,19 @@ const SensorsMenuButton = new Lang.Class({ } }); -let sensorsMenu; +let freonMenu; function init(extensionMeta) { Convenience.initTranslations(); - Convenience.initIcons(); settings = Convenience.getSettings(); } function enable() { - sensorsMenu = new SensorsMenuButton(); - Main.panel.addToStatusArea('sensorsMenu', sensorsMenu, 1, 'right'); + freonMenu = new FreonMenuButton(); + Main.panel.addToStatusArea('freonMenu', freonMenu, 1, 'right'); } function disable() { - sensorsMenu.destroy(); - sensorsMenu = null; + freonMenu.destroy(); + freonMenu = null; } diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index 72921a5..04fa658 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": ["3.10","3.12"], + "shell-version": ["3.12"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", "description": "Shows CPU temperature, HDD temperature, voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 0e79637..2a76d59 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -19,9 +19,9 @@ function init() { Convenience.initTranslations(); } -const SensorsPrefsWidget = new GObject.Class({ - Name: 'Sensors.Prefs.Widget', - GTypeName: 'SensorsPrefsWidget', +const FreonPrefsWidget = new GObject.Class({ + Name: 'Freon.Prefs.Widget', + GTypeName: 'FreonPrefsWidget', Extends: Gtk.Grid, _init: function(params) { @@ -239,7 +239,7 @@ const SensorsPrefsWidget = new GObject.Class({ }); function buildPrefsWidget() { - let widget = new SensorsPrefsWidget(); + let widget = new FreonPrefsWidget(); widget.show_all(); return widget; } diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled new file mode 100644 index 0000000000000000000000000000000000000000..d77ef40204a5923243194e1c5d4276e70fe4e2c4 GIT binary patch literal 740 zcmYk4&npCB7{{N*5}PO~P9$ZOnc*O3IdE84ad3Foyk_5;d1rcOc3Xw~7m9-uty~o; z+b*=ISSdltWo)NCZ2a11J_@XL(o)7xBk1IVRr4=hr zr~3p#X)DHe4$X2y8sT*|sYk9zq?M>Z;{A9FHETyAsUbRO6en#ICv6nxuTh+|Q5>Q; ezjq__lXTPU-Z^*WjtYctHH2Tsk)45iX6Xkc1DjI- literal 0 HcmV?d00001 diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml index a02bd82..7077ec4 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml +++ b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml @@ -1,7 +1,7 @@ - + 15 diff --git a/freon@UshakovVasilii_Github.yahoo.com/utilities.js b/freon@UshakovVasilii_Github.yahoo.com/utilities.js index 33e6a48..846b68f 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/utilities.js +++ b/freon@UshakovVasilii_Github.yahoo.com/utilities.js @@ -7,18 +7,18 @@ const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); const _ = Gettext.gettext; const UDisksDriveProxy = Gio.DBusProxy.makeProxyWrapper( -''\ -' '\ -' '\ -' '\ -''); +' \ + \ + \ + \ +'); const UDisksDriveAtaProxy = Gio.DBusProxy.makeProxyWrapper( -''\ -' '\ -' '\ -' '\ -''); +' \ + \ + \ + \ +'); function detectSensors() { let path = GLib.find_program_in_path('sensors'); From f502a268d14db8ecfe2ca507ca946a68542d94d4 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 12 Jun 2014 16:23:33 +0400 Subject: [PATCH 006/224] Improve UpdateTime prefs --- freon@UshakovVasilii_Github.yahoo.com/prefs.js | 15 ++++----------- .../schemas/gschemas.compiled | Bin 740 -> 740 bytes ...g.gnome.shell.extensions.sensors.gschema.xml | 4 ++-- 3 files changed, 6 insertions(+), 13 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 2a76d59..cea3c06 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -30,13 +30,10 @@ const FreonPrefsWidget = new GObject.Class({ this._settings = Convenience.getSettings(); - this.attach(new Gtk.Label({ label: _("Poll sensors every (in seconds)") }), 0, 0, 1, 1); - let update_time = Gtk.Scale.new_with_range(Gtk.Orientation.HORIZONTAL, 5, 100, 5); - update_time.set_value(this._settings.get_int('update-time')); - update_time.set_digits(0); - update_time.set_hexpand(true); - update_time.connect('value-changed', Lang.bind(this, this._onUpdateTimeChanged)); - this.attach(update_time, 1, 0, 1, 1); + this.attach(new Gtk.Label({ label: _('Poll sensors every (in seconds)'), halign : Gtk.Align.END}), 0, 0, 1, 1); + let updateTime = Gtk.SpinButton.new_with_range (1, 60, 1); + this.attach(updateTime, 1, 0, 1, 1); + this._settings.bind('update-time', updateTime, 'value', Gio.SettingsBindFlags.DEFAULT); this.attach(new Gtk.Label({ label: _("Temperature unit") }), 0, 2, 1, 1); let centigradeRadio = new Gtk.RadioButton({ group: null, label: _("Centigrade"), valign: Gtk.Align.START }); @@ -217,10 +214,6 @@ const FreonPrefsWidget = new GObject.Class({ return iter; }, - _onUpdateTimeChanged: function (update_time) { - this._settings.set_int('update-time', update_time.get_value()); - }, - _onUnitChanged: function (unit) { if (unit.get_active()) { this._settings.set_string('unit', unit.label); diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled index d77ef40204a5923243194e1c5d4276e70fe4e2c4..6cbd46c2e9f13ec4c481d9c1396682807d747a8f 100644 GIT binary patch delta 13 UcmaFD`h;~u0TUzZbN~PV delta 13 UcmaFD`h;~u0TUzt - 15 + 5 Seconds before next update - This is the seconds after CPU temperature extension updates the data from the syetem. The default is 15. + This is the seconds after CPU temperature extension updates the data from the syetem From e0fceeb72473abd106d1dd4878f3fb89d1aad7fa Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 12 Jun 2014 17:02:36 +0400 Subject: [PATCH 007/224] Improve preference --- .../prefs.js | 96 ++++++++----------- 1 file changed, 39 insertions(+), 57 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index cea3c06..338689c 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -30,12 +30,14 @@ const FreonPrefsWidget = new GObject.Class({ this._settings = Convenience.getSettings(); - this.attach(new Gtk.Label({ label: _('Poll sensors every (in seconds)'), halign : Gtk.Align.END}), 0, 0, 1, 1); + let i = 0; + + this.attach(new Gtk.Label({ label: _('Poll sensors every (sec)'), halign : Gtk.Align.END}), 0, i, 1, 1); let updateTime = Gtk.SpinButton.new_with_range (1, 60, 1); - this.attach(updateTime, 1, 0, 1, 1); + this.attach(updateTime, 1, i++, 1, 1); this._settings.bind('update-time', updateTime, 'value', Gio.SettingsBindFlags.DEFAULT); - this.attach(new Gtk.Label({ label: _("Temperature unit") }), 0, 2, 1, 1); + this.attach(new Gtk.Label({ label: _("Temperature unit"), halign : Gtk.Align.END}), 0, i, 1, 1); let centigradeRadio = new Gtk.RadioButton({ group: null, label: _("Centigrade"), valign: Gtk.Align.START }); let fahrenheitRadio = new Gtk.RadioButton({ group: centigradeRadio, label: _("Fahrenheit"), valign: Gtk.Align.START }); fahrenheitRadio.connect('toggled', Lang.bind(this, this._onUnitChanged)); @@ -44,54 +46,22 @@ const FreonPrefsWidget = new GObject.Class({ centigradeRadio.active = true; else fahrenheitRadio.active = true; - this.attach(centigradeRadio, 1, 2, 1, 1); - this.attach(fahrenheitRadio, 2, 2, 1, 1); - - let boolSettings = { - display_degree_sign: { - name: "display-degree-sign", - label: _("Display temperature unit"), - help: _("Show temperature unit in panel and menu.") - }, - display_decimal_value: { - name: "display-decimal-value", - label: _("Display decimal value"), - help: _("Show one digit after decimal.") - }, - show_hdd_temp: { - name: "display-hdd-temp", - label: _("Display drive temperature"), - }, - show_fan_rpm: { - name: "display-fan-rpm", - label: _("Display fan speed"), - }, - show_voltage: { - name: "display-voltage", - label: _("Display power supply voltage"), - }, - } - - let counter = 3; - - for (let boolSetting in boolSettings) { - let setting = boolSettings[boolSetting]; - let settingLabel = new Gtk.Label({ label: setting.label }); - let settingSwitch = new Gtk.Switch({active: this._settings.get_boolean(setting.name)}); - let settings = this._settings; - settingSwitch.connect('notify::active', function(button) { - settings.set_boolean(setting.name, button.active); - }); - - if (setting.help) { - settingLabel.set_tooltip_text(setting.help); - settingSwitch.set_tooltip_text(setting.help); - } - - this.attach(settingLabel, 0, counter, 1, 1); - this.attach(settingSwitch, 1, counter++, 1, 1); - - } + this.attach(centigradeRadio, 1, i, 1, 1); + this.attach(fahrenheitRadio, 2, i++, 1, 1); + + // Switches + this._addSwitch({key : 'display-degree-sign', y : i, x : 0, + label : _('Display temperature unit'), + help : _("Show temperature unit in panel and menu")}); + this._addSwitch({key : 'display-decimal-value', y : i++, x : 2, + label : _('Display decimal value'), + help : _("Show one digit after decimal")}); + this._addSwitch({key : 'display-hdd-temp', y : i, x : 0, + label : _('Display drive temperature')}); + this._addSwitch({key : 'display-fan-rpm', y : i++, x : 2, + label : _('Display fan speed')}); + this._addSwitch({key : 'display-voltage', y : i++, x : 0, + label : _('Display power supply voltage')}); //List of items of the ComboBox this._model = new Gtk.ListStore(); @@ -124,8 +94,8 @@ const FreonPrefsWidget = new GObject.Class({ this._sensorSelector.add_attribute(renderer, 'text', modelColumn.label); this._sensorSelector.connect('changed', Lang.bind(this, this._onSelectorChanged)); - this.attach(new Gtk.Label({ label: _("Sensor in panel") }), 0, ++counter, 1, 1); - this.attach(this._sensorSelector, 1, counter , 1, 1); + this.attach(new Gtk.Label({ label: _("Sensor in panel"), halign : Gtk.Align.END}), 0, ++i, 1, 1); + this.attach(this._sensorSelector, 1, i , 1, 1); let settings = this._settings; let checkButton = new Gtk.CheckButton({label: _("Display sensor label")}); @@ -133,7 +103,19 @@ const FreonPrefsWidget = new GObject.Class({ checkButton.connect('toggled', function () { settings.set_boolean('display-label', checkButton.get_active()); }); - this.attach(checkButton, 2, counter , 1, 1); + this.attach(checkButton, 2, i , 1, 1); + }, + + _addSwitch : function(params){ + let lbl = new Gtk.Label({label: params.label,halign : Gtk.Align.END}); + this.attach(lbl, params.x, params.y, 1, 1); + let sw = new Gtk.Switch({halign : Gtk.Align.END, valign : Gtk.Align.CENTER}); + this.attach(sw, params.x + 1, params.y, 1, 1); + if(params.help){ + lbl.set_tooltip_text(params.help); + sw.set_tooltip_text(params.help); + } + this._settings.bind(params.key, sw, 'active', Gio.SettingsBindFlags.DEFAULT); }, _comboBoxSeparator: function(model, iter, data) { @@ -232,7 +214,7 @@ const FreonPrefsWidget = new GObject.Class({ }); function buildPrefsWidget() { - let widget = new FreonPrefsWidget(); - widget.show_all(); - return widget; + let w = new FreonPrefsWidget(); + w.show_all(); + return w; } From 83a07dc23c05761a8d69684072f5179787dc833f Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 12 Jun 2014 17:23:11 +0400 Subject: [PATCH 008/224] Remove "display-degree-sign" property --- .../extension.js | 4 +--- freon@UshakovVasilii_Github.yahoo.com/prefs.js | 11 ++++------- .../schemas/gschemas.compiled | Bin 740 -> 684 bytes ...g.gnome.shell.extensions.sensors.gschema.xml | 6 ------ 4 files changed, 5 insertions(+), 16 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index c6f7198..1796104 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -247,9 +247,7 @@ const FreonMenuButton = new Lang.Class({ //ret = Math.round(value); format = '%d'; } - if (settings.get_boolean('display-degree-sign')) { - format += '%s'; - } + format += '%s'; return format.format(value, (settings.get_string('unit')=='Fahrenheit') ? "\u00b0F" : "\u00b0C"); } }); diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 338689c..1134424 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -50,17 +50,14 @@ const FreonPrefsWidget = new GObject.Class({ this.attach(fahrenheitRadio, 2, i++, 1, 1); // Switches - this._addSwitch({key : 'display-degree-sign', y : i, x : 0, - label : _('Display temperature unit'), - help : _("Show temperature unit in panel and menu")}); - this._addSwitch({key : 'display-decimal-value', y : i++, x : 2, + this._addSwitch({key : 'display-decimal-value', y : i, x : 0, label : _('Display decimal value'), help : _("Show one digit after decimal")}); - this._addSwitch({key : 'display-hdd-temp', y : i, x : 0, + this._addSwitch({key : 'display-hdd-temp', y : i++, x : 2, label : _('Display drive temperature')}); - this._addSwitch({key : 'display-fan-rpm', y : i++, x : 2, + this._addSwitch({key : 'display-fan-rpm', y : i, x : 0, label : _('Display fan speed')}); - this._addSwitch({key : 'display-voltage', y : i++, x : 0, + this._addSwitch({key : 'display-voltage', y : i++, x : 2, label : _('Display power supply voltage')}); //List of items of the ComboBox diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled index 6cbd46c2e9f13ec4c481d9c1396682807d747a8f..0cf5d41b9bb332a6692b843c32da1f5d6ffa2d59 100644 GIT binary patch literal 684 zcmZXSy-UMD7{;$^@e9#KsDmIP*n&xP5Ld-Pht8sd!_}PaL2?O6S`_^F7hFWqp-xiK zU2$@8cM;c)4le!$`aEev5f7d|Pk;Ab^Y*=LY{^JVlZfsrz_&ZO*q1^0?#0%8uDdrQ zHpKz*B|v^sh##z0T3ik3XoxrXJM?|~F-y)o3f_i)LD$W>U2^6LaDiU) z&`$gFk(_xPya1nuT6fR)i|}RW<@jWj|C>1vz6w{+>s0fI^~?j{A^a4&+F5Cl zGxPV);OCILR5>JPW}i23&JgY4d~YV42XHzY&c)Sn=*dINReRc(p4E_EU4dh)m69*D zv0}_Sh}Ie^l2z;!<5G5}=DJp*{E*c-)@K|0(pXXG|KpylD36p2^>!$eTIZXCi+0kB zcG8P>dKc}a7wrfU*Nx6zuyth;U5%vsx1~nlC25;!KlRX+iLw&yE4~k+s7th8vk#5F literal 740 zcmYk4KTE?<6vc1VDq2KA1f3KStY8uy#9174sH^DU@M@mvgXAT=q@{w2-$KyANvXIB ziXb>B_ziRsIyksE_zCpfG*KU%p3`66pPQGvx*?1bI-zWg!8bd(+?7N4_VLC{A$vAS zYt%%(1}KgaePg_(lPlDQzeAz%Y)^-QwBwreeOopYsbdxD*xofV)L33F;phM8!Ji`3 zo2d^z@K5B?Fy}l3PN=I0J&m93Gw0j`J`A6L zT9cn6|>i0`c%;(K#d9Qk6; zs=2O}$RH|ExjLJ}U7;-#1(=5Q;B~F?23V0gQJxX5#0QFhSNNhTeVz~cw~s45Bc&B9 zPpA6?LTM|;cMi>RLmJ_AHmOIhNTijhK&Ew5SbVb f#d+P0&`;7$v$}Kc${iI5-)acIjw3q*b!O=YAA6fg diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml index e0c4d32..f4e30b7 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml +++ b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml @@ -27,12 +27,6 @@ Select the sensor whose value has to be shown in the panel - - true - Show degree sign - Show degree sign in panel and menu - - false Show decimal value From 21eb3b144f3e7cf11f148aee34e32ce7a7a0e1e8 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 12 Jun 2014 17:58:48 +0400 Subject: [PATCH 009/224] Improve Temperature Unit prefs --- .../extension.js | 4 +- .../prefs.js | 52 ++++++++++-------- .../schemas/gschemas.compiled | Bin 684 -> 684 bytes ...gnome.shell.extensions.sensors.gschema.xml | 4 +- 4 files changed, 34 insertions(+), 26 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 1796104..3e706ea 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -239,7 +239,7 @@ const FreonMenuButton = new Lang.Class({ }, _formatTemp: function(value) { - if (settings.get_string('unit')=='Fahrenheit'){ + if (settings.get_string('unit')=='fahrenheit'){ value = this._toFahrenheit(value); } let format = '%.1f'; @@ -248,7 +248,7 @@ const FreonMenuButton = new Lang.Class({ format = '%d'; } format += '%s'; - return format.format(value, (settings.get_string('unit')=='Fahrenheit') ? "\u00b0F" : "\u00b0C"); + return format.format(value, (settings.get_string('unit')=='fahrenheit') ? "\u00b0F" : "\u00b0C"); } }); diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 1134424..d0fa2bd 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -34,31 +34,45 @@ const FreonPrefsWidget = new GObject.Class({ this.attach(new Gtk.Label({ label: _('Poll sensors every (sec)'), halign : Gtk.Align.END}), 0, i, 1, 1); let updateTime = Gtk.SpinButton.new_with_range (1, 60, 1); - this.attach(updateTime, 1, i++, 1, 1); + this.attach(updateTime, 1, i, 1, 1); this._settings.bind('update-time', updateTime, 'value', Gio.SettingsBindFlags.DEFAULT); - this.attach(new Gtk.Label({ label: _("Temperature unit"), halign : Gtk.Align.END}), 0, i, 1, 1); - let centigradeRadio = new Gtk.RadioButton({ group: null, label: _("Centigrade"), valign: Gtk.Align.START }); - let fahrenheitRadio = new Gtk.RadioButton({ group: centigradeRadio, label: _("Fahrenheit"), valign: Gtk.Align.START }); - fahrenheitRadio.connect('toggled', Lang.bind(this, this._onUnitChanged)); - centigradeRadio.connect('toggled', Lang.bind(this, this._onUnitChanged)); - if (this._settings.get_string('unit')=='Centigrade') - centigradeRadio.active = true; - else - fahrenheitRadio.active = true; - this.attach(centigradeRadio, 1, i, 1, 1); - this.attach(fahrenheitRadio, 2, i++, 1, 1); + // Temperature Unit ComboBox + let tUnitModel = new Gtk.ListStore(); + tUnitModel.set_column_types([GObject.TYPE_STRING, GObject.TYPE_STRING]); + + let tUnit = new Gtk.ComboBox({model: tUnitModel}); + let tUnitRenderer = new Gtk.CellRendererText(); + tUnit.pack_start(tUnitRenderer, true); + tUnit.add_attribute(tUnitRenderer, 'text', 1); + + let tUnitItems = ["centigrade", "fahrenheit"]; + + tUnitModel.set(tUnitModel.append(), [0, 1], [tUnitItems[0], "\u00b0C"]); + tUnitModel.set(tUnitModel.append(), [0, 1], [tUnitItems[1], "\u00b0F"]); + + tUnit.set_active(tUnitItems.indexOf(this._settings.get_string('unit'))); + + tUnit.connect('changed', Lang.bind(this, function(entry) { + let [success, iter] = tUnit.get_active_iter(); + if (!success) + return; + this._settings.set_string('unit', tUnitModel.get_value(iter, 0)) + })); + + this.attach(new Gtk.Label({ label: _('Temperature Unit'), halign : Gtk.Align.END}), 2, i, 1, 1); + this.attach(tUnit, 3, i++, 1, 1); // Switches this._addSwitch({key : 'display-decimal-value', y : i, x : 0, - label : _('Display decimal value'), + label : _('Show Decimal Value'), help : _("Show one digit after decimal")}); this._addSwitch({key : 'display-hdd-temp', y : i++, x : 2, - label : _('Display drive temperature')}); + label : _('Show Drive Temperature')}); this._addSwitch({key : 'display-fan-rpm', y : i, x : 0, - label : _('Display fan speed')}); + label : _('Show Fan Speed')}); this._addSwitch({key : 'display-voltage', y : i++, x : 2, - label : _('Display power supply voltage')}); + label : _('Show Power Supply Voltage')}); //List of items of the ComboBox this._model = new Gtk.ListStore(); @@ -193,12 +207,6 @@ const FreonPrefsWidget = new GObject.Class({ return iter; }, - _onUnitChanged: function (unit) { - if (unit.get_active()) { - this._settings.set_string('unit', unit.label); - } - }, - _onSelectorChanged: function (comboBox) { let [success, iter] = comboBox.get_active_iter(); if (!success) diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled index 0cf5d41b9bb332a6692b843c32da1f5d6ffa2d59..d126c72749e8bc93b16e741bb0540b65ae162512 100644 GIT binary patch delta 13 UcmZ3(x`uT_0TW~L - "Centigrade" + 'centigrade' Unit - The unit ('centigrade' or 'fahrenheit', without quotes) the extension should display the temperature in. + The unit ('centigrade' or 'fahrenheit') the extension should display the temperature in. From 81990a68def18913868dec13980065f555da8a50 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 12 Jun 2014 18:04:05 +0400 Subject: [PATCH 010/224] Improve "display-label" checkbox --- freon@UshakovVasilii_Github.yahoo.com/prefs.js | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index d0fa2bd..c79b1f0 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -105,16 +105,11 @@ const FreonPrefsWidget = new GObject.Class({ this._sensorSelector.add_attribute(renderer, 'text', modelColumn.label); this._sensorSelector.connect('changed', Lang.bind(this, this._onSelectorChanged)); - this.attach(new Gtk.Label({ label: _("Sensor in panel"), halign : Gtk.Align.END}), 0, ++i, 1, 1); + this.attach(new Gtk.Label({ label: _("Sensor in Panel"), halign : Gtk.Align.END}), 0, ++i, 1, 1); this.attach(this._sensorSelector, 1, i , 1, 1); - let settings = this._settings; - let checkButton = new Gtk.CheckButton({label: _("Display sensor label")}); - checkButton.set_active(settings.get_boolean('display-label')); - checkButton.connect('toggled', function () { - settings.set_boolean('display-label', checkButton.get_active()); - }); - this.attach(checkButton, 2, i , 1, 1); + this._addSwitch({key : 'display-label', y : i, x : 2, + label : _('Show Sensor Label')}); }, _addSwitch : function(params){ From 5be756e3fbd3d26b8cce94f2e1bc2e2df66715d5 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 12 Jun 2014 18:13:18 +0400 Subject: [PATCH 011/224] Remove active sensor conf from preferences --- .../prefs.js | 127 +----------------- 1 file changed, 2 insertions(+), 125 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index c79b1f0..fafc801 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -1,4 +1,3 @@ -const GLib = imports.gi.GLib; const GObject = imports.gi.GObject; const Gio = imports.gi.Gio; const Gtk = imports.gi.Gtk; @@ -6,7 +5,6 @@ const Lang = imports.lang; const Me = imports.misc.extensionUtils.getCurrentExtension(); const Convenience = Me.imports.convenience; -const Utilities = Me.imports.utilities; const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); const _ = Gettext.gettext; @@ -74,41 +72,7 @@ const FreonPrefsWidget = new GObject.Class({ this._addSwitch({key : 'display-voltage', y : i++, x : 2, label : _('Show Power Supply Voltage')}); - //List of items of the ComboBox - this._model = new Gtk.ListStore(); - this._model.set_column_types([GObject.TYPE_STRING, GObject.TYPE_BOOLEAN]); - this._appendItem(_("Average")); - this._appendItem(_("Maximum")); - this._appendSeparator(); - - //Get current options - this._display_fan_rpm = this._settings.get_boolean('display-fan-rpm'); - this._display_voltage = this._settings.get_boolean('display-voltage'); - this._display_hdd_temp = this._settings.get_boolean('display-hdd-temp'); - - //Fill the list - this._getSensorsLabels(); - this._getUdisksLabels(); - - if(this._display_hdd_temp) { - this._appendSeparator(); - this._getHddTempLabels(); - } - - // ComboBox to select which sensor to show in panel - this._sensorSelector = new Gtk.ComboBox({ model: this._model }); - this._sensorSelector.set_active_iter(this._getActiveSensorIter()); - this._sensorSelector.set_row_separator_func(Lang.bind(this, this._comboBoxSeparator), null, null); - - let renderer = new Gtk.CellRendererText(); - this._sensorSelector.pack_start(renderer, true); - this._sensorSelector.add_attribute(renderer, 'text', modelColumn.label); - this._sensorSelector.connect('changed', Lang.bind(this, this._onSelectorChanged)); - - this.attach(new Gtk.Label({ label: _("Sensor in Panel"), halign : Gtk.Align.END}), 0, ++i, 1, 1); - this.attach(this._sensorSelector, 1, i , 1, 1); - - this._addSwitch({key : 'display-label', y : i, x : 2, + this._addSwitch({key : 'display-label', y : i, x : 0, label : _('Show Sensor Label')}); }, @@ -122,94 +86,7 @@ const FreonPrefsWidget = new GObject.Class({ sw.set_tooltip_text(params.help); } this._settings.bind(params.key, sw, 'active', Gio.SettingsBindFlags.DEFAULT); - }, - - _comboBoxSeparator: function(model, iter, data) { - return model.get_value(iter, modelColumn.separator); - }, - - _appendItem: function(label) { - this._model.set(this._model.append(), [modelColumn.label], [label]); - }, - - _appendMultipleItems: function(sensorInfo) { - for each (let sensor in sensorInfo) { - this._model.set(this._model.append(), [modelColumn.label], [sensor['label']]); - } - }, - - _appendSeparator: function() { - this._model.set (this._model.append(), [modelColumn.separator], [true]); - }, - - _getSensorsLabels: function() { - let sensors_cmd = Utilities.detectSensors(); - if(sensors_cmd) { - let sensors_output = GLib.spawn_command_line_sync(sensors_cmd.join(' ')); - if(sensors_output[0]) - { - let output = sensors_output[1].toString(); - let tempInfo = Utilities.parseSensorsOutput(output,Utilities.parseSensorsTemperatureLine); - tempInfo = tempInfo.filter(Utilities.filterTemperature); - this._appendMultipleItems(tempInfo); - - if (this._display_fan_rpm){ - let fanInfo = Utilities.parseSensorsOutput(output,Utilities.parseFanRPMLine); - fanInfo = fanInfo.filter(Utilities.filterFan); - this._appendMultipleItems(fanInfo); - } - if (this._display_voltage){ - let voltageInfo = Utilities.parseSensorsOutput(output,Utilities.parseVoltageLine); - this._appendMultipleItems(voltageInfo); - } - } - } - }, - - _getHddTempLabels: function() { - let hddtemp_cmd = Utilities.detectHDDTemp(); - if(hddtemp_cmd){ - let hddtemp_output = GLib.spawn_command_line_sync(hddtemp_cmd.join(' ')) - if(hddtemp_output[0]){ - let hddTempInfo = Utilities.parseHddTempOutput(hddtemp_output[1].toString(), - !(/nc$/.exec(hddtemp_cmd[0])) ? ': ' : '|'); - this._appendMultipleItems(hddTempInfo); - } - } - }, - - _getUdisksLabels: function() { - Utilities.UDisks.get_drive_ata_proxies((function(proxies) { - let list = Utilities.UDisks.create_list_from_proxies(proxies); - - this._appendMultipleItems(list); - }).bind(this)); - }, - - _getActiveSensorIter: function() { - /* Get the first iter in the list */ - [success, iter] = this._model.get_iter_first(); - let sensorLabel = this._model.get_value(iter, 0); - - while (success) { - /* Walk through the list, reading each row */ - let sensorLabel = this._model.get_value(iter, 0); - if(sensorLabel == this._settings.get_string('main-sensor')) - break; - - success = this._model.iter_next(iter); - } - return iter; - }, - - _onSelectorChanged: function (comboBox) { - let [success, iter] = comboBox.get_active_iter(); - if (!success) - return; - - let label = this._model.get_value(iter, modelColumn.label); - this._settings.set_string('main-sensor', label); - }, + } }); From 78db59d4fc4b506bb830054d38863ac28e149d75 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 12 Jun 2014 18:24:07 +0400 Subject: [PATCH 012/224] Improve setting order --- .../prefs.js | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index fafc801..9cf4e55 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -30,11 +30,18 @@ const FreonPrefsWidget = new GObject.Class({ let i = 0; - this.attach(new Gtk.Label({ label: _('Poll sensors every (sec)'), halign : Gtk.Align.END}), 0, i, 1, 1); + this.attach(new Gtk.Label({ label: _('Poll Sensors Every (sec)'), halign : Gtk.Align.END}), 0, i, 1, 1); let updateTime = Gtk.SpinButton.new_with_range (1, 60, 1); this.attach(updateTime, 1, i, 1, 1); this._settings.bind('update-time', updateTime, 'value', Gio.SettingsBindFlags.DEFAULT); + this._addSwitch({key : 'display-label', y : i++, x : 2, + label : _('Show Sensor Label')}); + + this._addSwitch({key : 'display-decimal-value', y : i, x : 0, + label : _('Show Decimal Value'), + help : _("Show one digit after decimal")}); + // Temperature Unit ComboBox let tUnitModel = new Gtk.ListStore(); tUnitModel.set_column_types([GObject.TYPE_STRING, GObject.TYPE_STRING]); @@ -61,19 +68,18 @@ const FreonPrefsWidget = new GObject.Class({ this.attach(new Gtk.Label({ label: _('Temperature Unit'), halign : Gtk.Align.END}), 2, i, 1, 1); this.attach(tUnit, 3, i++, 1, 1); - // Switches - this._addSwitch({key : 'display-decimal-value', y : i, x : 0, - label : _('Show Decimal Value'), - help : _("Show one digit after decimal")}); - this._addSwitch({key : 'display-hdd-temp', y : i++, x : 2, + // + + + this._addSwitch({key : 'display-hdd-temp', y : i, x : 0, label : _('Show Drive Temperature')}); - this._addSwitch({key : 'display-fan-rpm', y : i, x : 0, + + this._addSwitch({key : 'display-fan-rpm', y : i++, x : 2, label : _('Show Fan Speed')}); - this._addSwitch({key : 'display-voltage', y : i++, x : 2, + + this._addSwitch({key : 'display-voltage', y : i, x : 0, label : _('Show Power Supply Voltage')}); - this._addSwitch({key : 'display-label', y : i, x : 0, - label : _('Show Sensor Label')}); }, _addSwitch : function(params){ From 14414340758bcd036000d17fea8238a80797d525 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 12 Jun 2014 18:40:59 +0400 Subject: [PATCH 013/224] Fix problem with hdd temperature setting, rename conf --- .../extension.js | 17 +++++++---------- freon@UshakovVasilii_Github.yahoo.com/prefs.js | 10 +++++----- .../schemas/gschemas.compiled | Bin 684 -> 676 bytes ....gnome.shell.extensions.sensors.gschema.xml | 10 +++++----- 4 files changed, 17 insertions(+), 20 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 3e706ea..a6fd01f 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -35,7 +35,7 @@ const FreonItem = new Lang.Class({ }, getPanelString: function() { - if(settings.get_boolean('display-label')) + if(settings.get_boolean('show-label')) return '%s: %s'.format(this._label, this._value); else return this._value; @@ -71,10 +71,7 @@ const FreonMenuButton = new Lang.Class({ this.actor.add_actor(this.statusLabel); this.sensorsArgv = Utilities.detectSensors(); - - if (settings.get_boolean('display-hdd-temp')){ - this.hddtempArgv = Utilities.detectHDDTemp(); - } + this.hddtempArgv = Utilities.detectHDDTemp(); this.udisksProxies = []; Utilities.UDisks.get_drive_ata_proxies(Lang.bind(this, function(proxies) { @@ -119,7 +116,7 @@ const FreonMenuButton = new Lang.Class({ })); } - if (this.hddtempArgv){ + if (settings.get_boolean('show-hdd-temp') && this.hddtempArgv){ this._hddtempFuture = new Utilities.Future(this.hddtempArgv, Lang.bind(this,function(stdout){ this._hddtempOutput = stdout; this._updateDisplay(this._sensorsOutput, this._hddtempOutput); @@ -129,8 +126,8 @@ const FreonMenuButton = new Lang.Class({ }, _updateDisplay: function(sensors_output, hddtemp_output){ - let display_fan_rpm = settings.get_boolean('display-fan-rpm'); - let display_voltage = settings.get_boolean('display-voltage'); + let display_fan_rpm = settings.get_boolean('show-fan-rpm'); + let display_voltage = settings.get_boolean('show-voltage'); let tempInfo = Array(); let fanInfo = Array(); @@ -146,7 +143,7 @@ const FreonMenuButton = new Lang.Class({ voltageInfo = Utilities.parseSensorsOutput(sensors_output,Utilities.parseVoltageLine); } - if(this.hddtempArgv) + if(settings.get_boolean('show-hdd-temp') && this.hddtempArgv) tempInfo = tempInfo.concat(Utilities.parseHddTempOutput(hddtemp_output, !(/nc$/.exec(this.hddtempArgv[0])) ? ': ' : '|')); tempInfo = tempInfo.concat(Utilities.UDisks.create_list_from_proxies(this.udisksProxies)); @@ -243,7 +240,7 @@ const FreonMenuButton = new Lang.Class({ value = this._toFahrenheit(value); } let format = '%.1f'; - if (!settings.get_boolean('display-decimal-value')){ + if (!settings.get_boolean('show-decimal-value')){ //ret = Math.round(value); format = '%d'; } diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 9cf4e55..9090018 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -35,10 +35,10 @@ const FreonPrefsWidget = new GObject.Class({ this.attach(updateTime, 1, i, 1, 1); this._settings.bind('update-time', updateTime, 'value', Gio.SettingsBindFlags.DEFAULT); - this._addSwitch({key : 'display-label', y : i++, x : 2, + this._addSwitch({key : 'show-label', y : i++, x : 2, label : _('Show Sensor Label')}); - this._addSwitch({key : 'display-decimal-value', y : i, x : 0, + this._addSwitch({key : 'show-decimal-value', y : i, x : 0, label : _('Show Decimal Value'), help : _("Show one digit after decimal")}); @@ -71,13 +71,13 @@ const FreonPrefsWidget = new GObject.Class({ // - this._addSwitch({key : 'display-hdd-temp', y : i, x : 0, + this._addSwitch({key : 'show-hdd-temp', y : i, x : 0, label : _('Show Drive Temperature')}); - this._addSwitch({key : 'display-fan-rpm', y : i++, x : 2, + this._addSwitch({key : 'show-fan-rpm', y : i++, x : 2, label : _('Show Fan Speed')}); - this._addSwitch({key : 'display-voltage', y : i, x : 0, + this._addSwitch({key : 'show-voltage', y : i, x : 0, label : _('Show Power Supply Voltage')}); }, diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled index d126c72749e8bc93b16e741bb0540b65ae162512..792899afffb61ef58a7d5fb6bfdb0f660a1024b2 100644 GIT binary patch literal 676 zcmYLHO-sW-5S?o4N2?%0K@p^Qu|<;TKhQ(bL(ip`9=6T42_&14q_u*I7x4#puouyT z6#NH0dJ+8rf;aI8c=0aOH`|sjyu7zBGdr7^99Ko;3YE}gZGdZIU7VYm;QC#4H#K=z zpcCpr_hDr6L?f(w9bBPD@DmV3ZL_TcUz)KaJgRBW~)87QO|vv^Dwr%y2t zodFgnSmynt4%Z~A=-NZ*-@)e&JFIimrFZZL@N#jP<9o5r!2f1Of!nWVE~9l8{u*|9 z;C1uioPE}5_yw@V`mcAxKI;|uhu|{svo+ddpY=NY8n_PF2aPlKS@V4ya0m?chuiG4 zUWI=Jz6Q#jw^R06^Z9)+_Y&8o1%Ugo1aMEd4{3n=;tN+9F4&gp`Q5-v^cQgC*w>2a E9}n+^n*aa+ literal 684 zcmZXSy-UMD7{;$^@uP??f)0X+U<)SEL0omx!C7?ZaBZ&bL2?O6S}OSQFSv-JgHBS> zU2$@8cM;c)4le!$`aEfahzC!fr@wozdHY^AcVwicNko55!*_eRIFLbj`D|w~*Wa5H zTcVA84v?P`;v1`z7HOX8o~_!6GO-R!Y}X3O7*Wn6!nYlV(J@XKF2tS4{_SQP& z%>4Zm_$lPBRQAc4+2=K!Gemnh|2q@T12~-x=i=%(^yI$fs;c&-XSJl)RNxqErQ}O( ztQhkSqK%e{WF0%jxRjk~xUQ8bKV)@|_1Q*E8Y>F@f83K5<&kos-VSBb=zVi=(N22N zPI}SK??pT5MLR;oO{23Htg1|+>ydQ-w$uu|ByBV8ry063QC6aT#rHuJb&2)^x{rThe unit ('centigrade' or 'fahrenheit') the extension should display the temperature in. - + false Display label Display also the label of the sensor in the panel @@ -27,25 +27,25 @@ Select the sensor whose value has to be shown in the panel - + false Show decimal value Show one digit after decimal - + true Display HDD Temp Display hard disk drive temperature. Requires hddtemp installed. - + true Display Fan RPM Display fan rotation per minute. - + true Display voltage Display voltage of various components. From 8236542cd63fe4972314be8772cbbd82ef52f354 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 12 Jun 2014 19:55:01 +0400 Subject: [PATCH 014/224] Add img --- img/panel_menu.jpg | Bin 0 -> 18204 bytes img/sensors-temperature-symbolic.png | Bin 0 -> 582 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/panel_menu.jpg create mode 100644 img/sensors-temperature-symbolic.png diff --git a/img/panel_menu.jpg b/img/panel_menu.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b672dd860cfcccc3ac34ce735422b54e254c8ad6 GIT binary patch literal 18204 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%0D4`li)8U_GGl_EB*s=5OGL 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 literal 0 HcmV?d00001 diff --git a/img/sensors-temperature-symbolic.png b/img/sensors-temperature-symbolic.png new file mode 100644 index 0000000000000000000000000000000000000000..bfaaa4b8f5c77662db0df67dd3293a61054c8714 GIT binary patch literal 582 zcmV-M0=fN(P)3ZKBz00O^bf#0#h09;i#z`}>HUTbU>3Q(z3 zs^Go_3j;`UYMg4l1#5uyw_v>m&lBMEWBZd!Y$*W#NpL8so0#29s0$#e>z@RND+4H% zN-e;XbkQI5&QgDW&^wcK0eDHyY5;&Y3CK?XGdni3cJC;Lgl`10SMc_$yDX2W6s$ U;?G?@4FCWD07*qoM6N<$f;fEfssI20 literal 0 HcmV?d00001 From 09d9c620f4af61a0c9d62fb954387e23a9ac67f3 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 13 Jun 2014 02:39:02 +0400 Subject: [PATCH 015/224] Change README --- README.md | 116 ++++++------------------------------------------------ 1 file changed, 11 insertions(+), 105 deletions(-) diff --git a/README.md b/README.md index cc0e17e..55e716b 100644 --- a/README.md +++ b/README.md @@ -1,111 +1,17 @@ -gnome-shell-extension-sensors -============================= -*gnome-shell-extension-sensors* (previously known as gnome-shell-extension-cpu-temperature) -is an extension for displaying CPU temperature, hard disk temperature, voltage and -CPU fan RPM in GNOME Shell. +gnome-shell-extension-freon +==================================== -The extension uses [sensors] from lm_sensors package (lm-sensors for Debian systems) -to read temperature for different CPU cores and adapters, voltage data and fan speed. +Freon is forked from [gnome-shell-extension-sensors](https://github.com/xtranophilist/gnome-shell-extension-sensors). Freon is an extension for displaying CPU temperature, hard disk temperature, voltage and CPU fan RPM in GNOME Shell. -Optionally, this extension uses the [UDisks2] dbus interface or [hddtemp] as fallback to -read hard drive temperature data. +More info in [wiki](https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki) -![Screenshot][screenshot] +### Installation from git -Installation -============= + git clone https://github.com/UshakovVasilii/gnome-shell-extension-freon.git + cd gnome-shell-extension-freon + cp -r freon@UshakovVasilii_Github.yahoo.com ~/.local/share/gnome-shell/extensions/. +restart GNOME Shell (`Alt+F2`, `r`, `Enter`) and enable the extension through gnome-tweak-tool. -This is the **recommended method** for installation, as it doesn't require the build -dependencies for installation. -You can install this extension by visiting the [GNOME extensions] -page for this extension. +### Installation from extensions.gnome.org -Installation by package manager -------------------------------- - -Fedora has packaged a **very old** version of this extension. You can install it by running: - -`yum -y install gnome-shell-extension-cpu-temperature` - -However this package will be retired and possibly replaced in the future according to Bug [RH#983409]. - -Manual installation -------------------- - -To install this extension you need to clone the source and build the extension. -The build dependenciesare: - -* *gettext*, -* *pkg-config*, -* *git*, -* *glib2*, -* *glib2-devel* or *libglib2.0-dev*, -* *zip*, -* *gnome-common*, -* *autoconf*, -* *automake*, -* *intltool*. - -To build the extension for gnome-shell 3.10 or newer please run the following commands: - - cd ~ && git clone https://github.com/xtranophilist/gnome-shell-extension-sensors.git - cd ~/gnome-shell-extension-sensors - ./autogen.sh - -To build the extension for gnome-shell 3.8 or older please run the following commands: - - cd ~ && git clone https://github.com/xtranophilist/gnome-shell-extension-sensors.git - cd ~/gnome-shell-extension-sensors - git checkout gnome-3.8 - ./autogen.sh - -You can install this extension for your user by executing: - - make local-install - -or system wide by executing (this requires root permissions): - - make install - -After installation you need to restart the GNOME shell: - -* `ALT`+`F2` to open the command prompt -* Enter `r` to restart the GNOME shell - -Then enable the extension: -Open `gnome-tweak-tool` -> `Shell Extensions` -> `Sensors` -> On - - -Installing dependencies -------------- -Installing lm-sensors for Fedora, CentOS and other distros with yum: - -`yum install -y lm_sensors` - -Ubuntu, Debian and other distros with apt-get: - -`apt-get install lm-sensors` - -Then run `sensors-detect` as root as one time detection process. - -Installing `hdd-temp`: - -`yum -y install hddtemp` - - -Configuration ---------------------- - -This extensions uses the output of `sensors`(1) command to obtain the -temperature data and sensor labeling. To relabel, hide or correct the -output consult the `sensors.conf`(5) manual. - -Authors : [authors] - -[sensors]: http://www.lm-sensors.org/ -[UDisks2]: http://www.freedesktop.org/wiki/Software/udisks/ -[hddtemp]: https://savannah.nongnu.org/projects/hddtemp/ -[GNOME extensions]: https://extensions.gnome.org/extension/82/cpu-temperature-indicator/ -[authors]: https://github.com/xtranophilist/gnome-shell-extension-sensors/graphs/contributors -[screenshot]: https://raw.github.com/wiki/xtranophilist/gnome-shell-extension-sensors/gnome-shell-extension-sensors.png -[RH#983409]: https://bugzilla.redhat.com/show_bug.cgi?id=983409 +// TODO From 7e3a09a9a57429da7b5e909b4e677b2e72924648 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 20 Jun 2014 00:21:28 +0400 Subject: [PATCH 016/224] Separate menuItems creation --- .../extension.js | 109 +++++++++++------- 1 file changed, 65 insertions(+), 44 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index a6fd01f..1af0ad8 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -126,20 +126,17 @@ const FreonMenuButton = new Lang.Class({ }, _updateDisplay: function(sensors_output, hddtemp_output){ - let display_fan_rpm = settings.get_boolean('show-fan-rpm'); - let display_voltage = settings.get_boolean('show-voltage'); - - let tempInfo = Array(); - let fanInfo = Array(); - let voltageInfo = Array(); + let tempInfo = []; + let fanInfo = []; + let voltageInfo = []; tempInfo = Utilities.parseSensorsOutput(sensors_output,Utilities.parseSensorsTemperatureLine); tempInfo = tempInfo.filter(Utilities.filterTemperature); - if (display_fan_rpm){ + if (settings.get_boolean('show-fan-rpm')){ fanInfo = Utilities.parseSensorsOutput(sensors_output,Utilities.parseFanRPMLine); fanInfo = fanInfo.filter(Utilities.filterFan); } - if (display_voltage){ + if (settings.get_boolean('show-voltage')){ voltageInfo = Utilities.parseSensorsOutput(sensors_output,Utilities.parseVoltageLine); } @@ -152,69 +149,57 @@ const FreonMenuButton = new Lang.Class({ fanInfo.sort(function(a,b) { return a['label'].localeCompare(b['label']) }); voltageInfo.sort(function(a,b) { return a['label'].localeCompare(b['label']) }); - this.menu.removeAll(); - let section = new PopupMenu.PopupMenuSection("Temperature"); if (this.sensorsArgv && tempInfo.length > 0){ - let sensorsList = new Array(); let sum = 0; //sum let max = 0; //max temp for each (let temp in tempInfo){ sum += temp['temp']; if (temp['temp'] > max) max = temp['temp']; + } - sensorsList.push(new FreonItem(this._temperatureGIcon, temp['label'], this._formatTemp(temp['temp']))); + let sensorsList = []; + + for each (let temp in tempInfo){ + sensorsList.push({type:'temperature', label:temp['label'], value:this._formatTemp(temp['temp'])}); } + if (tempInfo.length > 0){ - sensorsList.push(new PopupMenu.PopupSeparatorMenuItem()); + sensorsList.push({type : 'separator'}); // Add average and maximum entries - sensorsList.push(new FreonItem(this._temperatureGIcon, _("Average"), this._formatTemp(sum/tempInfo.length))); - sensorsList.push(new FreonItem(this._temperatureGIcon, _("Maximum"), this._formatTemp(max))); + sensorsList.push({type:'temperature', label:_("Average"), value:this._formatTemp(sum/tempInfo.length)}); + sensorsList.push({type:'temperature', label:_("Maximum"), value:this._formatTemp(max)}); if(fanInfo.length > 0 || voltageInfo.length > 0) - sensorsList.push(new PopupMenu.PopupSeparatorMenuItem()); + sensorsList.push({type : 'separator'}); } for each (let fan in fanInfo){ - sensorsList.push(new FreonItem(this._fanGIcon, fan['label'], _("%drpm").format(fan['rpm']))); + sensorsList.push({type:'fan',label:fan['label'], value:_("%drpm").format(fan['rpm'])}); } if (fanInfo.length > 0 && voltageInfo.length > 0){ - sensorsList.push(new PopupMenu.PopupSeparatorMenuItem()); + sensorsList.push({type : 'separator'}); } for each (let voltage in voltageInfo){ - sensorsList.push(new FreonItem(this._voltageGIcon, voltage['label'], _("%s%.2fV").format(((voltage['volt'] >= 0) ? '+' : '-'), voltage['volt']))); + sensorsList.push({type : 'voltage', label:voltage['label'], value:_("%s%.2fV").format(((voltage['volt'] >= 0) ? '+' : '-'), voltage['volt'])}); } - this.statusLabel.set_text(_("N/A")); // Just in case - + let mainSensor = settings.get_string('main-sensor'); for each (let item in sensorsList) { - if(item instanceof FreonItem) { - if (settings.get_string('main-sensor') == item.getLabel()) { - - // Configure as main sensor and set panel string - item.setMainSensor(); - this.statusLabel.set_text(item.getPanelString()); + if(item.type != 'separator') { + if (mainSensor == item.label) { + if(settings.get_boolean('show-label')) + this.statusLabel.set_text('%s: %s'.format(item.label, item.value)); + else + this.statusLabel.set_text(item.value); } } - section.addMenuItem(item); } - // separator - section.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - - let item = new PopupMenu.PopupBaseMenuItem(); - // HACK: span and expand parameters don't work as expected on Label, so add an invisible - // Label to switch columns and not totally break the layout. - item.actor.add(new St.Label({ text: '' })); - item.actor.add(new St.Label({ text: _("Sensors Settings") })); - - item.connect('activate', function () { - Util.spawn(["gnome-shell-extension-prefs", Me.metadata.uuid]); - }); - - section.addMenuItem(item); + this._appendMenuItems(sensorsList); } else { + this.menu.removeAll(); this.statusLabel.set_text(_("Error")); let item = new PopupMenu.PopupMenuItem( @@ -225,12 +210,48 @@ const FreonMenuButton = new Lang.Class({ item.connect('activate',function() { Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/issues"]); }); - section.addMenuItem(item); + this.menu.addMenuItem(item); + } + }, + + _appendMenuItems : function(sensorsList){ + this.menu.removeAll(); + let mainSensor = settings.get_string('main-sensor'); + for each (let s in sensorsList){ + if(s.type == 'separator'){ + this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + } else { + let icon = null; + if(s.type == 'temperature') + icon = this._temperatureGIcon; + else if(s.type == 'fan') + icon = this._fanGIcon; + else + icon = this._voltageGIcon; + let item = new FreonItem(icon, s.label, s.value); + if (mainSensor == item.label) + item.setMainSensor(); + this.menu.addMenuItem(item); + } } - this.menu.addMenuItem(section); + // separator + this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + + let item = new PopupMenu.PopupBaseMenuItem(); + // HACK: span and expand parameters don't work as expected on Label, so add an invisible + // Label to switch columns and not totally break the layout. + item.actor.add(new St.Label({ text: '' })); + item.actor.add(new St.Label({ text: _("Sensors Settings") })); + + item.connect('activate', function () { + Util.spawn(["gnome-shell-extension-prefs", Me.metadata.uuid]); + }); + + this.menu.addMenuItem(item); }, + _toFahrenheit: function(c){ return ((9/5)*c+32); }, From 5947bbd937e6b38a3f8bdbb528d1841d94e3ae36 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 20 Jun 2014 01:20:51 +0400 Subject: [PATCH 017/224] UI optimization --- .../extension.js | 47 +++++++++++++------ 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 1af0ad8..5471d7a 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -31,23 +31,17 @@ const FreonItem = new Lang.Class({ this.actor.add(new St.Icon({ style_class: 'system-status-icon', gicon : gIcon})); this.actor.add(new St.Label({text: label})); - this.actor.add(new St.Label({text: value}), {align: St.Align.END}); - }, - - getPanelString: function() { - if(settings.get_boolean('show-label')) - return '%s: %s'.format(this._label, this._value); - else - return this._value; + this._valueLabel = new St.Label({text: value}); + this.actor.add(this._valueLabel, {align: St.Align.END}); }, setMainSensor: function() { this.setOrnament(PopupMenu.Ornament.DOT); }, - getLabel: function() { - return this._label; - }, + setValue: function(value) { + this._valueLabel.text = value; + } }); const FreonMenuButton = new Lang.Class({ @@ -67,7 +61,6 @@ const FreonMenuButton = new Lang.Class({ this.statusLabel = new St.Label({ text: '\u2026', y_expand: true, y_align: Clutter.ActorAlign.CENTER }); - this.menu.removeAll(); this.actor.add_actor(this.statusLabel); this.sensorsArgv = Utilities.detectSensors(); @@ -110,9 +103,11 @@ const FreonMenuButton = new Lang.Class({ _querySensors: function(){ if (this.sensorsArgv){ this._sensorsFuture = new Utilities.Future(this.sensorsArgv, Lang.bind(this,function(stdout){ + //global.log('START ' + (new Date()).getTime()); this._sensorsOutput = stdout; this._updateDisplay(this._sensorsOutput, this._hddtempOutput); this._sensorsFuture = undefined; + //global.log('END__ ' + (new Date()).getTime()); })); } @@ -186,8 +181,10 @@ const FreonMenuButton = new Lang.Class({ } let mainSensor = settings.get_string('main-sensor'); + let sensorCount = 0; for each (let item in sensorsList) { if(item.type != 'separator') { + sensorCount++; if (mainSensor == item.label) { if(settings.get_boolean('show-label')) this.statusLabel.set_text('%s: %s'.format(item.label, item.value)); @@ -197,8 +194,29 @@ const FreonMenuButton = new Lang.Class({ } } - this._appendMenuItems(sensorsList); + let needAppendMenuItems = false; + if(this._sensorMenuItems && Object.keys(this._sensorMenuItems).length==sensorCount){ + for each (let s in sensorsList) { + if(s.type != 'separator') { + let item = this._sensorMenuItems[s.label]; + if(item) { + item.setValue(s.value); + } else { + needAppendMenuItems = true; + } + } + } + } else { + needAppendMenuItems = true; + } + + if(needAppendMenuItems){ + global.log('[FREON] Render all MenuItems'); + this.menu.removeAll(); + this._appendMenuItems(sensorsList); + } } else { + this._sensorMenuItems = {}; this.menu.removeAll(); this.statusLabel.set_text(_("Error")); @@ -215,7 +233,7 @@ const FreonMenuButton = new Lang.Class({ }, _appendMenuItems : function(sensorsList){ - this.menu.removeAll(); + this._sensorMenuItems = {}; let mainSensor = settings.get_string('main-sensor'); for each (let s in sensorsList){ if(s.type == 'separator'){ @@ -231,6 +249,7 @@ const FreonMenuButton = new Lang.Class({ let item = new FreonItem(icon, s.label, s.value); if (mainSensor == item.label) item.setMainSensor(); + this._sensorMenuItems[s.label] = item; this.menu.addMenuItem(item); } } From 540083ec0314e37eaabc2e2107d0f2a14602cf05 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 20 Jun 2014 01:40:00 +0400 Subject: [PATCH 018/224] Fix main sensor selection --- .../extension.js | 43 +++++++++++++++---- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 5471d7a..62da7f9 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -23,6 +23,8 @@ const FreonItem = new Lang.Class({ _init: function(gIcon, label, value) { this.parent(); + this._active = false; + this.connect('activate', function () { settings.set_string('main-sensor', label); }); @@ -37,6 +39,16 @@ const FreonItem = new Lang.Class({ setMainSensor: function() { this.setOrnament(PopupMenu.Ornament.DOT); + this._active = true; + }, + + isMainSensor: function() { + return this._active; + }, + + setNotMainSensor: function() { + this._active = false; + this.setOrnament(PopupMenu.Ornament.NONE); }, setValue: function(value) { @@ -52,6 +64,8 @@ const FreonMenuButton = new Lang.Class({ _init: function(){ this.parent(null, 'sensorMenu'); + this._sensorMenuItems = {}; + this._sensorsOutput = ''; this._hddtempOutput = ''; @@ -180,22 +194,35 @@ const FreonMenuButton = new Lang.Class({ sensorsList.push({type : 'voltage', label:voltage['label'], value:_("%s%.2fV").format(((voltage['volt'] >= 0) ? '+' : '-'), voltage['volt'])}); } + let needAppendMenuItems = false; let mainSensor = settings.get_string('main-sensor'); let sensorCount = 0; - for each (let item in sensorsList) { - if(item.type != 'separator') { + for each (let s in sensorsList) { + if(s.type != 'separator') { sensorCount++; - if (mainSensor == item.label) { + if (mainSensor == s.label) { if(settings.get_boolean('show-label')) - this.statusLabel.set_text('%s: %s'.format(item.label, item.value)); + this.statusLabel.set_text('%s: %s'.format(s.label, s.value)); else - this.statusLabel.set_text(item.value); + this.statusLabel.set_text(s.value); + + let item = this._sensorMenuItems[s.label]; + if(item) { + if(!item.isMainSensor()){ + global.log('[FREON] Change active sensor'); + for each (let i in this._sensorMenuItems){ + i.setNotMainSensor(); + } + item.setMainSensor(); + } + } else { + needAppendMenuItems = true; + } } } } - let needAppendMenuItems = false; - if(this._sensorMenuItems && Object.keys(this._sensorMenuItems).length==sensorCount){ + if(Object.keys(this._sensorMenuItems).length==sensorCount){ for each (let s in sensorsList) { if(s.type != 'separator') { let item = this._sensorMenuItems[s.label]; @@ -247,7 +274,7 @@ const FreonMenuButton = new Lang.Class({ else icon = this._voltageGIcon; let item = new FreonItem(icon, s.label, s.value); - if (mainSensor == item.label) + if (mainSensor == s.label) item.setMainSensor(); this._sensorMenuItems[s.label] = item; this.menu.addMenuItem(item); From 07c3115652a164809bb4e55a66edfc95e279aa50 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 20 Jun 2014 02:22:48 +0400 Subject: [PATCH 019/224] Improve code --- .../extension.js | 39 ++++++++----------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 62da7f9..a6a4024 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -23,7 +23,7 @@ const FreonItem = new Lang.Class({ _init: function(gIcon, label, value) { this.parent(); - this._active = false; + this._hasMainDot = false; this.connect('activate', function () { settings.set_string('main-sensor', label); @@ -37,17 +37,17 @@ const FreonItem = new Lang.Class({ this.actor.add(this._valueLabel, {align: St.Align.END}); }, - setMainSensor: function() { + addMainDot: function() { this.setOrnament(PopupMenu.Ornament.DOT); - this._active = true; + this._hasMainDot = true; }, - isMainSensor: function() { - return this._active; + hasMainDot: function() { + return this._hasMainDot; }, - setNotMainSensor: function() { - this._active = false; + removeMainDot: function() { + this._hasMainDot = false; this.setOrnament(PopupMenu.Ornament.NONE); }, @@ -69,9 +69,11 @@ const FreonMenuButton = new Lang.Class({ this._sensorsOutput = ''; this._hddtempOutput = ''; - this._temperatureGIcon = Gio.icon_new_for_string(Me.path + '/icons/sensors-temperature-symbolic.svg'); - this._voltageGIcon = Gio.icon_new_for_string(Me.path + '/icons/sensors-voltage-symbolic.svg'); - this._fanGIcon = Gio.icon_new_for_string(Me.path + '/icons/sensors-fan-symbolic.svg'); + this._sensorIcons = { + temperature : Gio.icon_new_for_string(Me.path + '/icons/sensors-temperature-symbolic.svg'), + voltage : Gio.icon_new_for_string(Me.path + '/icons/sensors-voltage-symbolic.svg'), + fan : Gio.icon_new_for_string(Me.path + '/icons/sensors-fan-symbolic.svg') + } this.statusLabel = new St.Label({ text: '\u2026', y_expand: true, y_align: Clutter.ActorAlign.CENTER }); @@ -208,12 +210,12 @@ const FreonMenuButton = new Lang.Class({ let item = this._sensorMenuItems[s.label]; if(item) { - if(!item.isMainSensor()){ + if(!item.hasMainDot()){ global.log('[FREON] Change active sensor'); for each (let i in this._sensorMenuItems){ - i.setNotMainSensor(); + i.removeMainDot(); } - item.setMainSensor(); + item.addMainDot(); } } else { needAppendMenuItems = true; @@ -266,16 +268,9 @@ const FreonMenuButton = new Lang.Class({ if(s.type == 'separator'){ this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); } else { - let icon = null; - if(s.type == 'temperature') - icon = this._temperatureGIcon; - else if(s.type == 'fan') - icon = this._fanGIcon; - else - icon = this._voltageGIcon; - let item = new FreonItem(icon, s.label, s.value); + let item = new FreonItem(this._sensorIcons[s.type], s.label, s.value); if (mainSensor == s.label) - item.setMainSensor(); + item.addMainDot(); this._sensorMenuItems[s.label] = item; this.menu.addMenuItem(item); } From 5783fd85a98e136dd6050cda8fdb51c5bf403994 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 20 Jun 2014 02:44:04 +0400 Subject: [PATCH 020/224] Improve change setting signals --- .../extension.js | 40 ++++++++++++++++--- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index a6a4024..716d752 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -88,19 +88,44 @@ const FreonMenuButton = new Lang.Class({ this._updateDisplay(this._sensorsOutput, this._hddtempOutput); })); - this._settingsChanged = settings.connect('changed', Lang.bind(this, this._querySensors)); + this._settingChangedSignals = []; + this._addSettingChangedSignal('update-time', Lang.bind(this, this._updateTimeChanged)); + this._addSettingChangedSignal('unit', Lang.bind(this, this._querySensors)); + this._addSettingChangedSignal('show-label', Lang.bind(this, this._querySensors)); + this._addSettingChangedSignal('main-sensor', Lang.bind(this, this._querySensors)); + this._addSettingChangedSignal('show-decimal-value', Lang.bind(this, this._querySensors)); + this._addSettingChangedSignal('show-hdd-temp', Lang.bind(this, this._querySensors)); + this._addSettingChangedSignal('show-fan-rpm', Lang.bind(this, this._querySensors)); + this._addSettingChangedSignal('show-voltage', Lang.bind(this, this._querySensors)); + this.connect('destroy', Lang.bind(this, this._onDestroy)); // don't postprone the first call by update-time. this._querySensors(); - this._eventLoop = Mainloop.timeout_add_seconds(settings.get_int('update-time'), Lang.bind(this, function (){ + this._addTimer(); + }, + + _updateTimeChanged : function(){ + // TODO remove + global.log('[FREON] readd timer'); + + Mainloop.source_remove(this._timeoutId); + this._addTimer(); + }, + + _addTimer : function(){ + this._timeoutId = Mainloop.timeout_add_seconds(settings.get_int('update-time'), Lang.bind(this, function (){ this._querySensors(); // readd to update queue return true; })); }, + _addSettingChangedSignal : function(key, callback){ + this._settingChangedSignals.push(settings.connect('changed::' + key, callback)); + }, + _onDestroy: function(){ for each (let proxy in this.udisksProxies){ if(proxy.drive){ @@ -111,12 +136,17 @@ const FreonMenuButton = new Lang.Class({ } } - Mainloop.source_remove(this._eventLoop); - this.menu.removeAll(); - settings.disconnect(this._settingsChanged); + Mainloop.source_remove(this._timeoutId); + + for each (signal in this._settingChangedSignals){ + settings.disconnect(signal); + }; }, _querySensors: function(){ + // TODO remove + global.log('[FREON] Query sensors ' + (new Date()).getTime()); + if (this.sensorsArgv){ this._sensorsFuture = new Utilities.Future(this.sensorsArgv, Lang.bind(this,function(stdout){ //global.log('START ' + (new Date()).getTime()); From 6a1c73765bd6fa617989e8be1fb9c066b01fa5d6 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 20 Jun 2014 02:52:33 +0400 Subject: [PATCH 021/224] Remove debug info --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 716d752..138e0cc 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -107,8 +107,7 @@ const FreonMenuButton = new Lang.Class({ }, _updateTimeChanged : function(){ - // TODO remove - global.log('[FREON] readd timer'); + //global.log('[FREON] readd timer'); Mainloop.source_remove(this._timeoutId); this._addTimer(); @@ -144,8 +143,7 @@ const FreonMenuButton = new Lang.Class({ }, _querySensors: function(){ - // TODO remove - global.log('[FREON] Query sensors ' + (new Date()).getTime()); + //global.log('[FREON] Query sensors ' + (new Date()).getTime()); if (this.sensorsArgv){ this._sensorsFuture = new Utilities.Future(this.sensorsArgv, Lang.bind(this,function(stdout){ From 3417cde7f4949d7c1e26608e53a1513a0e922922 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 20 Jun 2014 03:01:45 +0400 Subject: [PATCH 022/224] Add right align for sensor values --- .../extension.js | 4 ++-- img/panel_menu.jpg | Bin 18204 -> 14864 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 138e0cc..1da2d94 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -32,9 +32,9 @@ const FreonItem = new Lang.Class({ this._value = value; this.actor.add(new St.Icon({ style_class: 'system-status-icon', gicon : gIcon})); - this.actor.add(new St.Label({text: label})); + this.actor.add(new St.Label({text: label}), {x_fill: true, expand: true}); this._valueLabel = new St.Label({text: value}); - this.actor.add(this._valueLabel, {align: St.Align.END}); + this.actor.add(this._valueLabel); }, addMainDot: function() { diff --git a/img/panel_menu.jpg b/img/panel_menu.jpg index b672dd860cfcccc3ac34ce735422b54e254c8ad6..d21ae31a56c09e64528ceb4d379d9e02075606fd 100644 GIT binary patch literal 14864 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%0D4`li)8U_GGl_EB*s=5OGL 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 From 1bc9b73aa37f31f4d02e0fd3d5106c624ad51d44 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 20 Jun 2014 03:21:37 +0400 Subject: [PATCH 023/224] Add prefs screenshot --- img/prefs-1.jpg | Bin 0 -> 34814 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/prefs-1.jpg diff --git a/img/prefs-1.jpg b/img/prefs-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ac17af287b9b37eb6f73541957bff157f4dae6ee GIT binary patch literal 34814 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 oSw<{9 literal 0 HcmV?d00001 From 02cdd12831c8422b12b9bece88ef3a981b03fd6f Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 20 Jun 2014 03:29:51 +0400 Subject: [PATCH 024/224] Change prefs image --- img/prefs-1.jpg | Bin 34814 -> 27497 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/img/prefs-1.jpg b/img/prefs-1.jpg index ac17af287b9b37eb6f73541957bff157f4dae6ee..554980a1ce7a6ef452724806c335dddc3f20876f 100644 GIT binary patch literal 27497 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 oSw<{9 From 80b08a9a1757a579fa61caebaec8ef028be219f1 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 20 Jun 2014 03:36:42 +0400 Subject: [PATCH 025/224] Fix bugs with add/remove extension --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 1da2d94..caa8153 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -137,7 +137,7 @@ const FreonMenuButton = new Lang.Class({ Mainloop.source_remove(this._timeoutId); - for each (signal in this._settingChangedSignals){ + for each (let signal in this._settingChangedSignals){ settings.disconnect(signal); }; }, @@ -348,7 +348,7 @@ function init(extensionMeta) { function enable() { freonMenu = new FreonMenuButton(); - Main.panel.addToStatusArea('freonMenu', freonMenu, 1, 'right'); + Main.panel.addToStatusArea('freonMenu', freonMenu); } function disable() { From 0e43f30351e5ba91f8953cddaeea91560c0ff511 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Mon, 23 Jun 2014 22:16:05 +0400 Subject: [PATCH 026/224] Add AMD video card temperature (aticonfig from Catalyst) --- README.md | 2 +- .../extension.js | 46 +++++++++++++----- .../metadata.json | 2 +- .../prefs.js | 4 ++ .../schemas/gschemas.compiled | Bin 676 -> 724 bytes ...gnome.shell.extensions.sensors.gschema.xml | 6 +++ .../utilities.js | 31 ++++++++++++ 7 files changed, 76 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 55e716b..8daaa17 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ gnome-shell-extension-freon ==================================== -Freon is forked from [gnome-shell-extension-sensors](https://github.com/xtranophilist/gnome-shell-extension-sensors). Freon is an extension for displaying CPU temperature, hard disk temperature, voltage and CPU fan RPM in GNOME Shell. +Freon is forked from [gnome-shell-extension-sensors](https://github.com/xtranophilist/gnome-shell-extension-sensors). Freon is an extension for displaying CPU temperature, HDD/SSD temperature, AMD video card temperature (Catalyst), voltage and CPU fan RPM in GNOME Shell. More info in [wiki](https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index caa8153..05c42fe 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -68,6 +68,7 @@ const FreonMenuButton = new Lang.Class({ this._sensorsOutput = ''; this._hddtempOutput = ''; + this._aticonfigOutput = ''; this._sensorIcons = { temperature : Gio.icon_new_for_string(Me.path + '/icons/sensors-temperature-symbolic.svg'), @@ -80,12 +81,15 @@ const FreonMenuButton = new Lang.Class({ this.actor.add_actor(this.statusLabel); this.sensorsArgv = Utilities.detectSensors(); - this.hddtempArgv = Utilities.detectHDDTemp(); + if(settings.get_boolean('show-hdd-temp')) + this.hddtempArgv = Utilities.detectHDDTemp(); + if(settings.get_boolean('show-aticonfig-temp')) + this.aticonfigArgv = Utilities.detectAtiConfig(); this.udisksProxies = []; Utilities.UDisks.get_drive_ata_proxies(Lang.bind(this, function(proxies) { this.udisksProxies = proxies; - this._updateDisplay(this._sensorsOutput, this._hddtempOutput); + this._updateDisplay(this._sensorsOutput, this._hddtempOutput, this._aticonfigOutput); })); this._settingChangedSignals = []; @@ -94,9 +98,10 @@ const FreonMenuButton = new Lang.Class({ this._addSettingChangedSignal('show-label', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('main-sensor', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-decimal-value', Lang.bind(this, this._querySensors)); - this._addSettingChangedSignal('show-hdd-temp', Lang.bind(this, this._querySensors)); + this._addSettingChangedSignal('show-hdd-temp', Lang.bind(this, this._showHddTempChanged)); this._addSettingChangedSignal('show-fan-rpm', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-voltage', Lang.bind(this, this._querySensors)); + this._addSettingChangedSignal('show-aticonfig-temp', Lang.bind(this, this._showAtiConfigChanged)); this.connect('destroy', Lang.bind(this, this._onDestroy)); @@ -113,6 +118,16 @@ const FreonMenuButton = new Lang.Class({ this._addTimer(); }, + _showHddTempChanged : function(){ + this.hddtempArgv = settings.get_boolean('show-hdd-temp') ? Utilities.detectHDDTemp() : undefined; + this._querySensors(); + }, + + _showAtiConfigChanged : function(){ + this.aticonfigArgv = settings.get_boolean('show-aticonfig-temp') ? Utilities.detectAtiConfig() : undefined; + this._querySensors(); + }, + _addTimer : function(){ this._timeoutId = Mainloop.timeout_add_seconds(settings.get_int('update-time'), Lang.bind(this, function (){ this._querySensors(); @@ -143,28 +158,30 @@ const FreonMenuButton = new Lang.Class({ }, _querySensors: function(){ - //global.log('[FREON] Query sensors ' + (new Date()).getTime()); if (this.sensorsArgv){ - this._sensorsFuture = new Utilities.Future(this.sensorsArgv, Lang.bind(this,function(stdout){ - //global.log('START ' + (new Date()).getTime()); + new Utilities.Future(this.sensorsArgv, Lang.bind(this,function(stdout){ this._sensorsOutput = stdout; - this._updateDisplay(this._sensorsOutput, this._hddtempOutput); - this._sensorsFuture = undefined; - //global.log('END__ ' + (new Date()).getTime()); + this._updateDisplay(this._sensorsOutput, this._hddtempOutput, this._aticonfigOutput); })); } if (settings.get_boolean('show-hdd-temp') && this.hddtempArgv){ - this._hddtempFuture = new Utilities.Future(this.hddtempArgv, Lang.bind(this,function(stdout){ + new Utilities.Future(this.hddtempArgv, Lang.bind(this,function(stdout){ this._hddtempOutput = stdout; - this._updateDisplay(this._sensorsOutput, this._hddtempOutput); - this._hddtempFuture = undefined; + this._updateDisplay(this._sensorsOutput, this._hddtempOutput, this._aticonfigOutput); + })); + } + + if (settings.get_boolean('show-aticonfig-temp') && this.aticonfigArgv){ + new Utilities.Future(this.aticonfigArgv, Lang.bind(this,function(stdout){ + this._aticonfigOutput = stdout; + this._updateDisplay(this._sensorsOutput, this._hddtempOutput, this._aticonfigOutput); })); } }, - _updateDisplay: function(sensors_output, hddtemp_output){ + _updateDisplay: function(sensors_output, hddtemp_output, aticonfig_output){ let tempInfo = []; let fanInfo = []; let voltageInfo = []; @@ -182,6 +199,9 @@ const FreonMenuButton = new Lang.Class({ if(settings.get_boolean('show-hdd-temp') && this.hddtempArgv) tempInfo = tempInfo.concat(Utilities.parseHddTempOutput(hddtemp_output, !(/nc$/.exec(this.hddtempArgv[0])) ? ': ' : '|')); + if(settings.get_boolean('show-aticonfig-temp') && this.aticonfigArgv) + tempInfo = tempInfo.concat(Utilities.parseAtiConfigOutput(aticonfig_output)); + tempInfo = tempInfo.concat(Utilities.UDisks.create_list_from_proxies(this.udisksProxies)); tempInfo.sort(function(a,b) { return a['label'].localeCompare(b['label']) }); diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index 04fa658..0fac30e 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -2,7 +2,7 @@ "shell-version": ["3.12"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", - "description": "Shows CPU temperature, HDD temperature, voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", + "description": "Shows CPU temperature, HDD/SSD temperature, AMD video card temperature (Catalyst), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", "settings-schema": "org.gnome.shell.extensions.freon", "gettext-domain": "freon", "url": "https://github.com/UshakovVasilii/gnome-shell-extension-freon" diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 9090018..70dd745 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -80,6 +80,10 @@ const FreonPrefsWidget = new GObject.Class({ this._addSwitch({key : 'show-voltage', y : i, x : 0, label : _('Show Power Supply Voltage')}); + this._addSwitch({key : 'show-aticonfig-temp', y : i, x : 2, + label : _('Use Catalyst'), + help : _('Show AMD video card temperature, use aticonfig from Catalyst driver.')}); + }, _addSwitch : function(params){ diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled index 792899afffb61ef58a7d5fb6bfdb0f660a1024b2..6e6fad00153b7c2aa47961c7be2dd6d2cc21a572 100644 GIT binary patch literal 724 zcmYjPF>4e-82u9OGP5zBju^9C-WQzWwI=X21DX*HvYdb<(b7@J6G9`I!mc ze6@aauKjjh9?BH@9gOah$T8ND4_=dx;7>qVrBQ0jLPvF`^E}d1r)_OYTSvo6mloTD z9v)oG+W}6uI0GgY0LIMlK^_2(hV{fUu@ZW&h=Q=C5!bA^D zq4IE|^0CHd3HrDEhg|h_{@=TDW>DIpNkgZL(MjB-%$-X8Rz%NnKbU<-3BS(b$vZ)t zgRBW~)87QO|vv^Dwr%y2t zodFgnSmynt4%Z~A=-NZ*-@)e&JFIimrFZZL@N#jP<9o5r!2f1Of!nWVE~9l8{u*|9 z;C1uioPE}5_yw@V`mcAxKI;|uhu|{svo+ddpY=NY8n_PF2aPlKS@V4ya0m?chuiG4 zUWI=Jz6Q#jw^R06^Z9)+_Y&8o1%Ugo1aMEd4{3n=;tN+9F4&gp`Q5-v^cQgC*w>2a E9}n+^n*aa+ diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml index 2e9566a..aa33a37 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml +++ b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml @@ -51,5 +51,11 @@ Display voltage of various components. + + false + Show AMD Card Temperature (Catalyst) + Show AMD card temperature, use aticonfig from Catalyst driver. + + diff --git a/freon@UshakovVasilii_Github.yahoo.com/utilities.js b/freon@UshakovVasilii_Github.yahoo.com/utilities.js index 846b68f..909e7e7 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/utilities.js +++ b/freon@UshakovVasilii_Github.yahoo.com/utilities.js @@ -75,6 +75,11 @@ function detectHDDTemp() { return undefined; } +function detectAtiConfig() { + let path = GLib.find_program_in_path('aticonfig'); + return path ? [path, '--odgt'] : undefined; +} + function parseSensorsOutput(txt,parser) { let sensors_output = txt.split("\n"); let feature_label = undefined; @@ -184,6 +189,32 @@ function parseHddTempOutput(txt, sep) { return sensors; } +/* +Default Adapter - AMD Radeon R9 200 Series + Sensor 0: Temperature - 37.00 C +*/ +function parseAtiConfigOutput(txt) { + if(!txt) + return []; + let output = txt.split('\n'); + let label = null; + let temp = null; + for each(let line in output) { + if(!line) + continue; + let r; + if(line.indexOf('Adapter') > 0) + label = (r = /Adapter \- (.*)/.exec(line)) ? r[1] : undefined; + if(line.indexOf('Temperature') > 0) + temp = (r = /Temperature \- (\d{1,3}.\d{1,2})/.exec(line)) ? parseFloat(r[1]) : undefined; + } + + if(!label || !temp) + return []; + + return [{ label : label.trim(), temp : temp}]; +} + function filterTemperature(tempInfo) { return tempInfo['temp'] > 0 && tempInfo['temp'] < 115; } From 83e4e14bd38be553d2dd76531448b373b694a3b5 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Tue, 24 Jun 2014 02:21:34 +0400 Subject: [PATCH 027/224] Refactor drive utilities functionality --- .../extension.js | 132 +++++++++--------- .../prefs.js | 33 ++++- .../schemas/gschemas.compiled | Bin 724 -> 740 bytes ...gnome.shell.extensions.sensors.gschema.xml | 20 +-- .../udisks2.js | 109 +++++++++++++++ .../utilities.js | 90 ------------ 6 files changed, 217 insertions(+), 167 deletions(-) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/udisks2.js diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 05c42fe..6465c68 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -5,18 +5,16 @@ const PopupMenu = imports.ui.popupMenu; const Main = imports.ui.main; const Util = imports.misc.util; const Mainloop = imports.mainloop; -const Shell = imports.gi.Shell; const Clutter = imports.gi.Clutter; const Gio = imports.gi.Gio; const Me = imports.misc.extensionUtils.getCurrentExtension(); const Convenience = Me.imports.convenience; const Utilities = Me.imports.utilities; +const UDisks2 = Me.imports.udisks2; const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); const _ = Gettext.gettext; -let settings; - const FreonItem = new Lang.Class({ Name: 'FreonItem', Extends: PopupMenu.PopupBaseMenuItem, @@ -24,12 +22,7 @@ const FreonItem = new Lang.Class({ _init: function(gIcon, label, value) { this.parent(); this._hasMainDot = false; - - this.connect('activate', function () { - settings.set_string('main-sensor', label); - }); this._label = label; - this._value = value; this.actor.add(new St.Icon({ style_class: 'system-status-icon', gicon : gIcon})); this.actor.add(new St.Label({text: label}), {x_fill: true, expand: true}); @@ -51,6 +44,10 @@ const FreonItem = new Lang.Class({ this.setOrnament(PopupMenu.Ornament.NONE); }, + getLabel: function() { + return this._label; + }, + setValue: function(value) { this._valueLabel.text = value; } @@ -58,7 +55,6 @@ const FreonItem = new Lang.Class({ const FreonMenuButton = new Lang.Class({ Name: 'FreonMenuButton', - Extends: PanelMenu.Button, _init: function(){ @@ -70,6 +66,8 @@ const FreonMenuButton = new Lang.Class({ this._hddtempOutput = ''; this._aticonfigOutput = ''; + this._settings = Convenience.getSettings(); + this._sensorIcons = { temperature : Gio.icon_new_for_string(Me.path + '/icons/sensors-temperature-symbolic.svg'), voltage : Gio.icon_new_for_string(Me.path + '/icons/sensors-voltage-symbolic.svg'), @@ -81,27 +79,20 @@ const FreonMenuButton = new Lang.Class({ this.actor.add_actor(this.statusLabel); this.sensorsArgv = Utilities.detectSensors(); - if(settings.get_boolean('show-hdd-temp')) - this.hddtempArgv = Utilities.detectHDDTemp(); - if(settings.get_boolean('show-aticonfig-temp')) + this._initDriveUtility(); + if(this._settings.get_boolean('show-aticonfig-temp')) this.aticonfigArgv = Utilities.detectAtiConfig(); - this.udisksProxies = []; - Utilities.UDisks.get_drive_ata_proxies(Lang.bind(this, function(proxies) { - this.udisksProxies = proxies; - this._updateDisplay(this._sensorsOutput, this._hddtempOutput, this._aticonfigOutput); - })); - this._settingChangedSignals = []; this._addSettingChangedSignal('update-time', Lang.bind(this, this._updateTimeChanged)); this._addSettingChangedSignal('unit', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-label', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('main-sensor', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-decimal-value', Lang.bind(this, this._querySensors)); - this._addSettingChangedSignal('show-hdd-temp', Lang.bind(this, this._showHddTempChanged)); this._addSettingChangedSignal('show-fan-rpm', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-voltage', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-aticonfig-temp', Lang.bind(this, this._showAtiConfigChanged)); + this._addSettingChangedSignal('drive-utility', Lang.bind(this, this._driveUtilityChanged)); this.connect('destroy', Lang.bind(this, this._onDestroy)); @@ -111,25 +102,45 @@ const FreonMenuButton = new Lang.Class({ this._addTimer(); }, - _updateTimeChanged : function(){ - //global.log('[FREON] readd timer'); + _driveUtilityChanged : function(){ + this._destroyDriveUtility(); + this._initDriveUtility(); + this._querySensors(); + }, - Mainloop.source_remove(this._timeoutId); - this._addTimer(); + _initDriveUtility : function(){ + switch(this._settings.get_string('drive-utility')){ + case 'hddtemp': + this.hddtempArgv = Utilities.detectHDDTemp(); + break; + case 'udisks2': + this._udisks2 = new UDisks2.UDisks2(Lang.bind(this, function() { + this._updateDisplay(); + })); + break; + } }, - _showHddTempChanged : function(){ - this.hddtempArgv = settings.get_boolean('show-hdd-temp') ? Utilities.detectHDDTemp() : undefined; - this._querySensors(); + _destroyDriveUtility : function(){ + if(this._udisks2){ + this._udisks2.destroy(); + this._udisks2 = null; + } + this.hddtempArgv = null; + }, + + _updateTimeChanged : function(){ + Mainloop.source_remove(this._timeoutId); + this._addTimer(); }, _showAtiConfigChanged : function(){ - this.aticonfigArgv = settings.get_boolean('show-aticonfig-temp') ? Utilities.detectAtiConfig() : undefined; + this.aticonfigArgv = this._settings.get_boolean('show-aticonfig-temp') ? Utilities.detectAtiConfig() : undefined; this._querySensors(); }, _addTimer : function(){ - this._timeoutId = Mainloop.timeout_add_seconds(settings.get_int('update-time'), Lang.bind(this, function (){ + this._timeoutId = Mainloop.timeout_add_seconds(this._settings.get_int('update-time'), Lang.bind(this, function (){ this._querySensors(); // readd to update queue return true; @@ -137,23 +148,15 @@ const FreonMenuButton = new Lang.Class({ }, _addSettingChangedSignal : function(key, callback){ - this._settingChangedSignals.push(settings.connect('changed::' + key, callback)); + this._settingChangedSignals.push(this._settings.connect('changed::' + key, callback)); }, _onDestroy: function(){ - for each (let proxy in this.udisksProxies){ - if(proxy.drive){ - proxy.drive.run_dispose(); - } - if(proxy.ata){ - proxy.ata.run_dispose(); - } - } - + this._destroyDriveUtility(); Mainloop.source_remove(this._timeoutId); for each (let signal in this._settingChangedSignals){ - settings.disconnect(signal); + this._settings.disconnect(signal); }; }, @@ -162,47 +165,48 @@ const FreonMenuButton = new Lang.Class({ if (this.sensorsArgv){ new Utilities.Future(this.sensorsArgv, Lang.bind(this,function(stdout){ this._sensorsOutput = stdout; - this._updateDisplay(this._sensorsOutput, this._hddtempOutput, this._aticonfigOutput); + this._updateDisplay(); })); } - if (settings.get_boolean('show-hdd-temp') && this.hddtempArgv){ + if (this._settings.get_string('drive-utility') == 'hddtemp' && this.hddtempArgv){ new Utilities.Future(this.hddtempArgv, Lang.bind(this,function(stdout){ this._hddtempOutput = stdout; - this._updateDisplay(this._sensorsOutput, this._hddtempOutput, this._aticonfigOutput); + this._updateDisplay(); })); } - if (settings.get_boolean('show-aticonfig-temp') && this.aticonfigArgv){ + if (this._settings.get_boolean('show-aticonfig-temp') && this.aticonfigArgv){ new Utilities.Future(this.aticonfigArgv, Lang.bind(this,function(stdout){ this._aticonfigOutput = stdout; - this._updateDisplay(this._sensorsOutput, this._hddtempOutput, this._aticonfigOutput); + this._updateDisplay(); })); } }, - _updateDisplay: function(sensors_output, hddtemp_output, aticonfig_output){ + _updateDisplay: function(){ let tempInfo = []; let fanInfo = []; let voltageInfo = []; - tempInfo = Utilities.parseSensorsOutput(sensors_output,Utilities.parseSensorsTemperatureLine); + tempInfo = Utilities.parseSensorsOutput(this._sensorsOutput,Utilities.parseSensorsTemperatureLine); tempInfo = tempInfo.filter(Utilities.filterTemperature); - if (settings.get_boolean('show-fan-rpm')){ - fanInfo = Utilities.parseSensorsOutput(sensors_output,Utilities.parseFanRPMLine); + if (this._settings.get_boolean('show-fan-rpm')){ + fanInfo = Utilities.parseSensorsOutput(this._sensorsOutput,Utilities.parseFanRPMLine); fanInfo = fanInfo.filter(Utilities.filterFan); } - if (settings.get_boolean('show-voltage')){ - voltageInfo = Utilities.parseSensorsOutput(sensors_output,Utilities.parseVoltageLine); + if (this._settings.get_boolean('show-voltage')){ + voltageInfo = Utilities.parseSensorsOutput(this._sensorsOutput,Utilities.parseVoltageLine); } - if(settings.get_boolean('show-hdd-temp') && this.hddtempArgv) - tempInfo = tempInfo.concat(Utilities.parseHddTempOutput(hddtemp_output, !(/nc$/.exec(this.hddtempArgv[0])) ? ': ' : '|')); - - if(settings.get_boolean('show-aticonfig-temp') && this.aticonfigArgv) - tempInfo = tempInfo.concat(Utilities.parseAtiConfigOutput(aticonfig_output)); + if(this._settings.get_string('drive-utility') == 'hddtemp' && this.hddtempArgv) { + tempInfo = tempInfo.concat(Utilities.parseHddTempOutput(this._hddtempOutput, !(/nc$/.exec(this.hddtempArgv[0])) ? ': ' : '|')); + } else if(this._settings.get_string('drive-utility') == 'udisks2'){ + tempInfo = tempInfo.concat(this._udisks2.getHDDTemp()); + } - tempInfo = tempInfo.concat(Utilities.UDisks.create_list_from_proxies(this.udisksProxies)); + if(this._settings.get_boolean('show-aticonfig-temp') && this.aticonfigArgv) + tempInfo = tempInfo.concat(Utilities.parseAtiConfigOutput(this._aticonfigOutput)); tempInfo.sort(function(a,b) { return a['label'].localeCompare(b['label']) }); fanInfo.sort(function(a,b) { return a['label'].localeCompare(b['label']) }); @@ -245,13 +249,13 @@ const FreonMenuButton = new Lang.Class({ } let needAppendMenuItems = false; - let mainSensor = settings.get_string('main-sensor'); + let mainSensor = this._settings.get_string('main-sensor'); let sensorCount = 0; for each (let s in sensorsList) { if(s.type != 'separator') { sensorCount++; if (mainSensor == s.label) { - if(settings.get_boolean('show-label')) + if(this._settings.get_boolean('show-label')) this.statusLabel.set_text('%s: %s'.format(s.label, s.value)); else this.statusLabel.set_text(s.value); @@ -311,12 +315,15 @@ const FreonMenuButton = new Lang.Class({ _appendMenuItems : function(sensorsList){ this._sensorMenuItems = {}; - let mainSensor = settings.get_string('main-sensor'); + let mainSensor = this._settings.get_string('main-sensor'); for each (let s in sensorsList){ if(s.type == 'separator'){ this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); } else { let item = new FreonItem(this._sensorIcons[s.type], s.label, s.value); + item.connect('activate', Lang.bind(this, function (self) { + this._settings.set_string('main-sensor', self.getLabel()); + })); if (mainSensor == s.label) item.addMainDot(); this._sensorMenuItems[s.label] = item; @@ -346,16 +353,16 @@ const FreonMenuButton = new Lang.Class({ }, _formatTemp: function(value) { - if (settings.get_string('unit')=='fahrenheit'){ + if (this._settings.get_string('unit')=='fahrenheit'){ value = this._toFahrenheit(value); } let format = '%.1f'; - if (!settings.get_boolean('show-decimal-value')){ + if (!this._settings.get_boolean('show-decimal-value')){ //ret = Math.round(value); format = '%d'; } format += '%s'; - return format.format(value, (settings.get_string('unit')=='fahrenheit') ? "\u00b0F" : "\u00b0C"); + return format.format(value, (this._settings.get_string('unit')=='fahrenheit') ? "\u00b0F" : "\u00b0C"); } }); @@ -363,7 +370,6 @@ let freonMenu; function init(extensionMeta) { Convenience.initTranslations(); - settings = Convenience.getSettings(); } function enable() { diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 70dd745..8180541 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -71,8 +71,34 @@ const FreonPrefsWidget = new GObject.Class({ // - this._addSwitch({key : 'show-hdd-temp', y : i, x : 0, - label : _('Show Drive Temperature')}); + // HDD Temperature Utility ComboBox + let hddTempUtilModel = new Gtk.ListStore(); + hddTempUtilModel.set_column_types([GObject.TYPE_STRING, GObject.TYPE_STRING]); + + let hddTempUtil = new Gtk.ComboBox({model: hddTempUtilModel}); + let hddTempUtilRenderer = new Gtk.CellRendererText(); + hddTempUtil.pack_start(hddTempUtilRenderer, true); + hddTempUtil.add_attribute(hddTempUtilRenderer, 'text', 1); + + let hddTempUtilItems = ['none', 'hddtemp', 'udisks2']; + + hddTempUtilModel.set(hddTempUtilModel.append(), [0, 1], [hddTempUtilItems[0], 'None']); + hddTempUtilModel.set(hddTempUtilModel.append(), [0, 1], [hddTempUtilItems[1], 'Hddtemp']); + hddTempUtilModel.set(hddTempUtilModel.append(), [0, 1], [hddTempUtilItems[2], 'UDisks2']); + + hddTempUtil.set_active(hddTempUtilItems.indexOf(this._settings.get_string('drive-utility'))); + + hddTempUtil.connect('changed', Lang.bind(this, function(entry) { + let [success, iter] = hddTempUtil.get_active_iter(); + if (!success) + return; + this._settings.set_string('drive-utility', hddTempUtilModel.get_value(iter, 0)) + })); + + this.attach(new Gtk.Label({ label: _('Utility for HDD/SSD temperature'), halign : Gtk.Align.END}), 0, i, 1, 1); + this.attach(hddTempUtil, 1, i, 1, 1); + + // this._addSwitch({key : 'show-fan-rpm', y : i++, x : 2, label : _('Show Fan Speed')}); @@ -80,10 +106,9 @@ const FreonPrefsWidget = new GObject.Class({ this._addSwitch({key : 'show-voltage', y : i, x : 0, label : _('Show Power Supply Voltage')}); - this._addSwitch({key : 'show-aticonfig-temp', y : i, x : 2, + this._addSwitch({key : 'show-aticonfig-temp', y : i++, x : 2, label : _('Use Catalyst'), help : _('Show AMD video card temperature, use aticonfig from Catalyst driver.')}); - }, _addSwitch : function(params){ diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled index 6e6fad00153b7c2aa47961c7be2dd6d2cc21a572..ebcd33e1ad7d49d50d292f98c8f16b08c5ecc225 100644 GIT binary patch delta 263 zcmcb@`h<0Y2k%`b1|aZZcmSlIOboT>WCLKk+ze$55kNWx zh!@DO=mv>{*t|gT3LxDGk~2)I1c`&#AoUY~^b8ifkC5KGo>iAELFF(Br_+oq!OwvFFy|=Sz3^iSdyw+l9>zSGfb{$3IzbKZam}w delta 247 zcmaFDdWCg@2k%)X1|aZZxB#TDOboT>WCwCVm}BDH`Sr^TcF3^+IqpDNUWPJ;2p}B` z#2=SkR|1KH*xW$z3?N+s#3_bJl^}5t8zkNUq&t9^A8BfMqjMQglmFa|=Lnj0_q{ rnz@OYdAh}^dByofj%BGuiRq~f3>w9nr3ER8C8@e4nYpQx` 'centigrade' Unit - The unit ('centigrade' or 'fahrenheit') the extension should display the temperature in. + The unit ('centigrade' or 'fahrenheit') the extension should display the temperature in @@ -33,28 +33,28 @@ Show one digit after decimal - - true - Display HDD Temp - Display hard disk drive temperature. Requires hddtemp installed. - - true Display Fan RPM - Display fan rotation per minute. + Display fan rotation per minute true Display voltage - Display voltage of various components. + Display voltage of various components false Show AMD Card Temperature (Catalyst) - Show AMD card temperature, use aticonfig from Catalyst driver. + Show AMD card temperature, use aticonfig from Catalyst driver + + + + 'none' + Utility for detect HDD/SSD temperature + Utility for detect HDD/SSD temperature ('none', 'hddtemp' or 'udisks2') diff --git a/freon@UshakovVasilii_Github.yahoo.com/udisks2.js b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js new file mode 100644 index 0000000..f90e8f3 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js @@ -0,0 +1,109 @@ +const Lang = imports.lang; +const Gio = imports.gi.Gio; + +const UDisksDriveProxy = Gio.DBusProxy.makeProxyWrapper( +' \ + \ + \ + \ +'); + +const UDisksDriveAtaProxy = Gio.DBusProxy.makeProxyWrapper( +' \ + \ + \ + \ +'); + +// Poor man's async.js +const Async = { + // mapping will be done in parallel + map: function(arr, mapClb /* function(in, successClb)) */, resClb /* function(result) */) { + let counter = arr.length; + let result = []; + for (let i = 0; i < arr.length; ++i) { + mapClb(arr[i], (function(i, newVal) { + result[i] = newVal; + if (--counter == 0) resClb(result); + }).bind(null, i)); // i needs to be bound since it will be changed during the next iteration + } + } +} + +// routines for handling of udisks2 +const UDisks2 = new Lang.Class({ + Name: 'UDisks2', + + _init: function(callback) { + this._udisksProxies = []; + this._get_drive_ata_proxies(Lang.bind(this, function(proxies) { + this._udisksProxies = proxies; + callback(); + })); + }, + + // creates a list of sensor objects from the list of proxies given + getHDDTemp: function() { + return this._udisksProxies.filter(function(proxy) { + // 0K means no data available + return proxy.ata.SmartTemperature > 0; + }).map(function(proxy) { + return { + label: proxy.drive.Model, + temp: proxy.ata.SmartTemperature - 272.15 + }; + }); + }, + + // calls callback with [{ drive: UDisksDriveProxy, ata: UDisksDriveAtaProxy }, ... ] for every drive that implements both interfaces + _get_drive_ata_proxies: function(callback) { + Gio.DBusObjectManagerClient.new(Gio.DBus.system, 0, "org.freedesktop.UDisks2", "/org/freedesktop/UDisks2", null, null, function(src, res) { + try { + let objMgr = Gio.DBusObjectManagerClient.new_finish(res); //might throw + + let objPaths = objMgr.get_objects().filter(function(o) { + return o.get_interface("org.freedesktop.UDisks2.Drive") != null + && o.get_interface("org.freedesktop.UDisks2.Drive.Ata") != null; + }).map(function(o) { return o.get_object_path() }); + + // now create the proxy objects, log and ignore every failure + Async.map(objPaths, function(obj, callback) { + // create the proxies object + let driveProxy = new UDisksDriveProxy(Gio.DBus.system, "org.freedesktop.UDisks2", obj, function(res, error) { + if (error) { //very unlikely - we even checked the interfaces before! + global.log('[FREON] Could not create proxy on ' + obj + ':' + error); + callback(null); + return; + } + let ataProxy = new UDisksDriveAtaProxy(Gio.DBus.system, "org.freedesktop.UDisks2", obj, function(res, error) { + if (error) { + global.log('[FREON] Could not create proxy on ' + obj + ':' + error); + callback(null); + return; + } + + callback({ drive: driveProxy, ata: ataProxy }); + }); + }); + }, function(proxies) { + // filter out failed attempts == null values + callback(proxies.filter(function(a) { return a != null; })); + }); + } catch (e) { + global.log('[FREON] Could not find UDisks2 objects: ' + e); + } + }); + }, + + destroy: function(callback) { + for each (let proxy in this._udisksProxies){ + if(proxy.drive){ + proxy.drive.run_dispose(); + } + if(proxy.ata){ + proxy.ata.run_dispose(); + } + } + }, + +}); diff --git a/freon@UshakovVasilii_Github.yahoo.com/utilities.js b/freon@UshakovVasilii_Github.yahoo.com/utilities.js index 909e7e7..31d0a28 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/utilities.js +++ b/freon@UshakovVasilii_Github.yahoo.com/utilities.js @@ -1,25 +1,10 @@ const GLib = imports.gi.GLib; -const GObject = imports.gi.GObject; const Gio = imports.gi.Gio; const Lang = imports.lang; const Me = imports.misc.extensionUtils.getCurrentExtension(); const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); const _ = Gettext.gettext; -const UDisksDriveProxy = Gio.DBusProxy.makeProxyWrapper( -' \ - \ - \ - \ -'); - -const UDisksDriveAtaProxy = Gio.DBusProxy.makeProxyWrapper( -' \ - \ - \ - \ -'); - function detectSensors() { let path = GLib.find_program_in_path('sensors'); return path ? [path] : undefined; @@ -272,78 +257,3 @@ const Future = new Lang.Class({ } }); -// Poor man's async.js -const Async = { - // mapping will be done in parallel - map: function(arr, mapClb /* function(in, successClb)) */, resClb /* function(result) */) { - let counter = arr.length; - let result = []; - for (let i = 0; i < arr.length; ++i) { - mapClb(arr[i], (function(i, newVal) { - result[i] = newVal; - if (--counter == 0) resClb(result); - }).bind(null, i)); // i needs to be bound since it will be changed during the next iteration - } - } -} - -function debug(str){ - //tail -f -n100 ~/.cache/gdm/session.log | grep temperature - print ('LOG temperature@xtranophilist: ' + str); -} - -// routines for handling of udisks2 -const UDisks = { - // creates a list of sensor objects from the list of proxies given - create_list_from_proxies: function(proxies) { - return proxies.filter(function(proxy) { - // 0K means no data available - return proxy.ata.SmartTemperature > 0; - }).map(function(proxy) { - return { - label: proxy.drive.Model, - temp: proxy.ata.SmartTemperature - 272.15 - }; - }); - }, - - // calls callback with [{ drive: UDisksDriveProxy, ata: UDisksDriveAtaProxy }, ... ] for every drive that implements both interfaces - get_drive_ata_proxies: function(callback) { - Gio.DBusObjectManagerClient.new(Gio.DBus.system, 0, "org.freedesktop.UDisks2", "/org/freedesktop/UDisks2", null, null, function(src, res) { - try { - let objMgr = Gio.DBusObjectManagerClient.new_finish(res); //might throw - - let objPaths = objMgr.get_objects().filter(function(o) { - return o.get_interface("org.freedesktop.UDisks2.Drive") != null - && o.get_interface("org.freedesktop.UDisks2.Drive.Ata") != null; - }).map(function(o) { return o.get_object_path() }); - - // now create the proxy objects, log and ignore every failure - Async.map(objPaths, function(obj, callback) { - // create the proxies object - let driveProxy = new UDisksDriveProxy(Gio.DBus.system, "org.freedesktop.UDisks2", obj, function(res, error) { - if (error) { //very unlikely - we even checked the interfaces before! - debug("Could not create proxy on "+obj+":"+error); - callback(null); - return; - } - let ataProxy = new UDisksDriveAtaProxy(Gio.DBus.system, "org.freedesktop.UDisks2", obj, function(res, error) { - if (error) { - debug("Could not create proxy on "+obj+":"+error); - callback(null); - return; - } - - callback({ drive: driveProxy, ata: ataProxy }); - }); - }); - }, function(proxies) { - // filter out failed attempts == null values - callback(proxies.filter(function(a) { return a != null; })); - }); - } catch (e) { - debug("Could not find UDisks objects: "+e); - } - }); - } -}; From 7915e4fe97e6bbc11e795eb934cb97ce73a4414b Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Tue, 24 Jun 2014 04:21:29 +0400 Subject: [PATCH 028/224] Remove show label, add show icon on top panel functionality --- .../extension.js | 48 ++++++++++++++---- .../prefs.js | 6 +-- .../schemas/gschemas.compiled | Bin 740 -> 748 bytes ...gnome.shell.extensions.sensors.gschema.xml | 6 +-- 4 files changed, 44 insertions(+), 16 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 6465c68..5cab10b 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -23,6 +23,7 @@ const FreonItem = new Lang.Class({ this.parent(); this._hasMainDot = false; this._label = label; + this._gIcon = gIcon; this.actor.add(new St.Icon({ style_class: 'system-status-icon', gicon : gIcon})); this.actor.add(new St.Label({text: label}), {x_fill: true, expand: true}); @@ -48,6 +49,10 @@ const FreonItem = new Lang.Class({ return this._label; }, + getGIcon: function() { + return this._gIcon; + }, + setValue: function(value) { this._valueLabel.text = value; } @@ -58,7 +63,7 @@ const FreonMenuButton = new Lang.Class({ Extends: PanelMenu.Button, _init: function(){ - this.parent(null, 'sensorMenu'); + this.parent(St.Align.START); this._sensorMenuItems = {}; @@ -74,9 +79,16 @@ const FreonMenuButton = new Lang.Class({ fan : Gio.icon_new_for_string(Me.path + '/icons/sensors-fan-symbolic.svg') } + this._menuLayout = new St.BoxLayout(); + if(this._settings.get_boolean('show-icon-on-panel')){ + this._icon = new St.Icon({ style_class: 'system-status-icon'}); + this._menuLayout.add(this._icon); + } + this.statusLabel = new St.Label({ text: '\u2026', y_expand: true, y_align: Clutter.ActorAlign.CENTER }); + this._menuLayout.add(this.statusLabel); - this.actor.add_actor(this.statusLabel); + this.actor.add_actor(this._menuLayout); this.sensorsArgv = Utilities.detectSensors(); this._initDriveUtility(); @@ -86,7 +98,7 @@ const FreonMenuButton = new Lang.Class({ this._settingChangedSignals = []; this._addSettingChangedSignal('update-time', Lang.bind(this, this._updateTimeChanged)); this._addSettingChangedSignal('unit', Lang.bind(this, this._querySensors)); - this._addSettingChangedSignal('show-label', Lang.bind(this, this._querySensors)); + this._addSettingChangedSignal('show-icon-on-panel', Lang.bind(this, this._showIconOnPanelChanged)); this._addSettingChangedSignal('main-sensor', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-decimal-value', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-fan-rpm', Lang.bind(this, this._querySensors)); @@ -102,6 +114,18 @@ const FreonMenuButton = new Lang.Class({ this._addTimer(); }, + _showIconOnPanelChanged : function(){ + if(this._settings.get_boolean('show-icon-on-panel')) { + this._icon = new St.Icon({ style_class: 'system-status-icon'}); + if(this._lastActiveItem) + this._icon.gicon = this._lastActiveItem.getGIcon(); + this._menuLayout.insert_child_at_index(this._icon, 0); + } else { + this._icon.destroy(); + this._icon = null; + } + }, + _driveUtilityChanged : function(){ this._destroyDriveUtility(); this._initDriveUtility(); @@ -255,19 +279,19 @@ const FreonMenuButton = new Lang.Class({ if(s.type != 'separator') { sensorCount++; if (mainSensor == s.label) { - if(this._settings.get_boolean('show-label')) - this.statusLabel.set_text('%s: %s'.format(s.label, s.value)); - else - this.statusLabel.set_text(s.value); + this.statusLabel.set_text(s.value); let item = this._sensorMenuItems[s.label]; if(item) { if(!item.hasMainDot()){ global.log('[FREON] Change active sensor'); - for each (let i in this._sensorMenuItems){ - i.removeMainDot(); + if(this._lastActiveItem) { + this._lastActiveItem.removeMainDot(); } + this._lastActiveItem = item; item.addMainDot(); + if(this._icon) + this._icon.gicon = item.getGIcon(); } } else { needAppendMenuItems = true; @@ -324,8 +348,12 @@ const FreonMenuButton = new Lang.Class({ item.connect('activate', Lang.bind(this, function (self) { this._settings.set_string('main-sensor', self.getLabel()); })); - if (mainSensor == s.label) + if (mainSensor == s.label) { + this._lastActiveItem = item; item.addMainDot(); + if(this._icon) + this._icon.gicon = item.getGIcon(); + } this._sensorMenuItems[s.label] = item; this.menu.addMenuItem(item); } diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 8180541..783ebe8 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -35,8 +35,8 @@ const FreonPrefsWidget = new GObject.Class({ this.attach(updateTime, 1, i, 1, 1); this._settings.bind('update-time', updateTime, 'value', Gio.SettingsBindFlags.DEFAULT); - this._addSwitch({key : 'show-label', y : i++, x : 2, - label : _('Show Sensor Label')}); + this._addSwitch({key : 'show-icon-on-panel', y : i++, x : 2, + label : _('Show Icon on Panel')}); this._addSwitch({key : 'show-decimal-value', y : i, x : 0, label : _('Show Decimal Value'), @@ -95,7 +95,7 @@ const FreonPrefsWidget = new GObject.Class({ this._settings.set_string('drive-utility', hddTempUtilModel.get_value(iter, 0)) })); - this.attach(new Gtk.Label({ label: _('Utility for HDD/SSD temperature'), halign : Gtk.Align.END}), 0, i, 1, 1); + this.attach(new Gtk.Label({ label: _('Utility for HDD/SSD Temperature'), halign : Gtk.Align.END}), 0, i, 1, 1); this.attach(hddTempUtil, 1, i, 1, 1); // diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled index ebcd33e1ad7d49d50d292f98c8f16b08c5ecc225..6afb209c8ac7e5b77b163e87664f5b91541d9333 100644 GIT binary patch delta 327 zcmaFD`i6Ca2k%oR1|aZZcmbr}ObpGhf8{U!nFT0xmXU!$n4yf}0g!$Q#IB{s%R%BG zHV;tz2ax^?#K~rDf*^4aTL>sF05nJxh*?D$82$qRhz+tp0!Z5c@lnb7H6ZmMHVaU_ z1CaIy;*ZO&D*?sxz#ML%L;_GS2Z$HQujmG80I_+2;tfE$6Npm`lPW>tAT~(-3?RJ# zh*|zrw1dP!Y>-1Y0O_qje4w_D8{{Amn-wU207yTbypd6H@*_rVlj4m0a^1}2{5)MC kDoD&r%>f#rk)#PE*@2i1h=Cpi15O~x48%;6HJNq;0J#`LIRF3v delta 309 zcmaFE`h<0Y2k%`b1|aZZcmSlIObpGhpL}m66AMu2EF%L07eg7t4Iq6Nh+p}Oe+G$z z*up^Z4?y}W5WAKhF9(T(*gQaS4xmB2K+G!2!0;akKx~i&0zldXh>uFnuK}qCu~~rX zEr7H;5Pw{DT?r_j2j*}CB_e==DL}kHenmG(1BlHF6t4i%jUYM0q)L!Dhz(Ld0Z7jP zVwOJ@?I3Xw8|0uBKzc0@AE>S41~~}CW(A7x0Md6SZ)8+t%}Gp3&6#|h(M$%YjU9;D UfEXwX2An_==rsoB$%ah30jxkhaR2}S diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml index f7e7673..2cbeed5 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml +++ b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml @@ -15,10 +15,10 @@ The unit ('centigrade' or 'fahrenheit') the extension should display the temperature in - + false - Display label - Display also the label of the sensor in the panel + Show Icon on Panel + Show sensor icon on top panel From fff926096008409b659a6ee8e706a3daf109a67a Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Tue, 24 Jun 2014 04:42:11 +0400 Subject: [PATCH 029/224] Improve drive output --- freon@UshakovVasilii_Github.yahoo.com/utilities.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/utilities.js b/freon@UshakovVasilii_Github.yahoo.com/utilities.js index 31d0a28..0f0bbde 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/utilities.js +++ b/freon@UshakovVasilii_Github.yahoo.com/utilities.js @@ -165,7 +165,8 @@ function parseHddTempOutput(txt, sep) { for each(let line in hddtemp_output) { let sensor = new Array(); let fields = line.split(sep).filter(function(e){ return e; }); - sensor['label'] = _("Drive %s").format(fields[0].split('/').pop()); + //sensor['label'] = _("Drive %s").format(fields[0].split('/').pop()); + sensor['label'] = fields[0].split('/').pop() + ' - ' + fields[1]; sensor['temp'] = parseFloat(fields[2]); //push only if the temp is a Number if (!isNaN(sensor['temp'])) From 02ef584f80270cafd3f770484a1ac98581ac6bbf Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Tue, 24 Jun 2014 04:50:57 +0400 Subject: [PATCH 030/224] Replace screens --- img/panel_menu.jpg | Bin 14864 -> 59043 bytes img/prefs-1.jpg | Bin 27497 -> 30055 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/img/panel_menu.jpg b/img/panel_menu.jpg index d21ae31a56c09e64528ceb4d379d9e02075606fd..552b61922b008e2df80f48f0d8126dacb494960e 100644 GIT binary patch literal 59043 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 literal 14864 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 Hzt8>`5KCrz literal 27497 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 Date: Tue, 24 Jun 2014 13:13:49 +0400 Subject: [PATCH 031/224] Standardize drive output format --- freon@UshakovVasilii_Github.yahoo.com/utilities.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/utilities.js b/freon@UshakovVasilii_Github.yahoo.com/utilities.js index 0f0bbde..1ec905f 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/utilities.js +++ b/freon@UshakovVasilii_Github.yahoo.com/utilities.js @@ -161,15 +161,12 @@ function parseHddTempOutput(txt, sep) { hddtemp_output = hddtemp_output.filter(function(e){ return e; }); - let sensors = new Array(); + let sensors = []; for each(let line in hddtemp_output) { - let sensor = new Array(); let fields = line.split(sep).filter(function(e){ return e; }); - //sensor['label'] = _("Drive %s").format(fields[0].split('/').pop()); - sensor['label'] = fields[0].split('/').pop() + ' - ' + fields[1]; - sensor['temp'] = parseFloat(fields[2]); + let sensor = { label: fields[1], temp: parseFloat(fields[2])}; //push only if the temp is a Number - if (!isNaN(sensor['temp'])) + if (!isNaN(sensor.temp)) sensors.push(sensor); } return sensors; From 0572af3f92510db44669572f7f491a1cea7b1b00 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Tue, 24 Jun 2014 13:20:43 +0400 Subject: [PATCH 032/224] Improve default prorirties --- .../schemas/gschemas.compiled | Bin 748 -> 748 bytes ...g.gnome.shell.extensions.sensors.gschema.xml | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled index 6afb209c8ac7e5b77b163e87664f5b91541d9333..3d6bf5f6549f9b2fe5a90f0137c820eadb272c75 100644 GIT binary patch delta 59 zcmaFE`i6Bw1|x3|69YqvVNxXv0|P_PSD#3sMqG PQgur*b5kczX9@)X09z5# delta 59 zcmaFE`i6Bw1|x4L69YqvVNxXv0|P_n - false + true

Show Icon on Panel Show sensor icon on top panel @@ -52,7 +52,7 @@ - 'none' + 'udisks2' Utility for detect HDD/SSD temperature Utility for detect HDD/SSD temperature ('none', 'hddtemp' or 'udisks2') From 26bd3f76ddc09955515227cba7cdf7c99c22c6ac Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Tue, 24 Jun 2014 17:18:27 +0400 Subject: [PATCH 033/224] Fix bug in UDisk2 Kelvin conversion --- freon@UshakovVasilii_Github.yahoo.com/udisks2.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/udisks2.js b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js index f90e8f3..2ad300f 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/udisks2.js +++ b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js @@ -50,7 +50,7 @@ const UDisks2 = new Lang.Class({ }).map(function(proxy) { return { label: proxy.drive.Model, - temp: proxy.ata.SmartTemperature - 272.15 + temp: proxy.ata.SmartTemperature - 273.15 }; }); }, From 52df18ec74bcf383f9948d451669433cfc0689a7 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 26 Jun 2014 00:22:01 +0400 Subject: [PATCH 034/224] Improve ComboBox code --- .../prefs.js | 92 ++++++++----------- 1 file changed, 37 insertions(+), 55 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 783ebe8..74a012b 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -42,61 +42,17 @@ const FreonPrefsWidget = new GObject.Class({ label : _('Show Decimal Value'), help : _("Show one digit after decimal")}); - // Temperature Unit ComboBox - let tUnitModel = new Gtk.ListStore(); - tUnitModel.set_column_types([GObject.TYPE_STRING, GObject.TYPE_STRING]); - - let tUnit = new Gtk.ComboBox({model: tUnitModel}); - let tUnitRenderer = new Gtk.CellRendererText(); - tUnit.pack_start(tUnitRenderer, true); - tUnit.add_attribute(tUnitRenderer, 'text', 1); - - let tUnitItems = ["centigrade", "fahrenheit"]; - - tUnitModel.set(tUnitModel.append(), [0, 1], [tUnitItems[0], "\u00b0C"]); - tUnitModel.set(tUnitModel.append(), [0, 1], [tUnitItems[1], "\u00b0F"]); - - tUnit.set_active(tUnitItems.indexOf(this._settings.get_string('unit'))); - - tUnit.connect('changed', Lang.bind(this, function(entry) { - let [success, iter] = tUnit.get_active_iter(); - if (!success) - return; - this._settings.set_string('unit', tUnitModel.get_value(iter, 0)) - })); - - this.attach(new Gtk.Label({ label: _('Temperature Unit'), halign : Gtk.Align.END}), 2, i, 1, 1); - this.attach(tUnit, 3, i++, 1, 1); - - // - - - // HDD Temperature Utility ComboBox - let hddTempUtilModel = new Gtk.ListStore(); - hddTempUtilModel.set_column_types([GObject.TYPE_STRING, GObject.TYPE_STRING]); - - let hddTempUtil = new Gtk.ComboBox({model: hddTempUtilModel}); - let hddTempUtilRenderer = new Gtk.CellRendererText(); - hddTempUtil.pack_start(hddTempUtilRenderer, true); - hddTempUtil.add_attribute(hddTempUtilRenderer, 'text', 1); - - let hddTempUtilItems = ['none', 'hddtemp', 'udisks2']; - - hddTempUtilModel.set(hddTempUtilModel.append(), [0, 1], [hddTempUtilItems[0], 'None']); - hddTempUtilModel.set(hddTempUtilModel.append(), [0, 1], [hddTempUtilItems[1], 'Hddtemp']); - hddTempUtilModel.set(hddTempUtilModel.append(), [0, 1], [hddTempUtilItems[2], 'UDisks2']); - - hddTempUtil.set_active(hddTempUtilItems.indexOf(this._settings.get_string('drive-utility'))); - - hddTempUtil.connect('changed', Lang.bind(this, function(entry) { - let [success, iter] = hddTempUtil.get_active_iter(); - if (!success) - return; - this._settings.set_string('drive-utility', hddTempUtilModel.get_value(iter, 0)) - })); - - this.attach(new Gtk.Label({ label: _('Utility for HDD/SSD Temperature'), halign : Gtk.Align.END}), 0, i, 1, 1); - this.attach(hddTempUtil, 1, i, 1, 1); + this._addComboBox({ + items : {centigrade : "\u00b0C", fahrenheit : "\u00b0F"}, + key: 'unit', y : i++, x : 2, + label: _('Temperature Unit') + }); + + this._addComboBox({ + items : {none : 'None', hddtemp : 'Hddtemp', udisks2 : 'UDisks2'}, + key: 'drive-utility', y : i, x : 0, + label: _('Utility for HDD/SSD Temperature') + }); // @@ -121,6 +77,32 @@ const FreonPrefsWidget = new GObject.Class({ sw.set_tooltip_text(params.help); } this._settings.bind(params.key, sw, 'active', Gio.SettingsBindFlags.DEFAULT); + }, + + _addComboBox : function(params){ + let model = new Gtk.ListStore(); + model.set_column_types([GObject.TYPE_STRING, GObject.TYPE_STRING]); + + let combobox = new Gtk.ComboBox({model: model}); + let renderer = new Gtk.CellRendererText(); + combobox.pack_start(renderer, true); + combobox.add_attribute(renderer, 'text', 1); + + for(let k in params.items){ + model.set(model.append(), [0, 1], [k, params.items[k]]); + } + + combobox.set_active(Object.keys(params.items).indexOf(this._settings.get_string(params.key))); + + combobox.connect('changed', Lang.bind(this, function(entry) { + let [success, iter] = combobox.get_active_iter(); + if (!success) + return; + this._settings.set_string(params.key, model.get_value(iter, 0)) + })); + + this.attach(new Gtk.Label({ label: params.label, halign : Gtk.Align.END}), params.x, params.y, 1, 1); + this.attach(combobox, params.x + 1, params.y, 1, 1); } }); From 09ba86949061d78da8803957213ee6a56e55f70a Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 26 Jun 2014 01:39:05 +0400 Subject: [PATCH 035/224] Add position on panel pref --- .../extension.js | 22 +++++++++++++++++- .../prefs.js | 14 +++++++---- .../schemas/gschemas.compiled | Bin 748 -> 808 bytes ...gnome.shell.extensions.sensors.gschema.xml | 6 +++++ 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 5cab10b..aec0f5b 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -105,6 +105,7 @@ const FreonMenuButton = new Lang.Class({ this._addSettingChangedSignal('show-voltage', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-aticonfig-temp', Lang.bind(this, this._showAtiConfigChanged)); this._addSettingChangedSignal('drive-utility', Lang.bind(this, this._driveUtilityChanged)); + this._addSettingChangedSignal('position-in-panel', Lang.bind(this, this._positionInPanelChanged)); this.connect('destroy', Lang.bind(this, this._onDestroy)); @@ -114,6 +115,20 @@ const FreonMenuButton = new Lang.Class({ this._addTimer(); }, + _positionInPanelChanged : function(){ + this.container.get_parent().remove_actor(this.container); + + // small HACK with private boxes :) + let boxes = { + left: Main.panel._leftBox, + center: Main.panel._centerBox, + right: Main.panel._rightBox + }; + + let p = this.positionInPanel; + boxes[p].insert_child_at_index(this.container, p == 'right' ? 0 : -1) + }, + _showIconOnPanelChanged : function(){ if(this._settings.get_boolean('show-icon-on-panel')) { this._icon = new St.Icon({ style_class: 'system-status-icon'}); @@ -391,6 +406,10 @@ const FreonMenuButton = new Lang.Class({ } format += '%s'; return format.format(value, (this._settings.get_string('unit')=='fahrenheit') ? "\u00b0F" : "\u00b0C"); + }, + + get positionInPanel(){ + return this._settings.get_string('position-in-panel'); } }); @@ -402,7 +421,8 @@ function init(extensionMeta) { function enable() { freonMenu = new FreonMenuButton(); - Main.panel.addToStatusArea('freonMenu', freonMenu); + let positionInPanel = freonMenu.positionInPanel; + Main.panel.addToStatusArea('freonMenu', freonMenu, positionInPanel == 'right' ? 0 : -1, positionInPanel); } function disable() { diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 74a012b..c4b8acf 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -32,12 +32,9 @@ const FreonPrefsWidget = new GObject.Class({ this.attach(new Gtk.Label({ label: _('Poll Sensors Every (sec)'), halign : Gtk.Align.END}), 0, i, 1, 1); let updateTime = Gtk.SpinButton.new_with_range (1, 60, 1); - this.attach(updateTime, 1, i, 1, 1); + this.attach(updateTime, 1, i++, 1, 1); this._settings.bind('update-time', updateTime, 'value', Gio.SettingsBindFlags.DEFAULT); - this._addSwitch({key : 'show-icon-on-panel', y : i++, x : 2, - label : _('Show Icon on Panel')}); - this._addSwitch({key : 'show-decimal-value', y : i, x : 0, label : _('Show Decimal Value'), help : _("Show one digit after decimal")}); @@ -48,6 +45,15 @@ const FreonPrefsWidget = new GObject.Class({ label: _('Temperature Unit') }); + this._addComboBox({ + items : {left : 'Left', center : 'Center', right : 'Right'}, + key: 'position-in-panel', y : i, x : 0, + label: _('Position in Panel') + }); + + this._addSwitch({key : 'show-icon-on-panel', y : i++, x : 2, + label : _('Show Icon on Panel')}); + this._addComboBox({ items : {none : 'None', hddtemp : 'Hddtemp', udisks2 : 'UDisks2'}, key: 'drive-utility', y : i, x : 0, diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled index 3d6bf5f6549f9b2fe5a90f0137c820eadb272c75..e23b2a88cfd2691fb52bf6993adb410c01e556c9 100644 GIT binary patch literal 808 zcmYjPzl+sC82nC+zupO+BA!^B9HKdnBr0fQqlIW8*c~<&d&$0JG1-J-^Jc&O@$Ky04OJUuos8cy_~D@a19KDn==H|s zg>meH+>;sfM;P82k$rrt2U&byE`oiatkW>HWue0+(|I21nbWp0rES7#txJnyf00x0 zaUV{f!-GBo90iU6$AQU+ot1YlInKRLNGD&xKZx`D>-4El!RMkLuy^jw6Z+JL;GYDq zQ2&{|pijLB{|fjzu>17cg#A!^@Na=N_1Gsh`^>#i?}6_R&iYkm%SHDi1o9w;BcFZ?3i0%pX9ktutw@5{%8K zOqC7ls$j7!us*Dm%lf|(A?TY?}yu!*ti{mT=JFz)%+{|VNlSxP>aRn7CEwsPu zZY#O+3hiw~8|!OrghOn^#zN8eC%X!M_T{~O^Je~JGT)bZBDvD6Rm0$wLR+0}6a3@n z@X|i2J|tEt_ow%sB05mWdFgpK$Q57ucA;mXPe*q*4$kOy|o zgG^vDv(_ff0N1h_shad{EyDQC&!a$d-$aq_c+FGV#xLed1ci@rI(zyaI3iQMczyuT z9(!TzBakVnt3qk%C)~rrRyrASsq7SAI!X{g&F3O9T`}k-G8cBHWgzutG0ZYgrt9ff zGdYVru7#~-C`=D#$>No2T-iw+(iF3AC+50dEa2jzx#ps|=AyZ87tJ*n&Bb}Odc6RO CU!8~m diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml index 1829a13..93e86f0 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml +++ b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml @@ -57,5 +57,11 @@ Utility for detect HDD/SSD temperature ('none', 'hddtemp' or 'udisks2') + + 'right' + Position in Panel + Position in Panel ('left', 'center', 'right') + + From bc06a4aba1e05580de39e8566bf9ccb80cc3c5ef Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 26 Jun 2014 01:56:51 +0400 Subject: [PATCH 036/224] Remove HACK with setting menuItem --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index aec0f5b..88fe2bb 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -378,10 +378,7 @@ const FreonMenuButton = new Lang.Class({ this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); let item = new PopupMenu.PopupBaseMenuItem(); - // HACK: span and expand parameters don't work as expected on Label, so add an invisible - // Label to switch columns and not totally break the layout. - item.actor.add(new St.Label({ text: '' })); - item.actor.add(new St.Label({ text: _("Sensors Settings") })); + item.actor.add(new St.Label({ text: _("Sensors Settings") }), { expand: true, x_fill: false }); item.connect('activate', function () { Util.spawn(["gnome-shell-extension-prefs", Me.metadata.uuid]); From f17237772a9a6aef788fb623289925173ca94a2b Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 26 Jun 2014 02:12:11 +0400 Subject: [PATCH 037/224] Improve sorting for temperature menu items --- .../extension.js | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 88fe2bb..9214aff 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -224,32 +224,38 @@ const FreonMenuButton = new Lang.Class({ }, _updateDisplay: function(){ - let tempInfo = []; - let fanInfo = []; - let voltageInfo = []; + let gpuTempInfo = []; + if(this._settings.get_boolean('show-aticonfig-temp') && this.aticonfigArgv) + gpuTempInfo = Utilities.parseAtiConfigOutput(this._aticonfigOutput); + + let sensorsTempInfo = []; + sensorsTempInfo = Utilities.parseSensorsOutput(this._sensorsOutput,Utilities.parseSensorsTemperatureLine); + sensorsTempInfo = sensorsTempInfo.filter(Utilities.filterTemperature); - tempInfo = Utilities.parseSensorsOutput(this._sensorsOutput,Utilities.parseSensorsTemperatureLine); - tempInfo = tempInfo.filter(Utilities.filterTemperature); + let fanInfo = []; if (this._settings.get_boolean('show-fan-rpm')){ fanInfo = Utilities.parseSensorsOutput(this._sensorsOutput,Utilities.parseFanRPMLine); fanInfo = fanInfo.filter(Utilities.filterFan); } + + let voltageInfo = []; if (this._settings.get_boolean('show-voltage')){ voltageInfo = Utilities.parseSensorsOutput(this._sensorsOutput,Utilities.parseVoltageLine); } + let driveTempInfo = []; if(this._settings.get_string('drive-utility') == 'hddtemp' && this.hddtempArgv) { - tempInfo = tempInfo.concat(Utilities.parseHddTempOutput(this._hddtempOutput, !(/nc$/.exec(this.hddtempArgv[0])) ? ': ' : '|')); + driveTempInfo = Utilities.parseHddTempOutput(this._hddtempOutput, !(/nc$/.exec(this.hddtempArgv[0])) ? ': ' : '|'); } else if(this._settings.get_string('drive-utility') == 'udisks2'){ - tempInfo = tempInfo.concat(this._udisks2.getHDDTemp()); + driveTempInfo = this._udisks2.getHDDTemp(); } - if(this._settings.get_boolean('show-aticonfig-temp') && this.aticonfigArgv) - tempInfo = tempInfo.concat(Utilities.parseAtiConfigOutput(this._aticonfigOutput)); + sensorsTempInfo.sort(function(a,b) { return a.label.localeCompare(b.label) }); + driveTempInfo.sort(function(a,b) { return a.label.localeCompare(b.label) }); + fanInfo.sort(function(a,b) { return a.label.localeCompare(b.label) }); + voltageInfo.sort(function(a,b) { return a.label.localeCompare(b.label) }); - tempInfo.sort(function(a,b) { return a['label'].localeCompare(b['label']) }); - fanInfo.sort(function(a,b) { return a['label'].localeCompare(b['label']) }); - voltageInfo.sort(function(a,b) { return a['label'].localeCompare(b['label']) }); + let tempInfo = gpuTempInfo.concat(sensorsTempInfo).concat(driveTempInfo); if (this.sensorsArgv && tempInfo.length > 0){ let sum = 0; //sum From be96d068205f27b7480568e32b87b28ad133ab4c Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 26 Jun 2014 02:27:07 +0400 Subject: [PATCH 038/224] Replace screens --- img/panel_menu.jpg | Bin 59043 -> 54750 bytes img/prefs-1.jpg | Bin 30055 -> 35406 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/img/panel_menu.jpg b/img/panel_menu.jpg index 552b61922b008e2df80f48f0d8126dacb494960e..fc033ed5bc926d77986fe21b46bb5a24f38b9372 100644 GIT binary patch literal 54750 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 literal 59043 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 diff --git a/img/prefs-1.jpg b/img/prefs-1.jpg index 2a0d34283da9532c70a48091b2739d3d0433047c..91eb4c38759e780ba62ea7d01c21fac2fad81cad 100644 GIT binary patch literal 35406 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 PX)6v+o~z*Aj}QL`j3*R> literal 30055 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 Hzt8>`5KCrz From b407846f715e7215f215d2e1666b234d8e299031 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sun, 29 Jun 2014 15:47:17 +0400 Subject: [PATCH 039/224] Refactor output reading --- .../utilities.js | 44 +++++++------------ 1 file changed, 17 insertions(+), 27 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/utilities.js b/freon@UshakovVasilii_Github.yahoo.com/utilities.js index 1ec905f..fd3f42e 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/utilities.js +++ b/freon@UshakovVasilii_Github.yahoo.com/utilities.js @@ -213,45 +213,35 @@ function filterVoltage(voltageInfo) { const Future = new Lang.Class({ Name: 'Future', - _init: function(argv, callback) { + _init: function(argv, callback) { try{ this._callback = callback; - let [exit, pid, stdin, stdout, stderr] = + let [exit, pid, stdinFd, stdoutFd, stderrFd] = GLib.spawn_async_with_pipes(null, /* cwd */ argv, /* args */ null, /* env */ GLib.SpawnFlags.DO_NOT_REAP_CHILD, null /* child_setup */); - this._stdout = new Gio.UnixInputStream({fd: stdout, close_fd: true}); - this._dataStdout = new Gio.DataInputStream({base_stream: this._stdout}); - new Gio.UnixOutputStream({fd: stdin, close_fd: true}).close(null); - new Gio.UnixInputStream({fd: stderr, close_fd: true}).close(null); + let stdout = new Gio.UnixInputStream({fd: stdoutFd, close_fd: true}); + let outReader = new Gio.DataInputStream({base_stream: stdout}); - this._childWatch = GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, Lang.bind(this, function(pid, status, requestObj) { - GLib.source_remove(this._childWatch); - })); + GLib.close(stdinFd); + GLib.close(stderrFd); + + let childWatch = GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, Lang.bind(this, function(pid, status, requestObj) { + let output = ''; + let [line, size] = [null, 0]; + while (([line, size] = outReader.read_line(null)) != null && line != null) { + output += line.toString() + '\n'; + } - this._readStdout(); + stdout.close(null); + GLib.source_remove(childWatch); + callback(output); + })); } catch(e){ global.log(e.toString()); } - }, - - _readStdout: function(){ - this._dataStdout.fill_async(-1, GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(stream, result) { - if (stream.fill_finish(result) == 0){ - try{ - this._callback(stream.peek_buffer().toString()); - }catch(e){ - global.log(e.toString()); - } - this._stdout.close(null); - return; - } - - stream.set_buffer_size(2 * stream.get_buffer_size()); - this._readStdout(); - })); } }); From e5c60c5d87d7500306f650f414abbed51f95410b Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sun, 29 Jun 2014 23:04:34 +0400 Subject: [PATCH 040/224] Improve code --- .../extension.js | 37 ++++++++++--------- .../utilities.js | 8 +--- 2 files changed, 21 insertions(+), 24 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 9214aff..8f5f65d 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -67,9 +67,10 @@ const FreonMenuButton = new Lang.Class({ this._sensorMenuItems = {}; - this._sensorsOutput = ''; - this._hddtempOutput = ''; - this._aticonfigOutput = ''; + this._output = {}; + this._output.sensors = ''; + this._output.hddtemp = ''; + this._output.aticonfig = ''; this._settings = Convenience.getSettings(); @@ -202,22 +203,22 @@ const FreonMenuButton = new Lang.Class({ _querySensors: function(){ if (this.sensorsArgv){ - new Utilities.Future(this.sensorsArgv, Lang.bind(this,function(stdout){ - this._sensorsOutput = stdout; + Utilities.spawnCmd(this.sensorsArgv, Lang.bind(this,function(stdout){ + this._output.sensors = stdout; this._updateDisplay(); })); } - if (this._settings.get_string('drive-utility') == 'hddtemp' && this.hddtempArgv){ - new Utilities.Future(this.hddtempArgv, Lang.bind(this,function(stdout){ - this._hddtempOutput = stdout; + if (this.hddtempArgv){ + Utilities.spawnCmd(this.hddtempArgv, Lang.bind(this,function(stdout){ + this._output.hddtemp = stdout; this._updateDisplay(); })); } - if (this._settings.get_boolean('show-aticonfig-temp') && this.aticonfigArgv){ - new Utilities.Future(this.aticonfigArgv, Lang.bind(this,function(stdout){ - this._aticonfigOutput = stdout; + if (this.aticonfigArgv){ + Utilities.spawnCmd(this.aticonfigArgv, Lang.bind(this,function(stdout){ + this._output.aticonfig = stdout; this._updateDisplay(); })); } @@ -225,27 +226,27 @@ const FreonMenuButton = new Lang.Class({ _updateDisplay: function(){ let gpuTempInfo = []; - if(this._settings.get_boolean('show-aticonfig-temp') && this.aticonfigArgv) - gpuTempInfo = Utilities.parseAtiConfigOutput(this._aticonfigOutput); + if(this.aticonfigArgv) + gpuTempInfo = Utilities.parseAtiConfigOutput(this._output.aticonfig); let sensorsTempInfo = []; - sensorsTempInfo = Utilities.parseSensorsOutput(this._sensorsOutput,Utilities.parseSensorsTemperatureLine); + sensorsTempInfo = Utilities.parseSensorsOutput(this._output.sensors,Utilities.parseSensorsTemperatureLine); sensorsTempInfo = sensorsTempInfo.filter(Utilities.filterTemperature); let fanInfo = []; if (this._settings.get_boolean('show-fan-rpm')){ - fanInfo = Utilities.parseSensorsOutput(this._sensorsOutput,Utilities.parseFanRPMLine); + fanInfo = Utilities.parseSensorsOutput(this._output.sensors,Utilities.parseFanRPMLine); fanInfo = fanInfo.filter(Utilities.filterFan); } let voltageInfo = []; if (this._settings.get_boolean('show-voltage')){ - voltageInfo = Utilities.parseSensorsOutput(this._sensorsOutput,Utilities.parseVoltageLine); + voltageInfo = Utilities.parseSensorsOutput(this._output.sensors,Utilities.parseVoltageLine); } let driveTempInfo = []; - if(this._settings.get_string('drive-utility') == 'hddtemp' && this.hddtempArgv) { - driveTempInfo = Utilities.parseHddTempOutput(this._hddtempOutput, !(/nc$/.exec(this.hddtempArgv[0])) ? ': ' : '|'); + if(this.hddtempArgv) { + driveTempInfo = Utilities.parseHddTempOutput(this._output.hddtemp, !(/nc$/.exec(this.hddtempArgv[0])) ? ': ' : '|'); } else if(this._settings.get_string('drive-utility') == 'udisks2'){ driveTempInfo = this._udisks2.getHDDTemp(); } diff --git a/freon@UshakovVasilii_Github.yahoo.com/utilities.js b/freon@UshakovVasilii_Github.yahoo.com/utilities.js index fd3f42e..eb4df3f 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/utilities.js +++ b/freon@UshakovVasilii_Github.yahoo.com/utilities.js @@ -210,10 +210,7 @@ function filterVoltage(voltageInfo) { return true; } -const Future = new Lang.Class({ - Name: 'Future', - - _init: function(argv, callback) { +function spawnCmd(argv, callback) { try{ this._callback = callback; let [exit, pid, stdinFd, stdoutFd, stderrFd] = @@ -242,6 +239,5 @@ const Future = new Lang.Class({ } catch(e){ global.log(e.toString()); } - } -}); +} From 6a4501129b0edee6f4177171bc503b2e9ca0a31e Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Tue, 1 Jul 2014 23:58:27 +0400 Subject: [PATCH 041/224] Improve code --- .../aticonfigUtil.js | 42 +++ .../commandLineUtil.js | 53 ++++ .../extension.js | 100 ++++--- .../hddtempUtil.js | 84 ++++++ .../sensorsUtil.js | 124 +++++++++ .../utilities.js | 243 ------------------ 6 files changed, 352 insertions(+), 294 deletions(-) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js create mode 100644 freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js create mode 100644 freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js create mode 100644 freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/utilities.js diff --git a/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js b/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js new file mode 100644 index 0000000..fa579f6 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js @@ -0,0 +1,42 @@ +const Lang = imports.lang; +const GLib = imports.gi.GLib; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const CommandLineUtil = Me.imports.commandLineUtil; + +const AticonfigUtil = new Lang.Class({ + Name: 'AticonfigUtil', + Extends: CommandLineUtil.CommandLineUtil, + + detect: function(){ + let path = GLib.find_program_in_path('aticonfig'); + this._argv = path ? [path, '--odgt'] : null; + return this._argv != null; + }, + + /* + Default Adapter - AMD Radeon R9 200 Series + Sensor 0: Temperature - 37.00 C + */ + get temp() { + if(!this._output) + return []; + let label = null; + let temp = null; + for each(let line in this._output) { + if(!line) + continue; + let r; + if(line.indexOf('Adapter') > 0) + label = (r = /Adapter \- (.*)/.exec(line)) ? r[1] : undefined; + if(line.indexOf('Temperature') > 0) + temp = (r = /Temperature \- (\d{1,3}.\d{1,2})/.exec(line)) ? parseFloat(r[1]) : undefined; + } + + if(!label || !temp) + return []; + + return [{ label : label.trim(), temp : temp}]; + } + +}); diff --git a/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js new file mode 100644 index 0000000..4ff8db1 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js @@ -0,0 +1,53 @@ +const Lang = imports.lang; +const GLib = imports.gi.GLib; +const Gio = imports.gi.Gio; + +const CommandLineUtil = new Lang.Class({ + Name: 'CommandLineUtil', + + _init: function(){ + this._argv = null; + }, + + execute: function(callback) { + try{ + this._callback = callback; + let [exit, pid, stdinFd, stdoutFd, stderrFd] = + GLib.spawn_async_with_pipes(null, /* cwd */ + this._argv, /* args */ + null, /* env */ + GLib.SpawnFlags.DO_NOT_REAP_CHILD, + null /* child_setup */); + let stdout = new Gio.UnixInputStream({fd: stdoutFd, close_fd: true}); + let outReader = new Gio.DataInputStream({base_stream: stdout}); + + GLib.close(stdinFd); + GLib.close(stderrFd); + + let childWatch = GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, Lang.bind(this, function(pid, status, requestObj) { + let output = []; + let [line, size] = [null, 0]; + while (([line, size] = outReader.read_line(null)) != null && line != null) { + if(line) + output.push(line.toString()); + } + + stdout.close(null); + GLib.source_remove(childWatch); + this._output = output; + callback(); + })); + } catch(e){ + global.log(e.toString()); + } + }, + + get available(){ + return this._argv != null; + }, + + destroy: function(){ + this._argv = null; + } + +}); diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 8f5f65d..5507716 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -10,8 +10,11 @@ const Gio = imports.gi.Gio; const Me = imports.misc.extensionUtils.getCurrentExtension(); const Convenience = Me.imports.convenience; -const Utilities = Me.imports.utilities; const UDisks2 = Me.imports.udisks2; +const AticonfigUtil = Me.imports.aticonfigUtil; +const HddtempUtil = Me.imports.hddtempUtil; +const SensorsUtil = Me.imports.sensorsUtil; + const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); const _ = Gettext.gettext; @@ -67,10 +70,11 @@ const FreonMenuButton = new Lang.Class({ this._sensorMenuItems = {}; - this._output = {}; - this._output.sensors = ''; - this._output.hddtemp = ''; - this._output.aticonfig = ''; + this._utils = { + aticonfig: new AticonfigUtil.AticonfigUtil(), + hddtemp: new HddtempUtil.HddtempUtil(), + sensors: new SensorsUtil.SensorsUtil() + }; this._settings = Convenience.getSettings(); @@ -91,10 +95,10 @@ const FreonMenuButton = new Lang.Class({ this.actor.add_actor(this._menuLayout); - this.sensorsArgv = Utilities.detectSensors(); + this._utils.sensors.detect(); this._initDriveUtility(); if(this._settings.get_boolean('show-aticonfig-temp')) - this.aticonfigArgv = Utilities.detectAtiConfig(); + this._utils.aticonfig.detect(); this._settingChangedSignals = []; this._addSettingChangedSignal('update-time', Lang.bind(this, this._updateTimeChanged)); @@ -151,7 +155,7 @@ const FreonMenuButton = new Lang.Class({ _initDriveUtility : function(){ switch(this._settings.get_string('drive-utility')){ case 'hddtemp': - this.hddtempArgv = Utilities.detectHDDTemp(); + this._utils.hddtemp.detect(); break; case 'udisks2': this._udisks2 = new UDisks2.UDisks2(Lang.bind(this, function() { @@ -166,7 +170,7 @@ const FreonMenuButton = new Lang.Class({ this._udisks2.destroy(); this._udisks2 = null; } - this.hddtempArgv = null; + this._utils.hddtemp.destroy(); }, _updateTimeChanged : function(){ @@ -175,7 +179,10 @@ const FreonMenuButton = new Lang.Class({ }, _showAtiConfigChanged : function(){ - this.aticonfigArgv = this._settings.get_boolean('show-aticonfig-temp') ? Utilities.detectAtiConfig() : undefined; + if(this._settings.get_boolean('show-aticonfig-temp')) + this._utils.aticonfig.detect(); + else + this._utils.aticonfig.destroy(); this._querySensors(); }, @@ -201,24 +208,20 @@ const FreonMenuButton = new Lang.Class({ }, _querySensors: function(){ - - if (this.sensorsArgv){ - Utilities.spawnCmd(this.sensorsArgv, Lang.bind(this,function(stdout){ - this._output.sensors = stdout; + if (this._utils.sensors.available){ + this._utils.sensors.execute(Lang.bind(this,function(){ this._updateDisplay(); })); } - if (this.hddtempArgv){ - Utilities.spawnCmd(this.hddtempArgv, Lang.bind(this,function(stdout){ - this._output.hddtemp = stdout; + if (this._utils.hddtemp.available){ + this._utils.hddtemp.execute(Lang.bind(this,function(){ this._updateDisplay(); })); } - if (this.aticonfigArgv){ - Utilities.spawnCmd(this.aticonfigArgv, Lang.bind(this,function(stdout){ - this._output.aticonfig = stdout; + if (this._utils.aticonfig.available){ + this._utils.aticonfig.execute(Lang.bind(this,function(){ this._updateDisplay(); })); } @@ -226,27 +229,22 @@ const FreonMenuButton = new Lang.Class({ _updateDisplay: function(){ let gpuTempInfo = []; - if(this.aticonfigArgv) - gpuTempInfo = Utilities.parseAtiConfigOutput(this._output.aticonfig); + if (this._utils.aticonfig.available) + gpuTempInfo = this._utils.aticonfig.temp; - let sensorsTempInfo = []; - sensorsTempInfo = Utilities.parseSensorsOutput(this._output.sensors,Utilities.parseSensorsTemperatureLine); - sensorsTempInfo = sensorsTempInfo.filter(Utilities.filterTemperature); + let sensorsTempInfo = this._utils.sensors.temp; let fanInfo = []; - if (this._settings.get_boolean('show-fan-rpm')){ - fanInfo = Utilities.parseSensorsOutput(this._output.sensors,Utilities.parseFanRPMLine); - fanInfo = fanInfo.filter(Utilities.filterFan); - } + if (this._settings.get_boolean('show-fan-rpm')) + fanInfo = this._utils.sensors.rpm; let voltageInfo = []; - if (this._settings.get_boolean('show-voltage')){ - voltageInfo = Utilities.parseSensorsOutput(this._output.sensors,Utilities.parseVoltageLine); - } + if (this._settings.get_boolean('show-voltage')) + voltageInfo = this._utils.sensors.volt; let driveTempInfo = []; - if(this.hddtempArgv) { - driveTempInfo = Utilities.parseHddTempOutput(this._output.hddtemp, !(/nc$/.exec(this.hddtempArgv[0])) ? ': ' : '|'); + if(this._utils.hddtemp.available) { + driveTempInfo = this._utils.hddtemp.temp; } else if(this._settings.get_string('drive-utility') == 'udisks2'){ driveTempInfo = this._udisks2.getHDDTemp(); } @@ -258,7 +256,7 @@ const FreonMenuButton = new Lang.Class({ let tempInfo = gpuTempInfo.concat(sensorsTempInfo).concat(driveTempInfo); - if (this.sensorsArgv && tempInfo.length > 0){ + if (tempInfo.length > 0){ let sum = 0; //sum let max = 0; //max temp for each (let temp in tempInfo){ @@ -267,37 +265,37 @@ const FreonMenuButton = new Lang.Class({ max = temp['temp']; } - let sensorsList = []; + let sensors = []; for each (let temp in tempInfo){ - sensorsList.push({type:'temperature', label:temp['label'], value:this._formatTemp(temp['temp'])}); + sensors.push({type:'temperature', label:temp['label'], value:this._formatTemp(temp['temp'])}); } if (tempInfo.length > 0){ - sensorsList.push({type : 'separator'}); + sensors.push({type : 'separator'}); // Add average and maximum entries - sensorsList.push({type:'temperature', label:_("Average"), value:this._formatTemp(sum/tempInfo.length)}); - sensorsList.push({type:'temperature', label:_("Maximum"), value:this._formatTemp(max)}); + sensors.push({type:'temperature', label:_("Average"), value:this._formatTemp(sum/tempInfo.length)}); + sensors.push({type:'temperature', label:_("Maximum"), value:this._formatTemp(max)}); if(fanInfo.length > 0 || voltageInfo.length > 0) - sensorsList.push({type : 'separator'}); + sensors.push({type : 'separator'}); } for each (let fan in fanInfo){ - sensorsList.push({type:'fan',label:fan['label'], value:_("%drpm").format(fan['rpm'])}); + sensors.push({type:'fan',label:fan['label'], value:_("%drpm").format(fan['rpm'])}); } if (fanInfo.length > 0 && voltageInfo.length > 0){ - sensorsList.push({type : 'separator'}); + sensors.push({type : 'separator'}); } for each (let voltage in voltageInfo){ - sensorsList.push({type : 'voltage', label:voltage['label'], value:_("%s%.2fV").format(((voltage['volt'] >= 0) ? '+' : '-'), voltage['volt'])}); + sensors.push({type : 'voltage', label:voltage['label'], value:_("%s%.2fV").format(((voltage['volt'] >= 0) ? '+' : '-'), voltage['volt'])}); } let needAppendMenuItems = false; let mainSensor = this._settings.get_string('main-sensor'); let sensorCount = 0; - for each (let s in sensorsList) { + for each (let s in sensors) { if(s.type != 'separator') { sensorCount++; if (mainSensor == s.label) { @@ -323,7 +321,7 @@ const FreonMenuButton = new Lang.Class({ } if(Object.keys(this._sensorMenuItems).length==sensorCount){ - for each (let s in sensorsList) { + for each (let s in sensors) { if(s.type != 'separator') { let item = this._sensorMenuItems[s.label]; if(item) { @@ -340,7 +338,7 @@ const FreonMenuButton = new Lang.Class({ if(needAppendMenuItems){ global.log('[FREON] Render all MenuItems'); this.menu.removeAll(); - this._appendMenuItems(sensorsList); + this._appendMenuItems(sensors); } } else { this._sensorMenuItems = {}; @@ -348,9 +346,9 @@ const FreonMenuButton = new Lang.Class({ this.statusLabel.set_text(_("Error")); let item = new PopupMenu.PopupMenuItem( - (this.sensorsArgv + this._utils.sensors.available ? _("Please run sensors-detect as root.") - : _("Please install lm_sensors.")) + "\n" + _("If this doesn\'t help, click here to report with your sensors output!") + : _("Please install lm_sensors.\nIf this doesn\'t help, click here to report with your sensors output!") ); item.connect('activate',function() { Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/issues"]); @@ -359,10 +357,10 @@ const FreonMenuButton = new Lang.Class({ } }, - _appendMenuItems : function(sensorsList){ + _appendMenuItems : function(sensors){ this._sensorMenuItems = {}; let mainSensor = this._settings.get_string('main-sensor'); - for each (let s in sensorsList){ + for each (let s in sensors){ if(s.type == 'separator'){ this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); } else { diff --git a/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js b/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js new file mode 100644 index 0000000..6865596 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js @@ -0,0 +1,84 @@ +const Lang = imports.lang; +const GLib = imports.gi.GLib; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const CommandLineUtil = Me.imports.commandLineUtil; + +const HddtempUtil = new Lang.Class({ + Name: 'HddtempUtil', + Extends: CommandLineUtil.CommandLineUtil, + + detect: function(){ + let hddtempArgv = GLib.find_program_in_path('hddtemp'); + if(hddtempArgv) { + // check if this user can run hddtemp directly. + if(!GLib.spawn_command_line_sync(hddtempArgv)[3]){ + this._argv = [hddtempArgv]; + return true; + } + } + + // doesn't seem to be the case… is it running as a daemon? + // Check first for systemd + let systemctl = GLib.find_program_in_path('systemctl'); + let pidof = GLib.find_program_in_path('pidof'); + let nc = GLib.find_program_in_path('nc'); + let pid = undefined; + + if(systemctl) { + let activeState = GLib.spawn_command_line_sync(systemctl + " show hddtemp.service -p ActiveState")[1].toString().trim(); + if(activeState == "ActiveState=active") { + let output = GLib.spawn_command_line_sync(systemctl + " show hddtemp.service -p MainPID")[1].toString().trim(); + + if(output.length && output.split("=").length == 2) + pid = Number(output.split("=")[1].trim()); + } + } + + // systemd isn't used on this system, try sysvinit instead + if(!pid && pidof) { + let output = GLib.spawn_command_line_sync("pidof hddtemp")[1].toString().trim(); + if(output.length) + pid = Number(output.trim()); + } + + if(nc && pid) { + // get daemon command line + let cmdline = GLib.file_get_contents('/proc/'+pid+'/cmdline'); + // get port or assume default + let match = /(-p\W*|--port=)(\d{1,5})/.exec(cmdline) + let port = match ? parseInt(match[2]) : 7634; + // use net cat to get data + this._argv = [nc, 'localhost', port.toString()]; + return true; + } + + // not found + return false; + }, + + get temp() { + if(!this._output) + return []; + + let sep = /nc$/.exec(this._argv[0]) ? '|' : ': '; + let hddtempOutput = []; + if (this._output.join().indexOf(sep+sep) > 0) { + hddtempOutput = this._output.join().split(sep+sep); + } else { + hddtempOutput = this._output; + } + + let sensors = []; + for each(let line in hddtempOutput) { + let fields = line.split(sep).filter(function(e){ return e; }); + let sensor = { label: fields[1], temp: parseFloat(fields[2])}; + //push only if the temp is a Number + if (!isNaN(sensor.temp)) + sensors.push(sensor); + } + + return sensors; + } + +}); diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js new file mode 100644 index 0000000..44b2c0b --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -0,0 +1,124 @@ +const Lang = imports.lang; +const GLib = imports.gi.GLib; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const CommandLineUtil = Me.imports.commandLineUtil; + +const SensorsUtil = new Lang.Class({ + Name: 'SensorsUtil', + Extends: CommandLineUtil.CommandLineUtil, + + detect: function(){ + let path = GLib.find_program_in_path('sensors'); + this._argv = path ? [path] : null; + return this._argv != null; + }, + + get temp() { + let s = this._parseSensorsOutput(this._parseSensorsTemperatureLine); + return s.filter(function(e){ + return e.temp > 0 && e.temp < 115; + }); + }, + + get rpm() { + let s = this._parseSensorsOutput(this._parseFanRPMLine); + return s.filter(function(e){ + return e.rpm > 0; + }); + }, + + get volt() { + return this._parseSensorsOutput(this._parseVoltageLine); + }, + + _parseSensorsOutput: function(parser) { + if(!this._output) + return []; + + let feature_label = undefined; + let feature_value = undefined; + let sensors = []; + //iterate through each lines + for(let i = 0; i < this._output.length; i++){ + // ignore chipset driver name and 'Adapter:' line for now + i += 2; + // get every feature of the chip + while(this._output[i]){ + // if it is not a continutation of a feature line + if(this._output[i].indexOf(' ') != 0){ + let feature = parser(feature_label, feature_value); + if (feature){ + sensors.push(feature); + feature = undefined; + } + [feature_label, feature_value] = this._output[i].split(':'); + } else{ + feature_value += this._output[i]; + } + i++; + } + } + let feature = parser(feature_label, feature_value); + if (feature) { + sensors.push(feature); + feature = undefined; + } + return sensors; + }, + + _parseSensorsTemperatureLine: function(label, value) { + if(label == undefined || value == undefined) + return undefined; + let curValue = value.trim().split(' ')[0]; + // does the current value look like a temperature unit (°C)? + if(curValue.indexOf("C", curValue.length - "C".length) !== -1){ + return { + label: label.trim(), + temp: parseFloat(curValue.split(' ')[0]) + }; + // let r; + // sensor['low'] = (r = /low=\+(\d{1,3}.\d)/.exec(value)) ? parseFloat(r[1]) : undefined; + // sensor['high'] = (r = /high=\+(\d{1,3}.\d)/.exec(value)) ? parseFloat(r[1]) : undefined; + // sensor['crit'] = (r = /crit=\+(\d{1,3}.\d)/.exec(value)) ? parseFloat(r[1]) : undefined; + // sensor['hyst'] = (r = /hyst=\+(\d{1,3}.\d)/.exec(value)) ? parseFloat(r[1]) : undefined; + } + return undefined; + }, + + _parseFanRPMLine: function(label, value) { + if(label == undefined || value == undefined) + return undefined; + + let curValue = value.trim().split(' ')[0]; + // does the current value look like a fan rpm line? + if(curValue.indexOf("RPM", curValue.length - "RPM".length) !== -1){ + return { + label: label.trim(), + rpm: parseFloat(curValue.split(' ')[0]) + }; + // let r; + // sensor['min'] = (r = /min=(\d{1,5})/.exec(value)) ? parseFloat(r[1]) : undefined; + } + return undefined; + }, + + _parseVoltageLine: function(label, value) { + if(label == undefined || value == undefined) + return undefined; + + let curValue = value.trim().split(' ')[0]; + // does the current value look like a voltage line? + if(curValue.indexOf("V", curValue.length - "V".length) !== -1){ + return { + label: label.trim(), + volt: parseFloat(curValue.split(' ')[0]) + }; + // let r; + // sensor['min'] = (r = /min=(\d{1,3}.\d)/.exec(value)) ? parseFloat(r[1]) : undefined; + // sensor['max'] = (r = /max=(\d{1,3}.\d)/.exec(value)) ? parseFloat(r[1]) : undefined; + } + return undefined; + } + +}); diff --git a/freon@UshakovVasilii_Github.yahoo.com/utilities.js b/freon@UshakovVasilii_Github.yahoo.com/utilities.js deleted file mode 100644 index eb4df3f..0000000 --- a/freon@UshakovVasilii_Github.yahoo.com/utilities.js +++ /dev/null @@ -1,243 +0,0 @@ -const GLib = imports.gi.GLib; -const Gio = imports.gi.Gio; -const Lang = imports.lang; -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); -const _ = Gettext.gettext; - -function detectSensors() { - let path = GLib.find_program_in_path('sensors'); - return path ? [path] : undefined; -} - -function detectHDDTemp() { - let hddtempArgv = GLib.find_program_in_path('hddtemp'); - if(hddtempArgv) { - // check if this user can run hddtemp directly. - if(!GLib.spawn_command_line_sync(hddtempArgv)[3]) - return [hddtempArgv]; - } - - // doesn't seem to be the case… is it running as a daemon? - // Check first for systemd - let systemctl = GLib.find_program_in_path('systemctl'); - let pidof = GLib.find_program_in_path('pidof'); - let nc = GLib.find_program_in_path('nc'); - let pid = undefined; - - if(systemctl) { - let activeState = GLib.spawn_command_line_sync(systemctl + " show hddtemp.service -p ActiveState")[1].toString().trim(); - if(activeState == "ActiveState=active") { - let output = GLib.spawn_command_line_sync(systemctl + " show hddtemp.service -p MainPID")[1].toString().trim(); - - if(output.length && output.split("=").length == 2) { - pid = Number(output.split("=")[1].trim()); - } - } - } - - // systemd isn't used on this system, try sysvinit instead - if(!pid && pidof) { - let output = GLib.spawn_command_line_sync("pidof hddtemp")[1].toString().trim(); - - if(output.length) { - pid = Number(output.trim()); - } - } - - if(nc && pid) - { - // get daemon command line - let cmdline = GLib.file_get_contents('/proc/'+pid+'/cmdline'); - // get port or assume default - let match = /(-p\W*|--port=)(\d{1,5})/.exec(cmdline) - let port = match ? parseInt(match[2]) : 7634; - // use net cat to get data - return [nc, 'localhost', port.toString()]; - } - - // not found - return undefined; -} - -function detectAtiConfig() { - let path = GLib.find_program_in_path('aticonfig'); - return path ? [path, '--odgt'] : undefined; -} - -function parseSensorsOutput(txt,parser) { - let sensors_output = txt.split("\n"); - let feature_label = undefined; - let feature_value = undefined; - let sensors = new Array(); - //iterate through each lines - for(let i = 0; i < sensors_output.length; i++){ - // ignore chipset driver name and 'Adapter:' line for now - i += 2; - // get every feature of the chip - while(sensors_output[i]){ - // if it is not a continutation of a feature line - if(sensors_output[i].indexOf(' ') != 0){ - let feature = parser(feature_label, feature_value); - if (feature){ - sensors.push(feature); - feature = undefined; - } - [feature_label, feature_value] = sensors_output[i].split(':'); - } - else{ - feature_value += sensors_output[i]; - } - i++; - } - } - let feature = parser(feature_label, feature_value); - if (feature) { - sensors.push(feature); - feature = undefined; - } - return sensors; -} - -function parseSensorsTemperatureLine(label, value) { - let sensor = undefined; - if(label != undefined && value != undefined) { - let curValue = value.trim().split(' ')[0]; - // does the current value look like a temperature unit (°C)? - if(curValue.indexOf("C", curValue.length - "C".length) !== -1){ - sensor = new Array(); - let r; - sensor['label'] = label.trim(); - sensor['temp'] = parseFloat(curValue.split(' ')[0]); - sensor['low'] = (r = /low=\+(\d{1,3}.\d)/.exec(value)) ? parseFloat(r[1]) : undefined; - sensor['high'] = (r = /high=\+(\d{1,3}.\d)/.exec(value)) ? parseFloat(r[1]) : undefined; - sensor['crit'] = (r = /crit=\+(\d{1,3}.\d)/.exec(value)) ? parseFloat(r[1]) : undefined; - sensor['hyst'] = (r = /hyst=\+(\d{1,3}.\d)/.exec(value)) ? parseFloat(r[1]) : undefined; - } - } - return sensor; -} - -function parseFanRPMLine(label, value) { - let sensor = undefined; - if(label != undefined && value != undefined) { - let curValue = value.trim().split(' ')[0]; - // does the current value look like a fan rpm line? - if(curValue.indexOf("RPM", curValue.length - "RPM".length) !== -1){ - sensor = new Array(); - let r; - sensor['label'] = label.trim(); - sensor['rpm'] = parseFloat(curValue.split(' ')[0]); - sensor['min'] = (r = /min=(\d{1,5})/.exec(value)) ? parseFloat(r[1]) : undefined; - } - } - return sensor; -} - -function parseVoltageLine(label, value) { - let sensor = undefined; - if(label != undefined && value != undefined) { - let curValue = value.trim().split(' ')[0]; - // does the current value look like a voltage line? - if(curValue.indexOf("V", curValue.length - "V".length) !== -1){ - sensor = new Array(); - let r; - sensor['label'] = label.trim(); - sensor['volt'] = parseFloat(curValue.split(' ')[0]); - sensor['min'] = (r = /min=(\d{1,3}.\d)/.exec(value)) ? parseFloat(r[1]) : undefined; - sensor['max'] = (r = /max=(\d{1,3}.\d)/.exec(value)) ? parseFloat(r[1]) : undefined; - } - } - return sensor; -} - -function parseHddTempOutput(txt, sep) { - let hddtemp_output = []; - if (txt.indexOf(sep+sep) > 0) { - hddtemp_output = txt.split(sep+sep); - } else { - hddtemp_output = txt.split("\n"); - } - - hddtemp_output = hddtemp_output.filter(function(e){ return e; }); - - let sensors = []; - for each(let line in hddtemp_output) { - let fields = line.split(sep).filter(function(e){ return e; }); - let sensor = { label: fields[1], temp: parseFloat(fields[2])}; - //push only if the temp is a Number - if (!isNaN(sensor.temp)) - sensors.push(sensor); - } - return sensors; -} - -/* -Default Adapter - AMD Radeon R9 200 Series - Sensor 0: Temperature - 37.00 C -*/ -function parseAtiConfigOutput(txt) { - if(!txt) - return []; - let output = txt.split('\n'); - let label = null; - let temp = null; - for each(let line in output) { - if(!line) - continue; - let r; - if(line.indexOf('Adapter') > 0) - label = (r = /Adapter \- (.*)/.exec(line)) ? r[1] : undefined; - if(line.indexOf('Temperature') > 0) - temp = (r = /Temperature \- (\d{1,3}.\d{1,2})/.exec(line)) ? parseFloat(r[1]) : undefined; - } - - if(!label || !temp) - return []; - - return [{ label : label.trim(), temp : temp}]; -} - -function filterTemperature(tempInfo) { - return tempInfo['temp'] > 0 && tempInfo['temp'] < 115; -} - -function filterFan(fanInfo) { - return fanInfo['rpm'] > 0; -} - -function filterVoltage(voltageInfo) { - return true; -} - -function spawnCmd(argv, callback) { - try{ - this._callback = callback; - let [exit, pid, stdinFd, stdoutFd, stderrFd] = - GLib.spawn_async_with_pipes(null, /* cwd */ - argv, /* args */ - null, /* env */ - GLib.SpawnFlags.DO_NOT_REAP_CHILD, - null /* child_setup */); - let stdout = new Gio.UnixInputStream({fd: stdoutFd, close_fd: true}); - let outReader = new Gio.DataInputStream({base_stream: stdout}); - - GLib.close(stdinFd); - GLib.close(stderrFd); - - let childWatch = GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, Lang.bind(this, function(pid, status, requestObj) { - let output = ''; - let [line, size] = [null, 0]; - while (([line, size] = outReader.read_line(null)) != null && line != null) { - output += line.toString() + '\n'; - } - - stdout.close(null); - GLib.source_remove(childWatch); - callback(output); - })); - } catch(e){ - global.log(e.toString()); - } -} - From 1f4bff0fc9e524e1907c584a6572198eb362f283 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Wed, 2 Jul 2014 01:34:26 +0400 Subject: [PATCH 042/224] Improve code --- .../extension.js | 84 ++++--------------- .../freonItem.js | 44 ++++++++++ 2 files changed, 60 insertions(+), 68 deletions(-) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/freonItem.js diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 5507716..31347e3 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -14,53 +14,11 @@ const UDisks2 = Me.imports.udisks2; const AticonfigUtil = Me.imports.aticonfigUtil; const HddtempUtil = Me.imports.hddtempUtil; const SensorsUtil = Me.imports.sensorsUtil; +const FreonItem = Me.imports.freonItem; const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); const _ = Gettext.gettext; -const FreonItem = new Lang.Class({ - Name: 'FreonItem', - Extends: PopupMenu.PopupBaseMenuItem, - - _init: function(gIcon, label, value) { - this.parent(); - this._hasMainDot = false; - this._label = label; - this._gIcon = gIcon; - - this.actor.add(new St.Icon({ style_class: 'system-status-icon', gicon : gIcon})); - this.actor.add(new St.Label({text: label}), {x_fill: true, expand: true}); - this._valueLabel = new St.Label({text: value}); - this.actor.add(this._valueLabel); - }, - - addMainDot: function() { - this.setOrnament(PopupMenu.Ornament.DOT); - this._hasMainDot = true; - }, - - hasMainDot: function() { - return this._hasMainDot; - }, - - removeMainDot: function() { - this._hasMainDot = false; - this.setOrnament(PopupMenu.Ornament.NONE); - }, - - getLabel: function() { - return this._label; - }, - - getGIcon: function() { - return this._gIcon; - }, - - setValue: function(value) { - this._valueLabel.text = value; - } -}); - const FreonMenuButton = new Lang.Class({ Name: 'FreonMenuButton', Extends: PanelMenu.Button, @@ -208,22 +166,12 @@ const FreonMenuButton = new Lang.Class({ }, _querySensors: function(){ - if (this._utils.sensors.available){ - this._utils.sensors.execute(Lang.bind(this,function(){ - this._updateDisplay(); - })); - } - - if (this._utils.hddtemp.available){ - this._utils.hddtemp.execute(Lang.bind(this,function(){ - this._updateDisplay(); - })); - } - - if (this._utils.aticonfig.available){ - this._utils.aticonfig.execute(Lang.bind(this,function(){ - this._updateDisplay(); - })); + for each (let sensor in this._utils) { + if (sensor.available) { + sensor.execute(Lang.bind(this,function(){ + this._updateDisplay(); + })); + } } }, @@ -303,15 +251,15 @@ const FreonMenuButton = new Lang.Class({ let item = this._sensorMenuItems[s.label]; if(item) { - if(!item.hasMainDot()){ + if(!item.main){ global.log('[FREON] Change active sensor'); if(this._lastActiveItem) { - this._lastActiveItem.removeMainDot(); + this._lastActiveItem.main = false; } this._lastActiveItem = item; - item.addMainDot(); + item.main = true; if(this._icon) - this._icon.gicon = item.getGIcon(); + this._icon.gicon = item.gicon; } } else { needAppendMenuItems = true; @@ -325,7 +273,7 @@ const FreonMenuButton = new Lang.Class({ if(s.type != 'separator') { let item = this._sensorMenuItems[s.label]; if(item) { - item.setValue(s.value); + item.value = s.value; } else { needAppendMenuItems = true; } @@ -364,15 +312,15 @@ const FreonMenuButton = new Lang.Class({ if(s.type == 'separator'){ this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); } else { - let item = new FreonItem(this._sensorIcons[s.type], s.label, s.value); + let item = new FreonItem.FreonItem(this._sensorIcons[s.type], s.label, s.value); item.connect('activate', Lang.bind(this, function (self) { - this._settings.set_string('main-sensor', self.getLabel()); + this._settings.set_string('main-sensor', self.label); })); if (mainSensor == s.label) { this._lastActiveItem = item; - item.addMainDot(); + item.main = true; if(this._icon) - this._icon.gicon = item.getGIcon(); + this._icon.gicon = item.gicon; } this._sensorMenuItems[s.label] = item; this.menu.addMenuItem(item); diff --git a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js new file mode 100644 index 0000000..6a62afc --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js @@ -0,0 +1,44 @@ +const Lang = imports.lang; +const St = imports.gi.St; +const PopupMenu = imports.ui.popupMenu; + +const FreonItem = new Lang.Class({ + Name: 'FreonItem', + Extends: PopupMenu.PopupBaseMenuItem, + + _init: function(gIcon, label, value) { + this.parent(); + this._main = false; + this._label = label; + this._gIcon = gIcon; + + this.actor.add(new St.Icon({ style_class: 'system-status-icon', gicon : gIcon})); + this.actor.add(new St.Label({text: label}), {x_fill: true, expand: true}); + this._valueLabel = new St.Label({text: value}); + this.actor.add(this._valueLabel); + }, + + set main(main) { + if(main) + this.setOrnament(PopupMenu.Ornament.DOT); + else + this.setOrnament(PopupMenu.Ornament.NONE); + this._main = main; + }, + + get main() { + return this._main; + }, + + get label() { + return this._label; + }, + + get gicon() { + return this._gIcon; + }, + + set value(value) { + this._valueLabel.text = value; + } +}); From 519bec9da207f0cbe293d642122564aa7179f844 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Wed, 2 Jul 2014 01:59:07 +0400 Subject: [PATCH 043/224] Improve code --- .../extension.js | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 31347e3..7cc3422 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -207,16 +207,16 @@ const FreonMenuButton = new Lang.Class({ if (tempInfo.length > 0){ let sum = 0; //sum let max = 0; //max temp - for each (let temp in tempInfo){ - sum += temp['temp']; - if (temp['temp'] > max) - max = temp['temp']; + for each (let i in tempInfo){ + sum += i.temp; + if (i.temp > max) + max = i.temp; } let sensors = []; - for each (let temp in tempInfo){ - sensors.push({type:'temperature', label:temp['label'], value:this._formatTemp(temp['temp'])}); + for each (let i in tempInfo){ + sensors.push({type:'temperature', label: i.label, value:this._formatTemp(i.temp)}); } if (tempInfo.length > 0){ @@ -231,16 +231,16 @@ const FreonMenuButton = new Lang.Class({ } for each (let fan in fanInfo){ - sensors.push({type:'fan',label:fan['label'], value:_("%drpm").format(fan['rpm'])}); + sensors.push({type:'fan',label:fan.label, value:_("%drpm").format(fan.rpm)}); } if (fanInfo.length > 0 && voltageInfo.length > 0){ sensors.push({type : 'separator'}); } for each (let voltage in voltageInfo){ - sensors.push({type : 'voltage', label:voltage['label'], value:_("%s%.2fV").format(((voltage['volt'] >= 0) ? '+' : '-'), voltage['volt'])}); + sensors.push({type : 'voltage', label:voltage.label, value:_("%s%.2fV").format(((voltage.volt >= 0) ? '+' : '-'), voltage.volt)}); } - let needAppendMenuItems = false; + let mainSensor = this._settings.get_string('main-sensor'); let sensorCount = 0; for each (let s in sensors) { @@ -261,13 +261,12 @@ const FreonMenuButton = new Lang.Class({ if(this._icon) this._icon.gicon = item.gicon; } - } else { - needAppendMenuItems = true; } } } } + let needAppendMenuItems = false; if(Object.keys(this._sensorMenuItems).length==sensorCount){ for each (let s in sensors) { if(s.type != 'separator') { From 4f47a81daf8630d75fb19cdce1cc700fb8bb60b0 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 3 Jul 2014 21:11:43 +0400 Subject: [PATCH 044/224] Improve code udisks2 util --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 12 +++++------- freon@UshakovVasilii_Github.yahoo.com/udisks2.js | 10 +++++++++- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 7cc3422..1dd0179 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -33,6 +33,7 @@ const FreonMenuButton = new Lang.Class({ hddtemp: new HddtempUtil.HddtempUtil(), sensors: new SensorsUtil.SensorsUtil() }; + this._udisks2 = new UDisks2.UDisks2(); this._settings = Convenience.getSettings(); @@ -116,7 +117,7 @@ const FreonMenuButton = new Lang.Class({ this._utils.hddtemp.detect(); break; case 'udisks2': - this._udisks2 = new UDisks2.UDisks2(Lang.bind(this, function() { + this._udisks2.detect(Lang.bind(this, function() { this._updateDisplay(); })); break; @@ -124,10 +125,7 @@ const FreonMenuButton = new Lang.Class({ }, _destroyDriveUtility : function(){ - if(this._udisks2){ - this._udisks2.destroy(); - this._udisks2 = null; - } + this._udisks2.destroy(); this._utils.hddtemp.destroy(); }, @@ -193,8 +191,8 @@ const FreonMenuButton = new Lang.Class({ let driveTempInfo = []; if(this._utils.hddtemp.available) { driveTempInfo = this._utils.hddtemp.temp; - } else if(this._settings.get_string('drive-utility') == 'udisks2'){ - driveTempInfo = this._udisks2.getHDDTemp(); + } else if(this._udisks2.available){ + driveTempInfo = this._udisks2.temp; } sensorsTempInfo.sort(function(a,b) { return a.label.localeCompare(b.label) }); diff --git a/freon@UshakovVasilii_Github.yahoo.com/udisks2.js b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js index 2ad300f..f88de66 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/udisks2.js +++ b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js @@ -36,14 +36,21 @@ const UDisks2 = new Lang.Class({ _init: function(callback) { this._udisksProxies = []; + }, + + detect: function(callback){ this._get_drive_ata_proxies(Lang.bind(this, function(proxies) { this._udisksProxies = proxies; callback(); })); }, + get available(){ + return this._udisksProxies.length > 0; + }, + // creates a list of sensor objects from the list of proxies given - getHDDTemp: function() { + get temp() { return this._udisksProxies.filter(function(proxy) { // 0K means no data available return proxy.ata.SmartTemperature > 0; @@ -104,6 +111,7 @@ const UDisks2 = new Lang.Class({ proxy.ata.run_dispose(); } } + this._udisksProxies = []; }, }); From ffd153cc010a731e049103da3407446da789a42f Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 4 Jul 2014 22:05:35 +0400 Subject: [PATCH 045/224] Add NVIDIA card temperature --- .../extension.js | 19 ++++++++++-- .../nvidiaUtil.js | 29 ++++++++++++++++++ .../prefs.js | 6 +++- .../schemas/gschemas.compiled | Bin 808 -> 876 bytes ...gnome.shell.extensions.sensors.gschema.xml | 6 ++++ 5 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 1dd0179..61fb1d9 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -12,6 +12,7 @@ const Me = imports.misc.extensionUtils.getCurrentExtension(); const Convenience = Me.imports.convenience; const UDisks2 = Me.imports.udisks2; const AticonfigUtil = Me.imports.aticonfigUtil; +const NvidiaUtil = Me.imports.nvidiaUtil; const HddtempUtil = Me.imports.hddtempUtil; const SensorsUtil = Me.imports.sensorsUtil; const FreonItem = Me.imports.freonItem; @@ -31,7 +32,8 @@ const FreonMenuButton = new Lang.Class({ this._utils = { aticonfig: new AticonfigUtil.AticonfigUtil(), hddtemp: new HddtempUtil.HddtempUtil(), - sensors: new SensorsUtil.SensorsUtil() + sensors: new SensorsUtil.SensorsUtil(), + nvidia: new NvidiaUtil.NvidiaUtil() }; this._udisks2 = new UDisks2.UDisks2(); @@ -58,6 +60,8 @@ const FreonMenuButton = new Lang.Class({ this._initDriveUtility(); if(this._settings.get_boolean('show-aticonfig-temp')) this._utils.aticonfig.detect(); + if(this._settings.get_boolean('show-nvidia-temp')) + this._utils.nvidia.detect(); this._settingChangedSignals = []; this._addSettingChangedSignal('update-time', Lang.bind(this, this._updateTimeChanged)); @@ -68,6 +72,7 @@ const FreonMenuButton = new Lang.Class({ this._addSettingChangedSignal('show-fan-rpm', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-voltage', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-aticonfig-temp', Lang.bind(this, this._showAtiConfigChanged)); + this._addSettingChangedSignal('show-nvidia-temp', Lang.bind(this, this._showNvidiaChanged)); this._addSettingChangedSignal('drive-utility', Lang.bind(this, this._driveUtilityChanged)); this._addSettingChangedSignal('position-in-panel', Lang.bind(this, this._positionInPanelChanged)); @@ -142,6 +147,14 @@ const FreonMenuButton = new Lang.Class({ this._querySensors(); }, + _showNvidiaChanged : function(){ + if(this._settings.get_boolean('show-nvidia-temp')) + this._utils.nvidia.detect(); + else + this._utils.nvidia.destroy(); + this._querySensors(); + }, + _addTimer : function(){ this._timeoutId = Mainloop.timeout_add_seconds(this._settings.get_int('update-time'), Lang.bind(this, function (){ this._querySensors(); @@ -176,7 +189,9 @@ const FreonMenuButton = new Lang.Class({ _updateDisplay: function(){ let gpuTempInfo = []; if (this._utils.aticonfig.available) - gpuTempInfo = this._utils.aticonfig.temp; + gpuTempInfo = gpuTempInfo.concat(this._utils.aticonfig.temp); + if (this._utils.nvidia.available) + gpuTempInfo = gpuTempInfo.concat(this._utils.nvidia.temp); let sensorsTempInfo = this._utils.sensors.temp; diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js new file mode 100644 index 0000000..a71d53c --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js @@ -0,0 +1,29 @@ +const Lang = imports.lang; +const GLib = imports.gi.GLib; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const CommandLineUtil = Me.imports.commandLineUtil; + +const NvidiaUtil = new Lang.Class({ + Name: 'NvidiaUtil', + Extends: CommandLineUtil.CommandLineUtil, + + detect: function(){ + let path = GLib.find_program_in_path('nvidia-settings'); + this._argv = path ? [path, '-q', 'gpucoretemp', '-t'] : null; + return this._argv != null; + }, + + get temp() { + if(!this._output) + return []; + for each(let line in this._output) { + if(!line) + continue; + return [{label: 'Nvidia', temp: parseFloat(line)}]; + } + + return []; + } + +}); diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index c4b8acf..ddf2d8a 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -70,7 +70,11 @@ const FreonPrefsWidget = new GObject.Class({ this._addSwitch({key : 'show-aticonfig-temp', y : i++, x : 2, label : _('Use Catalyst'), - help : _('Show AMD video card temperature, use aticonfig from Catalyst driver.')}); + help : _('Show AMD video card temperature, use aticonfig from Catalyst driver')}); + + this._addSwitch({key : 'show-nvidia-temp', y : i, x : 0, + label : _('Use NVIDIA'), + help : _('Show NVIDIA video card temperature, use nvidia-settings util')}); }, _addSwitch : function(params){ diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled index e23b2a88cfd2691fb52bf6993adb410c01e556c9..d140afaa01ea1cc9456283b6f6a934df336058fc 100644 GIT binary patch literal 876 zcmYjPJ&4pm7#(%vse1>Whqxl5i0Gb@jarEKQ&@-x3U-H$#auF*3?`G1OmcgmVxtx| zcG_trmRi_fBbJu7*0PP*3g>&11ReJA9xvZ~-#7bxx7TH)@|!;O3jB}Y&%l?X zZy(X89>CuQe*=EK|9*--HS_!c&w)?p?o{-t55gDtA3b33XZC_VHTxNXj|11jGh_PH z%kVFNuLAu{s5z7CV9upV@=ZTdq0VILH!`gizmGRoqf$4@udPnC-J&N%9qH;}bqSxV zRd-K^x$*HUq){p7g?p1i+N6ySFz~<)Ja7XK{tY~E0}oK&C2I22%Gj00RhOqOB59Rx zb*4CXG1hHOX<2ouW8bQ*XbZ7!ZFIk|p)yv-rHqget!7dizrv>FWgC98QKhTazr!>- z((=EA$mjZ+O5>MB)>UzR6?vsCcGgGI?%k!16Vyhwc4zk?o;%4M-^Jc&O@$Ky04OJUuos8cy_~D@a19KDn==H|s zg>meH+>;sfM;P82k$rrt2U&byE`oiatkW>HWue0+(|I21nbWp0rES7#txJnyf00x0 zaUV{f!-GBo90iU6$AQU+ot1YlInKRLNGD&xKZx`D>-4El!RMkLuy^jw6Z+JL;GYDq zQ2&{|pijLB{|fjzu>17cg#A!^@Na=N_1Gsh`^>#i?}6_R&iYkm%SHDi1o9w;BcFZ?3i0%pX9ktutw@5{%8K zOqC7ls$j7!us*Dm%lf|(A?TShow AMD card temperature, use aticonfig from Catalyst driver + + false +

Show NVIDIA Card Temperature + Show NVIDIA card temperature, use nvidia-settings util + + 'udisks2' Utility for detect HDD/SSD temperature From 3024c636ef771e5c492f337978c21d77fbfc0daa Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sat, 5 Jul 2014 02:45:00 +0400 Subject: [PATCH 046/224] Add NVIDIA card label detection --- freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js index a71d53c..7d71152 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js @@ -11,6 +11,17 @@ const NvidiaUtil = new Lang.Class({ detect: function(){ let path = GLib.find_program_in_path('nvidia-settings'); this._argv = path ? [path, '-q', 'gpucoretemp', '-t'] : null; + this._label = 'NVIDIA'; + if(this._argv){ + // [0] ushakov-pc:0[gpu:0] (GeForce GTX 770) + for each(let line in GLib.spawn_command_line_sync(path + " -q gpus")){ + let match = /.*\[gpu:[\d]\].*\(([\w\d\ ]+)\).*/.exec(line); + if(match){ + this._label = match[1]; + break; + } + } + } return this._argv != null; }, @@ -20,7 +31,7 @@ const NvidiaUtil = new Lang.Class({ for each(let line in this._output) { if(!line) continue; - return [{label: 'Nvidia', temp: parseFloat(line)}]; + return [{label: this._label, temp: parseFloat(line)}]; } return []; From c254c1913375ea3799240477e6e7c102eb0745ff Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 10 Jul 2014 21:37:08 +0400 Subject: [PATCH 047/224] Improve utility for video card prefs --- README.md | 2 +- .../extension.js | 42 +++++++++--------- .../prefs.js | 28 +++++------- .../schemas/gschemas.compiled | Bin 876 -> 808 bytes ...gnome.shell.extensions.sensors.gschema.xml | 18 +++----- 5 files changed, 41 insertions(+), 49 deletions(-) diff --git a/README.md b/README.md index 8daaa17..329670e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ gnome-shell-extension-freon ==================================== -Freon is forked from [gnome-shell-extension-sensors](https://github.com/xtranophilist/gnome-shell-extension-sensors). Freon is an extension for displaying CPU temperature, HDD/SSD temperature, AMD video card temperature (Catalyst), voltage and CPU fan RPM in GNOME Shell. +Freon is forked from [gnome-shell-extension-sensors](https://github.com/xtranophilist/gnome-shell-extension-sensors). Freon is an extension for displaying CPU temperature, HDD/SSD temperature, video card temperature (Nvidia/Catalyst), voltage and fan RPM in GNOME Shell. More info in [wiki](https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 61fb1d9..0fc4e82 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -58,10 +58,7 @@ const FreonMenuButton = new Lang.Class({ this._utils.sensors.detect(); this._initDriveUtility(); - if(this._settings.get_boolean('show-aticonfig-temp')) - this._utils.aticonfig.detect(); - if(this._settings.get_boolean('show-nvidia-temp')) - this._utils.nvidia.detect(); + this._initGpuUtility(); this._settingChangedSignals = []; this._addSettingChangedSignal('update-time', Lang.bind(this, this._updateTimeChanged)); @@ -71,9 +68,8 @@ const FreonMenuButton = new Lang.Class({ this._addSettingChangedSignal('show-decimal-value', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-fan-rpm', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-voltage', Lang.bind(this, this._querySensors)); - this._addSettingChangedSignal('show-aticonfig-temp', Lang.bind(this, this._showAtiConfigChanged)); - this._addSettingChangedSignal('show-nvidia-temp', Lang.bind(this, this._showNvidiaChanged)); this._addSettingChangedSignal('drive-utility', Lang.bind(this, this._driveUtilityChanged)); + this._addSettingChangedSignal('gpu-utility', Lang.bind(this, this._gpuUtilityChanged)); this._addSettingChangedSignal('position-in-panel', Lang.bind(this, this._positionInPanelChanged)); this.connect('destroy', Lang.bind(this, this._onDestroy)); @@ -134,27 +130,33 @@ const FreonMenuButton = new Lang.Class({ this._utils.hddtemp.destroy(); }, - _updateTimeChanged : function(){ - Mainloop.source_remove(this._timeoutId); - this._addTimer(); + _initGpuUtility : function(){ + switch(this._settings.get_string('gpu-utility')){ + case 'nvidia-settings': + this._utils.nvidia.detect(); + break; + case 'aticonfig': + this._utils.aticonfig.detect(); + break; + } }, - _showAtiConfigChanged : function(){ - if(this._settings.get_boolean('show-aticonfig-temp')) - this._utils.aticonfig.detect(); - else - this._utils.aticonfig.destroy(); - this._querySensors(); + _destroyGpuUtility : function(){ + this._utils.nvidia.destroy(); + this._utils.aticonfig.destroy(); }, - _showNvidiaChanged : function(){ - if(this._settings.get_boolean('show-nvidia-temp')) - this._utils.nvidia.detect(); - else - this._utils.nvidia.destroy(); + _gpuUtilityChanged : function(){ + this._destroyGpuUtility(); + this._initGpuUtility(); this._querySensors(); }, + _updateTimeChanged : function(){ + Mainloop.source_remove(this._timeoutId); + this._addTimer(); + }, + _addTimer : function(){ this._timeoutId = Mainloop.timeout_add_seconds(this._settings.get_int('update-time'), Lang.bind(this, function (){ this._querySensors(); diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index ddf2d8a..cdbe699 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -54,27 +54,23 @@ const FreonPrefsWidget = new GObject.Class({ this._addSwitch({key : 'show-icon-on-panel', y : i++, x : 2, label : _('Show Icon on Panel')}); - this._addComboBox({ - items : {none : 'None', hddtemp : 'Hddtemp', udisks2 : 'UDisks2'}, - key: 'drive-utility', y : i, x : 0, - label: _('Utility for HDD/SSD Temperature') - }); - - // - - this._addSwitch({key : 'show-fan-rpm', y : i++, x : 2, + this._addSwitch({key : 'show-fan-rpm', y : i, x : 0, label : _('Show Fan Speed')}); - this._addSwitch({key : 'show-voltage', y : i, x : 0, + this._addSwitch({key : 'show-voltage', y : i++, x : 2, label : _('Show Power Supply Voltage')}); - this._addSwitch({key : 'show-aticonfig-temp', y : i++, x : 2, - label : _('Use Catalyst'), - help : _('Show AMD video card temperature, use aticonfig from Catalyst driver')}); + this._addComboBox({ + items : {none : 'None', hddtemp : 'Hddtemp', udisks2 : 'UDisks2'}, + key: 'drive-utility', y : i, x : 0, + label: _('HDD/SSD Temperature Utility') + }); - this._addSwitch({key : 'show-nvidia-temp', y : i, x : 0, - label : _('Use NVIDIA'), - help : _('Show NVIDIA video card temperature, use nvidia-settings util')}); + this._addComboBox({ + items : {none : 'None', 'nvidia-settings' : 'Nvidia', aticonfig : 'Catalyst'}, + key: 'gpu-utility', y : i, x : 2, + label: _('Video Card Temperature Utility') + }); }, _addSwitch : function(params){ diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled index d140afaa01ea1cc9456283b6f6a934df336058fc..3697b0f40cc298ca01063d5c4b18b3fa9da2f355 100644 GIT binary patch literal 808 zcmYjPy^GaA9Nbgm*E_)zgcFOCLo|mZIR$NOv=A+<4;zcUWG`7vc0+cPdk1Q#7B*sI z=~ZIkA7H74*xG3$SXx+UFPt;`^3?E#nK%2}kKfMT+>o7?#*6V=2H%ZE+SH1GX#E(%43&u2OZKs;O7TX=_}%)hTOG94~ST zKJLTmb41XGfWyEM;3zN|vAgp6DaX0@F)@g5;2*^4y$kfIPr&D*5%A&E%lq`H55PYT zUZMUyeL|ml5&k;(GVt!f!wLJLj^JMdE9$XNYW7)yp8>yKeO~1{)DzV2g5LnoA1O(n zn*Lkxdmz8^c!@qW&-n%X6(}xl?$D=Z{de$B;70#(n?5zq$xDiWtNFQ@KJ^m(WiT@+ zIz6bQ_qx`82jhLA-92{+x9!$kWw(<;<+_n|GRV4DC=l`HT5t6H0p!YfU3Rj-*nG;C zG)dPsEEWr_Ph07$@KQFWLX&e^wx^eXYXQ4!r(&+cHbwGWGq Z{j}C;kGGj%?{SGvmlf^=R}hvHe*k4@qYwZ9 literal 876 zcmYjPJ&4pm7#(%vse1>Whqxl5i0Gb@jarEKQ&@-x3U-H$#auF*3?`G1OmcgmVxtx| zcG_trmRi_fBbJu7*0PP*3g>&11ReJA9xvZ~-#7bxx7TH)@|!;O3jB}Y&%l?X zZy(X89>CuQe*=EK|9*--HS_!c&w)?p?o{-t55gDtA3b33XZC_VHTxNXj|11jGh_PH z%kVFNuLAu{s5z7CV9upV@=ZTdq0VILH!`gizmGRoqf$4@udPnC-J&N%9qH;}bqSxV zRd-K^x$*HUq){p7g?p1i+N6ySFz~<)Ja7XK{tY~E0}oK&C2I22%Gj00RhOqOB59Rx zb*4CXG1hHOX<2ouW8bQ*XbZ7!ZFIk|p)yv-rHqget!7dizrv>FWgC98QKhTazr!>- z((=EA$mjZ+O5>MB)>UzR6?vsCcGgGI?%k!16Vyhwc4zk?o;%4MDisplay voltage of various components - - false - Show AMD Card Temperature (Catalyst) - Show AMD card temperature, use aticonfig from Catalyst driver - - - - false - Show NVIDIA Card Temperature - Show NVIDIA card temperature, use nvidia-settings util - - 'udisks2' Utility for detect HDD/SSD temperature Utility for detect HDD/SSD temperature ('none', 'hddtemp' or 'udisks2') + + 'none' + Utility for detect video card temperature + Utility for detect video card temperature ('none', 'nvidia-settings' or 'aticonfig') + + 'right' Position in Panel From 2f93c118c80e57158ac7e8ccf281991f959f909d Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 10 Jul 2014 22:30:51 +0400 Subject: [PATCH 048/224] Improve icons --- .../extension.js | 17 +- ...an-symbolic.svg => freon-fan-symbolic.svg} | 0 .../icons/freon-gpu-temperature-symbolic.svg | 146 ++++++++++++++++++ ...lic.svg => freon-temperature-symbolic.svg} | 0 ...ymbolic.svg => freon-voltage-symbolic.svg} | 0 5 files changed, 159 insertions(+), 4 deletions(-) rename freon@UshakovVasilii_Github.yahoo.com/icons/{sensors-fan-symbolic.svg => freon-fan-symbolic.svg} (100%) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/icons/freon-gpu-temperature-symbolic.svg rename freon@UshakovVasilii_Github.yahoo.com/icons/{sensors-temperature-symbolic.svg => freon-temperature-symbolic.svg} (100%) rename freon@UshakovVasilii_Github.yahoo.com/icons/{sensors-voltage-symbolic.svg => freon-voltage-symbolic.svg} (100%) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 0fc4e82..73a188f 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -40,9 +40,12 @@ const FreonMenuButton = new Lang.Class({ this._settings = Convenience.getSettings(); this._sensorIcons = { - temperature : Gio.icon_new_for_string(Me.path + '/icons/sensors-temperature-symbolic.svg'), - voltage : Gio.icon_new_for_string(Me.path + '/icons/sensors-voltage-symbolic.svg'), - fan : Gio.icon_new_for_string(Me.path + '/icons/sensors-fan-symbolic.svg') + 'temperature' : Gio.icon_new_for_string(Me.path + '/icons/freon-temperature-symbolic.svg'), + 'gpu-temperature' : Gio.icon_new_for_string(Me.path + '/icons/freon-gpu-temperature-symbolic.svg'), + 'drive-temperature' : Gio.icon_new_for_string('drive-harddisk-symbolic'), + 'temperature' : Gio.icon_new_for_string(Me.path + '/icons/freon-temperature-symbolic.svg'), + 'voltage' : Gio.icon_new_for_string(Me.path + '/icons/freon-voltage-symbolic.svg'), + 'fan' : Gio.icon_new_for_string(Me.path + '/icons/freon-fan-symbolic.svg') } this._menuLayout = new St.BoxLayout(); @@ -230,9 +233,15 @@ const FreonMenuButton = new Lang.Class({ let sensors = []; - for each (let i in tempInfo){ + for each (let i in gpuTempInfo){ + sensors.push({type:'gpu-temperature', label: i.label, value:this._formatTemp(i.temp)}); + } + for each (let i in sensorsTempInfo){ sensors.push({type:'temperature', label: i.label, value:this._formatTemp(i.temp)}); } + for each (let i in driveTempInfo){ + sensors.push({type:'drive-temperature', label: i.label, value:this._formatTemp(i.temp)}); + } if (tempInfo.length > 0){ sensors.push({type : 'separator'}); diff --git a/freon@UshakovVasilii_Github.yahoo.com/icons/sensors-fan-symbolic.svg b/freon@UshakovVasilii_Github.yahoo.com/icons/freon-fan-symbolic.svg similarity index 100% rename from freon@UshakovVasilii_Github.yahoo.com/icons/sensors-fan-symbolic.svg rename to freon@UshakovVasilii_Github.yahoo.com/icons/freon-fan-symbolic.svg diff --git a/freon@UshakovVasilii_Github.yahoo.com/icons/freon-gpu-temperature-symbolic.svg b/freon@UshakovVasilii_Github.yahoo.com/icons/freon-gpu-temperature-symbolic.svg new file mode 100644 index 0000000..e75e10a --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/icons/freon-gpu-temperature-symbolic.svg @@ -0,0 +1,146 @@ + + + + + + + + image/svg+xml + + Gnome Symbolic Icon Theme + + + + + + + Gnome Symbolic Icon Theme + + + + + + + + + + + + + + + diff --git a/freon@UshakovVasilii_Github.yahoo.com/icons/sensors-temperature-symbolic.svg b/freon@UshakovVasilii_Github.yahoo.com/icons/freon-temperature-symbolic.svg similarity index 100% rename from freon@UshakovVasilii_Github.yahoo.com/icons/sensors-temperature-symbolic.svg rename to freon@UshakovVasilii_Github.yahoo.com/icons/freon-temperature-symbolic.svg diff --git a/freon@UshakovVasilii_Github.yahoo.com/icons/sensors-voltage-symbolic.svg b/freon@UshakovVasilii_Github.yahoo.com/icons/freon-voltage-symbolic.svg similarity index 100% rename from freon@UshakovVasilii_Github.yahoo.com/icons/sensors-voltage-symbolic.svg rename to freon@UshakovVasilii_Github.yahoo.com/icons/freon-voltage-symbolic.svg From c2e5734df7cfc52c7551adee4843cf5fe214e734 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 10 Jul 2014 22:47:09 +0400 Subject: [PATCH 049/224] Update screens --- img/freon-gpu-temperature-symbolic.png | Bin 0 -> 649 bytes img/panel_menu.jpg | Bin 54750 -> 51975 bytes img/prefs-1.jpg | Bin 35406 -> 36841 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 img/freon-gpu-temperature-symbolic.png diff --git a/img/freon-gpu-temperature-symbolic.png b/img/freon-gpu-temperature-symbolic.png new file mode 100644 index 0000000000000000000000000000000000000000..9e21b2365407bd12794294f44f8136fc252c8b56 GIT binary patch literal 649 zcmV;40(Sk0P)gD<`BX7ESg9Np-@Ib zD8)6L?@tjL6k19O(xDVN_%IeFx*G~?WLdh{-m{VvdEM;n&b)autF^VYy@?CnyncH< zNs_LlK7g6Utyb&vhlBTj>cqL`lpRQuA7-|s!z4)nKGliixe~}Km(-Ee$*vA8 literal 0 HcmV?d00001 diff --git a/img/panel_menu.jpg b/img/panel_menu.jpg index fc033ed5bc926d77986fe21b46bb5a24f38b9372..411d1882bb464dd25d1edf8399a5da647152d3c6 100644 GIT binary patch literal 51975 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
*-Ms=h;Zi3J;9n5!^y!j)(JO6WV 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 literal 54750 zcmce-bzD_l^C-U0p;JIQlsI%FA>G~GAgOetC?Fu+-3Zd%EuqrgAT2GW(gK2aAAFwY zecpRN-{1ZG{<({N)}Fm)*36n&vu4c>et-V`1;9~|k(U7=5C|X#{sF%i0Z9M>3WXnF zK?DyZR3s!sL?m<+6l7FPbWBVPbPNnEY&;w+Y+P&%3>-on-23XCiSh6W z@Zn4#2w)#XBs3%>G<+-!Ed2l9<@YB57ZrLR+K2$b1)#VP1YF4PZh#zs08j+@aQ`U~ zWJDws1Sl$qB>@re@(&IGAP7iM#NP`5CIZ+I2LT6c`Be;=R&jRklCu{dixm48?SF&F z@=i!%y#NBow;fS|i3&#KrA=hwf0Lks7Z5Q@Am^?TfulB{-ptRT{nrioD6jSK1*e6P z?J&{~XD9$LLVT-IA!<;+hg^Oju`qi)pa(z+DbaHAy-U#n97c38Kn!+@k_He~)rI;g z{{~`;_}D8;sssm6GA~ZH{eS>g1!3VASG7PaEjnOvIs3$WL5&isYHiAH$_y}K01xl4 z4(FE`RPkbLYE^*!p>M7l06+ue zG~@t4A^;x>P7gH3a$)IQ)bznn%G{9iE&w3;0YD;}6rLE^8~>t<^7UYdL<@WX z;=x9F@b{;Pj9ir0c0}`}us5YxO#=2~_fY`=F$YcJLlA%$3IGg%pMYoPZ$NP)<>@3~ zAg)UZqGSK=4d@G7?03=)q%01*eFfNLGAG}(4~6TGx?0XHm=kJbS`r|Bzdu_zN}lE6 zJkl~cL`A>!f|ZIJposHCjx8=wLnyKtJ8L;!y0Vq%eCBnw?#tUD`$V6KF;Ptn289bj zYCB<5+;a-A34fW{0MuUfdTh=A^6~By@sp^a!_7mQhlir5PGy~Dc8*D*MK^X7JrsY+S71NJ_yzCIy%Bt$ zzD4nGU{N$urOts^okboF);~RW!)yih$3gu3x4II3I4Fu!YiAw&!9GYzexTa{Xo!C! z!O`{YJ8EZ(R;5}^K=k{$7npTg|X7THpM_QM4eltBOh!vQA`oJX)= zu$PORZ|R?0^ZOd(nKdgRMTM`JT4yFN{Pf$+&YGCUHV(Fao@(Jb zbJ)IzUYpp^4cL`z>U_9kkE(?oV9m-qlBPj<$KGw5~Hg*0wgGLKk@;9$_fDR{QyKoUXTDX&9n1z>C!}49nsHEqMtGm z0MMxmQ8n;`K&t_eXJ;q9OGBbDRjFI!fDxAK+`9c&yFAsr;RJQIwhVA>3<5xy>`W|V zO6vuwR4L$r<<-&D$J|#6P-f=;Xmqf**{rU_7}+do6vm##Ud)8z*$afCOpv+69{hmUc&F`Ly3wQi;pJHA@i#iKTKNaEqWO%fa64^@9+#Np_Lo?9Z*1(|%Zh91shN z69fEmaPkS%fFMeU&Dn{}(vZmOryOHBKy!MX6vo1A-sYunWPB@JI4(=9JOD;NcE2m0 zAhj@AaAoYffxJFYFgjvai?gW8U8fTF+|k#?XS*RjSsx`43p-}Owb>)ZLLMk1)58zmH)pEqoECElXQT}zGBs8(zE4Ow>?>Z+Lmx;jukmcXb(Tj04=6 z4Q_eFSO~}$J_Ras+2DZZ-ShqA(a|UYX-ZK2L?{3q2c#f!+Ie%sQ)y3+&W?Yzib1Hs zA%O)I^d3-S(EJERcJPpM&?*M?lL!349Y+r_FjfpO1mbXj99EGI>&*9}F?C=tgeuBc z)~R5mX$bi@i9|7gK8F`Z3Hay(M3gUyBQ(Ld*!C+Tg?XqD;?UFM1;zVpPB!z2XX|A* z8YKe|4*@-3ge6Xe)mr?ERxxO{WcO|THlNJ*Y>BZLTXuMr*rhGOy^ltftq;A{!4c9z z0k~@|%%W3!SI7W+uiS*&tp+*vp)qqObM$qQlzZDBKC&?Dsu(^=^~*tpC4!b&dQ&)5 z&&c@7RFix?nHod4GpUGc1YF~wWvFXoXyBd#mM}5kUKu6mH0rz_!Yyx`MASp{a-I@X z!s5gznauG42+R+FPK#3lj5r4Ezbg2XogO}AAIh%={uC$}Z)W)r1!_<&(x=y;a}+G|egY!IWVXPKeVVV?d2?)?CK@{Cjwy3Y+t zA=BsEuZ%85D4dZuJFDpBl?T4qr;Kogmw>w-6bugP!pXhbQELgrh4Fzz?5|OxGq3q# znvyrB^pFnSYfP#=w%&|S6216XdO3^(3I|gH;QOQ5(=D5_Qh1!tIP`XHYxTPa8jig# zv@K@*o}M+H?cjtOs01T8Xe3Jt4dXDG+8eg~)l9q(tSh$<+go&mZog^AXhEul{*%Qh zg7LjtD#!iCYo$rVFhvbw!CVYR7SLR3VrroJZ$r{^kRXm1KW+{OYj!SN%LRt+hI3ab z$f*Gtpz(LFPTHNK4O5gLpbOpgMFrJl0g3?zjMr5m;Fb~7w>((0=f_vbSdM&p#i{y; z{73{q9-r|800n8O9IPI5I`MCv_I(@Qw)D=#h~B8_`d>kft!$NO7;5|GODaxX-?JTlVB}zrf*+FqPVvd`N&TX z*9lbHVX)@sb&HO$8uDf@&zFAQZQNsvj4o%Ldv8$3c%A@=W#GhTAO%hlZ!f$5pc^e} zVqe%9_;H{Bd1XKidD{_~o&(T=J_L>>=#&>FE%60$FDs?t%`Z_y*K%JG_d=B748Y#N`X~`f z_J_~Uvgx}jfh)ExVmKZ^oCkk7Ab|0_GuSuUID!3r(#AAkOr(?a!#C+|*{n_s!iy*A zC(gDJ_0IboVjwjWEmUQ?@i-s}y+n*c)Z}@^Sn}31RCT&;Hhye0RFL%Mp)4^-2bBjG z7Xt~3ilO*0-scXa{4a7yQzp;fF74BqIx&GeQ4Mi$4jIDZ)%1k%Q=XlgPx z@NQkd982)N38PG?t)f$+G#sP(PzfN(0f-=10IklDvzRN!g18J_dd|cNH2+^r@3g$D z^1+%y)6ul4{E~0%b37UlV2?xz-~*_7IDd%P7TkoIc0M2fadww=3%@_@e`*g3uZ}qp z%@_kQWSbx}ISqV2d_ar}T$FMk9=c!ksLv_*V~k|V)&yXrET4~JWBLg7TzD9vdzd$b zTQPS(D(#yY*~#0&T{lbw%+E5jHG^Eb(T&Ywm9%Q`MGtOQ!!L90O<>fU4nH3dpx!1p zev6aO06-;j00Kt5O$sCzytnSOpR-Y@#MoL-IJqxbRzyaPW8@&t9133rn10cRAuFsG z)-SWyC@4Y>T9Cy5c}p(6aI&Nx@}-;l2E2Eo3PraXwFCH6~9> z8?GXy81xw|h%A0oD=My0M1cco(ZrfAn-(7KU3UN2;GY^yv{q93So%sR^#G*1aE?QX z=RgVW0N_fTGjZh2rcL?NkLw=Imw&o}09^j**+#P2blejF>IX;p-xtFvhC=~|ReVIM z@k813L$1338**FKo6<^>M((g}!{k=osI|5z3UfNf4r2*>B8c#uwGJLQrMqSI+`(~7 ze()t)RYl%}o%=yh>C9G?*OdDF{aI0=85kP?L_9!DE4EWQu)a!2aee!(ESCgEW80Fk zh#)(B%b5g>N7RjxGOHijWol1uR%;J$j87KoTN!(mDk|(NYd9oVCUF2Lszw^kX+cs5 zMf;;?payHxfNz|MMB+zdSRd=;)Ikm)C65RunBd*&(5Icm)B37;6kaj5h2tMSzs|w! zmSZRfj{Hx7Or7t%Tm^@m1Lj`<5Xa(&N|%%BcSis{tYX*PA1Uga8hLc>2cU`FwW0xc zSQNEIcrusj0k-ASNU&oj)XZmu3-fH3ggzSWJBTVWK8E|OV%5UIJfCFc>I_sT)Jptwbpw;B5VONOp z@&vd*0IG-_B91t?4Ry4&JGD7H5b3Z;Spf!xVkiOR?g8$czc_(`%Ft1_sl0`aBHj<4 zETM)0ILd$@B^(cNpUR4;>a#jJKmPUdpAO*W=LcSRIJAhY)NM9<`a$5CTWBoUh6?@w zz^Hy_ z<)!iN;FOLQAW*r~nZKp)AtnaiYV#Iprg*+cLz%DQ4=|m3>1f`f*ZZNEyaF623=nsl z%04=EJMi*ptHVx3c;ZFu2lAOXhA(0;$Www9g{;Z*&hi!&;U|6oI)EsT_z?aKy~J4K=!Uw7uYuDwhsIR5ShfW`q~f#kNia<5t8NC^lfjuLpcD+l1*k$^e9PD^Axoexile@;d3g!o%JXpP2u{s`1oSfgBT-`O_RXB2>2O>*2e=mCjK8AY)Ci)Nr z2r@DP0EI%3Kng@85JZOH;NsoKe?&;h%_F9ULcl>qL(BODM#se`4nCkm1s~f%ke~}g z@~wgM^q??&3S>@zevd*SCTtCmLpRkDPMa(gm0wvgwQyo zm%yT&h=$;PznFdsv0&r2QVJt+|5|9(FH($V$Le~ z8+%7`SFIWgpH0E5{*D%+IqIuTQ=^FeI3HK`%D2jP36)8MmD;XlNk*kxx=bzFgO$dv z`zc1PTXRe;9z&JJ&bmnd!-4fW{WrkVWdt4~YJ`g{>chyA8a>{4_U|uu3%^GdW}G{J zuOwYIEc0-zm}zaYF)TA?_He8uT?4P0?Tnd&n{@X6!Ttr_l9hQ5v9ua)>QNfZ+sZjQ zZ|h9%RvyYa)3~&{pG_52$S7C1my{JK8*|z2Cg>`qw`$Ey7FH(lfQ{k_HpT+ByHmO< z>84t+awM6q*}|_`R`VBr z?2lABxY=bGEo{&6wloY^TDdW&84Ygha;L#HqI<*t2|6ohGAzb&)6 z)mXESb%iJ}XNqYLmbb~T52Tn`xFt3zQKgYI8;4t(1ucxE5r^!DzQ^&?Gbz1cR*G{+ zn52D^tv--LZ-U5LN`lhAK1)U4UnB4D@Bes%NM-v&Raj_hK_wy$LI<)+@cmMB%*(fRws^^V`b=K7NsOeqCkp4y|?s4(N7*Ef*_(Us(Va%b#o<_Yun zcj+d4WfP8P2iF~F)f1rjWpZ8qe*2uLY`N7(_AxfT(ea+YQuiNg6CYfY)XlF?ojSUu zsZi)>C}dy^SY=Yp4|07yfx5>l4TpV8;G_%-?sp>Ha5W#JDC0Lwqtnvr^Sj+LuY7dY z+cZe)sEAqqrZT{tb{SW)UJt6Mf68b0rnZ=VmXwL% zv3fT;DBO~!jwF^xS)D*P7?!+xKdG<2N>*O*wZ=tL*!6E7OM)*3< zYq3Z8H_#9Llor2C(*N{|tDORN=*9W?a%6eAVAPX@bjkIj+R`BN5j2D(nNH)QMkq|- zm{L0WUMN!y@dhgAmrjL3g0WNK^mUYllcw-jzkyf{d!1a>nZyk15~7$0{h<58TSXIW zl|9&-q8P;W{Kn8?)%j`)_rYV1PyW$rIeO+PC~xs9y255%t6TaaY)r!AJ=;=S^8C6e z*=Uvy>ZtMGJ@KWNn`6$Zzjwm?HZp6(Phz+4(D7$%yFr@=D2@az2dm#`{9Ix1q21^T zTsuiA#H?y?)$XfG?%`3gfvWM>*DM7b|2+yHpaoqt1|ly5w9+$6Yd(r z=gXsNvDsJclg#t0L;V^T`XXy%Eoyo(g8QUU&xcX!C2wJJVvin31foy^1#ZP-E%d4l zb9RIm-#6YHtj#vFRT|F>cC>KmQY-9kRi+#4T35!u{JK*a84gzQFTqQ&ZL3l$X&}Bu zcaClEOKY=7#lmj@>I07Ol9R+Ns8D=rZ^tq!>2UyE_>RE|OHDTkohgP3=cG7V-h2RU zN;ht417IZ$61~PSGq&p&Rh>TaBH{7pZK=aAoz=@#I=+akM3RgW+30&UDx%k~lx4)2PrC+c zzZ|`f7OvID-~F+L{Y(adv_187gOru{<$BQP+~H^K#)mW$8YXiISWRw9>8uv7YeL7Z z2pQh4;kWe5_$?>zrGU~O_?rodts&{te zJr+#6W9--K?Ve^XgqUBqwQLkg$Y;_oby2Tb**@udQ*BM6Em%q@h2TV=#T8T&6be|z z1y!&JglqVT8Z44q=52Fm+L6x55Ap%yj47&1SfOVY;0 zL~=4P@lcfo@sXLgKAX&77Os7XZA{nXZlc6B;^7wiaZ2#>vbYzwv-?o>#ApUH26gaR zzx!|CP>)oKjXxW$7*mA&-Do%W^_9JHWk9=Gc)cO=oUUEIUc)|v`9=Yy z7mmJm?FQzAxz0dn zVmJ}yGfZeL3kmFrR>QR7RGC#dOn6{RIB-OnPHvtEKYqyj7;k*a>~?dL6%&tS>!Cr` z$IY0AK0Bg|F_?ZHRn1{%HM871+h@m_)3dM1^x0ec7sybPIhmMv775kyhP$YnTfRTE z?+8fr^ewpSRgyA3={puDM_9`}af&mR^;>B_oWwspVHzE;eZ@NNP zod>s$axkoom2{44fCl_48+y@9Ohem}T7%i3;cqf1Cj=k@i9om^VN76tL%PcL#UT~MbH6N_sUT^*~3#aE(9kv*- ze^1%F!J`MTOPnwSD}MR;rmN&pO?RuMzbWoxM-HA~OA;8=sA6+G16)z5 zCx7Q{*oKs`k)!H>X~JH!3wbORAWHRO(6uYR`sZ8vNzT9_D^gCC%=^T530L$e`}Yo| z*N=$^`V_g`2Id`Av?J>KEoWt_=1 zCq-0aqb}n5`}FeRX51hoL|9gh=#vr#a*4l%~xdnjOC9 zo+B9df=ir<qk?4Q31t z>~xfOEBDa}^dem%T?t0YHPLsj9*npk9C|GDw1e^P`%$;!mtU>?Kd@@aO(Z|)2Q5F! zjKv6`S;rO%8ui8Qm!^(}JWkb=;%7TBBoxy4;?2({fTQXO>Y388*)u|pOagIvuw#`L zwDiICy;uQ>QN(?l*l@jCOS>^Tp;A+VqUTrrhl6=UT3(r9sce}pL$+6V$(@5v-uUb~ zRpj=K#KlI5uYwwW(vCc;A>-jWMXo1eNGIyCD&W?dKi-(G8PLhhfm3;hGm5(|o_A}3 z-5y{jIfQE0rtu$;FvEN*-|IDXdT}bnu~Ei#;9WL`%;@3$wnr}l4I#RGIVNUMQ z!;9D^UCU^m=rX79hkiQF80tL-RRC{r*xthfu`)P^?@i=T5=*M;^uAs38Mhg(b`*Yh z%3rRcW3;a2?SI_qQzynbqCWag;uT64RbZ05wCnR=`g;@+7#J1I_|d~vwA$#&I+aSK zVlEy6!v3x{eNPIUHQ&oVOM7&nK($yMhU)%+758zY0A8Wnr?eN4u?WP*oxvRBRc?5m z7(6(vz*K9-DQ>K}1I)os2% z^Vlh9WU9+KLfy3-KBZPStl|VsVxl%DKGK+R<+NWUjik~ytFEm3lrkUdkT9;nwtBQ$ z;bLd>T$gKad(~){Ih)o4Z%&iPLsM5**dt+1Pa3R1NK;pn6-0wW0T)4N6C5mUJUQeuTU|dTNoT zqM)bG$QUpsM$tvTuE0DTXr96aPc;|mbMlQlOI(VsYGS;v(uD66^d05=o~;STymy$r z4##u0nvasTk211(5OppdO(^j&VXf>tl*QLB`KO7Oq%eWsy@t-G#1~^F@0Gu3uq{|W zr?X4nnzP2_HJklrlOSF0bdEgF;96zPusdc?*L*nYNIPGS9DiFo5jGq#-rI=DRetF^&nd!-PyyAAkFq&tGpiUiM_Eyuu#)Hc?S)j)fk9Ab^uUrw?6P_#Hb-S&R_CBud z!&bkS%uw}KM{jMAsxmS<_aiLU$se>GxNb?TTU+{{>}DMZf0pcOD-XDgFTZIGY8)KA zpEu3#vM3+?vlloBkqedlQGo49P5&D}Fn4e#*ud1z{mk1u=T6*t>2ssCr(E$67Lzk1 zhG_Mj#xKl}k?>MV-##e!H;~LO7j~cCJ6_}sGd}HyLHDCuF{w@s^neeBQC!EOrkRl9 z)df{?Fsg{fq`CJHFy=c<8Luc`cUauz%Zs+kk}gj)E~e@)S8^Le{nWXGl>m0w#UurdtlBm(cX8bYE}^|Gz(^BbiY& zp2n8^2EYfIthfLK3Vy~2ehm5dSA`Hn1Y9mPC=TBJN1WCCaNI<1wm=GFy1c{JTu(N{|2vK&aDQ%Vj0 z1C4@LS7TQcQudvDq4V^YM(dJtAw9o=iKEx2G&Zk``i{L{)Bhh8^K1IvV{fPbv7+ls z*tp~s%6On01A-OIfplfM1o`|) zn|}b9TpYDj7#?kc9rj*j+Xnt(|Ni81A1U#6)1{P~ z%xSSr)k}qsF_p@t4g3|TXxBvxo=QHh4%#I>QV*mWEcO#@XQ$V5?@=4%dJHt!*}ABs z#IdRiY%Vl3JO(*s>nB{Pe7q0#Hq=Z?hEcK~)0Wa3WoR`PY3Ho|AuMPRs6hS|W*as~ zH^W*o@=R<~QOl%-x5PokmeQ5Bl>LsHCzc;?hUkt>`Z$~|hGoP*^s1%$=4Wu>ZW=g$ z$jS^g)BDN8Y(W~hde6j6x8O{9DjZZ&&SO`TM2eZVlZo41?F<&OX5R+?D*20Y+2*U$ zU~=)#{5#TpRY_m1hQ}pX7Dk%AjYSOU(F8d#O6NnS2T?V|0|6O?8Sqauz{}tntG7+!a0saDhuDwtwS_-Ze4( z&1Cr*FF4MZwKfJWtssx}^jotOT zK0?|sERb)H#)k>5bU0NBjVgfxw>HdXy#ysZKMKU(BajEV$UXSev*$lO;iI^dQsRE6 z0^3`rSa2A3EI~xRe{PA&7qBNNQ~7@%W~*(!e`l1&ZfQJ9c)=802&fP!Bk{|TR;-XV z$m$N!16Qf_lKO6}-f>!Qq&4<8?>KuLOT%$-Rq;&mNO89#=cS-)Y2bjL?}Pt}fP#h% z{xbmr66j=51VjKA36JVNCq5-Lm$Fb#7K z*Mu5L%{PfZo>=BeNoxhxPyY3q5m^-aZ7u9K5a3$6_-J%N9&vk#8*Qqv>*`fh{V2D8 zSaU#qH|LCl0Q!aIBzbJAb6T~_S$>)3cw*Fc4RXPHPw_#~iV5TVp%AaI=~Uaa4RJ49 zB+H=8M6x8hhZO}n@3Knc)O*j#T)eM@qXNHy(?~62eSL=ps-esXS_N8Rsi=}4QEAIB zm!;T=FG9rE9=}GQRh*o~DB-}o_@VUua4~-Bl`^Y+$hRU`pFG20Vv1H~!6b57Q*cg; z;C&NZfk$Z3)fOpgUsTpvRdNLj&Y{t==&suop5X2~T(D7VS&r1w$*{|Fyq|qOSe3l= z8)($_uI;?`&>bB54K!(c7nYs>1J~C42KJdc3{7up%eLl350g}BlN|IhsIVP}1+f0S zn!7ps&s#da@0CugMynkyojz{9SKA=!dOzc0?(gO%UGOzt>wjK1j#S9Bf7dEe{462M z@5A&1ou&7gSYj5bynuk{Z$PVXNnT>=9ZIX{=?evjMxs4XUROi6(LT9=V?@(uJKCnK zftTeeADy4{f?Z<6@)Ng1;y1anC@kb7SqwZw@-Q=!I_v_7DXXux$MM{j?*B7j^>0~s zz%3~K518OqeHQYm(&0->l5LqKF7RrI3wO*NB?-fL-J; z(hZUZFu`JqsF@wBdS5MupA)^B3GyUtuOEKOhVy=@$ame&@OdG1?}Z_=sDtGEQqL=l zj!_0P3`y@KmWokZjl`t;Uy-xJ4;#yy3uhdw9afZ>s~ZlBJD!)ms9rG3K(o~_a2dgK zJ!vQSNc(tjx#4EZt779j9oZSmneHEEjN(hhwX$E>iUI@k(J-nNrE~aYzdmq^$ZIvc z;8#qd4WY}m9=zm=OKMwPg5FS97e~rE5O;-nY#Ra4b6r#h`kvw=9n>M*ynak!#uO7n zGb1Ybr#xeN!|q2q3@K~U(ZBS5(H5=Ok}iocQa*Ef*-P$Fj4dybidFhjO@mF_*M}NM zAvHdABd{q%hApc73{AODx{ZL=t&lZU+5WhK#keOa!ax3s0_&^_FEF!#F4^{;t<%A-c20EoSv0R#01iTw8PuU7S$niEe?s?Kp z3*q7AHzU>2%A=FMh_axQGGcAx$+xuZkwEzB9xcZ2LHZlel{Vwtkm<4%^FdQ;Xst(s zbd5HQnmI=3xEHiQ8orV%PgW6^L&A>oy0W>{Hhb-Pezi2zK_-zhX{{FFUd^qJG7BqY?h$X^P8N!a$K$uus-l-DduRw+Ofg5F@HDH zk;}2+LUxb0fKCc|s?LS6g$W`!Cf%lumDKMMY{k9r?@F_2;Q1sTo&9jPIO;?E11nc! zGHvO>t@s74%6L_O(RQ<=87g}o4weFqwE1TA=aEgTtqc1vIVVkdNy9Mhb%Yk*(oyQn zk~itcc;@w4QcK8Dex=p*H z;k9@Dnhmodv8sr#k`Q?0`q4~6p6q!^ZncYvd#tdRDc2#mMlZzRtXp!2Q&`=hD4L?%zonrY6-;F&fKu7#4bDKRv&ERc?-| zVW>$0B~d8KnfpEnhTzm0hSzExqK|5SM_KE;XR`^Lb)Bn0bgnM31G zrugzV^xVbs6|ghGmPW;w5;gGsx+>7^-?bS z3&(=-dpeB|!mU+$N{|Yy=R4TmY~a%p$K?($guGBBIawXd1NY%B- zZQl;<+bb(aDlDqxF4o57gTxpT`l8Td>b2OljuWe-emfESBA?1!q+K)Ozz{qGO>s7% zT3i>qD0iCN1kR%5G{@Idj?z# z8D*t8y@r@=-Li!18r5E270wl}8`C7dNJbizVdm}PRJLs7_Qlln_o(Nd-wLLTK?I-8i+>ER9{yAYYk|0p^dIr+RKpz zjTU`W;o5T*SO_Of7?-&{HZ%7BE09=)mY2+#=x9MEpFI-ck6sV@03(Z`_xkrz(po-D zXLdL}(WBD~^XhZ*Oc~8`stcWyG6l_4BU&n$yZhv}gN4}y z;jTj^-dc_5B)4ECPtn`NUoV21bb3c-$OjF?cnMK_c6XBZv5B`BW2Y>)Ewkn(R|0Gu z89Ac~lL>@8IyA2B!S}j{J3;~K%+)!uk|Sd-BWTvu0tz7N$-Z*Td>4I z=Hp^`RnGact=`en=c~u5x@LBZ>fYbAj-0JtWl&@OV%ba4SFU33@A|U z;V8k=rhojLKu)nlyoE?P+A`nWW;x)}le$oue)WONxcVT17*hRiXMElduh>nl^Kq2% z0!t*cVewX{)^`dX_U6uSnQF{zA^Khe(@?(fAmL_7ET0{%#Of6MoQ)@Lmj>Ubwq5iy z@P}-6@MewQNr$NsP1dBCIw*#O1XVprG8AQJ()6vcC1mSFXo`9v<-Y2tUW;&rv_PS8CYlUqVdTb6owmLm%I8N{>#&RGIhyg zt7omX0w0&n!@fE_d0xb^^n5xEGjqUsTjS7vsEJYMYis4JnuQ*Y74l7Y`wXw92!(z= zS_86$W>`62ptR(mS0L?iz>33edsJ_LpG$SfPlK&PJojlB;^N2TEQP@C$Gb?+9%&T{ zMJ=kTB+;>?F0tWfwk%-u=g4d!%yr}yG$QK7Wz5%p(6P_G;1h-=oaiGXKRD4?HB%xG zq!GZwXDP$X`<_cNFDDmi(d0>nM4mx!)apMoCD%>LxL6=}i}<)UfFm08`5eCf~*Qx|!RvUy@|^WL`|o^4h6YBhcw$wef!Y z($A^(wJTHOpw9Vl=9NJPlsiNMf3J$pWWuQN*f1l9LOZA@0VA*mYllL^v&FNecK5xC zgTrFr!P9R@GvF|z0}J@2JFJ&VIEh&5a~dZ@8a>tc_IRijanQ{N9h3*c_b=;~mgaQ` zzn*G6j{2zi*wP~f1AI;2L$O)80+~?fePI_jN5NpbmypR=f9fXFK^i+s7VOL;Cns6S zdb~U2Y|l-&#Qd|+J9Hnj6IW4_wWaD4&933Rs;!65DekOfO|o`ll2O2#sABY7^S@vd)@fdu4h8%IlM;uj>HEY*tQE z*K9>6M%JP?3zuOCMIQ2Ie2fk~l%~ER+qF-5r@t;DpE#!sda_l1v4pNHcu1FwloZYu zSuYDw)FOSLURm%be3U_Ay%)QN&W{6Orq9b$^s=!DT)JuAZaxVetm4KJ7J~0F@bK^( z2x*?(Fq-;WY2HpStee|`WfK0A=O+Cp?O#74k%20Iw}bSbC?X&K07N1q-gvivex%@; z^sZw|_^B@U6?3}X^Pi8MrXS9jx)B_(T|cg5?ZaC*$58Z|#zRvZ^bl~xRF#*P_IRcLcyyEd6qZ-Ln0kjFpPDZa8#p!R%gPn zVcbp^GkJAwC@FC-vw#tJammBNu|Gm$i|)!9+OKl`i*k$9T4_rT&CJGyS^!!p-X7Io zWD-y`J(XYnBM>n*S0(-aiGBb}$)q-&K-!loUc3eQE7?RR$0){ zxBC6TcO8Py2IteJf-}NVE^hJT7J_cDC|L3b!+Nzl?&`0Wv1{p|v?2L@V8bVnjxOy+C zm4|KIOMi({YphnLi+0r?D z;)TQb!pS}D6vo=1o~dy=8ohw-!}QE~;@k7goGe`*J`Wwd=5Nk%p?Prw4Vfc}c~efx z@}Y~rXj#ge8irCh$!?z#YJ_{bx>+{f%Gb18+TrMB)oEtXkRMDX-Y@-L_^njJ___JK zP!ZSmppZ7wFAH3UMlP$$O0y!a{zYfvu z>T7sR(FMsC2IdY%YGz^B@iANHh|g8_W_q%*f6_iB=A2IQQu#)A=gLlkGeTPCj|=HY zKLxw@1}D<(^G98=d9)+qA5b=yHGcRFxUGE~u(FC>MK&P4)ovi)@fbDCW@WNS%_BDI z)@$4zqE@}KnXF42U~9O)N{g&qARFW5qoT1cqVzc7(h?uqBheq*0O_S5U()3D&1zZYy>yWZb9 z)kPWB)tjrbZ|3bmt5086SALpn%=20)`L6S?=OJtrvz9rrJM`dyp=7}nZ3{54sck!0zTn+kLqwNE4<}~ zyHUu|FRkIC#mpVXUr*}h@V+%NVXgWkqJQxoOHlbG%Jmf2Qoq_pnPmaJ&TQ72)(&bC zA+s{~Vs!IflJ!YM0lngO31>$3J(#EGUP79oQ0r@ltCuA~L}~F|Uy@g%%L;UO1#h2q z?MtV>yyh|WX&TqO|E^RbzMzoKt$}xS!ZEsI6AdrIA{bV}ntwcD=hoWt>D{_Y^AP8j z5Q&(JEJyo6E$hf;dO|QmX+R3Jve`{(!nH5~+VVGzvT=RCiG7D3L7axZpG zc^8#K@Y z3pLPI-g>^JnBH@4fuxR^vp=<|REUs9?Z`qCm~Q+GrXM|&y}I`#8pR&wjH;;@2I@?5 zh8jOjBulLaI;l^&hx~gp6F!c^4hYh!cQm{S8xKY7LVMG{J^Wy7CXFrYg|yYuju7uC zeT78?dmnshA=>f7+T6%ubK0 zk=0%JLz7Z?*bO&L`$+Yqe4AhEOof?-u|G~!Vqb|Sg@@wSVea$ozvRbCP zV9kDvXQrAZ!$L{nYp%4&)pan%=>5H~3Jniei)4`<;4B|E(VLz3k9p`Ow?~XHQg3zamffB|XzAJ;SQu3`Qfy z9SRjG6jWN0%16iE1pLpEV2?|lX{t|8-cKGWhC#AZQIwf+9Zs1E-gY^!*gr6EJ(+$z zj2F}SuZ2p$F6&`0kTv9>FLykdydFNA=UPCPu%g5cW;|`+4Uu7F3wG(Fm+#{1;zX!c zj0FGdma~-aZc|_VdsFYJJ3P#gyeC)(i<~Fb@SFO?uZ!wSnhUCcmtx!^_ zfTc{TVn=OUH-eL>$jB=Bn0MDqTD9@5-q-1Ujp+jqUTRi`SG++;x=q)lR=pWABTJX~ z8~tMZ4jGxRn>9#`JkN*tCCwG34XfVsY0GvKe#F^iC}?tIfj<^`>KK_}-PJ!$mj6wZ zdkwpOkZk_YBYxJtv6GMItAeeF^>loGRIbD<@^RwI&VYJ0AovMY!O(H*xzMr@@7Drh zs>bm|w}d8f18*DTUw2s_+y?4|_i1;M#s!4vOLJ?jOJ%s~(q<=qJd!*4(}InAbbvZ2lXv)T0f)XV(I zx3P=Q6!-@gb1Fo*-@Hzz>Y)Snp$)w0^aT94^T zJpYpyLb?BoySHGDn`^p7$1yY8F*7r>V`k=MksllH@!=la#j zzR`|~zq)JJGKdD-FP|y+dTlT*EaFS6Etyh6wS9*TH&?HqhC!E<5I;*Vk-f>Qffa+* zPs%xF*^Dq*PCAHsu>6k8u+O|gUWl&kMDm)h-l!-aeNJfGGB;pK%ex*G)Qz~siM?Ye zZn)|bNopeFJA&I&21nEUKE<{#`5Q1z2NuTp9WiZT)N4oRQb7|s*zX}sf=)K1455&h zi_Wj`IMN-j|6_1JsS^uERk6Da50T7x_m}2M=q9s6F*%V`7N1>4M(bk&QHJT?019!j za4RuWXr+ZnPgb&qo)#YPoWS@imhv6Zq2E9B$*xl-nKiRKB;Ap#zPwW0#yJ{Q$~MAxJwA z4hPZm|u%w{{>oQAJ27QQdt^I zKY<2xHQKzN4j==QJz^CnXZ3|$^E{99ue{B;4WAk_OXF*|bR=(@TLwdy zY;=_SW>u$&Bsa8tvh;L`;5^F0Y!nt4Z%aDwt2h-qfa)@^-v&90|JxC;hvt3N?ForeLO(wD7KASbx*!}&_>_jWe?+y&oH-v)Y${zT!W zM(+POZ_wC(szmyg_{Vu?hio%Wy}pn)omZ@7QXksNw*Cg-CJg|sY)jRGQ_+((po?7G zJ(LHIV1{@eH!w|G^-h^227seLoh-``8mb8^RY&7bB$nSPO2)sI2F2&t)Z5mWqBi!N zKd5{*YVJB~lEIT7yHoxfP14y*eSJY_pL84^7wM8b{-9b{#P#vYQywK&o>$9gBuILC z&zAg9@$(tRVk++VMAwq8|85P+D=huUZ$L(i8v0*0|8F!pB#OXUn)A6qDZt5!Zh?|( zAXjrRfl(!=^A}%rwQV(wgC3kxozjhpjwPJqke!V9STXyHEO7Bh+`f%u;_-RXrsQT+ zjPsaH5;6k-a_j`NF<~Hnv-z$gFwvfYwUk&|M4yBKlRZD{9&AN|^`ol_7@0AO^QQg6 z|9l_`i~+b3)>li($WO$c)+jOyNterhDD7RRPKvDCF7?JvtMrSn=Q5b%H-UH6NGyk$KQWiqYQD& zDkTkgV-fl7ku3cT_{CF+HrQgBOP~z#m}V(SS3wJ_8T##*eXv+uOzkDJKN-J#iMY~A z)!Djc`K(I(__N$F&cI-F@|FnNl}nKIn#S9yU1KO`J{zQNbf{|_;v$@C^@Z(08Ko#q zEM5o|o5Zsco83y`h{2F3)`pFn#EbQYZ4(Z|)3cyal!Q`B`YWQif}k@yo_uumtVyOu2Oqt>G@ClH<|{D z=%Dec_9voNhcXm2kGwoCCo|)iBi??gp8ISV_)d|#b9kv%6kun#yd6_>j^0krt&itDLAEiGJkTPB|KLK`kf>lZ1t`W zb(vDx?Qf}fCr9`@vZJ{GF}%)yhRdyl_3`U|&rH<#}Wo;3K*MWn2^ik^4q-2)BQ z|F+A%ld5%{L#olmbZ`plB<}Ut(0M^!;Q1%Tg1b`6b>jhsagbjKiJ@KjG_j7wf~k1A z6S&}HS?XyV*A$M|eWj)D^pg%P6(t>Y78gRu7uF6tx|>_tQxv@Idi88LBUjC48mGpl zR;*0yd2QU%piRq$&+Ohr_6vGZpQTtnBNT|nc;7XXm&G5H>bjX+F)SWxr|eNkp9#VN z2W32wShK3j8BvsY!!&-#I1XV}OPr}hkFjsCQuMsY|3Eni5f)@hbI`nnWdhmxlvZhs zf`tg1atgRnTL<@;@6c{GVOpR%&sH^6kPrGd=E}n5jmKr~0XEU^UwJ8_1N-&XOxF&l zZBw3FBYrI?a4TJqp&;}ho#h?c2vn~oeE9$#+JP3-qhB?K0zj+59idHe`39gmMs}rC?0~L(A*g^aAV3RNRX3<=kg!^_u9D?Gk%a z({~miFWsO=+rR#16+UrJ`4%?61^j$81*6t?%R7Esj_*wI4<+x0?a?mPA!kYa8<5vA z*pew<3hT_d!sva>cX#TKmAy$6vY#5veC(E{F($Kq$N$;&cIBoEhuW8ET(nHInjR4A zt5Kw5&{6lSBPoWqP?1&{*;4ZS&2k>j_Mng^x@jz2Wcdu&6WqvlMHpM@CgMrNyWxm= z)1yq*LR;hqL+ASA9O;(&b=0_JYLSh$uZp%1UUfkjgZ7oYp7^Bv5L2114%PT#IY*nav#~j{vAI9=h&mo9gMrDUJ2vd9ER&(3 z0eQc?++IY(wv!lcR&Q8_wPv@`gp0S)i6pjC%)P+vod9lIPP**R5SrOsCP7Qi6V{HR z;8-~B03RQxy+R(_Q&--QUqP#m%8+!_pj35!=n2_l70fW(k71*$L{2qOY*a&r5uP)H zzn5zF-q{W+8vpOVo0{-b3um#W`}+{6K7+>5L}qGiF)2tUW0{H7MT1C2V{j2jtqe72 zC45@D*FNF=oD`;pkrcc>ZJAdk`!hK|xg1rrz6)7kOfZsX@Q-6H_{*_I>`!=u*xZaj z^`vWPQImOS;o{M;#x@xddtU&+dfw%#$w1#X(GrLYW*Xg}SKiuCf%x+ixf4fks_KHO z5yeY4r-(C$ofR6RV$#ON+}HIDQE|wwF(A%e_JKg{)0~no?c_X;3ce++NJ2KcOS~=h zg}$xeOAEFUH0iH}QmQeKTg@LkwKFXu~QLmUa84Y zD=yX{KNJ$R6q4$`G~{O|ZKf{HgHs*Di9@SeqY;tnTQfTlk^L6>BvYum_RlR@c zNt1W`e`27>zha>OPZbC#%)ik7izJxbXBtvf+SU-`?nD^zyL=-!{2yaL$(@!y{wI9- z9tjQD!zx9=EPmlVGS|@D7O)Dlisz2(^Us=w9L$`};y}+W6Pi1vK?>%i&S0=+AWU5f za^KECrs!^oau`R5cS&>AXe2{$;4ST8=-4d03%mvingkJ~8M)*Zp2b&{{)L*NhyaS8 z@uD#%^i9>7utL-mQ*|dL=HgL10G(LYSCu%GiF~+|GtRc>n*S_QK+y6#ZvQGDMWB>q zcNZ}nE-B)2x1DFCV*Ijb*sAfNSznC$h(PnSxc*xn^V(K@R8qO1+dC!p>fd*vT0WhY zzdZD)4QFW1q+9y5?5Z<@VxnTo=+tfv-Bz<#|3Y#n>FZr2~AeR2Z5VomD*|{%VmU=$U;7$_0!Xr3igyJ z8c#|L9!hwyqGAGA6)$%JP*n&O>=U6H_Z74(gD_%8=#NNyp|(xrn0j3`=JmQc44J6) z1UNRn0(5&Y+86x4j6Ks|#vUZ6sH(JS&4!&+?kqU)=x~q5uso%PfZR}bPO>#F+~a%g zUUabGg|MWSn3T0GY}&HEZhqw~uSZM5Iy!`>@));ckSqRZM%cQx)J|uS3by0>D5$JT zc-V1Kl4Uu>^Y$_mlLl2y7nKV#gCxV&Hi1<{BQpE|*$TRJm;#B)~ z!5OyBaZHV)xvN3Md0v9QUEmQO()XfuORMR`KSC*uVP>qLT@R7<(@ah~zf7STk-CvlI zh<*ucav8D-tnV3204XJXC_K5@;3hGk>96ak%FG0FC8{3c!DlN5W&szIKuK_nf0E#T6GKty5_|=$$w~Z5PUuU1cYpA+@?S}c zAyxMli-wTjfD<0oaTzuE^Lp9hSx?E+9QWALPIT1(viU zjiw}HVw`TPJX4b<2Jq72w~&5Jr((mEGu%%KAu$($U9=-D#KL3Ty~DU;#l&lAqRVB?-6w#JDwl=deX zHo0EE=eAg&Pcx@^d-MqEdIyn}NXl8N1CLZs_|7aHQeRQOYOSoOj<#`-28s?arL z_*ZC@2yzFq^mHj^vkIpLJoVv5X@Wv?xVRae)->s0K>)#1q}A&Bo-`n8I2-7pf>m5r zjB46bG9cM+C-{pYi-V~}OIXbvUtg^1i-P(GSj@n^o11%)!D2vZLKs$F*7rCbv3n~Y zS1f&uz%-=q*6Lzai? zHMVdzG;7Edq|Yh|>L&N$H&?~Yc+hsVJwY3;q+MYc68<6L{9G5506*xf16%D6i*ll_71Y+5BYVOi`#jiGnR^jp1=uZb!YO#`XeiEKx`k8y-Eq_q=_tS6Ja+;8*;w%pK+kk(Mq_m%&Dmu z_+X4li44=c_1zY-ql4BDzeOyxh_k4rpb|@_bz{V+G_bHWe6NdR^#qag#U3j;&JJ#N zd+{|(6ozR``v+trbqk;ljI;hMKZbu?*ICduK|#4=xm!Bs-en?$9B>ZD<8DWMkE)ar z1P~7$Op?(7ZceyLZ@KEMsT%C=i=wF&UtrW2M_=UG_Nq$jwr#QmbZ6&_zcy_Xz~O`; zBBfrmx<$}6x1K7cse&bpc2>gmY! zgL`?LlL@D=hd*Qz=Otqbo5PLXPbyfGN;F%jx9wD_Ik3yo9Qiq%DLYQxZ8j5D5|(+@ z#@ebR37Fy}q1??A=Mm4qD?(nQ*eQx67_ExHy)ku4z84hjUy)g}d^;A+*x)GBq8nS1 z4GYJnBB;=_U23m%>mI(!h(*j|IXR1hu^f_}v935iAns;^{3u&L+mAFu-lO1ut~6GD zwrUVo5E%Op+KZB#p*=-lk9*2uS0>Q4GS1yqmGvOL+2)PJ!K?2^H4}j>aMa*cn7o|k zmU4UhzmsRGEHG>=Pj*=m(qQ?%95469G8wm?3nx-%;DsF|4z{yP=zC45mE99%L$eAMHabVa2$t!8wxxrUh zKZYgrDg*U(k`k>EGVIIBl1jL@=+6NOe|+9-)U3P5rco= zGf}(R_cql*Jt_p1mK5&k0FpU{bhFmmf{#ZtJ=h5U^*-Kzyw5)f=3npghkz|E(b1W% z%m8Ix#AzXEaZ$YZ#{Ni+oBtr4|G8f|4W~-MIN)~TNU`NvHvo2}FL9+O_i)LY9f z4T`!U*6uJtg4RV5weVVAyEnu03%#O$d z{PHiPY+h?jD{@bn)j`#&hHl+yIG0)Lu4OV-9~u^Y+hLXIHArk|PTQ9!xM952eRMHF zzH|{8CS(OuQr5kca3CS$)nC2#9MwTM7GV(+7Dy};!EC`Jm0Yr4bf_;pG7}`g` zQ5_b6`Uj0=nY#4oRCL4a1}Sok2YbBJO-3wts3nHhCjLTi5NkZ#zpa)+NoO2J@EeeZ z9j~vDi&~DFu{Tf7Z~>nCo;3`H&%9YNa|D~B#D}fvzzSw>E0R<72{W_BwBsONBkSuC>Kk-L zo_N&p@aK*qZjl%}&rKjSvX24oLL+KjGBhSo;4lkECb!Soa7BiE`Lu7L99b5Pz3+Aj;d>0Ed zGdeaoZmUq%%+t)io^-KM8q^}x2BEVdwTJV_b#(E(e4|EVVP(qtYutmqA8uT{-T0ej zH5nSBG3v(+60+d(Pm{#g)C;nn;>OB3jx)}C4dr-h@##{n-RIWU>HPl&!jISAzLnEP#<3S>OgW(U}EDf|V1(<@^*qunxOn=e2FpuHmu1 z*C2yD;y-V|2U?JCBDB}O@7Gt?XAG!%2#T`?CnILq*pFj+T=Kq5itW~Kr6tvJ0=IyE z@_^;M;$@Y^)o~Spqo(|ZxkU?J;a*93qj<9lC&EyCXv1|l^>okHWN%tR@)oR3?s8fA zh8UHEbyXu(=I2xQKxrENxk${GrtRSozaL7*zX9yS*oXz|7--471=7mO*x)K&r&^0f z3?oj}(zeG5AM_?neHpgcXLS(SILV8~BFZi(VBUB0_>)Ox@Un4bQH3)FLjrFBTo=EPfA{gtbkg&aWxD8wx*V@8YzF+pQi|o!bG@ z%+v(akl(MmEVenNdseXwvWL29s7753CHU~7`xA&pBO;Mva6Z~zdY-j+B>9xaGK(kk z$`p;L@?#$N>qvi+x{JP?D;Cf85q4fZvI$jdD)!HKYE6je=1k?#aBHQIR%%H6PimgO z?H7hII*TMwuxiW%-u8#t1K*r4Q_pcr!;0C$jSW>s?Cbf}xY2RS!I-iaZen|@3>>VW zhycbik$}pEs#7xQ?S@R_honfWeA~ri(pMl0jViY=bY zF&vEKGD3|GpE;zaX7+u=`6fIRD{_4zE?)3}BkZN?ylkeL4pmjL@(Ev>qyDuo8xbua zLE8?6=z4{UnoOI5SW&+5m1mqqQzEf9Z~pv@K_g8hq~ShZ3PMO4Du3gt3HG z5uEz&5$f|fxqewtO>TbbHvbZPU_roBYy)?i`(o~*o_&?3!F$N|--@`um2Q9NJ`e(Y zg!aw;-`4*x6*|GAd*#10w(i)wKAIwE4r(u9RUlQxLlkXG?E?@?HAkhG3yQgnE3wvZanS| zx2dF^g&$H4Nve&BnG~&e^3iAX=Jn+D;S)kSERkZR$y0C!AZpYExed6Yhp6W-ww)eN zsIn=t!!nvM+$StL?ov9I^Zl+iKb>N9h}i5@qN}!})M(~Yqa7~3>lhBxs8kzguR_k> zkn2w=3wY1WP3!Ux-2>f&(;BaCjv3989#s8|pW<&7Kh^*FmPSKbM_w;HErn;?`G(s za;PcKS=2PGLAn)pst&1NUouI`;XTDIKO^fRpF%6!_tZ(Me{F}~+zE~froLxAiqwhsUv?U1*SBOuDMC+fl0LQMidNtl@rjSoxM) z;5w&sZ4W77=W^ta!kupE&0|waW+08N(N$Buu0gz!mOg~`3`OrWCJDLX*V)edS->Sb zW2WN{*N#3u=@rj(b!TAo<-e`$UxO|7edu4g^CTyJ@2WSllnM&y2`7D& zy&kYMPMDj`M-e`ISYGlt%{)KtQd;ZU;dLIyfA0}hM%_fDmvq@%q(OKHbO=M`{iBJB?V)~)?WKIwierMGUk;b8{uwoyvkraPU4gAkJRyGWO&8BAKxb@Y07!$ zA+U8sqtk(DYkzOaMwqbDktTy5(f^@FZ)#HM9Jb^AjA0m208uH(n?g~<%}z(Pe!}Ou z!^;{jBFZ3ezz$EQQ-K_CVzxZhMi`mBI3CXudRqu<+e)%#;gavISaec1mGH;`*hf=3 zChnpSEpjL-O>I%XxXQyb&=z^L5E-D687D81a1xBy7O(vwC&9ns@c!W(j@pTDl!;;L z1V7PS`-4TIF_r--1FmYV8fK>(ndKxPx+0OIxs#b&Jo`QYS?G z|2OACs|czvx%R5->0kP9Bgt4}4N|z?+Prw1%??aojFE9lB;~Q+L}c{isY+QsyyC#9$3J!DYwTD{eW8nKxnDK*Wp3 zjxlRa9fQn_dkPLBHY;fri8&H$a8DU~=fkp@F9drK6b!9SojGl)ZCB+07vtRAS-D+r3(h?6Rj4RLXDssJ6;GH9+b!X1pKoh8_f0R<`e$ySE z{_);lMCzhZuxD+|7sIcFt7=bFz~F75Q|hoYr;7dwDQaPC$e61h5usd~_AnL<>vqvR zhA8a&lV(8f5$cTwuHDPi{6-KAzljMl=at%)v~^-C*W-yLLjeQ_#jEE@#S8)MQ)OWS z`+~2Odyph>bTvI{J>7zA`z{-?_3HFFV{7;(l!W!~q**Z!S9m%1DE0oGdRMhND&!5Zwm$$#hAU{>w4u z-WGiH$3rS=ez!jD$XDMQSv83yslJoQ5~j{;ZtF8p(wfUlJnW>sQ&&_Mjk( z_Pp)p!WdWAypSRljn`)PduhKF^N_=6 z+~$*bumtG&+Qz9*VEvMAZsy>q59V;GV%3C$O16m#j$rFTYU*%Ggw2KPAobnus&=kKiXI&)q! zYElR}4K0Bf0V2cq)a<2efx~}M=X8Qv)>uz@cdZBnwHdk7)!I~Hr#Ov}mbFnyN%L<2 z-akSP(BOP9^8K6m?A8JWHh+uHpDN)&33qimVJ897#RDXGhGw9^>A`@{c_zKSmwkaK4XE7P`?q#RVxX~z_; zfU4u^P(U5CKY;qvK>g`X^QZ9wXreq47GY%+Vxt>oAtlFv`25@YzP&laf4ggcBDoE_ zLCn6>fW%gn?WYoJpw{?mw1KsfCxAFo1gyvl+iLwOfPmU&7=tje0Jd=w=K>9U_zl?G z{pe64K$3*a@i0x2FPh^*Rx4~T3N;l~VL9)6V#Em>tA*~1dH>dKrHX;#_}Nz0ig9|x zn>kD z$?bQSwz!n;Y(U)__s?PlU zX-3GD(=#kY63r-~pdcY3p&0Oyhld*>Dl1EJ(BSzlm=y;hRFouf^y55a^UQ5zoEH+t z4)m6EA?fa0kAbd;7$=n+N*UT~o`HdVU^4oi3GQ-zl!?3OttE^~QZbE;3O^)J@Iz8Q zKnMopxKMdxcrZ!CoZW9SZ*Rk5v!X!f{Ckm5Ox+1^cXPbSfSQ|aes_H34AJb({ssTj z7ADrG5sZ|F;Wr?Pdk#2}%Bb7!bTqMBRaJ|41X_T=qn}I1kf7}bR8TI!8LtapdP%%O ziQF@jB;?k4oO7t#svFAO-JcA8r$?+qYGRO(^G%E&^W^7`h}v%{6@vto#pf@(n*M=| zhhIr=DPI@F<=(BgzHG z*HF68(Cd*>s}#9WVA9Cjp9{0u+iA^+QO}{y!w|Z7wI@HW#(XSfG0+>qmz;wd;2G4K zUeW04Ctcagh<)az4Bx!+%P9^@)vUZhVpUR?=397;Tp1;_Sc--bBC)zL{Lb_W3Nf?w%sYn|O395!X-Z#?bkFCpGQgsA7`#Rl zJtZR8+0hDC^3E#1&SU4XQLN)JstB-7LQYJs35beFQFYn*h(@kdg=P9e$UUO!Y?6)SmM{VdcIyWTm_ltv^wgW&qWg?5Ba-sJukEGC`a=t6N z?kh)!C6iToky;?ZH?tA{U$+e#EQAWNHL*EimzgMI^py%Vk$zyG7e7Alf37wGBk_dE2DB2SoEH_ z=uFqq;FzK3egn9x5a1+<^}}!z3goCcQNUde@-HI4TFdC zF-TD&4vwNrLQVii@=7X_{6k*SFx^^NEj~Oj_Cx2W;=SU8P92?8DOkiHv%t)>X>{vy z@yOt8z3(-seNOHK#OX~r(?@W_D|Cm_5Xq#$Qcd|weX{N{U@rqD&e3Z2OuWcbvdCmi5VuZrsxGis-7QzOW=lc-tDft4c7pH6~$oJ%!+AFIs zMtgb9jsex&*$(tsbq8Wc>nA&7oj(VmkZfz(9F0YSI~bmEPLt~u#6t4owoV*Fr4(*% zbYK))J~WU7$ta;v(*i$46v#t=t*bW22qS!b5GhxmG0A+3)feF3@I7BRm5wi@%#{<| zvAR6^;0RC>Qv$$ME?|P93M%0j!SJi>uBkaDqyS91YD90Gr}w9CG=kBstDTX~gHt`if%X7uU-hRK5lE!zHO#*z4>UAWH zrRsM30iB%B*#A|pdc_T+A?PWg1d|bFX8JO~A$DnT{<=U=!mw3aFD-vS z6N;OtC8Y5_V6x|VMX=63iWth0f=IA?S{aXlq8O%ihrvT)5tv6BeHXR^(n6EkE2{dk zsL@NcT*&sBuT*|$Km9`q;qcqRE?h^ayrhq2} zsNCH@D}THx%5Ss|WRj~hJrJDz0zcQ+B^g3?gYspqx)wo839Nc+zHNIX5%hA$+Fn?P zt^EcBtUxU1Xt~UdN1bpStjv;rUaN6W-k%C}_zfT#0W}laZsR%|aTQ!8cDvHH8O2vT z99$b)=E&&g4h_a!>h_bT;*gH{c6Go@l=Sx=J$JFn_}>f83}HkSQ|gq$cvbzSc&c}y z;!u_ZTVxlG$KO)z8Q(w1WI^hoU}7+vm6GRWtCv)(@3*zb=?7q7Lj5|7L*Yg^Ekxw2 zcWhr&Gf!yO*VV{|U4-ac?V14RqtRwykxLyVFySQ<YwYxgmc@Y7!A_b&($H2AM!YLcft2;LF&PNgfQrGWhz{vNS{dXH{1<8OvLA5gxM@4Pj3 z=tm7uYJp?Hk`5f}4_p^twg(WxqRexF2{_uKRQugxTGwg_zI9gN!o)fs@zU@+PYDn{ z|8piHFm|*QXoNL1&Fo1ioPfTBY(?G!NZMdr)t1oa#UDVBK~?H4l%DwsNtef%ZYw54 zJP1exfGeVZI_|Tb6*}!a;I58wgFnk&fxCkZ$T^ed*eJovYlQ-w3BQ~JRK#oSgg6*zItW*0dmur2Z z0?}mwT0ssxYWHAAOY|awu=B!0xCbug3p~C10YxN<*2&%669NHQXJAUGt3@{Nz8f5- zU}3Gs!)b&Hpjxea%FFYa8Efe$B$RI=)L4Xr7j!blqD!+yZe8vm6J!OM>HsisBb<4rjB0DuR>@Beud~hs z7{JsNFHj$Umkj z*Jo)WadBw=$`e73pKFbeP$L49=8&Cx-i2k3wOs&!2(Un+nkAyDcl&|mP=Qd947u9* zi5GW+<4kY|{<^_UFzQ(#vUQTkPZPAl-!v%(_@WG79LpUkT1k!xX>AOXsF=R0RU$t)vlG6NR(q!0hRXJF^2NKafm2j*a~+5m4!O)pqMw}`TijM`Uzs%1M8OAjXzgvZtUs5cn4kL*{!B{`jM>I!A|gWZ{n(&URkT5Rp1 zn=XK3^qnG&$s7YSdiYz{^{$34te-Q@!a^{TN zL0~&p3o?0gIklntspxVmd4Z&ohpr?-6%%T>!R~A)KB!}c4WJg8?FLk znzN$w$1XcukgiB_Ic1aeb>CSj@3nja>T$ZwG4v*tdEs%%59O)8pl*ZOp;CGZ95fz3 zBdEH?%l?{z`f>*dC~|kryqK4Rt z4udAzUMTO&R=Q$1hnG*R>_UHfnpUa+l$SBHmnY7of8U@}Zf*)|k&vx!bpb2q?6(y! zRRbQ5(;Gg2#7BjZkjjm0*o4me|?98Pj(SXrFL>3Zc-&M>I>oa8FR~Ea-*9rOsoQX z`{<|NHB{cbv3i+l+^DVesWuL|F24e5F)mxjY0K?f;!Et={X|`UJ0_bhKnL$jMIt;d z7&(>nA>l+1xIt=GNmM{Sz6$5oK#c`t<;5(VE9UY2Z8K9ep?Bms*V;cJu?(DT%$MZRbnK zNBhJwPvDNJY!wc7V+&RVO76OjgP@WqH*sMIQw@v-!?CQNg^OdL2r3QOGP-3CTX~gG ztCCt*Z`5Hy8|?=Qt)cDODFoX+BGR~fJKS{v-iPs+UIM9@!WnL7Uv7M|xiNJeQ*F^W z{6E3XF_OQbOLGP%Y2|QX?1kD{XYJQ^fPgRS)3!ejpvWl~VDFuMP01pw3Kja)zWuJ_ zg7K>TKFwlY`C|ajLjwK_pGxbdua<_HoR_pCrl}xI^n2;4C>hb$ETsJqtB3NB|*~eW6?VS`_k95s^1T>ZOA5N6yQuyy?ceuF-Y5 zt=5N+3NvY;Hn!X>of>7*s5=U09PY{;d1^c>gv4*q4CKg4jEPGbzX1nXD-(Hb2?WHL zrG4Vuu6KnrC5z{Igf(*CK4xKmKvd|}eb_s6;+usL)vDJeWmwM#)J!2+%8qiU!C8oi zXz+yLLk+ZBFu7%URPrMOGp2J4LFn$n(>2vmZJt&bX_w8YcbE)W9s8_Hj#xds(RTiU zD^x46r;+ceZ6eGZg3<6+f!PE?Tr~uJBT77LQYkREFjtpV23x4bR@}sYXS}#TCSHVG zTj^}KagtP@#A=OFn>a|}T315~1GQC8Qp;0dq45}&a>)3*{-7nexo5lPSAH2j_~Y}r z*?om<=dX_Uw31W}#)vUd(4^&vl_L}W@x5RCo@WpZt979&zZs`J3EvfjDk)&2)e_D_ zg#@03uJ`AE<0Af|#ENK6vyh`H>V@W+_?B3IUu$~t+NU@k>-UnMI0_R5CX6ZspskfV z^ef~=Ub~l^e=kMlIldX3=5$Hxa6P?OKK5U>ncjIIG>|9wEQ@|_f=yEQ>uI7koQ|!? z375Y>pT$7MPYr4C^tsKDME#o!{~3V-_t>>N48%01svXN|vr(R{)Wh6T#+SoAG+Bjw zx8vV{3REK{MDgVhRJH|cwt$q56d99UivjqKZ&STVGO zeIaB^co#@aL@6>qIB8iiS~lN_2)Paw9|+1<)hNUg)uMH4nSsT1y!T&tZ|=()N(VbZZ(kiF;`etsGw6Qk$v@kAU`W>I$-q}J%Eg6j0agG%-86xufPlwd z%huWIEzGq(>u|R*p7=@D!?XFN^|Uv($#~tDyTm5W%|NZmtc?aOX&Vv(h+Aw~W+!On zb?B>M5|k@?x)HmL`%zaBA?QN+XinBS2-MXPDVOOsoEmFi0C+0TG|a=43n6UxZHnV! zvCF&2wNJ<37gszNTS!1)&F$;d#1a@l*GAViPh>4)vFQ74xCN+BY98z?n{QwJoLM^W zL!a08^DhO(M^(%A76j||4F>;Ck z>%^y4fKIq(U?JKWZ@1m~(*5J%o3hH?vbZ#~9`pW5neS7WsuF0%a5d^*+|*Zu>dRZY zw$30cw+-A}TrR{aIX?EPu=0x|z=<(F;Y9b=elIj~1rEf!;#*MMw(W0l-1ome+2PR)#EjYe=-aqZ{yal5{VbXHE^= zUE=2GQzF*^%fqk?>4W%?!Qx^x96AFn{f%!b7vEecfOhG1&npp)YL9B4(`A~9B;sQk zv_M*QQT;RlKFSNi3AkXk-izOJM!9yGCaB?M6pV$WI3U3!)htT=yHvvf0T`E;DVl_Z zyE1#>sy(5B%bDq^@E8OC4Uy5AaFEq#+qR+_juUk$nEMJhes|DD6U2`lnoM!1cD;3% z2Ty^C)^vVD3!c63b-hoe`NMH|vPR$)bStG%VH;FphH-RlKe7VFPOy!^=B;a#MY4Fp zsq&1aaUr0UB;&B_Z*~HWq`%=gS~%bH1)Wcm;9ug^;el8BnCJH*m$%eVnhmx)hLlV@ zCsoIU@!`4fW{f(vSRhY%QT`^hVDAr*!v{H|YLaY)`DlM zxMKT&wc0YRCKj@0aTH!3EWIS4K*U@idPvaZp-Ttw8V#aX)oRA*ip(43eE^8a7-O}xd;!nfh2|;Y7mz)j zU3%mhQ}gd!#~&FmyNx>@#haJ!=FE0TD$ZBskN6V(c2i)$jIjmz8n8pIC-)UbRB}1i zndjL#Fg@g3srknN^iuW2d=GfQkN={`n6+u%b4P@TB?>f9#85LqM+;hs4$mL3?L*tbnNC+&B^Fo>fT>MSr4 zUR+w6N(MZOQb|xbgx7yVm3t98f#V9VnRS!AgLmc>jgq)6IIlmAM6Ui~psKydh{>7< ztxJ16IKS_6Yf-q>wSJfQ_UW2D;L29DTN6lQg_T#^dSR||PM8Om!PWNPi^Mhgl^0WZ^{B=xYpzov& z)3?}myl1hjB}zW<&R8qHJ{8~&LD>fz1EV9FaF}bn=0O8ZEw?J5J@z^LiNVC~%(#~d9y`=U8p|?iwAnS) z)>lM(brPNr3?An(E`&=k9|I*KRj zoC-r;%bkJ@7L%pLdL^_URrsg>Kt16qun~ti+4jL+CVZWp%|7*Vn*@el@VSB+`RdFU zou!JjY-|fK1B=Cy0C2d#)EY^VGQuy7WY;uy$VA9AxokP z=l_SWw*ZSW=pMzF?(VJyB&DUhmTo~%DG6oi?hffiLO@zTK$@kyL%J6P1f(TJknq0f z_xpeMKF__+f8W`6C(hKFGiPQe&aq6~e%CY#bQ#5>z|nT7ZH>Pq5%Gk3Oae?aqo7*%oI`q5jN>cb4DU& z7{B&Q;tD$}%{^PT4~IioM*UYI3rmTi%ax!fAD^b9x7@aXm?ZjMY^|hYjC|0Yic9Dn zc(W#As6Z1Tvgrma`ba)3`keW(+inKS>Cx$fB(`>fJ?F}ea{Rl-%1vMu_$I+e77DC zT6m5RacXXs{<4h|#-YN{s5SiCXp=*@3w|)yc)LW5pz@`VE-_nQ{*+37ga#SZpb~y{ zxKCZ;ezZ3H<&H8X>DeybbH0W?lkBQ|RHm-0rD>=Gy=wWvb)(kOOjwW7}N`! zj(K+ZrGB)(=GiN2Eo%*2DToX?q4!q>nw>!SxxAZ+=<6>1|a*isY>PVI_Tw`jB=Byh98!}39(r)me z#JgLAbQdb+(dW~t_2S`9-cO9=Kmzq*PfT4$%dqA%Z={|B{M7N#=a~?v{*awZ(XLhT zD_37sA*4LfGv44m{k{VXg9D*day)|MqVi zPGQrgO6l=OmGuw{W9T~h^Wmqnaq|HtRxuWP@u<>0{-(^I#9 z1&@4SdkmZc!39)wAcIhVqauVbBycDM4Eui=ASf8Z_>9L;)gSv(8xf1p$xc4110XY6`GAh}D?Xn$>k6RM(Eh;mh`bCMM8t zp)^xyC)^agJeB+4{sVGc&}{s=3I@)-T~1#~!4U+1K=+wxruIDbfQI|!V^aq>0-A;Z z%KX>N0h$vL&|-s6w(@BJfdj&GM3#QS5f4EBOyhS1^rvG;Bu+wgm$$D$3cR;C9*iad zR2Tqwh6aO%z<)b^?sSMO&;@4_r}LTBd}0pa@IzUn6~=60q|>Id)vbJw)!EpzvY9=O2tK9AG$;Y^(pEw};fZVjAmo zsA|=D;OY*^?}n6@h&~_Q^PnF61@OBWz%evo*5gafgjmBM4xdC~M23NS07U=*j^HZ~ z?e`kOx@^jh(3VVrus_5SJc4%}!Rw%K0%-k1ne6q3oz6^;5cY~QnmhnNbqX|kK;P*G z8s`UnVrtHccm^|l0Xx25o^)7-f?)_~3=Nc+uV)QmX^MafAmp?bi_(_dTb7)LK=7r< zuhV5Ao<;UL74qG5X>1)B%tiz&I4!8xLHWG9-5U4AH*yd_t+QQ1;vl3>)+Hs4-&B)z1 zJPF{VW(}IK3`s*ccrp9K)XSabieS%!?l-JqayG~!_5cDtARLTf04Z7}pnzc}z|pup zFzn?+ZA}6EQIckSfQV#YBCLw1U%^Gf>aoB*&>zbXa5@B>#GHRc1Wd7rA-M5y1Th30 zs|RTL8Clv@97+qqrTu289nC!QW~Yvuir43uW1F!PMEOAz-3>FsSGg zN9$1|0@{!cE%4J!kbnr7)FXVrFwG7agjp2=Mz$V)y)v(daIk5$d!K2a2UCIvl`Jn= z*Fi5}5PiLV)F;Ky9PcS5IzBWk(`YP@qYi(`B5HO-a3h?GV5&oQV6=9DgT{VtsLE00 z+htGj&mz+{U!fK7Q4vG{kc;)(Zl1kXXbeyQ1e6)Bl7O&+qx>Zt1hf_rsQ193B(#=~ zE)mc(#OqJ>DR6z7;w*>Chc3fi14rnogJEhb4z<&zkvLRIDVp3zX@}5{2p-R1AQ4BP z7o?@d>!}KY*_8I`Q{0;nJgrY$WoyH*oBm2;h0+1@Sa$w1Ec-d2| z4#@6-HpA;Q5!UIK;8fnD3cxw@1}H~3J)V*y`20sv~PXFL(ChpDXgHc+i3Li**S zn);)fC~UMRJhfpK=m>Kn@G5-C>JkaURcGbNHsg5%jRz{b_zrLA)jLz^%Vox-CqPCe ztyiyn00xDCRw5i65e^~Y9_gcBTrc;W-D z1H?B%kj)U#f>G-?0Qmc>#5_6vJxAq@}{58T8FX6m3-t*(gjRw)ty!ott$cY1lo z0{~#7ViB+ir36tTEIo=8z@SNPays}jw)IzV>LdNP>fC8Sa!ab~F zCLHm+eg>Kk;m~1!qz6GQ0NAx|lIsg#2syTfL3rRCpW(|z?-0-th+=rTkSlxWpxfD8hhpEb*{1 zv}rA{0_+k%G5CBlt1Bt>B*u=oR z0f`$1aYWcx-Q4{FEkF4F$J9Pp1i&Cgn7TF0jo3p`)PzIvD?>Vho9>hLDkoKfjw#R?g)_M|W!D)FL_Lzd9HR|A4yx zlS~$n+W8CcJ%KZoom8-k3ANyMzE23WwVgb%6-0i|k9z%M-rld#P`iEn^<)@n=GQKd&Q zgS%?eW4WqcLmA=PH;Swn-uD2U)T0>LYpEFCb8BV(ABG{fR)gb)<@*1}FkRnJcUCPC zOf04b1P%rMZ|45N-dDbNX$uZopRx0NC5|f{OP6Q8j>$DX}aMnJ|@Cw zMP?$*aCzoMW?-_6$r#ELnAG@agQmCMKh~1dgB_|*m#5p(A1zl-{oT4v^Z+z zdi3K$+%)`|f2Mex6=NvxD^Kv3qn7nA|H$e+Ov88urWyl=DSzLB9cE=}E}`UJrtANr z`vgvI-kL{^Pnk`Y9A^9e^o^jOV^jS3P{A7f(B}{6qZAicL*hM6C5=C#IUV6?q`PVy zFKl_i*1i0N4JcFcdsLj2z}qT0F1oP}L~U)t4+y2QNKYtc$o6mn!R|nNG-K?0x{7JX zCIQuz_@RuIvl%P0=77dmN_2BS=-&{DfE}U!p+FhH?_rSUv(9SuO&M8F z-iAU5y8`0nD~;TAeb})kV*kN#R)UJ-yV{T=B-xp5u?G)WjvtW<=Nx%?=#glo%Z z|9fqxETQr8;5!`FAZfLIY2=#U=nr0qa@UqS94`1_W#Kw=00w*GmrUr~T*f(^w~c2M z7Q(^U^F77$sqU&C5jRJMRLNRlwVm}2qJB~W{*Mo;_3r#k12IAAC?#>fRLRxgv; z%ahgE&nh1I>NJkC>-!=Z)%)xts?{~M&g?iq1RJ&#k1l_V0GGKhz9DDWTP=smmxRPBC2VH3>{c1I}-piHPG>k}DevkyK%fD!y zDM$q+nx^Ob%ZD5m7>_H(8|q}sx$LgJhPN(Pm-1F!@qcfY)BN*`uEnestx$V`00c>u zmwNUxCCT9?V1H9!N>Wg0e2DeqBa5zsW|GiAlX?_65SA`vTKi%sT1Cas1JBCQhR{Yb zp+xRP;BSMg0@e6c19T7q{u{@>?9O_xxX(Iu#Jjf4-QN^8cuArO)0<8ej0rfJJ{18~ zTHtJ_GMjW9*_WsbcU4arIclvlE4xrWd@9iDI3^HeclF+Rfjt%BWz%dRQMqU>AQtsn zYqO~FsFezsU)OuN(Tb4`#5O-~^n8=5&{Rk7IYx&crTo~X!aCf-a_m=*oHdh;l^g%9 z;VVtL#Uvk7N-Ar~Ygr)}M+Tz5FEbGDezhyD>;Q0RGrwdJpyP>6|;jxNO@w?w(i$u-U#Csq; zh4EqVC1V_VdtZ^KbflIT7D<;pYb($PYk>cK4RniyaLnz=yaVL!L{h;UH>Fna0%w$q zs9-aA9m1Uk3?e@&!70{_Zje^a(jQ}wp0dABgYdwHn+sN#Dh&zJ%rFAXCOPZyg6!_7 z%w`@68097nahV%neGFaFSMe49joe)P0E+)@%m=ZkYbnS=kG(GOz5p!&b!CckBvYca zl5sdO?G1_$_khgCyrca;M1Nad%N76OgRr+m(n(zJ8Z=*0z{%F?6wuT-A5>};YibRtkLE3v^ zEJQY5%$QxhEX??Y-El$POE}Dop32C5#_O72&=1QCTiL*$Lor4b#ErkILvH)1FN&%WVW(&v9fa2t^ud~(D)7!9Tw1*hp?|WI=oYhCP#nZ6lH}ina1&7 zYPI<}2exu8ontfc7Qe8RZ7~QJ8NTvh_-F_8V!Ee{*PjK-xk~T23X*~g=z(~ zTAl2EWjnbRMXCTKgxQ{0b@f_RlS!1XxfsZqZgvCj%cr-DsqZB# z-V%kd5o%EgWz}6LvK3+&4oN=@C4?#@kk)@?V$^uvAxbb=KT=U%cu`{S=Xf}NbQ;iM zadKf=Tb8h|XWp~Ok^u}uaSyF#>v`3-CUErzV1O1AM?gN7Peh8{!P!wGTIf`{)5^m= z-?O|dt&UDTI+fxc6Oa6sQ5!yL1p_I%bSeXs0Jx|AX7I+72|=kXj7q2k(0^6oMd|eA zD$K_7s;0StK*D)sJbd{Y!|h`%`hS8yvmG9t-?AFGui~A$ZCPif_-T{_S0OnKrJh*o zg)nrj`WnR;Jq2hX%ah3uJ$dfA0vt2Jh6*>7*DlraVCwYS<386+fHCzO&PpETx(N_g zgfX23^l=Y)QHEX`Mkl{qmX=Up&@F6AC{z%Sy|Kn~sYlca%I>#wban%6;lFZv0kA6k z^6C1w4``}r^95L=c$L~TXN^-QJJN40{p(iX(#(E47o=4XBZT{5E)h5E2nT5KV{A!i7mr_kU9h3(VHi-RamN)9xSGP3Aq~ z0_jwAXFcdt40#Jn_dia0e87-_gw8gnVj`PmNN0iU$Uf%Bq8d5dvlm%YPehyWp$wK6%Hg4Qt-4>t{s+X(#y-!y z>F~2QLcC_dJU54m_*=mo%l8VE5v6jr1_Op;Ex;m_ApTADDd&E^>KQ9Zg!AO?)@5mouT3wT=?qLhz<`6+W5*QCKF6}nlF;Nz zvh(ppl>>T^PuN*Z@aEKD%^>ZwJiW5dx&rraeGF<|a-dhH7*fk+Npe|3gmsIkU)3E^ zD)8=2D%5|? zgD7gbu?vk)SVx8yoST0@Dh%bAhzf z97pQjWdrd=vv((7zN*xmY_|H061E(m2qh48N;%1|EJ@)LaU9<)lv(-{fKa4IwHSXp z3-F=^^83FTlKtrD=%Jwh-WfziLPh$|zp1}>1_>GEbS?N?rcOd+lk}GRPmRFjS;yCa~p*sc5$hMpZVfXXAy_R1V(A1Z=6KS zhSG{eiS&&2=8qikfz>;PAIfOFeD*Fmm}_p)FXJq*#^RM~yz-(LU!Fz_S`S8P##BaL zH-#x|Y>b;@a8}O?RiNU`@R^LEy$#Q&xf{3K%X^N>OOmo6W@1=m0BmnZ35d}qsIVjt zZMpu}@=rnizZ(+3MG15MV<9Bm^I(hj+rSb!h6|VntxTE5n$NQSG*ru&s&|BsZ`n_XIDH?bVLuwDjNU4|Zv``;`%|3+#a#)m zPsHAuw|NkR5g7T?G1K!CP@UTL=aT!IoZ5E3{h5C7c>ZMtMa32F74FN5mld5_PfKX$ zde%GFa8mEDzW;bR{_q5?B*O!RiSX6%jq5@7jbPMiluVpc=x@Ol0jJg!5|bS^*5S6y;S@7-`(yl?DymL6 ztGoXWel4%txb|_(rkHeqRoB#Lh%C}38d012prJ3YJmhv{b-GiSi|=paOX-Un$bD6d z&*wx%UmIWW*w?~>*sZxR51+;mS+$5v> z2jp@$csD=}yHA(V{ys5vUHy3O{`@k~|1LM{!DH#V?(*JYO2+FvvFfXH5YP}QGEUnQ zh-<;idyUl_nQ^L!G+6&v(XU(AR4yo+Jc$y(*+@o@kXmys7)Kdvks~ay|Sj zU|56lsm?YL)Eky6+QN(zenXHyMrD*R)kWKIgCeMu1O0a7EPJtl8ImL@FcN z?3v$)pFqyp-)F3(jvtg5R`<>05Sf>fsLG{|&ya-x3I;yT1 zy=c=HtNq-g!Ju0e6@69GUvU}wO$G_rzdT!$z+GXmo6YX!-Lm?UiD-FQBkKsUY>Xj2 z8ASn04@v9cl*04@^^0taow}d*)e;s##!NZwMh0}zm>N=5aiYNm%%B2EnOls6?u-Se z3}^P^gZeR~MUaXAAl9cwIUKN%I1v<3vcaN`^hM*T(HJe6mgVHT$zj&T+)18&XA@+I zizfrOqD>biCfvLk?ef*fa3VQQN*jMYOiUbEEW7uPbD`l`1WphwjHN`ev>bXY*QZl> zXlWF#WI+Hq5<< zMY*WDo}gUXt3=2|$xWpWQ&+@J)7vsdoOp(1$t2nx3P=WatqNi+h ziXECo>xr!5P}D*mB@7dd)fTM3o0LPUaek8|t|L&DR>65G^Sq73W+ZG@Rli;--EYA+ zNs-Y<^owPfgealmqN?aOku|*5@t0BF&Yj)e;@G2)W6`MjC~f9QCv76xqzpsk(jT30 zQQUyLMb?ME`5crs$CNT`qICX}P!sa)nO*^p;qi~pB4bl03cY#!SW%0@{gAkqMyO!V z|G8O$I|*hmnG*(0h*#wnk({Bvv2v-XPLe!xh%)6mNFz%Y`5YB|)}O#&!_dk7SejEd zOX&UW>#+=p%VnN9q2Mqw24FLW>j$t?6W8MFl`Bf4^I;3+DubOcC}T| z@LzYm#uG+_gZKqr9qcBjqai&)ZJK-ppI)bCD#o=QrDiqVmY+UzK$z)`c*(C;CNgsL zT+$?Xb0QG+anjgE8*fQjECjoZuEJ24r_4jYMumZ$b@B{A@{Fy|H(LwjYaNOweUQ^K zw;hNkNFC~1-kR)18k)bXTV&Xckao#nenp$INfIC8;Kv^=OFz=jSWZIAVb~+opGbSe zYR!+`W%yN5jawwiIvLx$-<(Q3UoN5u8kQ`4QDIt{k@W%`$Zdbya~VYcmE#ZSM_}i| zZ20eE-%ENw+6KCS1C(+k@$rO`pA&R#whRu4#x9~~&m^U~P(K0V1r7NGGsB>r_FkH2 zj;r-xv3AWa?g!-k-}r*aiaK&SUzO$XEwWVut^`)hJsTh9te17(Bsp<~0;y`)%C+ux3s+O)z!89~z)$aOkI zN%i=#lV;8n45J@4nq6XuGi>0#F*!`P2Ul4+Qz+~>6RnC3=uj>e}f|!FGU^s zsd$^n#3Y|E`4N#9yM()1_?s$l`9&$J zY9#u;m!K-oa-+^`L0o$HzeiGrhexS3$G6#`nuG8uOH}*vT?ltL-#33sQrlt0C1J)Y zOXTSl)@8*(q6X*aa>UN?RLAs?Ihd5r@>2_eP=1qrNR7asrX(dJv5XWteB2fPnao_A z0_lU?2yV$1DORb1Tyc@IEUub;wTqv)igc63g!wb}^=|&=K_09jy{W!DSK07zhruwm z?K#gYlOL_N;lJ&d;I)ZNMbp(+S_Tj-s?g$azgI92u8W~>5{_C+e2}c@6Dax6+pJ1&KfK6|C2U#km2eOot3guBV$QayRX78A zToX`eQ9X)D5SC*iVwK7=pd?M?os@aD%+bL|%&R{jC*vsA-@gYlf;ua-Q|FzyKe6X+k6bWmu=j9)cr54)@`@%cEXg$%w&f&zQ=chMEn^ll>@#6iEM%Ehey6X) z>yz)`Tab8P#Gx13M)+c`S-@ha#ztaybHZFQ@_ASBC+25W_L#C8K^o6)Y5*6HO;MSGv?(jDL;y=PO*O75oUH17!{N1 zAs03LuF^=6ny}xF`m7fV{Q85UE?q67=|ztCQWN@El!8x`(1g}Q z%23MjC4Bbyyi#gC50js$h9Jo+l~mwbErX4?%@`YIJ6R?rs%@vnnW_b}+?wP??0Lzb zVV?5Zs09z#R-$gj^oN{zN?RN-B~8S`>UgUEfF`)YN6*vosJYETJ~O5$@p~XKCW(J% zd)BN`?JWCzgeaJlkqY1Wgi^fd112rBPhv$rN+?gqA2W}nmnzn~G8`nk^OQ>Kg(|Pk zmsHH;?C_H0JUQ&bDJSTj&uHYEhC>+LEdNU>jYX6&hA;d{+YxehiaqHA0}*m+jL5-F zdL;aojGVDfka8{GJem%PFsdd%oE_DvA2`-HE?G9X3%8$@z6}%{jEEAo8K_+(Mr$Qz zOk!e*?9<1t#x7ZGq?Z~e77C6wKsB7Y)stFsh9HX%zlyoE4si&1n#LPKFf06YqNey|Ov=x8HS@_UaxRqEZSNw#+I1MJNAlS@oq9_9)Bf1A z7A)##eJqPM95LKcuXJL_&9LT_QSudnpS~IYJ;)!hm>={NztU}q?>DVP^WY$4Zuc}% zM#Jw`Zr5#f2k!1Qc@!A7;z)8P1NQ^OAueR&N=M;;_4N+G$SuA0bM`%aQDRH?Vy<0l zp?qRSO#2t5gnO0h86P$(go;QwS?Ak%fw(qR6CbPPpV;$DGI`Z%H*N zak^b(ABFWEi=M`~NBKEBSBCW03HCmhm6oHX8~4NTn=l{JP$?qUu{U$0jnF~f=$bNk z467p2L|#&Tq^eWK=@{pETJ#mK*c zR~=QgY}YL!Iqq91fh>}Td)LHk8c;B9m{wCi=VOC}p3?4d(z#9{Y>=irqosyqGGfw9 zjPcBEcE7QDXHPodcTpYQBWjBN0VV@blQW+o&Q_BoADcdy0yR6{T;khKe` zNm7SlS)=!8HPCwLEXz-2(aCawmfvLN%ChM*(J=eb2fX`J8rdk}W%m^0Fw_~zdr)7LyjcK3ZL zVLyy0|1STT^L_6P-?~D>Rz+`|z{0IYPZ(Hy!y`R;jOS}KrRViCqZhGqAp#&OE^mb+ z=bAu!Tmd_NI^kpVi>eHKw+270^qO(smy4N5l{?N;dwi4!!)!Qm7mtE<89;|>BXr0_ zArx$=HZAyIg?_Ow8Yw@2bXjrGDmU_%`ajFJXHj?g{{BSR7f&!~dEYfR@o2f8zp1R% zE}j)l=(%dKU48j}?$h?w zi82j@F8*Y|Df0cGj)fNW1-CnMpI1l@I%suLiAYf;|7{NZJ^Dv?VD)>9Gd}S4x%qZs7Smtv*L`%%XM92qJNNUx3$ZVH}&*h&|vSxUa;-tT$%1igi^TtT( zwVju=ny}^~N7p^(M0t(mk-0>)mE~C7(JM4h6{^dT^gd6Oy`B!js);Oqoxz~wC?V$` zd|RcQiefQBS=c21(W5{`?a)8*sL4M7_kdaH~|IID+ReA@q9M|ua#@kx2hE)L z{H1s_Uu+s}z7vL$yv)FV)V!b76X758@#CQ}%2g*Ng#dpF(ID5I&m^;eaT z+|`87XxsP=@E*G66Q&^clLX(P( zm{;V?69|HSm~Siy0b)Bq7}K_Nw|_u%>rAPsBiqjFyO|j1q_$pGc!zK5C66+%32|Fu zs%zd7cCquUuahBr;y&`}u0VgPON!?Cgoyt!FjH%+Clw7ztkmJC*%IuPCn$>ItsGv|Pp0w5oX*&q=W^>7%sq*vyjM4F*=TVvPn)EH;_QKRUz1T5D~Ci7hzbV}1|;h2 z^?pA386}NOd!$*?bFogl5aj%fkwuQn;ssrUSG!TL0aFI${77C_AvzxSK;AVycw(;x z2baJ(y0LZicq(&$72Z}Mf7ZG4$(4X_bMz00&#HtDKP5skuXvgBEi5bohpFsANE-0z z8cb=;%{wNL8kKO;nE=N96}RgTAAijfW?DsqtTDBI1vy^NZI%p9;fEtVt<(E;KC_c} zyX!8&i=mRzn43R3dA@ugc8vdN$+-fXM!FUB8^`bZaAVrbdps~{RLF8rOZ+qmki^`W zcr1)p$Ohif_4_1S`Y2Q@k&PjoA)NC_uV}R|wA(|CIGTT&J#O~>Wm#5<#S>AN%I>GC zNO-&UW$Kxd71=cgVR@&~l$?>4_Vtlj6vos-e%I2dt7 z8-J`2mS(QAa+zL0=v`|{m|;iiYM~faE~?gvl)0dmO{vSwFL|d$H>gcDE*h!CL?FWY zy`|}S-Ud2|wv%#fx@KK8k476I9XJAp{P3g@))8xqYIc6W*K6aY%n8*pv94ueCH1V7!tMC(f4W!i$4^rbR}^o>1&80oOanu4i%1H?Y^KF1Y);9siMsMaSLiOe@v=$Ga~+ zd^^@gx)75ovdqB)1k@eyE z&Q6SORrS(yP1=v3ovrFeVHLbWW-L>b|de*l%q>3Rzs*c_Dv8aOV*@X}PbJlEF3VE1ZcVay3brO@VMZ-(6_Tl3> z_wkXVvu}7p9ZCd`=#n{d%W2+RDrMFYPBl1v-!If%tz^9DQ(*;?PiBK*d>us!f z8SmQ>p*WSIfFIE!$}w0KxKFa(mjxs*Y3m0s-KwC*dS6S{X!#E_m@`+NZ=(2-mJ%r) zQW&k+9G}JO6xDc(kHdbQ?4Kh%X1wV?;^=cA#0Hf{9mJ9vGo8lK;!wJx@~~3noJmjO zy0AfcHS}f?>yv~LP;5J~aj(kEpny>1>%-8)v3v37qQfg^wlbz)xyN5D`*~cGOIuV$q{95ahv@*>!;fD4Mb>tX_Ml2}tKVPr@}S2oOh*G>D>sQUZ2~I#SLJPie`c0oB5s${~#5qpOIWoV&2dcE95m}4LxtF z4)+)7`vYqFNft*Y7mUHv9d?xO{4rd)S83s;j7m<4Z9<#pbdv7q`l0vU&c}0-0gJ`~ zs)TG{ag&0o=%a(at-$R@2xr3JipS;SST+r51r#I6p2$*@R}zMu0~)dl?_0t8p>BIf z=wF}n@mQk?7};I%kVW4bVOwZoe_AgzdoEQrkKP9&3Y*=QD~^igJHPTSw?-8Qq!Z<7 zt*Jj5=$jKx`nJXm`@mF%ZJ#qfv_+ALzBMQ|sE@l@v`@vWm4ZpNM>`31{`{DuS=wKh z8}$vm+Nyg4wBP5W^bCBZG}N6;O~kJ0jwaL*1cy+Zb)C=K`RlF_PP`qex8fgHK4I$===NUqspw~bNTfzcIJ77T zH+LRem~XBrl+cBqcc%^e*}ZZ$b}TJdYMK${Kpv0Ohb1a}Tz7c!luM}U#kJZsvoktT zw>vH4r*A%wu%M3CF1mX1u2cin_=?q;d=YQ7!^^>aV#a3p=l(}9@DNo04TlDZJr3Yn#55y6V6q^(PSBce)e zphz2iOv0#Uq8QB>Q^PM^2s5ZuMbuRcK7P;F#QyXNi(cm=l^8`;HE9*trUCTn>z@eG z&9F=UCo0JH*`PR$di)t%K)q(fb`NMOOOzWFR3Ntd{XK4Ej&BQEBYE@dpG|r?@Ed56 zXGq1nq1U#k!nyo7p2j5x{906T${+^TG#Bn>JW|ymLMg(kIGxwnmqZ;RJ%2zQ=~^;{ z=X0ks39%uwd*ZH_xZ*z4Stn{!CVNM{_jfcoZVUd0n`OUTradJ+b_(q~6161AgrB~< zcEMD|9t(*Q48F!z*`xD0^ta8)->Kd#%)Tr!l(1tw@p18QkK5B50^^Fj`-&&=*#A&s zKHw%HrPgZDBqa+2Xrbs}x?r^Q@srGScftY%g?#b_9Uk>l>JH6tg;4HKNFPaMF|pze zYzmqU8K>h4SPK)VP!EwCcNy_PuUJd^>z}Dp8&Z%00x65p3ZoyT)a5Ls6pZ1|u(?h5 zB;j#}scwea>+L)#{8f&om_eLcN$F6A%7PZgLk-yt(Hk*~b<6e$Nu)y%93L+(U(_k3 zK1r5O!Oz5-am{fYRi&C+%)P~obwDLVCYl`K?)v$mhIjsOw7EV#|la(*-B=M%Ft!}PB<(b4J}t&rDl$fjU@g&+4#C}2-~@N z6D1%QDtUK9@YL55Bv9fC4z8^cy=FZjM3F^8DQ5#sM%*G}OzFqd1XnN##pxiG8}^rL zuJ)pT1}T_y{(Fq+4)AZLcluxA;iX-$#Y8`Y7kEL`2&~>+OMtKF3xvhbO68Y!OY zJiPSCT!&*gWmH4O;aS;?eHZ!Uz0UN>J2lkh8vWpPjV+ds=+y)M-o48<_7QPcP2MRIz7nRama7yW~K>s=wt0RpQBbKzmC?G3OjX}V133Lcbp$GsHPQ)OhkPB z_G6br8wZv`X9{Jn$==mv3MZ~i#>E9Lx4I(~8hvYF%cccjDO|09 zRNF${=hw=aF1+28_149G`Isah#74aZldYIVljTA7bmM2hz(<)_tKLk3DEq7ZEGX^j z(S$Y(?COdf9a#MI4aEwD@H|&f}8cb|G?rFYHl!;V z*Ndwxb@qI$h|x2tE3Y(*RKQAk9@8&@P+Zwb_m#0yNEqtJ!u)ch?HFcKd(f*XFr+I^ zUZG{VxNOr{q~a{K7{o~E-0|*ond(KrH&>iv)5&=T)-YPWPsAU^{HTjVR$>Q&UrEX@ zS$sr?crSMoxOCwsXBAOl&kIr&MWbcJm%o{Q`8p28osJ8eu88juCtE*mbSgH9cfzsc z^Y!Zw{_JnFUKfu$KVi~T#SNx>H)DS3Nb4@IEfd(bwFX8BLGR;#h9(S;I4sq~Tfcr* zc5(COeb7(L$~g4UZZ2ztCT6T6>cwm@;|YdPS!GAopzT`S=&!woGqj4ut$5QE`do3g z%O0WZj02DZp#G0+~SA0iE@pOrCF)Q+n-%1RH^tFnI3AXdV*#D1H$g zMw~j=t62q0W|pa~-xzejkqU*0m#06`kFJ58cA2c;@t}|1dlGH!b&UhQKHc0h1Ab2% z6wkS3^@@i|C^7H%P_oYGd2=*^(fxpbwMnGfk{jNgwx)WIV$gj0r9ZF++ZPi$U9p1 z+cLv-VdQM~-dZ0l^^UUke7S?2sXjNC_l0>XGpo!DQHWDwDxg-%mQT=1+hGU~sRWb% zMDi%$>_KAsip-NMKYgHJFG)pQSGUnUlmCnl!+E>{ErOW|%esjchL@!l!e)4QqoI=Y zB=9a+3Px(UYax3m+t52Nu{K+O7Gm&dZxe&Xyf>y9N$zzz6Aq!|*inS{C21RLME;Xy zsFT?N_-I!U=i8u;cK|P?*R{)6|B9U8Zq*0}{L)2#EXng=uEjYE{%8?Pyt|6T$G0T0 z6+~Q#6{!&t{iHoL6AD#dM)BmUL_EG^vvHHF=TZ;!gT)-w^58}IfU1cd-F2P8 zd2hc+NoGVwKo+Wy1tDG@na=tJ85x+ka`Pmg$C?UhVn&j2^=pH^VdADJN^3bdpo-zx zr1BUE2Cb}jtkh$4_Zt<&Ld9HDG_v?2oEKJSL?dp3Ogei(iA)PkcXfFiUg}q zEEjRzX0YEgGqd%PhK#bRG1-y90-ZM05OB;4y%-+M5GM~0%#Wz9l>X~4K&w}Y4%shX zTNM;zH|TBb-IxUnb7O~A8_Zz`-NbNGJBb(%SL~p9y^qh)G@F8)%&B%^AGgsf@UH6{ zBwHRua?IuB6Zvu}@t*wN=M5icg3Ve9;5fIWX(bufI1bjZ4_6a`a`FNQD#ZzE?9DE)wbT()kdNMKgpP4R?JYzl!=w&5=Kv zjHV!Xi`gx9!56qkeI@>Ak;F}S;ph|??K;tEIv(e>-GLT-$J*83?KV5jxZV6f_g$gC zzq=2NN^eZamMA*jEOXx}d~dV}pW=KpDBt47Hvg=VztJd&Ni{BC>Va+#?Hcqay?dZ6_ zJ7$=eUSf7kMn(>g)iz;2=$7jv4%XZVIq3VUf2_Q_yo-pqhEk@YzAXVYf#avF)!8Qd z#9i5FFaK^t2nNJT?koq=uX~_G$Yi4g-|vE z33b;y-xFkHq$-7Rjqp^EwV^7Rk7u^t#7(s#raFpqV3-q{Qsl~S;o#kph$KkQJ5oia zk#3=|Z!;h5oJ!K$H+QeYw$74shZxvYUM&5xiCpf$ z%KxcR%o0{uy>oAkMqJ~+Pa3nuCsurqFn+4cEO%*dhqVUf1pcFj zh;=%tlXiO^@Aq|PqKdgd+y!5c6|cxc+J|MKb%FfxwAd}7m$55vH2u-z-d8yQ*wvy zc^84%hVy+?oKGtHsQt;uut;e>>~AmKw7(|dot4jx{C87;@;{pb!0uIn)@McAV3ty1 zYTqBymci^P_!+13PU%rfFh1baBv$RIlOHwZUYhW!P&R%F%9Xs*b`WgRGEFe@pWbEc^jcG635raVU@Q?QjnJ&`Bk)sFF@VR&74mwy9lQ?@gsE z$sFXHOJ+OxjPGQQ-rhG}_4@}V#+hzj;p!jUxHq{iZS1@ml?f6xyKvP$GxroBGlUWq znV^JU@hw{!sa=m?1&{cN$(*EomVC;M9lAPJtz3p1SZ55n5vqpDJd44e{ zLsf{#?FLAQ-cM{?V)d>i+mm}DCrT>I@%`BDtb8dZ{E+)^Rk>3I42^zh>KRz@1hV&R+Y595n5uZ=hKf~K>0zjXXUJ> z1|piI;|uDdD*j(PX3&u!!Ks+|*f_>F>8jn9c>hak5njLT8zVVgt%Rb*C-t=`d2O}*2Cy?@xUn)pn1DAG@3+reeGtM7_iGK`r9eF2xb?>8%uk3%vRUP&)lsU9b)(@eA3P;ndEhk z=S};&>rA=toqz6Me*Jh~aeV$V!#MQ|cEHN<{TJE&vN2URWS?8+-(G9*p~`}L`J7(% z^M9?t>X!dKr%n2N83)pPs$Tcq?|}O*#|6Am&^Xyd<=L?h?|?UfL+0w z{yA-*Ko^8$R`Ys&xwP=aRDQ`rzQCJ6UUBW23(6(uw9bTXo1Y^v)t5t&p*r3UxbN_? uuL&|*f874DPvL7jVvY&Hsy^odT+GdXJBh!V0Nqje-i);7Vj$n diff --git a/img/prefs-1.jpg b/img/prefs-1.jpg index 91eb4c38759e780ba62ea7d01c21fac2fad81cad..39e62fed8e202462115c94c06533e86f26bdfa2f 100644 GIT binary patch literal 36841 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 literal 35406 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 PX)6v+o~z*Aj}QL`j3*R> From 6069675607df05018dd9d688f3cf574d3fe5a47f Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 10 Jul 2014 22:49:47 +0400 Subject: [PATCH 050/224] Remove old icon --- img/sensors-temperature-symbolic.png | Bin 582 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 img/sensors-temperature-symbolic.png diff --git a/img/sensors-temperature-symbolic.png b/img/sensors-temperature-symbolic.png deleted file mode 100644 index bfaaa4b8f5c77662db0df67dd3293a61054c8714..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 582 zcmV-M0=fN(P)3ZKBz00O^bf#0#h09;i#z`}>HUTbU>3Q(z3 zs^Go_3j;`UYMg4l1#5uyw_v>m&lBMEWBZd!Y$*W#NpL8so0#29s0$#e>z@RND+4H% zN-e;XbkQI5&QgDW&^wcK0eDHyY5;&Y3CK?XGdni3cJC;Lgl`10SMc_$yDX2W6s$ U;?G?@4FCWD07*qoM6N<$f;fEfssI20 From 1648517a6e262d351d393e862c3f5e7fe5ad88b3 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 10 Jul 2014 22:54:08 +0400 Subject: [PATCH 051/224] Update description --- freon@UshakovVasilii_Github.yahoo.com/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index 0fac30e..bf59e7b 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -2,7 +2,7 @@ "shell-version": ["3.12"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", - "description": "Shows CPU temperature, HDD/SSD temperature, AMD video card temperature (Catalyst), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", + "description": "Shows CPU temperature, HDD/SSD temperature, video card temperature (Nvidia/Catalyst), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", "settings-schema": "org.gnome.shell.extensions.freon", "gettext-domain": "freon", "url": "https://github.com/UshakovVasilii/gnome-shell-extension-freon" From 297d4e614fb17b3607dc225bce18dc8ede3c60bf Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Wed, 8 Oct 2014 23:45:21 +0400 Subject: [PATCH 052/224] add group functionality --- .../extension.js | 124 +++++++++++++----- .../prefs.js | 8 ++ .../schemas/gschemas.compiled | Bin 808 -> 920 bytes ...gnome.shell.extensions.sensors.gschema.xml | 12 ++ 4 files changed, 112 insertions(+), 32 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 73a188f..d72a622 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -39,11 +39,13 @@ const FreonMenuButton = new Lang.Class({ this._settings = Convenience.getSettings(); + let temperatureIcon = Gio.icon_new_for_string(Me.path + '/icons/freon-temperature-symbolic.svg'); this._sensorIcons = { - 'temperature' : Gio.icon_new_for_string(Me.path + '/icons/freon-temperature-symbolic.svg'), + 'temperature' : temperatureIcon, + 'temperature-average' : temperatureIcon, + 'temperature-maximum' : temperatureIcon, 'gpu-temperature' : Gio.icon_new_for_string(Me.path + '/icons/freon-gpu-temperature-symbolic.svg'), 'drive-temperature' : Gio.icon_new_for_string('drive-harddisk-symbolic'), - 'temperature' : Gio.icon_new_for_string(Me.path + '/icons/freon-temperature-symbolic.svg'), 'voltage' : Gio.icon_new_for_string(Me.path + '/icons/freon-voltage-symbolic.svg'), 'fan' : Gio.icon_new_for_string(Me.path + '/icons/freon-fan-symbolic.svg') } @@ -74,6 +76,8 @@ const FreonMenuButton = new Lang.Class({ this._addSettingChangedSignal('drive-utility', Lang.bind(this, this._driveUtilityChanged)); this._addSettingChangedSignal('gpu-utility', Lang.bind(this, this._gpuUtilityChanged)); this._addSettingChangedSignal('position-in-panel', Lang.bind(this, this._positionInPanelChanged)); + this._addSettingChangedSignal('group-temperature', Lang.bind(this, this._querySensors)) + this._addSettingChangedSignal('group-voltage', Lang.bind(this, this._rerender)) this.connect('destroy', Lang.bind(this, this._onDestroy)); @@ -83,6 +87,11 @@ const FreonMenuButton = new Lang.Class({ this._addTimer(); }, + _rerender : function(){ + this._needRerender = true; + this._querySensors(); + }, + _positionInPanelChanged : function(){ this.container.get_parent().remove_actor(this.container); @@ -223,8 +232,8 @@ const FreonMenuButton = new Lang.Class({ let tempInfo = gpuTempInfo.concat(sensorsTempInfo).concat(driveTempInfo); if (tempInfo.length > 0){ - let sum = 0; //sum - let max = 0; //max temp + let sum = 0; + let max = 0; for each (let i in tempInfo){ sum += i.temp; if (i.temp > max) @@ -247,13 +256,21 @@ const FreonMenuButton = new Lang.Class({ sensors.push({type : 'separator'}); // Add average and maximum entries - sensors.push({type:'temperature', label:_("Average"), value:this._formatTemp(sum/tempInfo.length)}); - sensors.push({type:'temperature', label:_("Maximum"), value:this._formatTemp(max)}); + sensors.push({type:'temperature-average', label:_("Average"), value:this._formatTemp(sum/tempInfo.length)}); + sensors.push({type:'temperature-maximum', label:_("Maximum"), value:this._formatTemp(max)}); if(fanInfo.length > 0 || voltageInfo.length > 0) sensors.push({type : 'separator'}); } + if(this._settings.get_boolean('group-temperature')){ + sum = 0; + for each (let i in sensorsTempInfo){ + sum += i.temp; + } + sensors.push({type:'temperature-group', label:'temperature-group', value: this._formatTemp(sum/sensorsTempInfo.length)}); + } + for each (let fan in fanInfo){ sensors.push({type:'fan',label:fan.label, value:_("%drpm").format(fan.rpm)}); } @@ -266,47 +283,44 @@ const FreonMenuButton = new Lang.Class({ let mainSensor = this._settings.get_string('main-sensor'); - let sensorCount = 0; for each (let s in sensors) { - if(s.type != 'separator') { - sensorCount++; - if (mainSensor == s.label) { - this.statusLabel.set_text(s.value); - - let item = this._sensorMenuItems[s.label]; - if(item) { - if(!item.main){ - global.log('[FREON] Change active sensor'); - if(this._lastActiveItem) { - this._lastActiveItem.main = false; - } - this._lastActiveItem = item; - item.main = true; - if(this._icon) - this._icon.gicon = item.gicon; - } + if(s.type != 'separator' && mainSensor == s.label) { + this.statusLabel.set_text(s.value); + + let item = this._sensorMenuItems[s.label]; + if(item && !item.main) { + global.log('[FREON] Change active sensor'); + if(this._lastActiveItem) { + this._lastActiveItem.main = false; } + this._lastActiveItem = item; + item.main = true; + if(this._icon) + this._icon.gicon = item.gicon; } } } - let needAppendMenuItems = false; - if(Object.keys(this._sensorMenuItems).length==sensorCount){ + if(this._lastSensorsCount && this._lastSensorsCount==sensors.length){ for each (let s in sensors) { if(s.type != 'separator') { let item = this._sensorMenuItems[s.label]; if(item) { - item.value = s.value; + if(s.type == 'temperature-group') + item.status.text = s.value; + else + item.value = s.value; } else { - needAppendMenuItems = true; + this._needRerender = true; } } } } else { - needAppendMenuItems = true; + this._needRerender = true; } - if(needAppendMenuItems){ + if(this._needRerender){ + this._needRerender = false; global.log('[FREON] Render all MenuItems'); this.menu.removeAll(); this._appendMenuItems(sensors); @@ -329,11 +343,41 @@ const FreonMenuButton = new Lang.Class({ }, _appendMenuItems : function(sensors){ + this._lastSensorsCount = sensors.length; this._sensorMenuItems = {}; let mainSensor = this._settings.get_string('main-sensor'); + let needGroupTemperature = this._settings.get_boolean('group-temperature'); + let needGroupVoltage = this._settings.get_boolean('group-voltage'); + + if(needGroupTemperature){ + let i = 0; + for each (let s in sensors) + if(s.type == 'temperature') + i++; + if(i <= 3) + needGroupTemperature = false; + } + + if(needGroupVoltage){ + let i = 0; + for each (let s in sensors) + if(s.type == 'voltage') + i++; + if(i <= 3) + needGroupVoltage = false; + } + + let temperatureGroup = null; + let voltageGroup = null; + for each (let s in sensors){ if(s.type == 'separator'){ this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + } else if (s.type == 'temperature-group') { + if(temperatureGroup) { + temperatureGroup.status.text = s.value; + this._sensorMenuItems['temperature-group'] = temperatureGroup; + } } else { let item = new FreonItem.FreonItem(this._sensorIcons[s.type], s.label, s.value); item.connect('activate', Lang.bind(this, function (self) { @@ -346,10 +390,26 @@ const FreonMenuButton = new Lang.Class({ this._icon.gicon = item.gicon; } this._sensorMenuItems[s.label] = item; - this.menu.addMenuItem(item); + + if(needGroupTemperature && s.type == 'temperature') { + if(!temperatureGroup) { + temperatureGroup = new PopupMenu.PopupSubMenuMenuItem(_('Temperature Sensors'), true); + temperatureGroup.icon.gicon = this._sensorIcons['temperature']; + this.menu.addMenuItem(temperatureGroup); + } + temperatureGroup.menu.addMenuItem(item); + } else if(needGroupVoltage && s.type == 'voltage') { + if(!voltageGroup) { + voltageGroup = new PopupMenu.PopupSubMenuMenuItem(_('Voltage'), true); + voltageGroup.icon.gicon = this._sensorIcons['voltage']; + this.menu.addMenuItem(voltageGroup); + } + voltageGroup.menu.addMenuItem(item); + } else { + this.menu.addMenuItem(item); + } } } - // separator this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index cdbe699..1df4332 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -60,6 +60,14 @@ const FreonPrefsWidget = new GObject.Class({ this._addSwitch({key : 'show-voltage', y : i++, x : 2, label : _('Show Power Supply Voltage')}); + this._addSwitch({key : 'group-temperature', y : i, x : 0, + label : _('Group Temperature Items'), + help : _("Works if you have more than three temperature sensors")}); + + this._addSwitch({key : 'group-voltage', y : i++, x : 2, + label : _('Group Voltage Items'), + help : _("Works if you have more than three voltage sensors")}); + this._addComboBox({ items : {none : 'None', hddtemp : 'Hddtemp', udisks2 : 'UDisks2'}, key: 'drive-utility', y : i, x : 0, diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled index 3697b0f40cc298ca01063d5c4b18b3fa9da2f355..2aacb8dba46333fa4423cacf2245874ab0b7b22d 100644 GIT binary patch literal 920 zcmY*Yy=xRf9G&Q$9$q3u5F#Rqh3+AH8!c>XA}D^4I;2T4xt;6|?#?W;vzH4*J3qii zMA1UfO49f@m?j8EZq@z=$DupG34reqd!N7VGRF=xVkqXo=YaU?>IQx4E`0tI^T5l;O46sM zzW}}mO!`x^{~~x37+ilc%RKcdJ5+m-D19aJ%}lPM?~6 zmcc8)&YAa{^r>6$Q!s;jAHQFuPt7?z1M|!hXR9I{+RV#D;rWyZR(n+uORqw&bH(!z zf$k+m6;@tn+HcSi#u~(fvIosGLT$nG;+g??X2$@&-vYY8G{CbiQ@bAOfi)ri3Tad} z{@wb)nlzy+a^$$`KD8gKfzD+X4rNxcDS9^Ly~+#aq^}(8Iv+bdRR7f#RjkVg<+ZwU zzmPtycNZeUg^lV98`T#!`g>uc`oc!&Ti8;2+~H6k_H{Z*@$p~)b-BX c@j7ubZl;w>Y*FHiu&ya^bBOAkd^1Y%2QRp~(*OVf literal 808 zcmYjPy^GaA9Nbgm*E_)zgcFOCLo|mZIR$NOv=A+<4;zcUWG`7vc0+cPdk1Q#7B*sI z=~ZIkA7H74*xG3$SXx+UFPt;`^3?E#nK%2}kKfMT+>o7?#*6V=2H%ZE+SH1GX#E(%43&u2OZKs;O7TX=_}%)hTOG94~ST zKJLTmb41XGfWyEM;3zN|vAgp6DaX0@F)@g5;2*^4y$kfIPr&D*5%A&E%lq`H55PYT zUZMUyeL|ml5&k;(GVt!f!wLJLj^JMdE9$XNYW7)yp8>yKeO~1{)DzV2g5LnoA1O(n zn*Lkxdmz8^c!@qW&-n%X6(}xl?$D=Z{de$B;70#(n?5zq$xDiWtNFQ@KJ^m(WiT@+ zIz6bQ_qx`82jhLA-92{+x9!$kWw(<;<+_n|GRV4DC=l`HT5t6H0p!YfU3Rj-*nG;C zG)dPsEEWr_Ph07$@KQFWLX&e^wx^eXYXQ4!r(&+cHbwGWGq Z{j}C;kGGj%?{SGvmlf^=R}hvHe*k4@qYwZ9 diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml index 3c27418..ef2fead 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml +++ b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml @@ -63,5 +63,17 @@ Position in Panel ('left', 'center', 'right') + + true + Group temperature menu items + Group more than three sensors temperature menu items + + + + true + Group voltage menu items + Group more than three voltage menu items + + From 690278cc9149d3612e4dba930d195183747f5d8a Mon Sep 17 00:00:00 2001 From: Vasilii Date: Mon, 13 Oct 2014 22:22:26 +0400 Subject: [PATCH 053/224] add path to EGO and mkdir in README --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 329670e..cc2c46d 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,10 @@ More info in [wiki](https://github.com/UshakovVasilii/gnome-shell-extension-freo git clone https://github.com/UshakovVasilii/gnome-shell-extension-freon.git cd gnome-shell-extension-freon + mkdir -p ~/.local/share/gnome-shell/extensions cp -r freon@UshakovVasilii_Github.yahoo.com ~/.local/share/gnome-shell/extensions/. restart GNOME Shell (`Alt+F2`, `r`, `Enter`) and enable the extension through gnome-tweak-tool. ### Installation from extensions.gnome.org -// TODO +https://extensions.gnome.org/extension/841/freon/ From 855553e42b93fdcdd20fd6f23120c18670c48557 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 16 Oct 2014 23:48:35 +0400 Subject: [PATCH 054/224] support GNOME 3.14 --- freon@UshakovVasilii_Github.yahoo.com/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index bf59e7b..31d77ea 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": ["3.12"], + "shell-version": ["3.12", "3.14"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", "description": "Shows CPU temperature, HDD/SSD temperature, video card temperature (Nvidia/Catalyst), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", From 8716057b1dfb98f1d9bd3d1d33044e9763de399c Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 19 Feb 2015 21:52:37 +0300 Subject: [PATCH 055/224] fix problem with show icon on panel setting --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index d72a622..034e0a5 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -110,7 +110,7 @@ const FreonMenuButton = new Lang.Class({ if(this._settings.get_boolean('show-icon-on-panel')) { this._icon = new St.Icon({ style_class: 'system-status-icon'}); if(this._lastActiveItem) - this._icon.gicon = this._lastActiveItem.getGIcon(); + this._icon.gicon = this._lastActiveItem.gicon; this._menuLayout.insert_child_at_index(this._icon, 0); } else { this._icon.destroy(); From 4e7dbe2d760b993a97c14f75cad1cf9243992dff Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 20 Feb 2015 01:34:28 +0300 Subject: [PATCH 056/224] implement multiple sensors on top panel functionality, #3 --- .../extension.js | 135 ++++++++++++------ .../schemas/gschemas.compiled | Bin 920 -> 908 bytes ...gnome.shell.extensions.sensors.gschema.xml | 8 +- 3 files changed, 98 insertions(+), 45 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 034e0a5..c3c0ab9 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -51,13 +51,17 @@ const FreonMenuButton = new Lang.Class({ } this._menuLayout = new St.BoxLayout(); - if(this._settings.get_boolean('show-icon-on-panel')){ - this._icon = new St.Icon({ style_class: 'system-status-icon'}); - this._menuLayout.add(this._icon); + this._hotLabels = {}; + this._hotIcons = {}; + let hotSensors = this._settings.get_strv('hot-sensors'); + let showIcon = this._settings.get_boolean('show-icon-on-panel'); + for each (let s in hotSensors){ + this._createHotItem(s, showIcon); } - this.statusLabel = new St.Label({ text: '\u2026', y_expand: true, y_align: Clutter.ActorAlign.CENTER }); - this._menuLayout.add(this.statusLabel); + if(hotSensors.length == 0){ + this._createInitialIcon(); + } this.actor.add_actor(this._menuLayout); @@ -69,7 +73,7 @@ const FreonMenuButton = new Lang.Class({ this._addSettingChangedSignal('update-time', Lang.bind(this, this._updateTimeChanged)); this._addSettingChangedSignal('unit', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-icon-on-panel', Lang.bind(this, this._showIconOnPanelChanged)); - this._addSettingChangedSignal('main-sensor', Lang.bind(this, this._querySensors)); + this._addSettingChangedSignal('hot-sensors', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-decimal-value', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-fan-rpm', Lang.bind(this, this._querySensors)); this._addSettingChangedSignal('show-voltage', Lang.bind(this, this._querySensors)); @@ -87,6 +91,28 @@ const FreonMenuButton = new Lang.Class({ this._addTimer(); }, + _createHotItem: function(s, showIcon, gicon){ + if(showIcon){ + let i = new St.Icon({ style_class: 'system-status-icon'}); + this._hotIcons[s] = i; + if(gicon) + i.gicon = gicon; + this._menuLayout.add(i); + } + let l = new St.Label({ + text: '\u2026', /* ... */ + y_expand: true, + y_align: Clutter.ActorAlign.CENTER}); + this._hotLabels[s] = l; + this._menuLayout.add(l); + }, + + _createInitialIcon: function() { + this._initialIcon = new St.Icon({ style_class: 'system-status-icon'}); + this._initialIcon.gicon = this._sensorIcons['gpu-temperature']; + this._menuLayout.add(this._initialIcon); + }, + _rerender : function(){ this._needRerender = true; this._querySensors(); @@ -108,13 +134,18 @@ const FreonMenuButton = new Lang.Class({ _showIconOnPanelChanged : function(){ if(this._settings.get_boolean('show-icon-on-panel')) { - this._icon = new St.Icon({ style_class: 'system-status-icon'}); - if(this._lastActiveItem) - this._icon.gicon = this._lastActiveItem.gicon; - this._menuLayout.insert_child_at_index(this._icon, 0); + let index = 0; + for(let k in this._hotLabels){ + let i = new St.Icon({ style_class: 'system-status-icon'}); + this._hotIcons[k] = i; + i.gicon = this._sensorMenuItems[k].gicon; + this._menuLayout.insert_child_at_index(i, index); + index += 2; + } } else { - this._icon.destroy(); - this._icon = null; + for(let k in this._hotIcons) + this._hotIcons[k].destroy(); + this._hotIcons = {}; } }, @@ -268,38 +299,35 @@ const FreonMenuButton = new Lang.Class({ for each (let i in sensorsTempInfo){ sum += i.temp; } - sensors.push({type:'temperature-group', label:'temperature-group', value: this._formatTemp(sum/sensorsTempInfo.length)}); + sensors.push({ + type:'temperature-group', + label:'temperature-group', + value: this._formatTemp(sum/sensorsTempInfo.length)}); } for each (let fan in fanInfo){ - sensors.push({type:'fan',label:fan.label, value:_("%drpm").format(fan.rpm)}); + sensors.push({ + type:'fan', + label:fan.label, + value:_("%drpm").format(fan.rpm)}); } if (fanInfo.length > 0 && voltageInfo.length > 0){ sensors.push({type : 'separator'}); } for each (let voltage in voltageInfo){ - sensors.push({type : 'voltage', label:voltage.label, value:_("%s%.2fV").format(((voltage.volt >= 0) ? '+' : '-'), voltage.volt)}); + sensors.push({ + type : 'voltage', + label:voltage.label, + value:_("%s%.2fV").format(((voltage.volt >= 0) ? '+' : '-'), + voltage.volt)}); } - - let mainSensor = this._settings.get_string('main-sensor'); - for each (let s in sensors) { - if(s.type != 'separator' && mainSensor == s.label) { - this.statusLabel.set_text(s.value); - - let item = this._sensorMenuItems[s.label]; - if(item && !item.main) { - global.log('[FREON] Change active sensor'); - if(this._lastActiveItem) { - this._lastActiveItem.main = false; - } - this._lastActiveItem = item; - item.main = true; - if(this._icon) - this._icon.gicon = item.gicon; - } + for each (let s in sensors) + if(s.type != 'separator') { + let l = this._hotLabels[s.label]; + if(l) + l.set_text(s.value); } - } if(this._lastSensorsCount && this._lastSensorsCount==sensors.length){ for each (let s in sensors) { @@ -328,7 +356,6 @@ const FreonMenuButton = new Lang.Class({ } else { this._sensorMenuItems = {}; this.menu.removeAll(); - this.statusLabel.set_text(_("Error")); let item = new PopupMenu.PopupMenuItem( this._utils.sensors.available @@ -336,7 +363,7 @@ const FreonMenuButton = new Lang.Class({ : _("Please install lm_sensors.\nIf this doesn\'t help, click here to report with your sensors output!") ); item.connect('activate',function() { - Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/issues"]); + Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki/Dependency"]); }); this.menu.addMenuItem(item); } @@ -345,7 +372,6 @@ const FreonMenuButton = new Lang.Class({ _appendMenuItems : function(sensors){ this._lastSensorsCount = sensors.length; this._sensorMenuItems = {}; - let mainSensor = this._settings.get_string('main-sensor'); let needGroupTemperature = this._settings.get_boolean('group-temperature'); let needGroupVoltage = this._settings.get_boolean('group-voltage'); @@ -381,13 +407,40 @@ const FreonMenuButton = new Lang.Class({ } else { let item = new FreonItem.FreonItem(this._sensorIcons[s.type], s.label, s.value); item.connect('activate', Lang.bind(this, function (self) { - this._settings.set_string('main-sensor', self.label); + let l = this._hotLabels[self.label]; + let hotSensors = this._settings.get_strv('hot-sensors'); + if(l){ + hotSensors.splice(hotSensors.indexOf(self.label), 1); + l.destroy(); + delete this._hotLabels[self.label]; + let i = this._hotIcons[self.label]; + if(i){ + i.destroy(); + delete this._hotIcons[self.label]; + } + if(Object.keys(this._hotLabels).length == 0) + this._createInitialIcon(); + self.main = false; + } else { + hotSensors.push(self.label); + if(Object.keys(this._hotLabels).length == 0){ + this._initialIcon.destroy(); + this._initialIcon = null; + } + let showIcon = this._settings.get_boolean('show-icon-on-panel'); + this._createHotItem(self.label, showIcon, self.gicon); + self.main = true; + } + + this._settings.set_strv('hot-sensors', hotSensors.filter( + function(item, pos) { + return hotSensors.indexOf(item) == pos; + })); })); - if (mainSensor == s.label) { - this._lastActiveItem = item; + if (this._hotLabels[s.label]) { item.main = true; - if(this._icon) - this._icon.gicon = item.gicon; + if(this._hotIcons[s.label]) + this._hotIcons[s.label].gicon = item.gicon; } this._sensorMenuItems[s.label] = item; diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled index 2aacb8dba46333fa4423cacf2245874ab0b7b22d..391211bc97d1357e27467062a154f4645c4ee2e6 100644 GIT binary patch delta 503 zcmYk3!7Bt|7{=cnGiEh2YL!|c2cDzse^hn>Iv8qjiH7mQw=wNO%RPabt z(EN`$dJ8Z>>mMK24=>yo#{o-9l0$)z`rV?$U7eDJ?DFT!OmYM_8FDxa a91zZhD+V|l9dK?MFo6Y>T1EM$5cvTom{4T^ delta 515 zcmYk3ze~eF9K|m&F~KxK6+saZ9VDWGy6E6iK|v*};NpJoxb5z5Cwfa^DNBqLmiS>kfh82x{eWWu_=$N|>wv z(BO5@1-k!eKD{(pr^`Z^A`<=3A+SD`+GkF0Ah)0iaCPLl%;}jYp-VvR6QYd)U&OK_ z9E1gso<5Fq1APxRl%O|2Y3-dbr;j18LLb4$V0(f&J?m@GI(VJ`x@AruN8W(GgZts? zIdgjcz^9Dww=k(492&e4y@~}LRW_JSk6GM6&x4ZCWw4NY&NHXyg;t?!pgwR{U{0?f z-+;2P`S3Q%oSrXn3S|p2y@8+Gu_J$L*Ufk+kc5>gPs$0KZ;#6e_JP9$>_sPFpA=w# g7?8?m^7qKLyP35^FB|#+GK{&%3w}?v!g0=j06YX$3jhEB diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml index ef2fead..129d221 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml +++ b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml @@ -21,10 +21,10 @@ Show sensor icon on top panel - - "Average" - Sensor value to show in panel - Select the sensor whose value has to be shown in the panel + + [] + Sensors to show in panel + Select the sensord whose values has to be shown in the panel From 4074154770997da35394317cde6c4c4b06b3e738 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 20 Feb 2015 10:56:34 +0300 Subject: [PATCH 057/224] fix for not exitst sensors, resolve #3 --- .../extension.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index c3c0ab9..d612b28 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -431,7 +431,20 @@ const FreonMenuButton = new Lang.Class({ this._createHotItem(self.label, showIcon, self.gicon); self.main = true; } - + + for(let i = hotSensors.length -1; i >= 0 ; i--){ + let k = hotSensors[i]; + if(!this._sensorMenuItems[k]){ + hotSensors.splice(i, 1); + this._hotLabels[k].destroy(); + delete this._hotLabels[k]; + if(this._hotIcons[k]){ + this._hotIcons[k].destroy(); + delete this._hotIcons[k]; + } + } + } + this._settings.set_strv('hot-sensors', hotSensors.filter( function(item, pos) { return hotSensors.indexOf(item) == pos; From a7ca5597f728a219216d27b9da8cef1488e9fe68 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 20 Feb 2015 12:08:58 +0300 Subject: [PATCH 058/224] update image --- img/panel_menu.jpg | Bin 51975 -> 38026 bytes img/prefs-1.jpg | Bin 36841 -> 0 bytes img/prefs-1.png | Bin 0 -> 32802 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 img/prefs-1.jpg create mode 100644 img/prefs-1.png diff --git a/img/panel_menu.jpg b/img/panel_menu.jpg index 411d1882bb464dd25d1edf8399a5da647152d3c6..eb67ad8581fb6332e7275ded54592ef8f103522a 100644 GIT binary patch literal 38026 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 to show in panel Select the sensord whose values has to be shown in the panel From c7a0aa9ec7c575d78865e0f25e25ba57195a2309 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 7 Dec 2017 09:43:50 +0300 Subject: [PATCH 112/224] fix settings menu item --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 98e8521..c132eb0 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -407,7 +407,11 @@ const FreonMenuButton = new Lang.Class({ Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki/Dependency"]); }); this.menu.addMenuItem(item); + this._appendSettingsMenuItem(); } + }, + + _appendSettingsMenuItem : function(){ // separator this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); @@ -529,6 +533,7 @@ const FreonMenuButton = new Lang.Class({ } } } + this._appendSettingsMenuItem(); }, From a426de761d3816408fa57a2e8b0ac23dc5dbc93a Mon Sep 17 00:00:00 2001 From: Alex Volga Date: Mon, 15 Jan 2018 09:38:49 +0200 Subject: [PATCH 113/224] fix in uk_UA translation --- .../locale/uk_UA/LC_MESSAGES/freon.mo | Bin 3176 -> 3176 bytes .../po/uk_UA.mo | Bin 0 -> 3176 bytes .../po/uk_UA.po | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.mo diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/uk_UA/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/uk_UA/LC_MESSAGES/freon.mo index 35e0e18917747cebc41a9ea3f89a9f31e19ac980..4af773fd4a697311a0a8936a2547949abd13fc26 100644 GIT binary patch delta 35 rcmaDM@j_z5ELL6%T?0d1LsJCMGBwz|ob?GK)5U3%{kUy5pJboU0s!^)4AB4p diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.mo b/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.mo new file mode 100644 index 0000000000000000000000000000000000000000..4af773fd4a697311a0a8936a2547949abd13fc26 GIT binary patch literal 3176 zcmb`HTWl0n7{`x@7b*&(pm;r~MH-kgyQNSU76QG%Mv5ESuDsP@_q01QJF}TNTWI8g zwsJ9PtfDp=1wwo@(YDe{TDs_y8WVHo!51Hhi4P_w#z*4|`u}ET=^_P9bkpf?=FItS z|L;3F;gf#cvk;B>?*;3_Ot(0NxG$1U>@( z0zL#Txs$QS!8PDgFbLcU zffN)+M#6|H?W>5#fR^!5W zFr>~9HqZkIexx;88)zS{U?wX!#M+!&EU;Rywm#mIVY~Z;YxD}Xr&Ks>iNiwhjr>3+ z)souHnhj}K{hnma!j{5idtIkgvr@}s8A^M0q~^2nMyC0Q)Vbrt_^$*#Q8azcu%+I3!qfY3Y}5{lK9jsH>}%5Wm=qi{XK)mrVWlf#T8c++81)*RCI3Y$(6<&kzo4(*NC z>-7yaX{+QKme%ID1uwzvV({oC8@BWCHo3vBjp@l`jIUqM=~iEtjK%mau5)b1^Uh?v z@@hwN3*815`i_{+j~@?But%?hO$;{iy6rXiE~v5^-|U}M6VcZ}on`8xn)FYoNp(rh z`y;pgN~p8kKZTw1{-A%tA7$ztU`SoTHKE4*K{dnib`IC&a2FP^N{?59AlTy%A=u2n zGF9_x49+RU=VbCRMNo78C^*KE@0>rv5qU;U(^mg91*IZx5tK)tET%s6M`2ec*Zygy zK0=&Xe*lgy<8IC$CU=$ZmO6)kBWe~a>TRTQ$sgvZaSZ#hwh0ON1C$VK%D6{z*iijp zQ=h^48>$>=$FXgaaxX)YGUAohl$wMWDgfod>wM%R&}wiKCtEengZ=Oy*j~oYKyJtb z&lDGl4WOLCz#bVP3pk@@4Fr{<;&r#EU^>uwi0X)9BgiCNO(OF_vcAa`CrP3&sydI{ zkWbYZR7a+%m<{SgWqd>MYPOE43s{>A>qqs}HWGpABrP#VG+`G|-&l38&f$^NKU0Yp z*;YrS?uP!+AvIlD-hp^r##Fe~7CoOz1>#z5=}#&lG;>BoEQJ&G@g=j6+k( zIy^7b*=hyKI9!;ZKm}Ac6nqdWQ*)aGd>&zDP{@pbs&WizDk&VaSoF;Q=K~zhIh+St zAr{1EibkUHnSlPm$RMdV{daMAFs9+*g9`MK8sKUi4Z3oA}Q>;M1& literal 0 HcmV?d00001 diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po b/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po index c654673..c51e190 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po +++ b/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-10-06 17:05-0300\n" -"PO-Revision-Date: 2017-11-12 00:09+0200\n" +"PO-Revision-Date: 2018-01-15 09:36+0200\n" "Last-Translator: \n" "Language-Team: \n" "Language: uk_UA\n" @@ -110,7 +110,7 @@ msgstr "Працює, якщо у вас більше трьох сенсорі #: prefs.js:74 msgid "HDD/SSD Temperature Utility" -msgstr "Утіліта для визначення температури HDD/SSD" +msgstr "Утиліта для визначення температури HDD/SSD" #: prefs.js:79 msgid "None" From bf029d7eedeb6be4e3a37d0fdc02e0b826b57b7e Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sat, 20 Jan 2018 08:26:50 +0300 Subject: [PATCH 114/224] update UI every 250ms if necessary, resolve #74 --- .../commandLineUtil.js | 10 +++++++++ .../extension.js | 22 ++++++++++++++++++- .../udisks2.js | 13 ++++++++++- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js index 4ff8db1..b77dc0c 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js @@ -7,6 +7,7 @@ const CommandLineUtil = new Lang.Class({ _init: function(){ this._argv = null; + this._updated = false; }, execute: function(callback) { @@ -35,6 +36,7 @@ const CommandLineUtil = new Lang.Class({ stdout.close(null); GLib.source_remove(childWatch); this._output = output; + this._updated = true; callback(); })); } catch(e){ @@ -46,6 +48,14 @@ const CommandLineUtil = new Lang.Class({ return this._argv != null; }, + get updated (){ + return this._updated; + }, + + set updated (updated){ + this._updated = updated; + }, + destroy: function(){ this._argv = null; } diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index c132eb0..f05abd8 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -84,6 +84,11 @@ const FreonMenuButton = new Lang.Class({ this._querySensors(); this._addTimer(); + this._updateUITimeoutId = Mainloop.timeout_add(250, Lang.bind(this, function (){ + this._updateUI(); + // readd to update queue + return true; + })); }, _createHotItem: function(s, showIcon, gicon){ @@ -218,6 +223,7 @@ const FreonMenuButton = new Lang.Class({ this._destroyDriveUtility(); this._destroyGpuUtility(); Mainloop.source_remove(this._timeoutId); + Mainloop.source_remove(this._updateUITimeoutId); for each (let signal in this._settingChangedSignals){ this._settings.disconnect(signal); @@ -232,7 +238,21 @@ const FreonMenuButton = new Lang.Class({ })); } } - this._updateDisplay(); // #74 + }, + + _updateUI: function(){ + let needUpdate = false; + for each (let sensor in this._utils) { + if (sensor.available && sensor.updated) { + // global.log(sensor + ' updated'); + sensor.updated = false; + needUpdate = true; + } + } + if(needUpdate) { + this._updateDisplay(); // #74 + // global.log('update display'); + } }, _fixNames: function(sensors){ diff --git a/freon@UshakovVasilii_Github.yahoo.com/udisks2.js b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js index c6227ed..5a60c1d 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/udisks2.js +++ b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js @@ -41,12 +41,21 @@ const UDisks2 = new Lang.Class({ this._udisksProxies = proxies; callback(); })); + this._updated = true; }, get available(){ return this._udisksProxies.length > 0; }, + get updated (){ + return this._updated; + }, + + set updated (updated){ + this._updated = updated; + }, + // creates a list of sensor objects from the list of proxies given get temp() { return this._udisksProxies.filter(function(proxy) { @@ -112,6 +121,8 @@ const UDisks2 = new Lang.Class({ this._udisksProxies = []; }, - execute: function(callback) {}, + execute: function(callback) { + this._updated = true; + }, }); From ea1f7c25534f9c59445ce7f74e768a4003760805 Mon Sep 17 00:00:00 2001 From: Alonso Lara Date: Sun, 15 Apr 2018 15:05:54 +0200 Subject: [PATCH 115/224] Added + Translated (Left, Center, Right) Copied and translated from the original POT file. --- freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po b/freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po index 02f02ec..d8fc691 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po +++ b/freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po @@ -126,3 +126,15 @@ msgstr "Catalyst" #: prefs.js:84 msgid "Video Card Temperature Utility" msgstr "Utilidad de temperatura de la placa de video" + +#: prefs.js:49 +msgid "Left" +msgstr "Izquierda" + +#: prefs.js:49 +msgid "Center" +msgstr "Centro" + +#: prefs.js:49 +msgid "Right" +msgstr "Derecha" From 334934d5b54ff9494c293185acda9bb9a9528ac1 Mon Sep 17 00:00:00 2001 From: Pavel Date: Sat, 12 May 2018 00:14:37 +0300 Subject: [PATCH 116/224] Fix problem when card does not recognize if it is already in use --- .../bumblebeeNvidiaUtil.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js index 8902770..c97ae20 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js @@ -37,6 +37,13 @@ const BumblebeeNvidiaUtil = new Lang.Class({ this._lockMonitor.id = this._lockMonitor.connect( 'changed', Lang.bind(this, this._statusChanged) ); + + // Check if the lock file already exists + // (needed when NVIDIA card is already in use at that point) + if(GLib.file_test(lockFilePath, GLib.FileTest.EXISTS)){ + this._detectLabel(); + this._active = true; + } }, _detectLabel: function() { From da3af4da27169cdde1bf3eb0dbd5c1d1b77f351f Mon Sep 17 00:00:00 2001 From: Pavel Date: Sat, 12 May 2018 00:16:17 +0300 Subject: [PATCH 117/224] Added stderr to output for parsing since on Fedora 28 nvidia-smi output goes to stderr --- .../commandLineUtil.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js index b77dc0c..10b9e73 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js @@ -22,18 +22,27 @@ const CommandLineUtil = new Lang.Class({ let stdout = new Gio.UnixInputStream({fd: stdoutFd, close_fd: true}); let outReader = new Gio.DataInputStream({base_stream: stdout}); + let stderr = new Gio.UnixInputStream({fd: stderrFd, close_fd: true}); + let errReader = new Gio.DataInputStream({base_stream: stderr}); + GLib.close(stdinFd); - GLib.close(stderrFd); let childWatch = GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, Lang.bind(this, function(pid, status, requestObj) { let output = []; let [line, size] = [null, 0]; + while (([line, size] = outReader.read_line(null)) != null && line != null) { if(line) output.push(line.toString()); } - stdout.close(null); + + while (([line, size] = errReader.read_line(null)) != null && line != null) { + if(line) + output.push(line.toString()); + } + stderr.close(null); + GLib.source_remove(childWatch); this._output = output; this._updated = true; From 2d8e16989981e3479629c753f182d33101468b20 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sat, 12 May 2018 08:21:40 +0300 Subject: [PATCH 118/224] add 3.28 gnome-shell version --- freon@UshakovVasilii_Github.yahoo.com/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index 3e94e01..762dbd2 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": ["3.12", "3.14", "3.16", "3.18", "3.20", "3.22", "3.24", "3.26"], + "shell-version": ["3.12", "3.14", "3.16", "3.18", "3.20", "3.22", "3.24", "3.26", "3.28"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", "description": "Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", From 2fdfb58de0c7e0a55f5eea5860cf90b4ed9cb0a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dennis=20M=2E=20P=C3=B6pperl?= Date: Tue, 7 Aug 2018 11:29:21 +0200 Subject: [PATCH 119/224] Fix German translation "U/min" or "UpM" are no valid translations for "rpm". The standardised unit is "1/min". See https://de.wikipedia.org/wiki/Rpm_(Einheit) --- freon@UshakovVasilii_Github.yahoo.com/po/de.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/de.po b/freon@UshakovVasilii_Github.yahoo.com/po/de.po index bd567b3..bea26fb 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/de.po +++ b/freon@UshakovVasilii_Github.yahoo.com/po/de.po @@ -3,14 +3,14 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-10-06 17:05-0300\n" -"PO-Revision-Date: 2017-06-09 17:39+0200\n" +"PO-Revision-Date: 2018-08-07 11:27+0200\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Last-Translator: Jonatan Hatakeyama Zeidler \n" +"Last-Translator: Dennis M. Pöpperl \n" "Language-Team: \n" -"X-Generator: Poedit 2.0.1\n" +"X-Generator: Poedit 2.0.9\n" #: bumblebeeNvidiaUtil.js:75 prefs.js:82 msgid "Bumblebee + NVIDIA" @@ -27,7 +27,7 @@ msgstr "Maximum" #: extension.js:341 #, javascript-format msgid "%drpm" -msgstr "%dupm" +msgstr "%d1/min" #: extension.js:350 #, javascript-format From 5f2569c18685f8097893d1aead7fe5918709fb88 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Tue, 18 Sep 2018 13:19:09 +0300 Subject: [PATCH 120/224] fix gjs errors #98 --- .../aticonfigUtil.js | 4 +-- .../bumblebeeNvidiaUtil.js | 6 ++-- .../commandLineUtil.js | 2 +- .../extension.js | 34 +++++++++---------- .../freonItem.js | 2 +- .../hddtempUtil.js | 4 +-- .../metadata.json | 2 +- .../nvidiaUtil.js | 4 +-- .../prefs.js | 2 +- .../sensorsUtil.js | 2 +- .../udisks2.js | 4 +-- 11 files changed, 33 insertions(+), 33 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js b/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js index c85ab5f..cd0ecda 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js @@ -4,7 +4,7 @@ const GLib = imports.gi.GLib; const Me = imports.misc.extensionUtils.getCurrentExtension(); const CommandLineUtil = Me.imports.commandLineUtil; -const AticonfigUtil = new Lang.Class({ +var AticonfigUtil = new Lang.Class({ Name: 'AticonfigUtil', Extends: CommandLineUtil.CommandLineUtil, @@ -23,7 +23,7 @@ const AticonfigUtil = new Lang.Class({ return []; let label = null; let temp = null; - for each(let line in this._output) { + for (let line of this._output) { if(!line) continue; let r; diff --git a/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js index c97ae20..8d14418 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js @@ -5,7 +5,7 @@ const Gio = imports.gi.Gio; const Me = imports.misc.extensionUtils.getCurrentExtension(); const CommandLineUtil = Me.imports.commandLineUtil; -const BumblebeeNvidiaUtil = new Lang.Class({ +var BumblebeeNvidiaUtil = new Lang.Class({ Name: 'BumblebeeNvidiaUtil', Extends: CommandLineUtil.CommandLineUtil, @@ -49,7 +49,7 @@ const BumblebeeNvidiaUtil = new Lang.Class({ _detectLabel: function() { // optirun nvidia-smi -L // GPU 0: GeForce GT 525M (UUID: GPU-...) - for each(let line in GLib.spawn_command_line_sync(this._path + " nvidia-smi -L")){ + for (let line of GLib.spawn_command_line_sync(this._path + " nvidia-smi -L")){ let match = /.*GPU [\d]:([\w\d\ ]+).*/.exec(line); if(match){ this._label = match[1]; @@ -82,7 +82,7 @@ const BumblebeeNvidiaUtil = new Lang.Class({ let label = this._label ? this._label : _('Bumblebee + NVIDIA'); if(this._active && this._output){ // GPU Current Temp : 37 C - for each(let line in this._output) { + for (let line of this._output) { if(!line) continue; let r; diff --git a/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js index 10b9e73..8635de0 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js @@ -2,7 +2,7 @@ const Lang = imports.lang; const GLib = imports.gi.GLib; const Gio = imports.gi.Gio; -const CommandLineUtil = new Lang.Class({ +var CommandLineUtil = new Lang.Class({ Name: 'CommandLineUtil', _init: function(){ diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index f05abd8..e9ae25f 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -21,7 +21,7 @@ const FreonItem = Me.imports.freonItem; const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); const _ = Gettext.gettext; -const FreonMenuButton = new Lang.Class({ +var FreonMenuButton = new Lang.Class({ Name: 'FreonMenuButton', Extends: PanelMenu.Button, @@ -54,7 +54,7 @@ const FreonMenuButton = new Lang.Class({ this._hotIcons = {}; let hotSensors = this._settings.get_strv('hot-sensors'); let showIcon = this._settings.get_boolean('show-icon-on-panel'); - for each (let s in hotSensors){ + for (let s of hotSensors){ this._createHotItem(s, showIcon); } @@ -225,13 +225,13 @@ const FreonMenuButton = new Lang.Class({ Mainloop.source_remove(this._timeoutId); Mainloop.source_remove(this._updateUITimeoutId); - for each (let signal in this._settingChangedSignals){ + for (let signal of this._settingChangedSignals){ this._settings.disconnect(signal); }; }, _querySensors: function(){ - for each (let sensor in this._utils) { + for (let sensor of Object.values(this._utils)) { if (sensor.available) { sensor.execute(Lang.bind(this,function(){ // we cannot change actor in background thread #74 @@ -242,7 +242,7 @@ const FreonMenuButton = new Lang.Class({ _updateUI: function(){ let needUpdate = false; - for each (let sensor in this._utils) { + for (let sensor of Object.values(this._utils)) { if (sensor.available && sensor.updated) { // global.log(sensor + ' updated'); sensor.updated = false; @@ -257,7 +257,7 @@ const FreonMenuButton = new Lang.Class({ _fixNames: function(sensors){ let names = []; - for each (let s in sensors){ + for (let s of sensors){ if(s.type == 'separator' || s.type == 'temperature-group' || s.type == 'temperature-average' || @@ -308,7 +308,7 @@ const FreonMenuButton = new Lang.Class({ let total = 0; let sum = 0; let max = 0; - for each (let i in tempInfo){ + for (let i of tempInfo){ if(i.temp !== null){ total++; sum += i.temp; @@ -319,17 +319,17 @@ const FreonMenuButton = new Lang.Class({ let sensors = []; - for each (let i in gpuTempInfo){ + for (let i of gpuTempInfo){ sensors.push({ type: 'gpu-temperature', label: i.label, value: this._formatTemp(i.temp), displayName: i.displayName}); } - for each (let i in sensorsTempInfo){ + for (let i of sensorsTempInfo){ sensors.push({type:'temperature', label: i.label, value:this._formatTemp(i.temp)}); } - for each (let i in driveTempInfo){ + for (let i of driveTempInfo){ sensors.push({type:'drive-temperature', label: i.label, value:this._formatTemp(i.temp)}); } @@ -352,7 +352,7 @@ const FreonMenuButton = new Lang.Class({ if(sensorsTempInfo.length > 0 && this._settings.get_boolean('group-temperature')){ sum = 0; - for each (let i in sensorsTempInfo){ + for (let i of sensorsTempInfo){ sum += i.temp; } sensors.push({ @@ -361,7 +361,7 @@ const FreonMenuButton = new Lang.Class({ value: this._formatTemp(sum / sensorsTempInfo.length)}); } - for each (let fan in fanInfo){ + for (let fan of fanInfo){ sensors.push({ type:'fan', label:fan.label, @@ -370,7 +370,7 @@ const FreonMenuButton = new Lang.Class({ if (fanInfo.length > 0 && voltageInfo.length > 0){ sensors.push({type : 'separator'}); } - for each (let voltage in voltageInfo){ + for (let voltage of voltageInfo){ sensors.push({ type : 'voltage', label:voltage.label, @@ -380,7 +380,7 @@ const FreonMenuButton = new Lang.Class({ this._fixNames(sensors); - for each (let s in sensors) + for (let s of sensors) if(s.type != 'separator') { let l = this._hotLabels[s.key || s.label]; if(l) @@ -388,7 +388,7 @@ const FreonMenuButton = new Lang.Class({ } if(this._lastSensorsCount && this._lastSensorsCount==sensors.length){ - for each (let s in sensors) { + for (let s of sensors) { if(s.type != 'separator') { let item = this._sensorMenuItems[s.key || s.label]; if(item) { @@ -453,7 +453,7 @@ const FreonMenuButton = new Lang.Class({ if(needGroupVoltage){ let i = 0; - for each (let s in sensors) + for (let s of sensors) if(s.type == 'voltage') i++; if(i < 2) @@ -463,7 +463,7 @@ const FreonMenuButton = new Lang.Class({ let temperatureGroup = null; let voltageGroup = null; - for each (let s in sensors){ + for (let s of sensors){ if(s.type == 'separator'){ this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); } else if (s.type == 'temperature-group') { diff --git a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js index 5dc520d..3c6aac5 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js +++ b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js @@ -2,7 +2,7 @@ const Lang = imports.lang; const St = imports.gi.St; const PopupMenu = imports.ui.popupMenu; -const FreonItem = new Lang.Class({ +var FreonItem = new Lang.Class({ Name: 'FreonItem', Extends: PopupMenu.PopupBaseMenuItem, diff --git a/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js b/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js index ef320aa..d19ed99 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js @@ -4,7 +4,7 @@ const GLib = imports.gi.GLib; const Me = imports.misc.extensionUtils.getCurrentExtension(); const CommandLineUtil = Me.imports.commandLineUtil; -const HddtempUtil = new Lang.Class({ +var HddtempUtil = new Lang.Class({ Name: 'HddtempUtil', Extends: CommandLineUtil.CommandLineUtil, @@ -67,7 +67,7 @@ const HddtempUtil = new Lang.Class({ } let sensors = []; - for each(let line in hddtempOutput) { + for (let line of hddtempOutput) { let fields = line.split(sep).filter(function(e){ return e; }); let sensor = { label: fields[1], temp: parseFloat(fields[2])}; //push only if the temp is a Number diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index 762dbd2..5608649 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": ["3.12", "3.14", "3.16", "3.18", "3.20", "3.22", "3.24", "3.26", "3.28"], + "shell-version": ["3.30"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", "description": "Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js index d1227a2..985d1ee 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js @@ -5,7 +5,7 @@ const Gio = imports.gi.Gio; const Me = imports.misc.extensionUtils.getCurrentExtension(); const CommandLineUtil = Me.imports.commandLineUtil; -const NvidiaUtil = new Lang.Class({ +var NvidiaUtil = new Lang.Class({ Name: 'NvidiaUtil', Extends: CommandLineUtil.CommandLineUtil, @@ -49,7 +49,7 @@ const NvidiaUtil = new Lang.Class({ if(!this._output) return []; let temps = []; - for each(let line in this._output) { + for (let line of this._output) { if(!line) continue; temps.push(parseFloat(line)); diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index f2df8fb..b11f817 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -17,7 +17,7 @@ function init() { Convenience.initTranslations(); } -const FreonPrefsWidget = new GObject.Class({ +var FreonPrefsWidget = new GObject.Class({ Name: 'Freon.Prefs.Widget', GTypeName: 'FreonPrefsWidget', Extends: Gtk.Grid, diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js index c5382ff..58bee24 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -4,7 +4,7 @@ const GLib = imports.gi.GLib; const Me = imports.misc.extensionUtils.getCurrentExtension(); const CommandLineUtil = Me.imports.commandLineUtil; -const SensorsUtil = new Lang.Class({ +var SensorsUtil = new Lang.Class({ Name: 'SensorsUtil', Extends: CommandLineUtil.CommandLineUtil, diff --git a/freon@UshakovVasilii_Github.yahoo.com/udisks2.js b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js index 5a60c1d..1375cae 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/udisks2.js +++ b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js @@ -31,7 +31,7 @@ const Async = { } // routines for handling of udisks2 -const UDisks2 = new Lang.Class({ +var UDisks2 = new Lang.Class({ Name: 'UDisks2', _init: function(callback) { @@ -110,7 +110,7 @@ const UDisks2 = new Lang.Class({ }, destroy: function(callback) { - for each (let proxy in this._udisksProxies){ + for (let proxy of this._udisksProxies){ if(proxy.drive){ proxy.drive.run_dispose(); } From b3affd57dce5a736b58ece0127efdeb9b4a4c80a Mon Sep 17 00:00:00 2001 From: Thomas Ingvarsson Date: Tue, 18 Sep 2018 21:52:08 +0200 Subject: [PATCH 121/224] Correct usage of toString on Uint8Array According to warning given today with gnome 3.30: "Some code called array.toString() on a Uint8Array instance. Previously this would have interpreted the bytes of the array as a string, but that is nonstandard. In the future this will return the bytes as comma-separated digits. For the time being, the old behavior has been preserved, but please fix your code anyway to explicitly call ByteArray.toString(array)." --- freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js | 5 +++-- freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js index 8635de0..db401c8 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js @@ -1,3 +1,4 @@ +const ByteArray = imports.byteArray; const Lang = imports.lang; const GLib = imports.gi.GLib; const Gio = imports.gi.Gio; @@ -33,13 +34,13 @@ var CommandLineUtil = new Lang.Class({ while (([line, size] = outReader.read_line(null)) != null && line != null) { if(line) - output.push(line.toString()); + output.push(ByteArray.toString(line)); } stdout.close(null); while (([line, size] = errReader.read_line(null)) != null && line != null) { if(line) - output.push(line.toString()); + output.push(ByteArray.toString(line)); } stderr.close(null); diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js index 985d1ee..c9520dd 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js @@ -1,3 +1,4 @@ +const ByteArray = imports.byteArray; const Lang = imports.lang; const GLib = imports.gi.GLib; const Gio = imports.gi.Gio; @@ -33,7 +34,7 @@ var NvidiaUtil = new Lang.Class({ let [line, size] = [null, 0]; while (([line, size] = outReader.read_line(null)) != null && line != null) { - let match = /.*\[gpu:[\d]\].*\(([\w\d\ ]+)\).*/.exec(line.toString()); + let match = /.*\[gpu:[\d]\].*\(([\w\d\ ]+)\).*/.exec(ByteArray.toString(line)); if(match){ this._labels.push(match[1]); } From 4391db1c96c008887297b92be85b509b2706ec9a Mon Sep 17 00:00:00 2001 From: Thomas Ingvarsson Date: Thu, 20 Sep 2018 23:05:32 +0200 Subject: [PATCH 122/224] Utilize JSON parser for sensorUtil --- .../sensorsUtil.js | 143 +++++------------- 1 file changed, 40 insertions(+), 103 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js index 58bee24..895c68a 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -11,136 +11,73 @@ var SensorsUtil = new Lang.Class({ _init: function() { this.parent(); let path = GLib.find_program_in_path('sensors'); - this._argv = path ? [path] : null; + // -A: Do not show adapter -j: JSON output + this._argv = path ? [path, '-A', 'j'] : null; }, get temp() { - return this._parseGenericSensorsOutput(this._parseSensorsTemperatureLine); - // wrong lm_sensors not problem of this application #16 - // return s.filter(function(e){ - // return e.temp > 0 && e.temp < 115; - // }); + return this._parseGenericSensorsOutput(/^temp\d_input/); }, get gpu() { - return this._parseGpuSensorsOutput(this._parseSensorsTemperatureLine); + return this._parseGpuSensorsOutput(/^temp\d_input/); }, get rpm() { - // 0 is normal value for turned off fan - return this._parseGenericSensorsOutput(this._parseFanRPMLine); + return this._parseGenericSensorsOutput(/^fan\d_input/); }, get volt() { - return this._parseGenericSensorsOutput(this._parseVoltageLine); + return this._parseGenericSensorsOutput(/^in\d_input/); }, - _parseGenericSensorsOutput: function(parser) { - return this._parseSensorsOutput(parser, false); + _parseGenericSensorsOutput: function(filter) { + return this._parseSensorsOutput(filter, false); }, - _parseGpuSensorsOutput: function(parser) { - return this._parseSensorsOutput(parser, true); + _parseGpuSensorsOutput: function(filter) { + return this._parseSensorsOutput(filter, true); }, - _parseSensorsOutput: function(parser, gpuFlag) { + _parseSensorsOutput: function(filter, gpuFlag) { if(!this._output) return []; - let feature_label = undefined; - let feature_value = undefined; - let sensors = []; - //iterate through each lines - for(let i = 0; i < this._output.length; i++){ + // Prep output as one big string for JSON parser + let output = this._output.join(''); - let isGpuDriver = this._output[i].indexOf("radeon") != -1 - || this._output[i].indexOf("amdgpu") != -1 - || this._output[i].indexOf("nouveau") != -1; + let data = [] + try { + data = JSON.parse(output); + } catch (e) { + global.log(e.toString()); + return []; + } - if (gpuFlag != isGpuDriver) { - // skip driver if gpu requested and driver is not a gpu or the opposite + let sensors = []; + for (var chipset in data) { + let gpuFilter = /(radeon|amdgpu|nouveau)/; + if (!data.hasOwnProperty(chipset) || gpuFlag != gpuFilter.test(chipset)) continue; - } - // skip chipset driver name and 'Adapter:' lines - i += 2; - - // get every feature of the chip - while(this._output[i]){ - // if it is not a continutation of a feature line - if(this._output[i].indexOf(' ') != 0){ - let feature = parser(feature_label, feature_value); - if (feature){ - sensors.push(feature); - feature = undefined; - } - [feature_label, feature_value] = this._output[i].split(':'); - } else{ - feature_value += this._output[i]; - } - i++; + let chipsetSensors = data[chipset] + for (var sensor in chipsetSensors) { + if (!chipsetSensors.hasOwnProperty(sensor)) + continue; + + let fields = chipsetSensors[sensor]; + for (key in fields) { + if (fields.hasOwnProperty(key) && filter.test(key)) { + let feature = { + label: sensor, + temp: parseFloat(fields[key]) + }; + sensors.push(feature); + break; + } + } } } - let feature = parser(feature_label, feature_value); - if (feature) { - sensors.push(feature); - feature = undefined; - } return sensors; - }, - - _parseSensorsTemperatureLine: function(label, value) { - if(label == undefined || value == undefined) - return undefined; - let curValue = value.trim().split(' ')[0]; - // does the current value look like a temperature unit (°C)? - if(curValue.indexOf("C", curValue.length - "C".length) !== -1){ - return { - label: label.trim(), - temp: parseFloat(curValue.split(' ')[0]) - }; - // let r; - // sensor['low'] = (r = /low=\+(\d{1,3}.\d)/.exec(value)) ? parseFloat(r[1]) : undefined; - // sensor['high'] = (r = /high=\+(\d{1,3}.\d)/.exec(value)) ? parseFloat(r[1]) : undefined; - // sensor['crit'] = (r = /crit=\+(\d{1,3}.\d)/.exec(value)) ? parseFloat(r[1]) : undefined; - // sensor['hyst'] = (r = /hyst=\+(\d{1,3}.\d)/.exec(value)) ? parseFloat(r[1]) : undefined; - } - return undefined; - }, - - _parseFanRPMLine: function(label, value) { - if(label == undefined || value == undefined) - return undefined; - - let curValue = value.trim().split(' ')[0]; - // does the current value look like a fan rpm line? - if(curValue.indexOf("RPM", curValue.length - "RPM".length) !== -1){ - return { - label: label.trim(), - rpm: parseFloat(curValue.split(' ')[0]) - }; - // let r; - // sensor['min'] = (r = /min=(\d{1,5})/.exec(value)) ? parseFloat(r[1]) : undefined; - } - return undefined; - }, - - _parseVoltageLine: function(label, value) { - if(label == undefined || value == undefined) - return undefined; - - let curValue = value.trim().split(' ')[0]; - // does the current value look like a voltage line? - if(curValue.indexOf("V", curValue.length - "V".length) !== -1){ - return { - label: label.trim(), - volt: parseFloat(curValue.split(' ')[0]) - }; - // let r; - // sensor['min'] = (r = /min=(\d{1,3}.\d)/.exec(value)) ? parseFloat(r[1]) : undefined; - // sensor['max'] = (r = /max=(\d{1,3}.\d)/.exec(value)) ? parseFloat(r[1]) : undefined; - } - return undefined; } - }); From eca2d1ab7e9cca199df80c55c09840992742e3b4 Mon Sep 17 00:00:00 2001 From: Thomas Ingvarsson Date: Fri, 21 Sep 2018 08:04:15 +0200 Subject: [PATCH 123/224] Correct syntax error and add sensorType to the parsing - missing dash when I did a list second split of the arguments - Add sensorType as a dynamic key for a feature --- .../sensorsUtil.js | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js index 895c68a..6963a31 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -12,34 +12,34 @@ var SensorsUtil = new Lang.Class({ this.parent(); let path = GLib.find_program_in_path('sensors'); // -A: Do not show adapter -j: JSON output - this._argv = path ? [path, '-A', 'j'] : null; + this._argv = path ? [path, '-A', '-j'] : null; }, get temp() { - return this._parseGenericSensorsOutput(/^temp\d_input/); + return this._parseGenericSensorsOutput(/^temp\d_input/, 'temp'); }, get gpu() { - return this._parseGpuSensorsOutput(/^temp\d_input/); + return this._parseGpuSensorsOutput(/^temp\d_input/, 'temp'); }, get rpm() { - return this._parseGenericSensorsOutput(/^fan\d_input/); + return this._parseGenericSensorsOutput(/^fan\d_input/, 'rpm'); }, get volt() { - return this._parseGenericSensorsOutput(/^in\d_input/); + return this._parseGenericSensorsOutput(/^in\d_input/, 'volt'); }, - _parseGenericSensorsOutput: function(filter) { - return this._parseSensorsOutput(filter, false); + _parseGenericSensorsOutput: function(sensorFilter, sensorType) { + return this._parseSensorsOutput(sensorFilter, sensorType, false); }, - _parseGpuSensorsOutput: function(filter) { - return this._parseSensorsOutput(filter, true); + _parseGpuSensorsOutput: function(sensorFilter, sensorType) { + return this._parseSensorsOutput(sensorFilter, sensorType, true); }, - _parseSensorsOutput: function(filter, gpuFlag) { + _parseSensorsOutput: function(sensorFilter, sensorType, gpuFlag) { if(!this._output) return []; @@ -67,10 +67,10 @@ var SensorsUtil = new Lang.Class({ let fields = chipsetSensors[sensor]; for (key in fields) { - if (fields.hasOwnProperty(key) && filter.test(key)) { + if (fields.hasOwnProperty(key) && sensorFilter.test(key)) { let feature = { label: sensor, - temp: parseFloat(fields[key]) + [sensorType]: parseFloat(fields[key]) }; sensors.push(feature); break; From 8886149678524cb280a0b5d0cde44a80354f105e Mon Sep 17 00:00:00 2001 From: Thomas Ingvarsson Date: Fri, 21 Sep 2018 08:22:21 +0200 Subject: [PATCH 124/224] Fix JS warning about assignment to undeclared variable key --- freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js index 6963a31..dd6bcf2 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -66,7 +66,7 @@ var SensorsUtil = new Lang.Class({ continue; let fields = chipsetSensors[sensor]; - for (key in fields) { + for (var key in fields) { if (fields.hasOwnProperty(key) && sensorFilter.test(key)) { let feature = { label: sensor, From 1e7536030026d6dab1c364419801cf45fdf96548 Mon Sep 17 00:00:00 2001 From: Thomas Ingvarsson Date: Sun, 23 Sep 2018 18:23:19 +0200 Subject: [PATCH 125/224] [WIP] Add debug logging, fixes #103 To enable more debug logging without custom builds while still maintaining a minimal syslog impact by default - Add a settings variable 'debug', hidden from the user - Use dconf to write/read it (suggest adding to the README and/or wiki). Only for debugging purposes really - When 'debug' is set it will enable the possibility of extra logging - The new 'debug' function also adds in some meta data such as unique syslog id instead of gnome-shell, file/func/line id to easier locate in code - Changed the Render all MenuItems and a couple of outcommented updated logs to use the new debug function instead Todo's before no longer WIP: - Place it somewhere else than in this, cause I presume it wont be reachable everywhere then - Consider replacing regular log with something like this as well (to gain the neat meta data (extension prefix, file, func, line)) - Think some more on the usage of log domains and if possible to turn of more logging that way instead of dconf variable --- .../extension.js | 38 ++++++++++++++++-- .../schemas/gschemas.compiled | Bin 932 -> 972 bytes ...gnome.shell.extensions.sensors.gschema.xml | 6 +++ 3 files changed, 41 insertions(+), 3 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index e9ae25f..0dd43bb 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -7,6 +7,7 @@ const Util = imports.misc.util; const Mainloop = imports.mainloop; const Clutter = imports.gi.Clutter; const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; const Me = imports.misc.extensionUtils.getCurrentExtension(); const Convenience = Me.imports.convenience; @@ -21,6 +22,30 @@ const FreonItem = Me.imports.freonItem; const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); const _ = Gettext.gettext; +function _makeLogFunction(prefix) { + return msg => { + // Grab the second line of a stack trace, i.e. caller of debug() + let regex = /(?:(?:[^<.]+<\.)?([^@]+))?@(.+):(\d+):\d+/g; + let trace = ((msg.stack) ? msg : new Error()).stack.split('\n')[1]; + let [m, func, file, line] = regex.exec(trace); + file = GLib.path_get_basename(file); + + let hdr = [file, func, line].filter(k => (k)).join(':'); + + GLib.log_structured( + 'freon', + GLib.LogLevelFlags.LEVEL_MESSAGE, + { + MESSAGE: `[${prefix}] [${hdr}]: ${msg}`, + SYSLOG_IDENTIFIER: 'org.gnome.shell.extensions.freon', + CODE_FILE: file, + CODE_FUNC: `${func}`, + CODE_LINE: `${line}` + } + ); + } +} + var FreonMenuButton = new Lang.Class({ Name: 'FreonMenuButton', Extends: PanelMenu.Button, @@ -30,6 +55,13 @@ var FreonMenuButton = new Lang.Class({ this._settings = Convenience.getSettings(); + var _debugFunc = _makeLogFunction('DEBUG'); + this.debug = this._settings.get_boolean('debug') ? _debugFunc : () => {}; + + this._settings.connect('changed::debug', () => { + this.debug = this._settings.get_boolean('debug') ? _debugFunc : () => {}; + }); + this._sensorMenuItems = {}; this._utils = { @@ -244,14 +276,14 @@ var FreonMenuButton = new Lang.Class({ let needUpdate = false; for (let sensor of Object.values(this._utils)) { if (sensor.available && sensor.updated) { - // global.log(sensor + ' updated'); + this.debug(sensor + ' updated'); sensor.updated = false; needUpdate = true; } } if(needUpdate) { this._updateDisplay(); // #74 - // global.log('update display'); + this.debug('update display'); } }, @@ -410,7 +442,7 @@ var FreonMenuButton = new Lang.Class({ if(this._needRerender){ this._needRerender = false; - global.log('[FREON] Render all MenuItems'); + this.debug('Render all MenuItems'); this.menu.removeAll(); this._appendMenuItems(sensors); } diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled index 83b7a59319ee3060c56cad969246a4ecb7abd82a..62f47770f460621c22f58e1c1d78831d7dd5ad16 100644 GIT binary patch literal 972 zcmY*YziSjh7@g>yM(<*XC`3fG5WT2-8->`|q)=24?1CV&&fQM-Mt5hH-Py|p)XpDZ zCxVS&8ZnKaomQp^2GQQe|G+{E!9s}d?d@S4_VFHXznS@F=k3J>nQ3X9sKzw-+EBN) zjZE;3XA8&2s&_}kB{6_Lih}xnAvQ7Ax3l<)*Z_Y9Y!{(!>6zGsoBpgcn(-U@Zt`A z>Kgoc@KxYk_gITQHP3Yud>)VOtd;PJ?p$2*J-mn2xMPnGEzYxf*_FtaC4t%$$TctY>|3SB`FGAktudj z&JQ!)S6<K0rSg%`Tqju zmjUz9cezlgx;l}u*Ozg@7SMl@hSDj|=|t7JTuTr4?AzGkD74BxhbP$LR(@gh=!fYl z<8+kC5VO#FYIE(7a!*&CXFBSk7O#ZZgLUya%M2q5Wv2O0G1tsI2lLOo?*^FtC@uc` SP{x|!PNC`)5ej%762@Ob3C4r~ literal 932 zcmY*YF>4e-7@g>yM(!d+6e1#8i0&zSs}?qvDq2|B7}Cfxxt;6|?(S@6XD=5}v56Ko zVq+sDML=6S8_`A-L9h}02^Lz|SqSmH$z9Z8AMf$zo0;#MZ}#fEv|5%^!VOs~g zCMNjS)A>_VjgXAzfx zRE4YoPUe^pHMv7yf7P z7vTGmtuyqg8UGFZ1Ne0L*E9Omv+xD(tPN}&d+~@qwXX|&0(g7(UWfNg-A4Rb@J-<2 z;AFsfYVMPPEpVlIze1my`P>Ju0q+j4-=R<4g8vxI-lf(wRX8-clc~b|ln54knQ>u_ zwi#Q;u^cLkxi}VaT*wi)dr$zH+el?CoBFediusUUPP#F8vSTNQ}o@OgVbQ3GAb zJRHir!O^T|yGW;s3Z=Nl!uIir)kF1Px}r&ReY-yIQ|?#NWqx-dB0TKKKkUdq?C9^q vj{L)pkZ)yb?eNw^y_2uiX@;K+7vPiIxoCfWQ|ieNI8de2sg=pjZ3*!QqbGroup more than three voltage menu items + + false + Enable debug logging + Enable debug logging from the extension + + From 26e0b5843364e35dc6145930d10456c067009efa Mon Sep 17 00:00:00 2001 From: Nikita Yustovskiy Date: Sat, 20 Oct 2018 18:58:04 +0300 Subject: [PATCH 126/224] Fixed NaN values when NVIDIA is disabled --- freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js index c9520dd..b38e8ef 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js @@ -51,9 +51,11 @@ var NvidiaUtil = new Lang.Class({ return []; let temps = []; for (let line of this._output) { - if(!line) + let convertedLine = parseFloat(line); + + if(!line || !convertedLine) continue; - temps.push(parseFloat(line)); + temps.push(convertedLine); } let gpus = []; From 9ecff762388e771fe5837ade62ed289b516b1e1b Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 1 Nov 2018 17:58:22 +0300 Subject: [PATCH 127/224] fix double voltages minus, resolve #110 --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 0dd43bb..43c82fb 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -406,7 +406,7 @@ var FreonMenuButton = new Lang.Class({ sensors.push({ type : 'voltage', label:voltage.label, - value:_("%s%.2fV").format(((voltage.volt >= 0) ? '+' : '-'), + value:_("%s%.2fV").format(((voltage.volt >= 0) ? '+' : ''), voltage.volt)}); } From 0a5a37aa6b69d461758f31b8893e4d038940aab4 Mon Sep 17 00:00:00 2001 From: Andrew Toskin Date: Fri, 16 Nov 2018 18:57:17 -0800 Subject: [PATCH 128/224] Installation and other info are already better explained in the wiki I figure it's better to make the link to the project wiki more prominent than to replicate only a small part of the wiki here. --- README.md | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/README.md b/README.md index 093c8a2..5a139e7 100644 --- a/README.md +++ b/README.md @@ -3,16 +3,4 @@ gnome-shell-extension-freon Freon is forked from [gnome-shell-extension-sensors](https://github.com/xtranophilist/gnome-shell-extension-sensors). Freon is an extension for displaying CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM in GNOME Shell. -More info in [wiki](https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki) - -### Installation from git - - git clone https://github.com/UshakovVasilii/gnome-shell-extension-freon.git - cd gnome-shell-extension-freon - mkdir -p ~/.local/share/gnome-shell/extensions - cp -r freon@UshakovVasilii_Github.yahoo.com ~/.local/share/gnome-shell/extensions/. -restart GNOME Shell (`Alt+F2`, `r`, `Enter`) and enable the extension through gnome-tweak-tool. - -### Installation from extensions.gnome.org - -https://extensions.gnome.org/extension/841/freon/ +**[For more info, check out the Freon wiki.](https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki)** From 405a0905e55ba2f476666a0bba05221c1e61c260 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sun, 18 Nov 2018 10:14:34 +0300 Subject: [PATCH 129/224] add link to WiKi #113 --- .../extension.js | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 43c82fb..6152e1f 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -459,22 +459,27 @@ var FreonMenuButton = new Lang.Class({ Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki/Dependency"]); }); this.menu.addMenuItem(item); - this._appendSettingsMenuItem(); + this._appendStaticMenuItems(); } }, - _appendSettingsMenuItem : function(){ + _appendStaticMenuItems : function(){ // separator this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - let item = new PopupMenu.PopupBaseMenuItem(); - item.actor.add(new St.Label({ text: _("Sensors Settings") }), { expand: true, x_fill: false }); + let wiki = new PopupMenu.PopupBaseMenuItem(); + wiki.actor.add(new St.Label({ text: _("GitHub / WiKi") }), { expand: true, x_fill: false }); + wiki.connect('activate', function () { + Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki"]); + }); + this.menu.addMenuItem(wiki); - item.connect('activate', function () { + let settings = new PopupMenu.PopupBaseMenuItem(); + settings.actor.add(new St.Label({ text: _("Sensors Settings") }), { expand: true, x_fill: false }); + settings.connect('activate', function () { Util.spawn(["gnome-shell-extension-prefs", Me.metadata.uuid]); }); - - this.menu.addMenuItem(item); + this.menu.addMenuItem(settings); }, _appendMenuItems : function(sensors){ @@ -585,7 +590,7 @@ var FreonMenuButton = new Lang.Class({ } } } - this._appendSettingsMenuItem(); + this._appendStaticMenuItems(); }, From 94281931e7675ae7044100bebec178738c5c04b0 Mon Sep 17 00:00:00 2001 From: Andrew Toskin Date: Sun, 18 Nov 2018 13:50:52 -0800 Subject: [PATCH 130/224] Reword labels for the bottom buttons of the top bar menu I think it makes sense to call it the Freon wiki rather than the GitHub wiki, because code hosting could change, and this wiki is specifically all about Freon. And I think adding the "Go to" phrase both clarifies what the button does, and also sorta invites the user to actually click on the button. And as for "Sensors Settings", this might be a little nit-picky, but you don't *usually* pluralize a noun when it's acting as a modifier on another noun. --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 6152e1f..821fba6 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -468,14 +468,14 @@ var FreonMenuButton = new Lang.Class({ this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); let wiki = new PopupMenu.PopupBaseMenuItem(); - wiki.actor.add(new St.Label({ text: _("GitHub / WiKi") }), { expand: true, x_fill: false }); + wiki.actor.add(new St.Label({ text: _("Go to the Freon wiki") }), { expand: true, x_fill: false }); wiki.connect('activate', function () { Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki"]); }); this.menu.addMenuItem(wiki); let settings = new PopupMenu.PopupBaseMenuItem(); - settings.actor.add(new St.Label({ text: _("Sensors Settings") }), { expand: true, x_fill: false }); + settings.actor.add(new St.Label({ text: _("Sensor Settings") }), { expand: true, x_fill: false }); settings.connect('activate', function () { Util.spawn(["gnome-shell-extension-prefs", Me.metadata.uuid]); }); From bfebb8d8b9c3c984866d3023734f3e624847b847 Mon Sep 17 00:00:00 2001 From: "Erdem U. Altinyurt" Date: Sun, 6 Jan 2019 18:51:19 +0300 Subject: [PATCH 131/224] Addition of custom SmartCtl quert for NVME devices. --- .../smartctlUtil.js | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js diff --git a/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js b/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js new file mode 100644 index 0000000..351e108 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js @@ -0,0 +1,52 @@ +const Lang = imports.lang; +const GLib = imports.gi.GLib; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const CommandLineUtil = Me.imports.commandLineUtil; + +var smartctlUtil = new Lang.Class({ + Name: 'smartctlUtil', + Extends: CommandLineUtil.CommandLineUtil, + + _init: function() { + this.parent(); + let path = GLib.find_program_in_path('smartctl'); + this._argv = path ? [path, '-x', '/dev/nvme0'] : null; + }, + + get temp() { + if(!this._output) + return []; + + let smartctlOutput = []; + smartctlOutput = this._output; + + let sensors = []; + + let slabel="Temperature Sensor"; + for (let line of smartctlOutput) { + let matchModel = /Model Number:/.exec( line.toString() ); + if(matchModel){ + let sline=line.split(/\s+/); + slabel=sline.slice(2).join(" "); + } + //let line = "Temperature Sensor 1: 37 Celsius" + let match = /Temperature Sensor \d: *\w\d Celsius/.exec( line.toString() ); + //let match = /Use smartctl.*/.exec( line.toString() ); + //let match = /.*\[Temperature Sensor \d: .*\d Celcius.*/.exec(line.toString()); + if(match){ + let sline=line.split(/\s+/); + let sensor = { label: slabel+" "+sline[2][0], temp: parseFloat(sline[3]) }; + sensors.push(sensor); + } + } + return sensors; + + }, + + get available(){ + return true; + }, + +}); + From 8ecea4e639f8892dcc1c257fc88c41f407d4447a Mon Sep 17 00:00:00 2001 From: "Erdem U. Altinyurt" Date: Sun, 6 Jan 2019 18:53:16 +0300 Subject: [PATCH 132/224] Required changes for custom SmartCtl for NVME. --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 4 ++++ freon@UshakovVasilii_Github.yahoo.com/prefs.js | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 821fba6..667bf0f 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -16,6 +16,7 @@ const AticonfigUtil = Me.imports.aticonfigUtil; const NvidiaUtil = Me.imports.nvidiaUtil; const HddtempUtil = Me.imports.hddtempUtil; const SensorsUtil = Me.imports.sensorsUtil; +const smartctlUtil = Me.imports.smartctlUtil; const BumblebeeNvidiaUtil = Me.imports.bumblebeeNvidiaUtil; const FreonItem = Me.imports.freonItem; @@ -197,6 +198,9 @@ var FreonMenuButton = new Lang.Class({ // this._updateDisplay(); we cannot change actor in background thread #74 })); break; + case 'smartctl': + this._utils.disks = new smartctlUtil.smartctlUtil(); + break; } }, diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index b11f817..70ec683 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -69,7 +69,7 @@ var FreonPrefsWidget = new GObject.Class({ help : _("Works if you have more than three voltage sensors")}); this._addComboBox({ - items : {none : 'None', hddtemp : 'Hddtemp', udisks2 : 'UDisks2'}, + items : {none : 'None', hddtemp : 'Hddtemp', udisks2 : 'UDisks2', smartctl : 'smartctl'}, key: 'drive-utility', y : i, x : 0, label: _('HDD/SSD Temperature Utility') }); From 4007f2d2b1ad951fb6a269e7a5205eff2e0a6fc6 Mon Sep 17 00:00:00 2001 From: Jonas Malaco Date: Sun, 27 Jan 2019 04:49:05 -0200 Subject: [PATCH 133/224] Accept more than nine hwmon sensors of each type --- freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js index dd6bcf2..1076168 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -16,19 +16,19 @@ var SensorsUtil = new Lang.Class({ }, get temp() { - return this._parseGenericSensorsOutput(/^temp\d_input/, 'temp'); + return this._parseGenericSensorsOutput(/^temp\d+_input/, 'temp'); }, get gpu() { - return this._parseGpuSensorsOutput(/^temp\d_input/, 'temp'); + return this._parseGpuSensorsOutput(/^temp\d+_input/, 'temp'); }, get rpm() { - return this._parseGenericSensorsOutput(/^fan\d_input/, 'rpm'); + return this._parseGenericSensorsOutput(/^fan\d+_input/, 'rpm'); }, get volt() { - return this._parseGenericSensorsOutput(/^in\d_input/, 'volt'); + return this._parseGenericSensorsOutput(/^in\d+_input/, 'volt'); }, _parseGenericSensorsOutput: function(sensorFilter, sensorType) { From dd635f2948819e8baae0867285a041d7075e7f9b Mon Sep 17 00:00:00 2001 From: Jonas Malaco Date: Sat, 2 Mar 2019 10:08:25 -0300 Subject: [PATCH 134/224] Fix temperatures being rounded down instead of to the closest integer --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 667bf0f..8395cf6 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -610,8 +610,7 @@ var FreonMenuButton = new Lang.Class({ } let format = '%.1f'; if (!this._settings.get_boolean('show-decimal-value')){ - //ret = Math.round(value); - format = '%d'; + format = '%.0f'; } format += '%s'; return format.format(value, (this._settings.get_string('unit')=='fahrenheit') ? "\u00b0F" : "\u00b0C"); From 470a8e6a782f810338bf084d89a73a9c1186724c Mon Sep 17 00:00:00 2001 From: Jonas Malaco Date: Sat, 2 Mar 2019 17:35:08 -0300 Subject: [PATCH 135/224] Visualize hot (on panel) sensors that became stale MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a hwmon module was unloaded or crashed any sensors it had that were also pinned to the panel (i.e. a 'hot sensor') retained the value they had last, hiding the failure. To fix that, this first clears all hot labels, replacing them with a placeholder, before checking the new sensor data. The placeholder chosen is ⚠ (\u26a0 warning sign), after some experimentation with other alternatives. For consistency, the placeholder used on initialization is also changed. --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 667bf0f..3ea90f6 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -133,7 +133,7 @@ var FreonMenuButton = new Lang.Class({ this._menuLayout.add(i); } let l = new St.Label({ - text: '\u2026', /* ... */ + text: '\u26a0', // ⚠, warning y_expand: true, y_align: Clutter.ActorAlign.CENTER}); this._hotLabels[s] = l; @@ -416,6 +416,9 @@ var FreonMenuButton = new Lang.Class({ this._fixNames(sensors); + for (let k in this._hotLabels) + this._hotLabels[k].set_text('\u26a0'); // ⚠, warning + for (let s of sensors) if(s.type != 'separator') { let l = this._hotLabels[s.key || s.label]; From 6f9d334cef6de3eae114f6e17da2743200e0c8e4 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Wed, 20 Mar 2019 10:28:11 +0300 Subject: [PATCH 136/224] update for gnome-shell 3.32 #126 --- .../aticonfigUtil.js | 13 +- .../bumblebeeNvidiaUtil.js | 31 ++-- .../commandLineUtil.js | 26 ++- .../extension.js | 153 +++++++++--------- .../freonItem.js | 23 ++- .../hddtempUtil.js | 13 +- .../metadata.json | 2 +- .../nvidiaUtil.js | 15 +- .../prefs.js | 31 ++-- .../sensorsUtil.js | 31 ++-- .../smartctlUtil.js | 15 +- .../udisks2.js | 36 ++--- 12 files changed, 179 insertions(+), 210 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js b/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js index cd0ecda..fc6ea77 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js @@ -1,18 +1,15 @@ -const Lang = imports.lang; const GLib = imports.gi.GLib; const Me = imports.misc.extensionUtils.getCurrentExtension(); const CommandLineUtil = Me.imports.commandLineUtil; -var AticonfigUtil = new Lang.Class({ - Name: 'AticonfigUtil', - Extends: CommandLineUtil.CommandLineUtil, +var AticonfigUtil = class extends CommandLineUtil.CommandLineUtil { - _init: function() { - this.parent(); + constructor() { + super(); let path = GLib.find_program_in_path('aticonfig'); this._argv = path ? [path, '--odgt'] : null; - }, + } /* Default Adapter - AMD Radeon R9 200 Series @@ -39,4 +36,4 @@ var AticonfigUtil = new Lang.Class({ return [{ label : label.trim(), temp : temp}]; } -}); +}; diff --git a/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js index 8d14418..e0acec5 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js @@ -1,16 +1,13 @@ -const Lang = imports.lang; const GLib = imports.gi.GLib; const Gio = imports.gi.Gio; const Me = imports.misc.extensionUtils.getCurrentExtension(); const CommandLineUtil = Me.imports.commandLineUtil; -var BumblebeeNvidiaUtil = new Lang.Class({ - Name: 'BumblebeeNvidiaUtil', - Extends: CommandLineUtil.CommandLineUtil, +var BumblebeeNvidiaUtil = class extends CommandLineUtil.CommandLineUtil { - _init: function() { - this.parent(); + constructor() { + super(); // optirun nvidia-smi -q -d TEMPERATURE this._path = GLib.find_program_in_path('optirun'); this._argv = this._path ? [this._path, 'nvidia-smi', '-q', '-d', 'TEMPERATURE'] : null; @@ -35,7 +32,7 @@ var BumblebeeNvidiaUtil = new Lang.Class({ lockFilePath).monitor_file(Gio.FileMonitorFlags.NONE, null ); this._lockMonitor.id = this._lockMonitor.connect( - 'changed', Lang.bind(this, this._statusChanged) + 'changed', this._statusChanged.bind(this) ); // Check if the lock file already exists @@ -44,9 +41,9 @@ var BumblebeeNvidiaUtil = new Lang.Class({ this._detectLabel(); this._active = true; } - }, + } - _detectLabel: function() { + _detectLabel() { // optirun nvidia-smi -L // GPU 0: GeForce GT 525M (UUID: GPU-...) for (let line of GLib.spawn_command_line_sync(this._path + " nvidia-smi -L")){ @@ -58,9 +55,9 @@ var BumblebeeNvidiaUtil = new Lang.Class({ break; } } - }, + } - _statusChanged: function(monitor, a_file, other_file, event_type) { + _statusChanged(monitor, a_file, other_file, event_type) { if (event_type == Gio.FileMonitorEvent.CREATED) { if(this._argv && !this._label) this._detectLabel(); @@ -68,14 +65,14 @@ var BumblebeeNvidiaUtil = new Lang.Class({ } else if (event_type == Gio.FileMonitorEvent.DELETED) { this._active = false; } - }, + } - execute: function(callback) { + execute(callback) { if(this._active) this.parent(callback); else this._output = []; - }, + } get temp() { let key = 'bumblebee-nvidia' @@ -95,11 +92,11 @@ var BumblebeeNvidiaUtil = new Lang.Class({ } } return [{label: key, temp: null, displayName: label}]; - }, + } - destroy: function(){ + destroy(){ this.parent(); this._lockMonitor.disconnect(this._lockMonitor.id); } -}); +}; diff --git a/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js index db401c8..63489ae 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js @@ -1,17 +1,15 @@ const ByteArray = imports.byteArray; -const Lang = imports.lang; const GLib = imports.gi.GLib; const Gio = imports.gi.Gio; -var CommandLineUtil = new Lang.Class({ - Name: 'CommandLineUtil', +var CommandLineUtil = class { - _init: function(){ + constructor(){ this._argv = null; this._updated = false; - }, + } - execute: function(callback) { + execute(callback) { try{ this._callback = callback; let [exit, pid, stdinFd, stdoutFd, stderrFd] = @@ -28,7 +26,7 @@ var CommandLineUtil = new Lang.Class({ GLib.close(stdinFd); - let childWatch = GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, Lang.bind(this, function(pid, status, requestObj) { + let childWatch = GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, (pid, status, requestObj) => { let output = []; let [line, size] = [null, 0]; @@ -48,26 +46,26 @@ var CommandLineUtil = new Lang.Class({ this._output = output; this._updated = true; callback(); - })); + }); } catch(e){ global.log(e.toString()); } - }, + } get available(){ return this._argv != null; - }, + } get updated (){ return this._updated; - }, + } set updated (updated){ this._updated = updated; - }, + } - destroy: function(){ + destroy(){ this._argv = null; } -}); +}; diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 59b2d7b..c8afdfd 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -1,5 +1,4 @@ const St = imports.gi.St; -const Lang = imports.lang; const PanelMenu = imports.ui.panelMenu; const PopupMenu = imports.ui.popupMenu; const Main = imports.ui.main; @@ -47,12 +46,10 @@ function _makeLogFunction(prefix) { } } -var FreonMenuButton = new Lang.Class({ - Name: 'FreonMenuButton', - Extends: PanelMenu.Button, +const FreonMenuButton = class extends PanelMenu.Button { - _init: function(){ - this.parent(St.Align.START); + constructor(){ + super(St.Align.START); this._settings = Convenience.getSettings(); @@ -98,33 +95,33 @@ var FreonMenuButton = new Lang.Class({ this.actor.add_actor(this._menuLayout); this._settingChangedSignals = []; - this._addSettingChangedSignal('update-time', Lang.bind(this, this._updateTimeChanged)); - this._addSettingChangedSignal('unit', Lang.bind(this, this._querySensors)); - this._addSettingChangedSignal('show-icon-on-panel', Lang.bind(this, this._showIconOnPanelChanged)); - this._addSettingChangedSignal('hot-sensors', Lang.bind(this, this._querySensors)); - this._addSettingChangedSignal('show-decimal-value', Lang.bind(this, this._querySensors)); - this._addSettingChangedSignal('show-fan-rpm', Lang.bind(this, this._querySensors)); - this._addSettingChangedSignal('show-voltage', Lang.bind(this, this._querySensors)); - this._addSettingChangedSignal('drive-utility', Lang.bind(this, this._driveUtilityChanged)); - this._addSettingChangedSignal('gpu-utility', Lang.bind(this, this._gpuUtilityChanged)); - this._addSettingChangedSignal('position-in-panel', Lang.bind(this, this._positionInPanelChanged)); - this._addSettingChangedSignal('group-temperature', Lang.bind(this, this._querySensors)) - this._addSettingChangedSignal('group-voltage', Lang.bind(this, this._rerender)) - - this.connect('destroy', Lang.bind(this, this._onDestroy)); + this._addSettingChangedSignal('update-time', this._updateTimeChanged.bind(this)); + this._addSettingChangedSignal('unit', this._querySensors.bind(this)); + this._addSettingChangedSignal('show-icon-on-panel', this._showIconOnPanelChanged.bind(this)); + this._addSettingChangedSignal('hot-sensors', this._querySensors.bind(this)); + this._addSettingChangedSignal('show-decimal-value', this._querySensors.bind(this)); + this._addSettingChangedSignal('show-fan-rpm', this._querySensors.bind(this)); + this._addSettingChangedSignal('show-voltage', this._querySensors.bind(this)); + this._addSettingChangedSignal('drive-utility', this._driveUtilityChanged.bind(this)); + this._addSettingChangedSignal('gpu-utility', this._gpuUtilityChanged.bind(this)); + this._addSettingChangedSignal('position-in-panel', this._positionInPanelChanged.bind(this)); + this._addSettingChangedSignal('group-temperature', this._querySensors.bind(this)) + this._addSettingChangedSignal('group-voltage', this._rerender.bind(this)) + + this.connect('destroy', this._onDestroy.bind(this)); // don't postprone the first call by update-time. this._querySensors(); this._addTimer(); - this._updateUITimeoutId = Mainloop.timeout_add(250, Lang.bind(this, function (){ + this._updateUITimeoutId = Mainloop.timeout_add(250, () => { this._updateUI(); // readd to update queue return true; - })); - }, + }); + } - _createHotItem: function(s, showIcon, gicon){ + _createHotItem(s, showIcon, gicon){ if(showIcon){ let i = new St.Icon({ style_class: 'system-status-icon'}); this._hotIcons[s] = i; @@ -138,20 +135,20 @@ var FreonMenuButton = new Lang.Class({ y_align: Clutter.ActorAlign.CENTER}); this._hotLabels[s] = l; this._menuLayout.add(l); - }, + } - _createInitialIcon: function() { + _createInitialIcon() { this._initialIcon = new St.Icon({ style_class: 'system-status-icon'}); this._initialIcon.gicon = this._sensorIcons['gpu-temperature']; this._menuLayout.add(this._initialIcon); - }, + } - _rerender : function(){ + _rerender(){ this._needRerender = true; this._querySensors(); - }, + } - _positionInPanelChanged : function(){ + _positionInPanelChanged(){ this.container.get_parent().remove_actor(this.container); // small HACK with private boxes :) @@ -163,9 +160,9 @@ var FreonMenuButton = new Lang.Class({ let p = this.positionInPanel; boxes[p].insert_child_at_index(this.container, p == 'right' ? 0 : -1) - }, + } - _showIconOnPanelChanged : function(){ + _showIconOnPanelChanged(){ if(this._settings.get_boolean('show-icon-on-panel')) { let index = 0; for(let k in this._hotLabels){ @@ -180,38 +177,38 @@ var FreonMenuButton = new Lang.Class({ this._hotIcons[k].destroy(); this._hotIcons = {}; } - }, + } - _driveUtilityChanged : function(){ + _driveUtilityChanged(){ this._destroyDriveUtility(); this._initDriveUtility(); this._querySensors(); - }, + } - _initDriveUtility : function(){ + _initDriveUtility(){ switch(this._settings.get_string('drive-utility')){ case 'hddtemp': this._utils.disks = new HddtempUtil.HddtempUtil(); break; case 'udisks2': - this._utils.disks = new UDisks2.UDisks2(Lang.bind(this, function() { + this._utils.disks = new UDisks2.UDisks2(() => { // this._updateDisplay(); we cannot change actor in background thread #74 - })); + }); break; case 'smartctl': this._utils.disks = new smartctlUtil.smartctlUtil(); break; } - }, + } - _destroyDriveUtility : function(){ + _destroyDriveUtility(){ if(this._utils.disks){ this._utils.disks.destroy(); delete this._utils.disks; } - }, + } - _initGpuUtility : function(){ + _initGpuUtility(){ switch(this._settings.get_string('gpu-utility')){ case 'nvidia-settings': this._utils.gpu = new NvidiaUtil.NvidiaUtil(); @@ -223,39 +220,39 @@ var FreonMenuButton = new Lang.Class({ this._utils.gpu = new BumblebeeNvidiaUtil.BumblebeeNvidiaUtil(); break; } - }, + } - _destroyGpuUtility : function(){ + _destroyGpuUtility(){ if(this._utils.gpu){ this._utils.gpu.destroy(); delete this._utils.gpu; } - }, + } - _gpuUtilityChanged : function(){ + _gpuUtilityChanged(){ this._destroyGpuUtility(); this._initGpuUtility(); this._querySensors(); - }, + } - _updateTimeChanged : function(){ + _updateTimeChanged(){ Mainloop.source_remove(this._timeoutId); this._addTimer(); - }, + } - _addTimer : function(){ - this._timeoutId = Mainloop.timeout_add_seconds(this._settings.get_int('update-time'), Lang.bind(this, function (){ + _addTimer(){ + this._timeoutId = Mainloop.timeout_add_seconds(this._settings.get_int('update-time'), () => { this._querySensors(); // readd to update queue return true; - })); - }, + }); + } - _addSettingChangedSignal : function(key, callback){ + _addSettingChangedSignal(key, callback){ this._settingChangedSignals.push(this._settings.connect('changed::' + key, callback)); - }, + } - _onDestroy: function(){ + _onDestroy(){ this._destroyDriveUtility(); this._destroyGpuUtility(); Mainloop.source_remove(this._timeoutId); @@ -264,19 +261,19 @@ var FreonMenuButton = new Lang.Class({ for (let signal of this._settingChangedSignals){ this._settings.disconnect(signal); }; - }, + } - _querySensors: function(){ + _querySensors(){ for (let sensor of Object.values(this._utils)) { if (sensor.available) { - sensor.execute(Lang.bind(this,function(){ + sensor.execute(() => { // we cannot change actor in background thread #74 - })); + }); } } - }, + } - _updateUI: function(){ + _updateUI(){ let needUpdate = false; for (let sensor of Object.values(this._utils)) { if (sensor.available && sensor.updated) { @@ -289,9 +286,9 @@ var FreonMenuButton = new Lang.Class({ this._updateDisplay(); // #74 this.debug('update display'); } - }, + } - _fixNames: function(sensors){ + _fixNames(sensors){ let names = []; for (let s of sensors){ if(s.type == 'separator' || @@ -310,9 +307,9 @@ var FreonMenuButton = new Lang.Class({ } names.push(name); } - }, + } - _updateDisplay: function(){ + _updateDisplay(){ let gpuTempInfo = this._utils.sensors.gpu; if (this._utils.gpu && this._utils.gpu.available) @@ -468,9 +465,9 @@ var FreonMenuButton = new Lang.Class({ this.menu.addMenuItem(item); this._appendStaticMenuItems(); } - }, + } - _appendStaticMenuItems : function(){ + _appendStaticMenuItems(){ // separator this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); @@ -487,9 +484,9 @@ var FreonMenuButton = new Lang.Class({ Util.spawn(["gnome-shell-extension-prefs", Me.metadata.uuid]); }); this.menu.addMenuItem(settings); - }, + } - _appendMenuItems : function(sensors){ + _appendMenuItems(sensors){ this._lastSensorsCount = sensors.length; this._sensorMenuItems = {}; let needGroupTemperature = this._settings.get_boolean('group-temperature'); @@ -518,7 +515,7 @@ var FreonMenuButton = new Lang.Class({ } else { let key = s.key || s.label; let item = new FreonItem.FreonItem(this._sensorIcons[s.type], key, s.label, s.value, s.displayName || undefined); - item.connect('activate', Lang.bind(this, function (self) { + item.connect('activate', (self) => { let l = this._hotLabels[self.key]; let hotSensors = this._settings.get_strv('hot-sensors'); if(l){ @@ -563,7 +560,7 @@ var FreonMenuButton = new Lang.Class({ function(item, pos) { return hotSensors.indexOf(item) == pos; })); - })); + }); if (this._hotLabels[key]) { item.main = true; if(this._hotIcons[key]) @@ -598,14 +595,14 @@ var FreonMenuButton = new Lang.Class({ } } this._appendStaticMenuItems(); - }, + } - _toFahrenheit: function(c){ + _toFahrenheit(c){ return ((9/5)*c+32); - }, + } - _formatTemp: function(value) { + _formatTemp(value) { if(value === null) return 'N/A'; if (this._settings.get_string('unit')=='fahrenheit'){ @@ -617,12 +614,12 @@ var FreonMenuButton = new Lang.Class({ } format += '%s'; return format.format(value, (this._settings.get_string('unit')=='fahrenheit') ? "\u00b0F" : "\u00b0C"); - }, + } get positionInPanel(){ return this._settings.get_string('position-in-panel'); } -}); +}; let freonMenu; diff --git a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js index 3c6aac5..8e996cb 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js +++ b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js @@ -1,13 +1,10 @@ -const Lang = imports.lang; const St = imports.gi.St; const PopupMenu = imports.ui.popupMenu; -var FreonItem = new Lang.Class({ - Name: 'FreonItem', - Extends: PopupMenu.PopupBaseMenuItem, +var FreonItem = class extends PopupMenu.PopupBaseMenuItem { - _init: function(gIcon, key, label, value, displayName) { - this.parent(); + constructor(gIcon, key, label, value, displayName) { + super(); this._main = false; this._key = key; this._gIcon = gIcon; @@ -17,7 +14,7 @@ var FreonItem = new Lang.Class({ this.actor.add(this._labelActor, {x_fill: true, expand: true}); this._valueLabel = new St.Label({text: value}); this.actor.add(this._valueLabel); - }, + } set main(main) { if(main) @@ -25,25 +22,25 @@ var FreonItem = new Lang.Class({ else this.setOrnament(PopupMenu.Ornament.NONE); this._main = main; - }, + } get main() { return this._main; - }, + } get key() { return this._key; - }, + } set display_name(text) { return this._labelActor.text = text; - }, + } get gicon() { return this._gIcon; - }, + } set value(value) { this._valueLabel.text = value; } -}); +}; diff --git a/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js b/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js index d19ed99..e5d1d6d 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js @@ -1,15 +1,12 @@ -const Lang = imports.lang; const GLib = imports.gi.GLib; const Me = imports.misc.extensionUtils.getCurrentExtension(); const CommandLineUtil = Me.imports.commandLineUtil; -var HddtempUtil = new Lang.Class({ - Name: 'HddtempUtil', - Extends: CommandLineUtil.CommandLineUtil, +var HddtempUtil = class extends CommandLineUtil.CommandLineUtil { - _init: function() { - this.parent(); + constructor() { + super(); let hddtempArgv = GLib.find_program_in_path('hddtemp'); if(hddtempArgv) { // check if this user can run hddtemp directly. @@ -52,7 +49,7 @@ var HddtempUtil = new Lang.Class({ // use net cat to get data this._argv = [nc, 'localhost', port.toString()]; } - }, + } get temp() { if(!this._output) @@ -78,4 +75,4 @@ var HddtempUtil = new Lang.Class({ return sensors; } -}); +}; diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index 5608649..30dd7d4 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": ["3.30"], + "shell-version": ["3.32"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", "description": "Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js index b38e8ef..8e2c4bb 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js @@ -1,16 +1,13 @@ const ByteArray = imports.byteArray; -const Lang = imports.lang; const GLib = imports.gi.GLib; const Gio = imports.gi.Gio; const Me = imports.misc.extensionUtils.getCurrentExtension(); const CommandLineUtil = Me.imports.commandLineUtil; -var NvidiaUtil = new Lang.Class({ - Name: 'NvidiaUtil', - Extends: CommandLineUtil.CommandLineUtil, +var NvidiaUtil = class extends CommandLineUtil.CommandLineUtil { - _init: function() { + constructor() { this.parent(); let path = GLib.find_program_in_path('nvidia-settings'); this._argv = path ? [path, '-q', 'gpucoretemp', '-t'] : null; @@ -29,7 +26,7 @@ var NvidiaUtil = new Lang.Class({ GLib.close(stdinFd); GLib.close(stderrFd); - let childWatch = GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, Lang.bind(this, function(pid, status, requestObj) { + let childWatch = GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, (pid, status, requestObj) => { let output = []; let [line, size] = [null, 0]; @@ -42,9 +39,9 @@ var NvidiaUtil = new Lang.Class({ stdout.close(null); GLib.source_remove(childWatch); - })); + }); } - }, + } get temp() { if(!this._output) @@ -79,4 +76,4 @@ var NvidiaUtil = new Lang.Class({ return gpus; } -}); +}; diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 70ec683..a1b8515 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -1,10 +1,10 @@ const GObject = imports.gi.GObject; const Gio = imports.gi.Gio; const Gtk = imports.gi.Gtk; -const Lang = imports.lang; -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Convenience = Me.imports.convenience; +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); + const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); const _ = Gettext.gettext; @@ -14,19 +14,16 @@ const modelColumn = { } function init() { - Convenience.initTranslations(); + ExtensionUtils.initTranslations(); } -var FreonPrefsWidget = new GObject.Class({ - Name: 'Freon.Prefs.Widget', - GTypeName: 'FreonPrefsWidget', - Extends: Gtk.Grid, +var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget extends Gtk.Grid { - _init: function(params) { - this.parent(params); + _init() { + super._init(); this.margin = this.row_spacing = this.column_spacing = 20; - this._settings = Convenience.getSettings(); + this._settings = ExtensionUtils.getSettings(); let i = 0; @@ -83,9 +80,9 @@ var FreonPrefsWidget = new GObject.Class({ key: 'gpu-utility', y : i, x : 2, label: _('Video Card Temperature Utility') }); - }, + } - _addSwitch : function(params){ + _addSwitch(params){ let lbl = new Gtk.Label({label: params.label,halign : Gtk.Align.END}); this.attach(lbl, params.x, params.y, 1, 1); let sw = new Gtk.Switch({halign : Gtk.Align.END, valign : Gtk.Align.CENTER}); @@ -95,9 +92,9 @@ var FreonPrefsWidget = new GObject.Class({ sw.set_tooltip_text(params.help); } this._settings.bind(params.key, sw, 'active', Gio.SettingsBindFlags.DEFAULT); - }, + } - _addComboBox : function(params){ + _addComboBox(params){ let model = new Gtk.ListStore(); model.set_column_types([GObject.TYPE_STRING, GObject.TYPE_STRING]); @@ -112,12 +109,12 @@ var FreonPrefsWidget = new GObject.Class({ combobox.set_active(Object.keys(params.items).indexOf(this._settings.get_string(params.key))); - combobox.connect('changed', Lang.bind(this, function(entry) { + combobox.connect('changed', (entry) => { let [success, iter] = combobox.get_active_iter(); if (!success) return; this._settings.set_string(params.key, model.get_value(iter, 0)) - })); + }); this.attach(new Gtk.Label({ label: params.label, halign : Gtk.Align.END}), params.x, params.y, 1, 1); this.attach(combobox, params.x + 1, params.y, 1, 1); diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js index 1076168..a412d0d 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -1,45 +1,42 @@ -const Lang = imports.lang; const GLib = imports.gi.GLib; const Me = imports.misc.extensionUtils.getCurrentExtension(); const CommandLineUtil = Me.imports.commandLineUtil; -var SensorsUtil = new Lang.Class({ - Name: 'SensorsUtil', - Extends: CommandLineUtil.CommandLineUtil, +var SensorsUtil = class extends CommandLineUtil.CommandLineUtil { - _init: function() { - this.parent(); + constructor() { + super(); let path = GLib.find_program_in_path('sensors'); // -A: Do not show adapter -j: JSON output this._argv = path ? [path, '-A', '-j'] : null; - }, + } get temp() { return this._parseGenericSensorsOutput(/^temp\d+_input/, 'temp'); - }, + } get gpu() { return this._parseGpuSensorsOutput(/^temp\d+_input/, 'temp'); - }, + } get rpm() { return this._parseGenericSensorsOutput(/^fan\d+_input/, 'rpm'); - }, + } get volt() { return this._parseGenericSensorsOutput(/^in\d+_input/, 'volt'); - }, + } - _parseGenericSensorsOutput: function(sensorFilter, sensorType) { + _parseGenericSensorsOutput(sensorFilter, sensorType) { return this._parseSensorsOutput(sensorFilter, sensorType, false); - }, + } - _parseGpuSensorsOutput: function(sensorFilter, sensorType) { + _parseGpuSensorsOutput(sensorFilter, sensorType) { return this._parseSensorsOutput(sensorFilter, sensorType, true); - }, + } - _parseSensorsOutput: function(sensorFilter, sensorType, gpuFlag) { + _parseSensorsOutput(sensorFilter, sensorType, gpuFlag) { if(!this._output) return []; @@ -80,4 +77,4 @@ var SensorsUtil = new Lang.Class({ } return sensors; } -}); +}; diff --git a/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js b/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js index 351e108..3118c8b 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js @@ -1,18 +1,15 @@ -const Lang = imports.lang; const GLib = imports.gi.GLib; const Me = imports.misc.extensionUtils.getCurrentExtension(); const CommandLineUtil = Me.imports.commandLineUtil; -var smartctlUtil = new Lang.Class({ - Name: 'smartctlUtil', - Extends: CommandLineUtil.CommandLineUtil, +var smartctlUtil = class extends CommandLineUtil.CommandLineUtil { - _init: function() { + constructor() { this.parent(); let path = GLib.find_program_in_path('smartctl'); this._argv = path ? [path, '-x', '/dev/nvme0'] : null; - }, + } get temp() { if(!this._output) @@ -42,11 +39,11 @@ var smartctlUtil = new Lang.Class({ } return sensors; - }, + } get available(){ return true; - }, + } -}); +}; diff --git a/freon@UshakovVasilii_Github.yahoo.com/udisks2.js b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js index 1375cae..bb72eb4 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/udisks2.js +++ b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js @@ -1,4 +1,3 @@ -const Lang = imports.lang; const Gio = imports.gi.Gio; const UDisksDriveProxy = Gio.DBusProxy.makeProxyWrapper( @@ -18,7 +17,7 @@ const UDisksDriveAtaProxy = Gio.DBusProxy.makeProxyWrapper( // Poor man's async.js const Async = { // mapping will be done in parallel - map: function(arr, mapClb /* function(in, successClb)) */, resClb /* function(result) */) { + map(arr, mapClb /* function(in, successClb)) */, resClb /* function(result) */) { let counter = arr.length; let result = []; for (let i = 0; i < arr.length; ++i) { @@ -31,30 +30,29 @@ const Async = { } // routines for handling of udisks2 -var UDisks2 = new Lang.Class({ - Name: 'UDisks2', +var UDisks2 = class { - _init: function(callback) { + constructor(callback) { this.parent(); this._udisksProxies = []; - this._get_drive_ata_proxies(Lang.bind(this, function(proxies) { + this._get_drive_ata_proxies((proxies) => { this._udisksProxies = proxies; callback(); - })); + }); this._updated = true; - }, + } get available(){ return this._udisksProxies.length > 0; - }, + } get updated (){ return this._updated; - }, + } set updated (updated){ this._updated = updated; - }, + } // creates a list of sensor objects from the list of proxies given get temp() { @@ -67,10 +65,10 @@ var UDisks2 = new Lang.Class({ temp: proxy.ata.SmartTemperature - 273.15 }; }); - }, + } // calls callback with [{ drive: UDisksDriveProxy, ata: UDisksDriveAtaProxy }, ... ] for every drive that implements both interfaces - _get_drive_ata_proxies: function(callback) { + _get_drive_ata_proxies(callback) { Gio.DBusObjectManagerClient.new(Gio.DBus.system, 0, "org.freedesktop.UDisks2", "/org/freedesktop/UDisks2", null, null, function(src, res) { try { let objMgr = Gio.DBusObjectManagerClient.new_finish(res); //might throw @@ -107,9 +105,9 @@ var UDisks2 = new Lang.Class({ global.log('[FREON] Could not find UDisks2 objects: ' + e); } }); - }, + } - destroy: function(callback) { + destroy(callback) { for (let proxy of this._udisksProxies){ if(proxy.drive){ proxy.drive.run_dispose(); @@ -119,10 +117,10 @@ var UDisks2 = new Lang.Class({ } } this._udisksProxies = []; - }, + } - execute: function(callback) { + execute(callback) { this._updated = true; - }, + } -}); +}; From 98630647ddc04de8a4d419be97f86ed7773b8836 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Wed, 20 Mar 2019 22:11:27 +0300 Subject: [PATCH 137/224] update for gnome-shell 3.32 #126 --- .../bumblebeeNvidiaUtil.js | 4 +- .../convenience.js | 93 ------------------- .../extension.js | 18 ++-- .../nvidiaUtil.js | 2 +- .../smartctlUtil.js | 3 +- .../udisks2.js | 3 +- 6 files changed, 14 insertions(+), 109 deletions(-) delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/convenience.js diff --git a/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js index e0acec5..6ccc1c8 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js @@ -69,7 +69,7 @@ var BumblebeeNvidiaUtil = class extends CommandLineUtil.CommandLineUtil { execute(callback) { if(this._active) - this.parent(callback); + super.execute(callback); else this._output = []; } @@ -95,7 +95,7 @@ var BumblebeeNvidiaUtil = class extends CommandLineUtil.CommandLineUtil { } destroy(){ - this.parent(); + super.destroy(); this._lockMonitor.disconnect(this._lockMonitor.id); } diff --git a/freon@UshakovVasilii_Github.yahoo.com/convenience.js b/freon@UshakovVasilii_Github.yahoo.com/convenience.js deleted file mode 100644 index bbc8608..0000000 --- a/freon@UshakovVasilii_Github.yahoo.com/convenience.js +++ /dev/null @@ -1,93 +0,0 @@ -/* -*- mode: js; js-basic-offset: 4; indent-tabs-mode: nil -*- */ -/* - Copyright (c) 2011-2012, Giovanni Campagna - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of the GNOME nor the - names of its contributors may be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY - DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -const Gettext = imports.gettext; -const Gio = imports.gi.Gio; - -const Config = imports.misc.config; -const ExtensionUtils = imports.misc.extensionUtils; - -/** - * initTranslations: - * @domain: (optional): the gettext domain to use - * - * Initialize Gettext to load translations from extensionsdir/locale. - * If @domain is not provided, it will be taken from metadata['gettext-domain'] - */ -function initTranslations(domain) { - let extension = ExtensionUtils.getCurrentExtension(); - - domain = domain || extension.metadata['gettext-domain']; - - // check if this extension was built with "make zip-file", and thus - // has the locale files in a subfolder - // otherwise assume that extension has been installed in the - // same prefix as gnome-shell - let localeDir = extension.dir.get_child('locale'); - if (localeDir.query_exists(null)) - Gettext.bindtextdomain(domain, localeDir.get_path()); - else - Gettext.bindtextdomain(domain, Config.LOCALEDIR); -} - -/** - * getSettings: - * @schema: (optional): the GSettings schema id - * - * Builds and return a GSettings schema for @schema, using schema files - * in extensionsdir/schemas. If @schema is not provided, it is taken from - * metadata['settings-schema']. - */ -function getSettings(schema) { - let extension = ExtensionUtils.getCurrentExtension(); - - schema = schema || extension.metadata['settings-schema']; - - const GioSSS = Gio.SettingsSchemaSource; - - // check if this extension was built with "make zip-file", and thus - // has the schema files in a subfolder - // otherwise assume that extension has been installed in the - // same prefix as gnome-shell (and therefore schemas are available - // in the standard folders) - let schemaDir = extension.dir.get_child('schemas'); - let schemaSource; - if (schemaDir.query_exists(null)) - schemaSource = GioSSS.new_from_directory(schemaDir.get_path(), - GioSSS.get_default(), - false); - else - schemaSource = GioSSS.get_default(); - - let schemaObj = schemaSource.lookup(schema, true); - if (!schemaObj) - throw new Error('Schema ' + schema + ' could not be found for extension ' - + extension.metadata.uuid + '. Please check your installation.'); - - return new Gio.Settings({ settings_schema: schemaObj }); -} - diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index c8afdfd..1825f13 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -7,9 +7,10 @@ const Mainloop = imports.mainloop; const Clutter = imports.gi.Clutter; const Gio = imports.gi.Gio; const GLib = imports.gi.GLib; +const GObject = imports.gi.GObject; -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Convenience = Me.imports.convenience; +const ExtensionUtils = imports.misc.extensionUtils; +const Me = ExtensionUtils.getCurrentExtension(); const UDisks2 = Me.imports.udisks2; const AticonfigUtil = Me.imports.aticonfigUtil; const NvidiaUtil = Me.imports.nvidiaUtil; @@ -46,12 +47,11 @@ function _makeLogFunction(prefix) { } } -const FreonMenuButton = class extends PanelMenu.Button { +const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extends PanelMenu.Button { + _init() { + super._init(St.Align.START); - constructor(){ - super(St.Align.START); - - this._settings = Convenience.getSettings(); + this._settings = ExtensionUtils.getSettings(); var _debugFunc = _makeLogFunction('DEBUG'); this.debug = this._settings.get_boolean('debug') ? _debugFunc : () => {}; @@ -619,12 +619,12 @@ const FreonMenuButton = class extends PanelMenu.Button { get positionInPanel(){ return this._settings.get_string('position-in-panel'); } -}; +}); let freonMenu; function init(extensionMeta) { - Convenience.initTranslations(); + ExtensionUtils.initTranslations(); } function enable() { diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js index 8e2c4bb..35adb31 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js @@ -8,7 +8,7 @@ const CommandLineUtil = Me.imports.commandLineUtil; var NvidiaUtil = class extends CommandLineUtil.CommandLineUtil { constructor() { - this.parent(); + super(); let path = GLib.find_program_in_path('nvidia-settings'); this._argv = path ? [path, '-q', 'gpucoretemp', '-t'] : null; this._labels = []; diff --git a/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js b/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js index 3118c8b..43ceb26 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js @@ -6,7 +6,7 @@ const CommandLineUtil = Me.imports.commandLineUtil; var smartctlUtil = class extends CommandLineUtil.CommandLineUtil { constructor() { - this.parent(); + super(); let path = GLib.find_program_in_path('smartctl'); this._argv = path ? [path, '-x', '/dev/nvme0'] : null; } @@ -46,4 +46,3 @@ var smartctlUtil = class extends CommandLineUtil.CommandLineUtil { } }; - diff --git a/freon@UshakovVasilii_Github.yahoo.com/udisks2.js b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js index bb72eb4..5c7700f 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/udisks2.js +++ b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js @@ -33,7 +33,6 @@ const Async = { var UDisks2 = class { constructor(callback) { - this.parent(); this._udisksProxies = []; this._get_drive_ata_proxies((proxies) => { this._udisksProxies = proxies; @@ -49,7 +48,7 @@ var UDisks2 = class { get updated (){ return this._updated; } - + set updated (updated){ this._updated = updated; } From 985b5093d873cdbc34a89b1769f339cf89a15e07 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sun, 31 Mar 2019 21:54:00 +0300 Subject: [PATCH 138/224] fix amdgpu fan and voltage for lm_sensors #130 --- freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js index a412d0d..8e699e3 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -54,7 +54,7 @@ var SensorsUtil = class extends CommandLineUtil.CommandLineUtil { let sensors = []; for (var chipset in data) { let gpuFilter = /(radeon|amdgpu|nouveau)/; - if (!data.hasOwnProperty(chipset) || gpuFlag != gpuFilter.test(chipset)) + if (!data.hasOwnProperty(chipset) || (gpuFlag != gpuFilter.test(chipset) && sensorType === 'temp')) continue; let chipsetSensors = data[chipset] From d5b37692d90e87202741988b4350885dc934c2bb Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 4 Apr 2019 08:11:09 +0300 Subject: [PATCH 139/224] desplay menu if lm_sensors is not intstalled. fix #89 --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 1825f13..60ff2e3 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -114,6 +114,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._querySensors(); this._addTimer(); + this._updateUI(true); this._updateUITimeoutId = Mainloop.timeout_add(250, () => { this._updateUI(); // readd to update queue @@ -273,8 +274,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend } } - _updateUI(){ - let needUpdate = false; + _updateUI(needUpdate = false){ for (let sensor of Object.values(this._utils)) { if (sensor.available && sensor.updated) { this.debug(sensor + ' updated'); From 888ce3643e608fdeea400a4b57b0e2dbd69b9aab Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sun, 12 May 2019 18:53:28 +0300 Subject: [PATCH 140/224] remove error from command output #114 --- freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js | 6 ++++-- freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js | 8 +++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js index 63489ae..813fe59 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js @@ -28,6 +28,7 @@ var CommandLineUtil = class { let childWatch = GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, (pid, status, requestObj) => { let output = []; + let error_output = []; let [line, size] = [null, 0]; while (([line, size] = outReader.read_line(null)) != null && line != null) { @@ -38,12 +39,13 @@ var CommandLineUtil = class { while (([line, size] = errReader.read_line(null)) != null && line != null) { if(line) - output.push(ByteArray.toString(line)); + error_output.push(ByteArray.toString(line)); } stderr.close(null); GLib.source_remove(childWatch); this._output = output; + this._error_output = error_output; this._updated = true; callback(); }); @@ -59,7 +61,7 @@ var CommandLineUtil = class { get updated (){ return this._updated; } - + set updated (updated){ this._updated = updated; } diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js index 35adb31..d2f8e80 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js @@ -44,7 +44,13 @@ var NvidiaUtil = class extends CommandLineUtil.CommandLineUtil { } get temp() { - if(!this._output) + let output = []; + if(this._output) + output.push(...this._output) + if(this._error_output) + output.push(...this._error_output) + + if(output.length === 0) return []; let temps = []; for (let line of this._output) { From fa73baec2a0e0ae632a4a00410d7773b73ac4fb8 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Wed, 15 May 2019 16:17:13 +0300 Subject: [PATCH 141/224] fix invalid lm_sendsors JSON format #114 --- freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js index 8e699e3..46d3629 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -40,15 +40,18 @@ var SensorsUtil = class extends CommandLineUtil.CommandLineUtil { if(!this._output) return []; - // Prep output as one big string for JSON parser - let output = this._output.join(''); - let data = [] try { - data = JSON.parse(output); + data = JSON.parse(this._output.join('')); } catch (e) { + try { + // fix for wrong lm_sensors output + // https://github.com/UshakovVasilii/gnome-shell-extension-freon/issues/114#issuecomment-491613545 + data = JSON.parse(this._output.filter(l => l.trim() !== ',').join('')); + } catch (e) { global.log(e.toString()); return []; + } } let sensors = []; From e169842b3db20adce04aa887bbb002bf02eec43d Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 17 May 2019 07:53:45 +0300 Subject: [PATCH 142/224] fix for incorrect lm_sensors out #114 --- freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js index 46d3629..c0e9379 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -47,7 +47,9 @@ var SensorsUtil = class extends CommandLineUtil.CommandLineUtil { try { // fix for wrong lm_sensors output // https://github.com/UshakovVasilii/gnome-shell-extension-freon/issues/114#issuecomment-491613545 - data = JSON.parse(this._output.filter(l => l.trim() !== ',').join('')); + let lineRemoved = this._output.filter(l => l.trim() !== ',').join('\n'); + let errorRemoved = lineRemoved.replace(/ERROR.*Can't read/, ""); + data = JSON.parse(errorRemoved); } catch (e) { global.log(e.toString()); return []; From e559cb3e4cd93f6b81646cce30709c522e043a43 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 17 May 2019 14:04:14 +0300 Subject: [PATCH 143/224] fix for wrong lm_sensors error output #66 --- freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js | 1 + 1 file changed, 1 insertion(+) diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js index c0e9379..eb46617 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -49,6 +49,7 @@ var SensorsUtil = class extends CommandLineUtil.CommandLineUtil { // https://github.com/UshakovVasilii/gnome-shell-extension-freon/issues/114#issuecomment-491613545 let lineRemoved = this._output.filter(l => l.trim() !== ',').join('\n'); let errorRemoved = lineRemoved.replace(/ERROR.*Can't read/, ""); + errorRemoved = errorRemoved.replace(/ERROR.*I/O error/, ""); data = JSON.parse(errorRemoved); } catch (e) { global.log(e.toString()); From a006cea782f25595e91dcf5853f97535983ac4db Mon Sep 17 00:00:00 2001 From: iovxw Date: Thu, 23 May 2019 18:05:28 +0800 Subject: [PATCH 144/224] fix regular expression syntax error --- freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js index eb46617..50ff2bc 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -49,7 +49,7 @@ var SensorsUtil = class extends CommandLineUtil.CommandLineUtil { // https://github.com/UshakovVasilii/gnome-shell-extension-freon/issues/114#issuecomment-491613545 let lineRemoved = this._output.filter(l => l.trim() !== ',').join('\n'); let errorRemoved = lineRemoved.replace(/ERROR.*Can't read/, ""); - errorRemoved = errorRemoved.replace(/ERROR.*I/O error/, ""); + errorRemoved = errorRemoved.replace(/ERROR.*I\/O error/, ""); data = JSON.parse(errorRemoved); } catch (e) { global.log(e.toString()); From ef8c77c4e8ccc32f88d7990d097fa16a758e33b2 Mon Sep 17 00:00:00 2001 From: Paulo Richards Date: Sun, 21 Jul 2019 19:51:55 -0400 Subject: [PATCH 145/224] added nvme support through nvme-cli --- .../extension.js | 4 ++ .../nvmecliUtil.js | 50 +++++++++++++++++++ .../prefs.js | 2 +- 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 60ff2e3..11d5d4b 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -17,6 +17,7 @@ const NvidiaUtil = Me.imports.nvidiaUtil; const HddtempUtil = Me.imports.hddtempUtil; const SensorsUtil = Me.imports.sensorsUtil; const smartctlUtil = Me.imports.smartctlUtil; +const nvmecliUtil = Me.imports.nvmecliUtil; const BumblebeeNvidiaUtil = Me.imports.bumblebeeNvidiaUtil; const FreonItem = Me.imports.freonItem; @@ -199,6 +200,9 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend case 'smartctl': this._utils.disks = new smartctlUtil.smartctlUtil(); break; + case 'nvmecli': + this._utils.disks = new nvmecliUtil.nvmecliUtil(); + break; } } diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js new file mode 100644 index 0000000..c5476a9 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js @@ -0,0 +1,50 @@ +const GLib = imports.gi.GLib; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); + +function getNvmeData (argv){ + const nvme = GLib.find_program_in_path('nvme') + return JSON.parse(GLib.spawn_command_line_sync(`${nvme} ${argv} -o json`)[1].toString()) +} + +var nvmecliUtil = class { + constructor(callback) { + this._nvmeDevices = []; + try { + this._nvmeDevices = getNvmeData("list")["Devices"] + } catch (e) { + global.log('[FREON] Unable to find nvme devices: ' + e); + } + this._updated = true; + } + + get available(){ + return this._nvmeDevices.length > 0; + } + + get updated (){ + return this._updated; + } + + set updated (updated){ + this._updated = updated; + } + + get temp() { + return this._nvmeDevices.map(device => { + return { + label: device["ModelNumber"], + temp: parseFloat(getNvmeData(`smart-log ${device["DevicePath"]}`).temperature) - 273.15 + } + }) + } + + destroy(callback) { + this._nvmeDevices = []; + } + + execute(callback) { + this._updated = true; + } + +}; diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index a1b8515..91a126b 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -66,7 +66,7 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex help : _("Works if you have more than three voltage sensors")}); this._addComboBox({ - items : {none : 'None', hddtemp : 'Hddtemp', udisks2 : 'UDisks2', smartctl : 'smartctl'}, + items : {none : 'None', hddtemp : 'Hddtemp', udisks2 : 'UDisks2', smartctl : 'smartctl', nvmecli : 'nvme-cli'}, key: 'drive-utility', y : i, x : 0, label: _('HDD/SSD Temperature Utility') }); From fbe95b3b4f20dd59551669ae06efb6db35fa7732 Mon Sep 17 00:00:00 2001 From: Volha Alex Date: Thu, 19 Sep 2019 18:02:04 +0300 Subject: [PATCH 146/224] Added lines for translation that are missing. Update ru and uk_UA translations. --- .../locale/ru/LC_MESSAGES/freon.mo | Bin 2950 -> 3233 bytes .../locale/uk_UA/LC_MESSAGES/freon.mo | Bin 3176 -> 3250 bytes .../po/freon.pot | 8 +++ .../po/ru.po | 53 +++++++++++++----- .../po/uk_UA.mo | Bin 3176 -> 0 bytes .../po/uk_UA.po | 18 ++++-- 6 files changed, 60 insertions(+), 19 deletions(-) delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.mo diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/ru/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/ru/LC_MESSAGES/freon.mo index 7bb7a4781cac42a95eeb13856a18149867383fc5..c2f6d5cffb3b7a8e5547b46d2d533a275a570d98 100644 GIT binary patch delta 1258 zcmZ|NPiS049Ki9(Hk))eQEQvOMw`L5iX@x7ZAkOS7-$o;8)GSL5V4f7p|44Fvr9KG ztsbQ{k??JLp$v3XJ+1; z`Tb_*E!3{mPyeyIbXid}^?9i!N;Qcg{wTLFjJL5If7hIS}b zi?z51Td@KAuoQ=p^`_Ms8Zt4p{a_M@>3@JP;%``o5Aa#6Vzwmo67Irgltf;`r}6l9 ze;DiOXHhn`h?2-9lzBzmOMJCSLw5ETw&Q;o$0njIa~h{n7XFtkBN*ak=~tozZa_JK z7L)`#a4#mX7ss#%FXEec7o+GfsgC&SRT^>vL))IhRr({C#CoDiLLZ^V@30a#Q4;ta zyYX+7K(DZR8=l2Z{2Y(q&v*c9Dz?UZaQYnvrfA5WZK53gpLiPkh{6E`*~-qIqLO^D zJ2^_ZUrAh!w~;DEPDYNG+X_wvf@Eu?L1F2KOoR?K^toxz&8jyt+T%Co>esVwCao`wzdvri4kbzl-Lsy#7rGff zF+MuxeSdj}SF)=;7I$LKAsz4NcG_c3n{mQ*hr41tJ#=Dlzxe6ZzUOPjeLJ|9sB&S<+~ue6#^${OEN zN2Vr5QtpWB>Lz{c?L>d#uC$<&9Fp0Z!r4ec-3ye;~3{)|5_BYA&@fgk)iThO*> zbHSFjc4uta$NTL!^2n~+0_L>6X4m~CiFhNJc#X;H=G|yxvp(A2-+J<7zp^X5owrwQ zPT4PP&aU~hEO4FHy1ytP{3Y{k`M#27^JDoc|Fb(+DprE!ax%&2$nlyl3C5-fk+ZAJ znDZC4KWolKULJVdBi3Kz{UWjEw{~G~FtaGh*@CicCt>PcIx W*5p-S=XqkRki?)gL;C zndmK1supK(CqBk1e1(#zh}+S2$KSDz@g~aUD>+pXA3@pIjtB4($_0k-1WsTaU*fDM ztJDS^*)YcSD)2T+1@5CHUO@SUYuJu9p2jLpjo<~>8_1G+;hM(<#_#Y74swVj{)84v zvTE|HLv)gO92;>M<>n8t0T;0Yzq#Z3fKqLY&$?d6-HhjvlBzYlj7>qMsvsqnkP=tYINNzH?xe`4cF-hv4d+?pzp#f!ah>W) zWhA7MD%_VI8C2m+II6#Rn{=q8OZSz0m_JsU@l>@&Vu?s1X2nk?6D>z$3H`dP_V7QG zEpaAevB3G%(7npBhYB+V2|<#iMP}R#q}&k)CvFD03|}Hk@W{$~RHF_5Gxk z9uIH>%M{I=)okfszJod!tnr$>-tgAztL0N2U7elH-QAs*eaoIPOJ>C^Vcs&U>?t^d zqCL$*!OWYyGEYq2EZaAkSf#gO-!ldMEEtj#yZsG%(!Z#q6*;|LanY00X9A7ZL$mCh xv@C}ftAJR(Sra0 diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/uk_UA/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/uk_UA/LC_MESSAGES/freon.mo index 4af773fd4a697311a0a8936a2547949abd13fc26..aa8879e578754697da2301474de31efcd379fcf5 100644 GIT binary patch delta 830 zcmYk)K}b|V9LMq5r|za(Y3t@&t+iKF5bKibYPCup5|ui6NXdh2hZd3~!33krN?kqq zP`nj_2RlUDBILnCr>sN0hlf1nA%Z*v5h#I|zQ5-Z4Lg2j)}5LE|3C91@us=>HCDY~ zXb%0fddQfRwD?2Y#2Wm75&T^73&xo5;1T?dVLZS%T2;o_Xk#N@##7jb)tE>2E1G)@ zv~Z&Gk4Kni{us~UHYV@@PhgzY3g{v>U>hos>v$Z8D)T%xGoL~wHirsi6}4^yTRGo+ zVxY`^Vi)dV22-4}L^Z}R%6y+Fm8r##bx;&_a0}}DG}hx4Y{dcW#sYTW3%rS2sP#z} zHF3UaW1tH3VIAJWcQ}l<(XKrVYy!_SUq)r{9xvfGUPFt;z1V|Ue1e_$3WxC5tI~KFCg`)cq=OmG=x?P5US~ZY!t?7`8D@ z8qnDKUu&UA!9)+^|Hcgjk0^<{Lp8kt5;Z634qb0R<>tMan7eA-XqGoVYlXEgxySuWf_N@D|W+l|&4uwA^pL=WmtheT^`%k^MjF~o?##&rK7e7_pz()38@B;q87#`wfJi#V(s?A!l1#7T?dd~pz|DxTk+!)14 zZalzte2W>}!v;J;CGro`c!o+K&08;G2WnryERLWGnnWcsje2eouVV>a;@c*RelBcd z9#8QlUGRuj$9{)2RpB>OpfW1ZugZ0mlVTsoAKD_ zFiw&R%U-r8;+wYfJ^C&ZrQu zW+tCV&Pd*f8?^+Yp>}h;QTxxY@L_7HE(ITh&%sJK8!QKF{#@c`ELaa`!>9gmGVAZV!~T9<`9DHF BSE2v_ diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/freon.pot b/freon@UshakovVasilii_Github.yahoo.com/po/freon.pot index 253c22a..cafa337 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/freon.pot +++ b/freon@UshakovVasilii_Github.yahoo.com/po/freon.pot @@ -134,3 +134,11 @@ msgstr "" #: prefs.js:49 msgid "Right" msgstr "" + +#: extension.js:479 +msgid "Go to the Freon wiki" +msgstr "" + +#: extension.js:486 +msgid "Sensor Settings" +msgstr "" \ No newline at end of file diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/ru.po b/freon@UshakovVasilii_Github.yahoo.com/po/ru.po index a9dfd23..31a2fb9 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/ru.po +++ b/freon@UshakovVasilii_Github.yahoo.com/po/ru.po @@ -2,16 +2,17 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-02-20 19:23+0200\n" -"PO-Revision-Date: 2016-02-20 19:31+0200\n" +"POT-Creation-Date: 2015-10-06 17:05-0300\n" +"PO-Revision-Date: 2019-09-19 17:58+0300\n" +"Last-Translator: \n" "Language-Team: \n" +"Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.6\n" -"Last-Translator: \n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"Language: ru\n" +"X-Generator: Poedit 2.2.3\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: bumblebeeNvidiaUtil.js:75 prefs.js:82 msgid "Bumblebee + NVIDIA" @@ -19,16 +20,16 @@ msgstr "Bumblebee + NVIDIA" #: extension.js:319 msgid "Average" -msgstr "Средняя температура" +msgstr "Средняя" #: extension.js:320 msgid "Maximum" -msgstr "Максимальная температура" +msgstr "Максимальная" #: extension.js:341 #, javascript-format msgid "%drpm" -msgstr "%d об / мин" +msgstr "%d об/мин" #: extension.js:350 #, javascript-format @@ -49,7 +50,7 @@ msgstr "" #: extension.js:488 msgid "Temperature Sensors" -msgstr "Датчик температуры" +msgstr "Датчики температуры" #: extension.js:495 msgid "Voltage" @@ -81,15 +82,15 @@ msgstr "Позиция на панели" #: prefs.js:55 msgid "Show Icon on Panel" -msgstr "Иконка на панели" +msgstr "Отображать иконку на панели" #: prefs.js:58 msgid "Show Fan Speed" -msgstr "Скорость вентилятора" +msgstr "Отображать скорость вентилятора" #: prefs.js:61 msgid "Show Power Supply Voltage" -msgstr "Напряжение питания" +msgstr "Отображать напряжение питания" #: prefs.js:64 msgid "Group Temperature Items" @@ -109,7 +110,7 @@ msgstr "Работает если у вас более трёх датчиков #: prefs.js:74 msgid "HDD/SSD Temperature Utility" -msgstr "HDD/SSD утилита мониторинга" +msgstr "Утилита для определения температуры HDD/SSD" #: prefs.js:79 msgid "None" @@ -125,4 +126,26 @@ msgstr "Catalyst" #: prefs.js:84 msgid "Video Card Temperature Utility" -msgstr "Утилита мониторинга видеокарт" +msgstr "Утилита для определения температуры видеокарты" + +#: prefs.js:49 +msgid "Left" +msgstr "Слева" + +#: prefs.js:49 +msgid "Center" +msgstr "По центру" + +#: prefs.js:49 +msgid "Right" +msgstr "Справа" + +#: extension.js:479 +msgid "Go to the Freon wiki" +msgstr "Перейти на wiki Freon" + +#: extension.js:486 +#, fuzzy +#| msgid "Sensors Settings" +msgid "Sensor Settings" +msgstr "Настройки" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.mo b/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.mo deleted file mode 100644 index 4af773fd4a697311a0a8936a2547949abd13fc26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3176 zcmb`HTWl0n7{`x@7b*&(pm;r~MH-kgyQNSU76QG%Mv5ESuDsP@_q01QJF}TNTWI8g zwsJ9PtfDp=1wwo@(YDe{TDs_y8WVHo!51Hhi4P_w#z*4|`u}ET=^_P9bkpf?=FItS z|L;3F;gf#cvk;B>?*;3_Ot(0NxG$1U>@( z0zL#Txs$QS!8PDgFbLcU zffN)+M#6|H?W>5#fR^!5W zFr>~9HqZkIexx;88)zS{U?wX!#M+!&EU;Rywm#mIVY~Z;YxD}Xr&Ks>iNiwhjr>3+ z)souHnhj}K{hnma!j{5idtIkgvr@}s8A^M0q~^2nMyC0Q)Vbrt_^$*#Q8azcu%+I3!qfY3Y}5{lK9jsH>}%5Wm=qi{XK)mrVWlf#T8c++81)*RCI3Y$(6<&kzo4(*NC z>-7yaX{+QKme%ID1uwzvV({oC8@BWCHo3vBjp@l`jIUqM=~iEtjK%mau5)b1^Uh?v z@@hwN3*815`i_{+j~@?But%?hO$;{iy6rXiE~v5^-|U}M6VcZ}on`8xn)FYoNp(rh z`y;pgN~p8kKZTw1{-A%tA7$ztU`SoTHKE4*K{dnib`IC&a2FP^N{?59AlTy%A=u2n zGF9_x49+RU=VbCRMNo78C^*KE@0>rv5qU;U(^mg91*IZx5tK)tET%s6M`2ec*Zygy zK0=&Xe*lgy<8IC$CU=$ZmO6)kBWe~a>TRTQ$sgvZaSZ#hwh0ON1C$VK%D6{z*iijp zQ=h^48>$>=$FXgaaxX)YGUAohl$wMWDgfod>wM%R&}wiKCtEengZ=Oy*j~oYKyJtb z&lDGl4WOLCz#bVP3pk@@4Fr{<;&r#EU^>uwi0X)9BgiCNO(OF_vcAa`CrP3&sydI{ zkWbYZR7a+%m<{SgWqd>MYPOE43s{>A>qqs}HWGpABrP#VG+`G|-&l38&f$^NKU0Yp z*;YrS?uP!+AvIlD-hp^r##Fe~7CoOz1>#z5=}#&lG;>BoEQJ&G@g=j6+k( zIy^7b*=hyKI9!;ZKm}Ac6nqdWQ*)aGd>&zDP{@pbs&WizDk&VaSoF;Q=K~zhIh+St zAr{1EibkUHnSlPm$RMdV{daMAFs9+*g9`MK8sKUi4Z3oA}Q>;M1& diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po b/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po index c51e190..4f41d8f 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po +++ b/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po @@ -3,14 +3,14 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-10-06 17:05-0300\n" -"PO-Revision-Date: 2018-01-15 09:36+0200\n" +"PO-Revision-Date: 2019-09-19 17:53+0300\n" "Last-Translator: \n" "Language-Team: \n" "Language: uk_UA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.3\n" +"X-Generator: Poedit 2.2.3\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" @@ -74,7 +74,7 @@ msgstr "Показувати одну цифру після десятковог #: prefs.js:45 msgid "Temperature Unit" -msgstr "Одиниця вимиру температури" +msgstr "Одиниця виміру температури" #: prefs.js:51 msgid "Position in Panel" @@ -82,7 +82,7 @@ msgstr "Положення на панелі" #: prefs.js:55 msgid "Show Icon on Panel" -msgstr "Відображати значок на панелі" +msgstr "Показувати значок на панелі" #: prefs.js:58 msgid "Show Fan Speed" @@ -139,3 +139,13 @@ msgstr "В центрі" #: prefs.js:49 msgid "Right" msgstr "Праворуч" + +#: extension.js:479 +msgid "Go to the Freon wiki" +msgstr "Перейти на wiki Freon" + +#: extension.js:486 +#, fuzzy +#| msgid "Sensors Settings" +msgid "Sensor Settings" +msgstr "Налаштування сенсорів" From 1e43e21011eaafdd5f5230e81d487e211f1d2993 Mon Sep 17 00:00:00 2001 From: l3nn4rt Date: Mon, 23 Sep 2019 12:42:24 +0200 Subject: [PATCH 147/224] Fix missing gschema compilation --- deploy.sh | 1 + .../schemas/gschemas.compiled | Bin 972 -> 969 bytes makeZip.sh | 1 + 3 files changed, 2 insertions(+) diff --git a/deploy.sh b/deploy.sh index b292548..d20ac64 100755 --- a/deploy.sh +++ b/deploy.sh @@ -1,5 +1,6 @@ #!/bin/sh NAME=freon@UshakovVasilii_Github.yahoo.com +glib-compile-schemas $NAME/schemas rm -rf ~/.local/share/gnome-shell/extensions/$NAME cp -r $NAME ~/.local/share/gnome-shell/extensions/. diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled index 62f47770f460621c22f58e1c1d78831d7dd5ad16..25f97dc14b275f9ecb494fec3b7ad68396176485 100644 GIT binary patch literal 969 zcmYjQJ#5oJ7(F0?LQ+Z*NFWBf014n&FrZ4P8;Bq=7Y2}ZwXe>p_Sv$}X)3jBzyJec zVW~tHM8yOHGhGlrQg=ocHWs!Hpz@v_1E)N{r|0i--{)EoLe) z44uNGUOaCf&;a(2aR5wA00)5&HDKfP=41NQlklH{*MY6I`z_W@-Gsjh-Uj?D52qPVeH8vT@OR+Hsoe|o zsp;>4e*?j#g%$eL%x40H9s#ZwAD8J?}&- zWND1o=x=ACJ4mdPqoqlfd!8JsOoqzygy+R_1a2P_9hrB-EGbgQsyIb}Ei(0Ye~{^+ zatf;>ZCB_DQ3N_)$}gj#dAFBJJE&~oVwl`=nA~!h+<(L5mc!&C$1+LnC&s}ql}1HX zo~0isU&k_XhB7Lc0`f1?Kw9Nk9jhkK>F915I!q#qQfQTRRu%l`j{U;u`r`P?SRH0E zz%Ha-&L}>cI1HfW*44+dm%C%4sZtkGEfUeh$!S8 NrbYeLOk%1N{{Z0e#{&QW literal 972 zcmY*YziSjh7@g>yM(<*XC`3fG5WT2-8->`|q)=24?1CV&&fQM-Mt5hH-Py|p)XpDZ zCxVS&8ZnKaomQp^2GQQe|G+{E!9s}d?d@S4_VFHXznS@F=k3J>nQ3X9sKzw-+EBN) zjZE;3XA8&2s&_}kB{6_Lih}xnAvQ7Ax3l<)*Z_Y9Y!{(!>6zGsoBpgcn(-U@Zt`A z>Kgoc@KxYk_gITQHP3Yud>)VOtd;PJ?p$2*J-mn2xMPnGEzYxf*_FtaC4t%$$TctY>|3SB`FGAktudj z&JQ!)S6<K0rSg%`Tqju zmjUz9cezlgx;l}u*Ozg@7SMl@hSDj|=|t7JTuTr4?AzGkD74BxhbP$LR(@gh=!fYl z<8+kC5VO#FYIE(7a!*&CXFBSk7O#ZZgLUya%M2q5Wv2O0G1tsI2lLOo?*^FtC@uc` SP{x|!PNC`)5ej%762@Ob3C4r~ diff --git a/makeZip.sh b/makeZip.sh index 6cd5d0b..ab6bb04 100755 --- a/makeZip.sh +++ b/makeZip.sh @@ -1,5 +1,6 @@ #!/bin/sh NAME=freon@UshakovVasilii_Github.yahoo.com +glib-compile-schemas $NAME/schemas cd $NAME zip -r $NAME.zip * cd .. From 1115b6a3e4b2ae6325a2d0578cd781ff760ceaee Mon Sep 17 00:00:00 2001 From: l3nn4rt Date: Mon, 23 Sep 2019 12:48:46 +0200 Subject: [PATCH 148/224] Do not track gschemas.compiled Better to rebuild this every time --- .gitignore | 1 + .../schemas/gschemas.compiled | Bin 969 -> 0 bytes 2 files changed, 1 insertion(+) delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled diff --git a/.gitignore b/.gitignore index c4c4ffc..9bec7b1 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ *.zip +freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled deleted file mode 100644 index 25f97dc14b275f9ecb494fec3b7ad68396176485..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 969 zcmYjQJ#5oJ7(F0?LQ+Z*NFWBf014n&FrZ4P8;Bq=7Y2}ZwXe>p_Sv$}X)3jBzyJec zVW~tHM8yOHGhGlrQg=ocHWs!Hpz@v_1E)N{r|0i--{)EoLe) z44uNGUOaCf&;a(2aR5wA00)5&HDKfP=41NQlklH{*MY6I`z_W@-Gsjh-Uj?D52qPVeH8vT@OR+Hsoe|o zsp;>4e*?j#g%$eL%x40H9s#ZwAD8J?}&- zWND1o=x=ACJ4mdPqoqlfd!8JsOoqzygy+R_1a2P_9hrB-EGbgQsyIb}Ei(0Ye~{^+ zatf;>ZCB_DQ3N_)$}gj#dAFBJJE&~oVwl`=nA~!h+<(L5mc!&C$1+LnC&s}ql}1HX zo~0isU&k_XhB7Lc0`f1?Kw9Nk9jhkK>F915I!q#qQfQTRRu%l`j{U;u`r`P?SRH0E zz%Ha-&L}>cI1HfW*44+dm%C%4sZtkGEfUeh$!S8 NrbYeLOk%1N{{Z0e#{&QW From 81d2e97f7e6abcfd2eebf0643b89b59696835722 Mon Sep 17 00:00:00 2001 From: l3nn4rt Date: Mon, 23 Sep 2019 13:24:21 +0200 Subject: [PATCH 149/224] Add a central column to the preferences grid Shift all items in column 2 to column 3; column 2 is now empty, so there is no visual change to the preferences window. Note: gschema compilation needed. --- freon@UshakovVasilii_Github.yahoo.com/prefs.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 91a126b..cd4ab67 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -38,7 +38,7 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex this._addComboBox({ items : {centigrade : "\u00b0C", fahrenheit : "\u00b0F"}, - key: 'unit', y : i++, x : 2, + key: 'unit', y : i++, x : 3, label: _('Temperature Unit') }); @@ -48,20 +48,20 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex label: _('Position in Panel') }); - this._addSwitch({key : 'show-icon-on-panel', y : i++, x : 2, + this._addSwitch({key : 'show-icon-on-panel', y : i++, x : 3, label : _('Show Icon on Panel')}); this._addSwitch({key : 'show-fan-rpm', y : i, x : 0, label : _('Show Fan Speed')}); - this._addSwitch({key : 'show-voltage', y : i++, x : 2, + this._addSwitch({key : 'show-voltage', y : i++, x : 3, label : _('Show Power Supply Voltage')}); this._addSwitch({key : 'group-temperature', y : i, x : 0, label : _('Group Temperature Items'), help : _("Works if you have more than three temperature sensors")}); - this._addSwitch({key : 'group-voltage', y : i++, x : 2, + this._addSwitch({key : 'group-voltage', y : i++, x : 3, label : _('Group Voltage Items'), help : _("Works if you have more than three voltage sensors")}); @@ -77,7 +77,7 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex 'nvidia-settings' : _('NVIDIA'), 'aticonfig' : _('Catalyst'), 'bumblebee-nvidia-smi': _('Bumblebee + NVIDIA') }, - key: 'gpu-utility', y : i, x : 2, + key: 'gpu-utility', y : i, x : 3, label: _('Video Card Temperature Utility') }); } From ac768a748c6fe66e2861ce8334f6fdb1304422c8 Mon Sep 17 00:00:00 2001 From: l3nn4rt Date: Mon, 23 Sep 2019 13:43:30 +0200 Subject: [PATCH 150/224] Add `panel-box-index` to preferences grid It does nothing; it's placed next to the `position-in-panel` ComboBox and binded to the settings gschema. Note: gschema compilation needed. --- freon@UshakovVasilii_Github.yahoo.com/prefs.js | 4 ++++ .../schemas/org.gnome.shell.extensions.sensors.gschema.xml | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index cd4ab67..12296d5 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -48,6 +48,10 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex label: _('Position in Panel') }); + let panelBoxIndex = Gtk.SpinButton.new_with_range (-1, 20, 1); + this.attach(panelBoxIndex, 2, i, 1, 1); + this._settings.bind('panel-box-index', panelBoxIndex, 'value', Gio.SettingsBindFlags.DEFAULT); + this._addSwitch({key : 'show-icon-on-panel', y : i++, x : 3, label : _('Show Icon on Panel')}); diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml index 72cee4f..d14f84b 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml +++ b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml @@ -63,6 +63,12 @@ Position in Panel ('left', 'center', 'right') + + 0 + Index in panel box + Index within the selected panel box (0: first, 1: second, ..., -1: last) + + true Group temperature menu items From 39d844a32458a8decfe45c78c417342d1816cc55 Mon Sep 17 00:00:00 2001 From: l3nn4rt Date: Mon, 23 Sep 2019 14:21:00 +0200 Subject: [PATCH 151/224] Update extension position with `panel-box-index` Let the user to chose where to place the extension button within each panel box. From the left (with default orientation, otherwise from the right) as: - 0, first - 1, second - ... - -1, last Note: gschema compilation needed. --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 11d5d4b..03c4652 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -106,6 +106,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._addSettingChangedSignal('drive-utility', this._driveUtilityChanged.bind(this)); this._addSettingChangedSignal('gpu-utility', this._gpuUtilityChanged.bind(this)); this._addSettingChangedSignal('position-in-panel', this._positionInPanelChanged.bind(this)); + this._addSettingChangedSignal('panel-box-index', this._positionInPanelChanged.bind(this)); this._addSettingChangedSignal('group-temperature', this._querySensors.bind(this)) this._addSettingChangedSignal('group-voltage', this._rerender.bind(this)) @@ -161,7 +162,8 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend }; let p = this.positionInPanel; - boxes[p].insert_child_at_index(this.container, p == 'right' ? 0 : -1) + let i = this._settings.get_int('panel-box-index'); + boxes[p].insert_child_at_index(this.container, i); } _showIconOnPanelChanged(){ From 387b7cbe23a80bf7aa942c548003c2c1cae0cb1a Mon Sep 17 00:00:00 2001 From: l3nn4rt Date: Mon, 23 Sep 2019 20:20:43 +0200 Subject: [PATCH 152/224] Enable extension at the right index Bug: enabling does spawn the extension at wrong index. Fix: update the position when enabling. --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 03c4652..9521d40 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -635,8 +635,8 @@ function init(extensionMeta) { function enable() { freonMenu = new FreonMenuButton(); - let positionInPanel = freonMenu.positionInPanel; - Main.panel.addToStatusArea('freonMenu', freonMenu, positionInPanel == 'right' ? 0 : -1, positionInPanel); + Main.panel.addToStatusArea('freonMenu', freonMenu); + freonMenu._positionInPanelChanged(); } function disable() { From b821805f2ac75f9979431f346c835666ba072963 Mon Sep 17 00:00:00 2001 From: Jonas Malaco Date: Thu, 26 Sep 2019 16:58:34 -0300 Subject: [PATCH 153/224] Construct FreonItem through GObject.registerClass GNOME/gjs@72062b5e0368 ("object: Throw if constructing an unregistered object inheriting from GObject") started to enforce proper GObject inheritance through registerClass: > When a class inherits from a GObject class, it must be always registered > using GObject.registerClass, however gjs was accepting this silently [...] Closes: #146 ("Broken on 3.34") See also: [GNOME/gjs/doc/Mapping.md] [GNOME/gjs/doc/Mapping.md]: https://gitlab.gnome.org/GNOME/gjs/blob/57ba26807271a9b4fdd0f4bb5a8c9bad776d98d4/doc/Mapping.md --- freon@UshakovVasilii_Github.yahoo.com/freonItem.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js index 8e996cb..05d623d 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js +++ b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js @@ -1,10 +1,11 @@ -const St = imports.gi.St; +const GObject = imports.gi.GObject; const PopupMenu = imports.ui.popupMenu; +const St = imports.gi.St; -var FreonItem = class extends PopupMenu.PopupBaseMenuItem { +var FreonItem = GObject.registerClass(class FreonItem extends PopupMenu.PopupBaseMenuItem { - constructor(gIcon, key, label, value, displayName) { - super(); + _init(gIcon, key, label, value, displayName) { + super._init(); this._main = false; this._key = key; this._gIcon = gIcon; @@ -43,4 +44,4 @@ var FreonItem = class extends PopupMenu.PopupBaseMenuItem { set value(value) { this._valueLabel.text = value; } -}; +}); From f83688a197990ff7b8340bfc95ea4598c7781857 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sun, 29 Sep 2019 10:59:43 +0300 Subject: [PATCH 154/224] update gnome version --- freon@UshakovVasilii_Github.yahoo.com/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index 30dd7d4..d8d1e34 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": ["3.32"], + "shell-version": ["3.34"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", "description": "Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", From dbcd29a5a6d82692d237f35b9e906fdd6d0df7a8 Mon Sep 17 00:00:00 2001 From: Jonas Malaco Date: Sun, 15 Dec 2019 13:27:11 -0300 Subject: [PATCH 155/224] Remove deprecated use of Actor.actor In Gnome 3.34 accessing .actor results in a warning: Usage of object.actor is deprecated for Freon_FreonMenuButton get@resource:///org/gnome/shell/ui/environment.js:249:29 _init@[...]/freon@UshakovVasilii_Github.yahoo.com/extension.js:96:9 enable@[...]/freon@UshakovVasilii_Github.yahoo.com/extension.js:637:17 _callExtensionEnable@resource:///org/gnome/shell/ui/extensionSystem.js:148:13 loadExtension@resource:///org/gnome/shell/ui/extensionSystem.js:280:21 _loadExtensions/<@resource:///org/gnome/shell/ui/extensionSystem.js:490:13 collectFromDatadirs@resource:///org/gnome/shell/misc/fileUtils.js:27:17 _loadExtensions@resource:///org/gnome/shell/ui/extensionSystem.js:469:9 _enableAllExtensions@resource:///org/gnome/shell/ui/extensionSystem.js:499:13 _sessionUpdated@resource:///org/gnome/shell/ui/extensionSystem.js:530:13 init@resource:///org/gnome/shell/ui/extensionSystem.js:48:9 _initializeUI@resource:///org/gnome/shell/ui/main.js:242:5 start@resource:///org/gnome/shell/ui/main.js:138:5 @
:1:31 The actor property is no longer needed, as Freon_FreonMenuButton already is an Actor. Additionally, we only support old Gnome versions on the Freon versions of the same era, so we do not need to worry about backwards compatibility (see #153). Reported-by: @49studebaker Fixes: #156 ("JS WARNING: " [...]) Related: https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/487 ("this.actor = this removal") --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 9521d40..aea1033 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -93,7 +93,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._createInitialIcon(); } - this.actor.add_actor(this._menuLayout); + this.add_actor(this._menuLayout); this._settingChangedSignals = []; this._addSettingChangedSignal('update-time', this._updateTimeChanged.bind(this)); From 98b787e44fb7ee31a33351dac7f1f26271fa9886 Mon Sep 17 00:00:00 2001 From: "Erdem U. Altinyurt" Date: Fri, 10 Jan 2020 03:41:42 +0300 Subject: [PATCH 156/224] Added 2nd sensor and detection for nvme-cli. --- .../nvmecliUtil.js | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js index c5476a9..ae2ea93 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js @@ -31,13 +31,22 @@ var nvmecliUtil = class { } get temp() { - return this._nvmeDevices.map(device => { - return { - label: device["ModelNumber"], - temp: parseFloat(getNvmeData(`smart-log ${device["DevicePath"]}`).temperature) - 273.15 + let sensors = []; + for (let device of this._nvmeDevices) { + var smart_log = getNvmeData(`smart-log ${device["DevicePath"]}`); + if( smart_log.hasOwnProperty('temperature_sensor_2') ){ + sensors.push({ label: device["ModelNumber"] + " S1", + temp: parseFloat(smart_log.temperature_sensor_1) - 273.15 }); + sensors.push({ label: device["ModelNumber"] + " S2", + temp: parseFloat(smart_log.temperature_sensor_2) - 273.15 }); + } + else{ + sensors.push({ label: device["ModelNumber"], + temp: parseFloat(smart_log.temperature) - 273.15 }); } - }) - } + } + return sensors; + } destroy(callback) { this._nvmeDevices = []; From b6e56f0f4aada7f22ab6a9bf429d37454414763d Mon Sep 17 00:00:00 2001 From: "Erdem U. Altinyurt" Date: Fri, 10 Jan 2020 03:52:48 +0300 Subject: [PATCH 157/224] Rewriten smartctl for all devices, (using nvmeUtil as a template). --- .../smartctlUtil.js | 69 ++++++++++--------- 1 file changed, 36 insertions(+), 33 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js b/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js index 43ceb26..03d469b 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js @@ -1,48 +1,51 @@ const GLib = imports.gi.GLib; const Me = imports.misc.extensionUtils.getCurrentExtension(); -const CommandLineUtil = Me.imports.commandLineUtil; - -var smartctlUtil = class extends CommandLineUtil.CommandLineUtil { - - constructor() { - super(); - let path = GLib.find_program_in_path('smartctl'); - this._argv = path ? [path, '-x', '/dev/nvme0'] : null; +const ByteArray = imports.byteArray; +function getSmartData (argv){ + const smartctl = GLib.find_program_in_path('smartctl') + return JSON.parse(ByteArray.toString( GLib.spawn_command_line_sync(`${smartctl} ${argv} -j`)[1] )) +} + +var smartctlUtil = class { + constructor(callback) { + this._smartDevices = []; + try { + this._smartDevices = getSmartData("--scan")["devices"] + global.log('[FREON] test devices: ' + e); + } catch (e) { + global.log('[FREON] Unable to find smart devices: ' + e); + } + this._updated = true; } - get temp() { - if(!this._output) - return []; + get available(){ + return this._smartDevices.length > 0; + } - let smartctlOutput = []; - smartctlOutput = this._output; + get updated (){ + return this._updated; + } - let sensors = []; + set updated (updated){ + this._updated = updated; + } - let slabel="Temperature Sensor"; - for (let line of smartctlOutput) { - let matchModel = /Model Number:/.exec( line.toString() ); - if(matchModel){ - let sline=line.split(/\s+/); - slabel=sline.slice(2).join(" "); - } - //let line = "Temperature Sensor 1: 37 Celsius" - let match = /Temperature Sensor \d: *\w\d Celsius/.exec( line.toString() ); - //let match = /Use smartctl.*/.exec( line.toString() ); - //let match = /.*\[Temperature Sensor \d: .*\d Celcius.*/.exec(line.toString()); - if(match){ - let sline=line.split(/\s+/); - let sensor = { label: slabel+" "+sline[2][0], temp: parseFloat(sline[3]) }; - sensors.push(sensor); + get temp() { + return this._smartDevices.map(device => { + return { + label: getSmartData(`--info ${device["name"]}`)["model_name"], + temp: parseFloat(getSmartData(`--attributes ${device["name"]}`).temperature.current) } - } - return sensors; + }) + } + destroy(callback) { + this._smartDevices = []; } - get available(){ - return true; + execute(callback) { + this._updated = true; } }; From 4833a2e1906711fe938691b0e8324470ffcd9ce7 Mon Sep 17 00:00:00 2001 From: Jonas Malaco Date: Fri, 21 Feb 2020 09:48:42 -0300 Subject: [PATCH 158/224] Switch to nvidia-smi to reduce CPU load when fetching GPU temperatures At least on one Intel systems (i7-8700K/delidded/watercooled) the display of the GPU temperature of NVIDIA cards caused perceptible spikes in CPU utilization, frequency and temperature of individual cores. This was eventually tracked down to nvidia-settings being substantially slower and, more importantly, computationally intensive than nvidia-smi. Switch the nvidiaUtil implementation to use nvidia-smi. In the process, simplify the label parsing and label vs. temperature code because nvidia-smi allows us greater control over the output. --- .../nvidiaUtil.js | 29 +++++-------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js index d2f8e80..78d9f79 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js @@ -9,14 +9,14 @@ var NvidiaUtil = class extends CommandLineUtil.CommandLineUtil { constructor() { super(); - let path = GLib.find_program_in_path('nvidia-settings'); - this._argv = path ? [path, '-q', 'gpucoretemp', '-t'] : null; + let path = GLib.find_program_in_path('nvidia-smi'); + this._argv = path ? [path, '--query-gpu=temperature.gpu', '--format=csv,noheader'] : null; this._labels = []; if(this._argv){ // [0] ushakov-pc:0[gpu:0] (GeForce GTX 770) let [exit, pid, stdinFd, stdoutFd, stderrFd] = GLib.spawn_async_with_pipes(null, /* cwd */ - [path, '-q', 'gpus'], /* args */ + [path, '--query-gpu=name', '--format=csv,noheader'], /* args */ null, /* env */ GLib.SpawnFlags.DO_NOT_REAP_CHILD, null /* child_setup */); @@ -31,10 +31,7 @@ var NvidiaUtil = class extends CommandLineUtil.CommandLineUtil { let [line, size] = [null, 0]; while (([line, size] = outReader.read_line(null)) != null && line != null) { - let match = /.*\[gpu:[\d]\].*\(([\w\d\ ]+)\).*/.exec(ByteArray.toString(line)); - if(match){ - this._labels.push(match[1]); - } + this._labels.push(ByteArray.toString(line)); } stdout.close(null); @@ -63,20 +60,10 @@ var NvidiaUtil = class extends CommandLineUtil.CommandLineUtil { let gpus = []; - if(this._labels.length > 0 && this._labels.length == temps.length - 1){ - // usually we should skip first line (most popular case) - for(let i = 0; i < this._labels.length; i++){ - gpus.push({ label: this._labels[i], temp: temps[i + 1] }) - } - } else if(temps.length == 1 || temps.length == 2){ - // cannot parse GPU label, usually temp duplicated - gpus.push({ label: 'NVIDIA', temp: temps[0] }) - } else { - // I think it is not possible - for(let i = 0; i < temps.length; i++){ - let label = 'NVIDIA-' + (i + 1); - gpus.push({ label: label, temp: temps[i] }) - } + if(this._labels.length == temps.length){ + for(let i = 0; i < this._labels.length; i++){ + gpus.push({ label: this._labels[i], temp: temps[i] }) + } } return gpus; From 93216cb920a508a9793a5fdad3cb0eb26d38f164 Mon Sep 17 00:00:00 2001 From: Ashesh Singh Date: Fri, 1 May 2020 22:20:39 -0500 Subject: [PATCH 159/224] Switch to `gnome-extensions` --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index aea1033..348122e 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -487,7 +487,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend let settings = new PopupMenu.PopupBaseMenuItem(); settings.actor.add(new St.Label({ text: _("Sensor Settings") }), { expand: true, x_fill: false }); settings.connect('activate', function () { - Util.spawn(["gnome-shell-extension-prefs", Me.metadata.uuid]); + Util.spawn(["gnome-extensions", "prefs", Me.metadata.uuid]); }); this.menu.addMenuItem(settings); } From fa474d0d4e3613d2221fc0cdea728c5e2e5b51a7 Mon Sep 17 00:00:00 2001 From: Ashesh Singh Date: Fri, 1 May 2020 22:23:05 -0500 Subject: [PATCH 160/224] Update gnome version --- freon@UshakovVasilii_Github.yahoo.com/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index d8d1e34..d730083 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": ["3.34"], + "shell-version": ["3.36"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", "description": "Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", From 76955ca50142c24785f5c4333037ac2f4be93471 Mon Sep 17 00:00:00 2001 From: Jimmy Date: Tue, 12 May 2020 12:01:58 +0200 Subject: [PATCH 161/224] Added italian translation --- .../po/it.po | 148 ++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/it.po diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/it.po b/freon@UshakovVasilii_Github.yahoo.com/po/it.po new file mode 100644 index 0000000..8e7041c --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/po/it.po @@ -0,0 +1,148 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-06 17:05-0300\n" +"PO-Revision-Date: 2020-05-12 11:59+0200\n" +"Language-Team: Jimmy Scionti \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.3\n" +"Last-Translator: Jimmy Scionti \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: it\n" + +#: bumblebeeNvidiaUtil.js:75 prefs.js:82 +msgid "Bumblebee + NVIDIA" +msgstr "Bumblebee + NVIDIA" + +#: extension.js:319 +msgid "Average" +msgstr "Media" + +#: extension.js:320 +msgid "Maximum" +msgstr "Massimo" + +#: extension.js:341 +#, javascript-format +msgid "%drpm" +msgstr "%drpm" + +#: extension.js:350 +#, javascript-format +msgid "%s%.2fV" +msgstr "%s%.2fV" + +#: extension.js:396 +msgid "Please run sensors-detect as root." +msgstr "Eseguire sensors-detect come amministratore di sistema." + +#: extension.js:397 +msgid "" +"Please install lm_sensors.\n" +"If this doesn't help, click here to report with your sensors output!" +msgstr "" +"Installare lm_sensors.\n" +"Se il problema persiste, cliccare qui per inviare la segnalazione con l'elenco dei sensori!" + +#: extension.js:488 +msgid "Temperature Sensors" +msgstr "Sensori di temperatura" + +#: extension.js:495 +msgid "Voltage" +msgstr "Voltaggio" + +#: extension.js:509 +msgid "Sensors Settings" +msgstr "Impostazioni sensori" + +#: prefs.js:33 +msgid "Poll Sensors Every (sec)" +msgstr "Interrogare i sensori ogni (sec)" + +#: prefs.js:39 +msgid "Show Decimal Value" +msgstr "Mostrare valori decimali" + +#: prefs.js:40 +msgid "Show one digit after decimal" +msgstr "Mostrare solo un decimale" + +#: prefs.js:45 +msgid "Temperature Unit" +msgstr "Unità temperatura" + +#: prefs.js:51 +msgid "Position in Panel" +msgstr "Posizione nel pannello" + +#: prefs.js:55 +msgid "Show Icon on Panel" +msgstr "Mostrare icona sul pannello" + +#: prefs.js:58 +msgid "Show Fan Speed" +msgstr "Mostrare velocità ventola" + +#: prefs.js:61 +msgid "Show Power Supply Voltage" +msgstr "Mostrare tensione di alimentazione" + +#: prefs.js:64 +msgid "Group Temperature Items" +msgstr "Raggruppare i sensori di temperatura" + +#: prefs.js:65 +msgid "Works if you have more than three temperature sensors" +msgstr "Funziona solo se sono disponibili più di tre sensori di temperatura" + +#: prefs.js:68 +msgid "Group Voltage Items" +msgstr "Raggruppare i sensori di tensione" + +#: prefs.js:69 +msgid "Works if you have more than three voltage sensors" +msgstr "Funziona solo se sono disponibili più di tre sensori di tensione" + +#: prefs.js:74 +msgid "HDD/SSD Temperature Utility" +msgstr "Utilità di temperatura HDD/SSD" + +#: prefs.js:79 +msgid "None" +msgstr "Nessuno" + +#: prefs.js:80 +msgid "NVIDIA" +msgstr "NVIDIA" + +#: prefs.js:81 +msgid "Catalyst" +msgstr "Catalyst" + +#: prefs.js:84 +msgid "Video Card Temperature Utility" +msgstr "Utilità di temperatura scheda video" + +#: prefs.js:49 +msgid "Left" +msgstr "Sinistra" + +#: prefs.js:49 +msgid "Center" +msgstr "Centro" + +#: prefs.js:49 +msgid "Right" +msgstr "Destra" + +#: extension.js:479 +msgid "Go to the Freon wiki" +msgstr "Visitare wiki Freon" + +#: extension.js:486 +msgid "Sensor Settings" +msgstr "Impostazioni sensore" From cfcc27d7df4fd9d9329124867f4df00a2989edfe Mon Sep 17 00:00:00 2001 From: Jimmy Date: Tue, 12 May 2020 12:02:38 +0200 Subject: [PATCH 162/224] Create a.dat --- .../locale/it/LC_MESSAGES/a.dat | 1 + 1 file changed, 1 insertion(+) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/locale/it/LC_MESSAGES/a.dat diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/it/LC_MESSAGES/a.dat b/freon@UshakovVasilii_Github.yahoo.com/locale/it/LC_MESSAGES/a.dat new file mode 100644 index 0000000..7898192 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/locale/it/LC_MESSAGES/a.dat @@ -0,0 +1 @@ +a From 7fd46cc244fcc6cbced4c41161050919542d87da Mon Sep 17 00:00:00 2001 From: Jimmy Date: Tue, 12 May 2020 12:03:18 +0200 Subject: [PATCH 163/224] Added italian translation --- .../locale/it/LC_MESSAGES/freon.mo | Bin 0 -> 2639 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/locale/it/LC_MESSAGES/freon.mo diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/it/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/it/LC_MESSAGES/freon.mo new file mode 100644 index 0000000000000000000000000000000000000000..5c03f2f1f0f67f2eb615b250e398f272edb4f702 GIT binary patch literal 2639 zcmbuA&u<(x6vs^|zZMFmK>1M$PHEIu?QD}RRm+wj(rgkICG9Gk1SF6uXV#f@>#+yh zv+Z($1LDMw1405$h(7>{6CfctR6<UfI3SK7fq?JZnN2pdP$Wh(^I3cR?62Q@ ze*4|7?Qb(&V|X6Kv;R8Aj)F(F;f3o5@CNWl@Fwu*lD~kv(Eby=8QgU}V>g0(z`MbH z;Jx4p@GkHyxCe~E?chrw&G!mOcCVHFZ-M8~eh1tK{tDg)?t#&r;G-bvnFH?t7r>q1 z^C0O-!P~)?%l4b#{b+vx(*8aJNzb<++5H4Q1pWb%p1qj-I5-YYg3o~lK6xF)&3=bi z8n+EEYF9v7cPB`Gcm$;V906&aW8i*p9wZ-Y@L})`kj8%q;$|P?MRs45?Jq%x_BY@O za2kU-*avrm?}0S_Bar<4Ny)E4^4Is^1K@8U`F-~-g+FT``C|p7c`Qi!Uj<3$yC81% zIbIF$D{vazQDF>j*m98_T?i4|i-+{wiig%G-$MG9i}p=xQhdmFkj9WcgM9&m_>j-& zqF4_vEIqjH!JBewN6}=rfn#_m4`@%MoAyfkrkIjn5Z2-v@3<^w<9@taTVG|X@+@1 z?j&ypnfkJS)#`xR%f6=?jic>$W6S83ptK5owjkF7TNIa6ny0K3aK;+RT3QM(xiTJV zG}q}lFO9d(S1ZkRs8ODGtn}tU;9aS+BRtkBzJTA50=Z6R)&*z{UEa63`FWY{kqiZknhKyAzG+z}um#j@)bHea;CS|8+He<|MBv88XtsK8cLM_N83T<5CM87}mUbr(EW>*Pw_6+OvQ zOMdP`cj!7~4}!mu38kyqwXJ$(o(wHo&YnjIqGl&rmCnP(bzWH-gfd$6iRwhB^TbEX z7TvA0(UR;b8Wc4|kab?0s7*u@$D_#_pPZ~8f9x>Y6O{#Fk{rnxElZKs`O_**`@9{) zEGYi?d1_XD(R?yVh0@j7rcYEBn~SrXA||U7l^IyzL`2K|42uPMDICqTQ05emyTW-H zrdF2cqLZ8BoG^Y}x@gwKwu6MI^OI{TRGy9IrJ++}U7feA>>zZt>M;oQn4FAs@$J7# zZRy+z9nD#n`Z_n+py{V-r+D#m>Y(9cQ+)E!sSRh;IfSsSC1DXt#5D_ovq&1Gzd-z{ z5)?&&Er}#?$WH23<%v?r%aOzo|2D`_93?Bt!sYk>X35JE!rICxADlqR@Lr{Mqhv_$ zb7NVvC>Nw+v|_X&O7qNF)Vfq~WU9wBvM3rcjea3l)QuC}Qv+*(O(aHW@gfQ1bRzWu zsU>2GBet={F*b{Fxxy4>5)aD=vPg1~rln#;o6ad8ES!oeq~f$Xn{4%%O^h0;GR5Mk zFgz0m(3UmizyZxPvnY);U?@hit8^;1h;fcq=?QHef>IQS(GODFSOvJfhXl78?j71F zY#gr0M+9tq!)X{qjkYDUN?}`gYt!6YZ8=J8xhBfppqyTj8B~n0{ALvq|CkCs?#hnf zJ*r%+C{T&AY%VwC3uvV!@z3F{L8O$=;Gi}9+3-wV{&bL68?m}V#{Zb4OyIu&3F*+` literal 0 HcmV?d00001 From 3faacb55bb5450bb65433b8953e622478bdba69b Mon Sep 17 00:00:00 2001 From: Jimmy Date: Tue, 12 May 2020 12:03:46 +0200 Subject: [PATCH 164/224] Delete a.dat --- .../locale/it/LC_MESSAGES/a.dat | 1 - 1 file changed, 1 deletion(-) delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/locale/it/LC_MESSAGES/a.dat diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/it/LC_MESSAGES/a.dat b/freon@UshakovVasilii_Github.yahoo.com/locale/it/LC_MESSAGES/a.dat deleted file mode 100644 index 7898192..0000000 --- a/freon@UshakovVasilii_Github.yahoo.com/locale/it/LC_MESSAGES/a.dat +++ /dev/null @@ -1 +0,0 @@ -a From 2389a3aedb904b631b61fe4e08da2d20d13647e3 Mon Sep 17 00:00:00 2001 From: uno20001 Date: Tue, 12 May 2020 14:15:38 +0200 Subject: [PATCH 165/224] Hungarian translation --- .../po/hu.po | 148 ++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/hu.po diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/hu.po b/freon@UshakovVasilii_Github.yahoo.com/po/hu.po new file mode 100644 index 0000000..cd4b5be --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/po/hu.po @@ -0,0 +1,148 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-06 17:05-0300\n" +"PO-Revision-Date: 2020-05-12 14:10+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.3\n" +"Last-Translator: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: hu\n" + +#: bumblebeeNvidiaUtil.js:75 prefs.js:82 +msgid "Bumblebee + NVIDIA" +msgstr "Bumblebee + NVIDIA" + +#: extension.js:319 +msgid "Average" +msgstr "Átlag" + +#: extension.js:320 +msgid "Maximum" +msgstr "Maximum" + +#: extension.js:341 +#, javascript-format +msgid "%drpm" +msgstr "%drpm" + +#: extension.js:350 +#, javascript-format +msgid "%s%.2fV" +msgstr "%s%.2fV" + +#: extension.js:396 +msgid "Please run sensors-detect as root." +msgstr "Kérlek futtasd a sensors-detect programot root felhasználóként." + +#: extension.js:397 +msgid "" +"Please install lm_sensors.\n" +"If this doesn't help, click here to report with your sensors output!" +msgstr "" +"Kérlek telepítsd az lm_sensors csomagot.\n" +"Ha nem segít, akkor kattints ide a probléma jelentéséhez!" + +#: extension.js:488 +msgid "Temperature Sensors" +msgstr "Hőmérők" + +#: extension.js:495 +msgid "Voltage" +msgstr "Feszültség" + +#: extension.js:509 +msgid "Sensors Settings" +msgstr "Szenzorbeállítások" + +#: prefs.js:33 +msgid "Poll Sensors Every (sec)" +msgstr "Szenzoradatok lekérdezés ennyi másodpercenként" + +#: prefs.js:39 +msgid "Show Decimal Value" +msgstr "Tizedesjegy mutatása" + +#: prefs.js:40 +msgid "Show one digit after decimal" +msgstr "Egy tizedesjegy mutatása az egész rész után" + +#: prefs.js:45 +msgid "Temperature Unit" +msgstr "Hőmérséklet mértékegysége" + +#: prefs.js:51 +msgid "Position in Panel" +msgstr "Pozíció a panelen" + +#: prefs.js:55 +msgid "Show Icon on Panel" +msgstr "Ikon mutatása a panelen" + +#: prefs.js:58 +msgid "Show Fan Speed" +msgstr "Ventilátorsebesség mutatása" + +#: prefs.js:61 +msgid "Show Power Supply Voltage" +msgstr "Tápfeszültség mutatása" + +#: prefs.js:64 +msgid "Group Temperature Items" +msgstr "Hőmérsékletek csoportosítása" + +#: prefs.js:65 +msgid "Works if you have more than three temperature sensors" +msgstr "Akkor működik, ha több, mint három hőmérő van" + +#: prefs.js:68 +msgid "Group Voltage Items" +msgstr "Feszültségek csoportosítása" + +#: prefs.js:69 +msgid "Works if you have more than three voltage sensors" +msgstr "Akkor működik, ha több, mint három feszültségmérő van" + +#: prefs.js:74 +msgid "HDD/SSD Temperature Utility" +msgstr "HDD/SSD hőmérsékletének lekérdezése ezzel" + +#: prefs.js:79 +msgid "None" +msgstr "Egyik sem" + +#: prefs.js:80 +msgid "NVIDIA" +msgstr "NVIDIA" + +#: prefs.js:81 +msgid "Catalyst" +msgstr "Catalyst" + +#: prefs.js:84 +msgid "Video Card Temperature Utility" +msgstr "Videokártya hőmérsékletének lekérdezése ezzel" + +#: prefs.js:49 +msgid "Left" +msgstr "Bal" + +#: prefs.js:49 +msgid "Center" +msgstr "Közép" + +#: prefs.js:49 +msgid "Right" +msgstr "Jobb" + +#: extension.js:479 +msgid "Go to the Freon wiki" +msgstr "Freon wiki megnyitása" + +#: extension.js:486 +msgid "Sensor Settings" +msgstr "Szenzorbeállítások" From d6a4cff1fd40b837a3e01657c3caab99c3988945 Mon Sep 17 00:00:00 2001 From: Arngren Date: Thu, 28 May 2020 12:49:59 +0200 Subject: [PATCH 166/224] Changed the gpu and temperature symbolic icons --- .../extension.js | 4 +- .../icons/material-icons/LICENSE | 94 +++++++++++++++++++ .../material-gpu-temperature-symbolic.svg | 58 ++++++++++++ .../material-temperature-symbolic.svg | 58 ++++++++++++ 4 files changed, 212 insertions(+), 2 deletions(-) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/LICENSE create mode 100644 freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-gpu-temperature-symbolic.svg create mode 100644 freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-temperature-symbolic.svg diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 348122e..fb7c277 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -69,12 +69,12 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._initDriveUtility(); this._initGpuUtility(); - let temperatureIcon = Gio.icon_new_for_string(Me.path + '/icons/freon-temperature-symbolic.svg'); + let temperatureIcon = Gio.icon_new_for_string(Me.path + '/icons/material-icons/material-temperature-symbolic.svg'); this._sensorIcons = { 'temperature' : temperatureIcon, 'temperature-average' : temperatureIcon, 'temperature-maximum' : temperatureIcon, - 'gpu-temperature' : Gio.icon_new_for_string(Me.path + '/icons/freon-gpu-temperature-symbolic.svg'), + 'gpu-temperature' : Gio.icon_new_for_string(Me.path + '/icons/material-icons/material-gpu-temperature-symbolic.svg'), 'drive-temperature' : Gio.icon_new_for_string('drive-harddisk-symbolic'), 'voltage' : Gio.icon_new_for_string(Me.path + '/icons/freon-voltage-symbolic.svg'), 'fan' : Gio.icon_new_for_string(Me.path + '/icons/freon-fan-symbolic.svg') diff --git a/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/LICENSE b/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/LICENSE new file mode 100644 index 0000000..4ae316b --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/LICENSE @@ -0,0 +1,94 @@ +Copyright (c) 2014, Austin Andrews (http://materialdesignicons.com/), +with Reserved Font Name Material Design Icons. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-gpu-temperature-symbolic.svg b/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-gpu-temperature-symbolic.svg new file mode 100644 index 0000000..b01e803 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-gpu-temperature-symbolic.svg @@ -0,0 +1,58 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-temperature-symbolic.svg b/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-temperature-symbolic.svg new file mode 100644 index 0000000..03a1556 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/icons/material-icons/material-temperature-symbolic.svg @@ -0,0 +1,58 @@ + + + + + + image/svg+xml + + + + + + + + + From 144498ac0b696f805d821f8d11ebee79a6186db6 Mon Sep 17 00:00:00 2001 From: Bowie Chen Date: Sun, 31 May 2020 11:29:52 -0700 Subject: [PATCH 167/224] Updated zh_TW localization --- .../locale/zh_TW/LC_MESSAGES/freon.mo | Bin 2178 -> 4735 bytes .../po/zh_TW.po | 213 ++++++++++++++---- 2 files changed, 169 insertions(+), 44 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/zh_TW/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/zh_TW/LC_MESSAGES/freon.mo index 9e2b8c5bef60481f4d305c11f4c424e259b947c1..c541003961a424b7b04f5bf3098ff049b2321124 100644 GIT binary patch literal 4735 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 diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po b/freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po index 18ad27f..534129b 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po +++ b/freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po @@ -2,127 +2,252 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-02-20 19:18+0800\n" -"PO-Revision-Date: 2016-02-20 19:32+0800\n" -"Last-Translator: Dingzhong Chen \n" +"POT-Creation-Date: 2020-05-31 11:23-0700\n" +"PO-Revision-Date: 2020-05-31 11:53-0700\n" +"Last-Translator: Bowie Chen \n" "Language-Team: \n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.7\n" +"X-Generator: Poedit 2.3\n" "Plural-Forms: nplurals=1; plural=0;\n" +"X-Poedit-Basepath: ..\n" +"X-Poedit-SearchPath-0: .\n" -#: bumblebeeNvidiaUtil.js:75 prefs.js:82 +#: bumblebeeNvidiaUtil.js:79 prefs.js:83 msgid "Bumblebee + NVIDIA" msgstr "Bumblebee + NVIDIA" -#: extension.js:319 +#: extension.js:381 msgid "Average" msgstr "平均值" -#: extension.js:320 +#: extension.js:385 msgid "Maximum" msgstr "最大值" -#: extension.js:341 +#: extension.js:407 #, javascript-format msgid "%drpm" msgstr "%drpm" -#: extension.js:350 +#: extension.js:416 #, javascript-format msgid "%s%.2fV" msgstr "%s%.2fV" -#: extension.js:396 +#: extension.js:465 msgid "Please run sensors-detect as root." -msgstr "請以 root 運行 sensors-detect。" +msgstr "請以 root 執行 sensors-detect。" -#: extension.js:397 +#: extension.js:466 msgid "" "Please install lm_sensors.\n" "If this doesn't help, click here to report with your sensors output!" msgstr "" "請安裝 lm_sensors。\n" -"如果這不管用,點擊這裡並報告你的傳感器輸出!" +"如果沒有改進,點擊這裡並輸出您的感測器數據!" + +#: extension.js:481 +msgid "Go to the Freon wiki" +msgstr "到 Freon 的 wiki" #: extension.js:488 +msgid "Sensor Settings" +msgstr "感測器設定" + +#: extension.js:579 msgid "Temperature Sensors" -msgstr "溫度傳感器" +msgstr "溫度感測器" -#: extension.js:495 +#: extension.js:593 msgid "Voltage" msgstr "電壓" -#: extension.js:509 -msgid "Sensors Settings" -msgstr "傳感器設置" - -#: prefs.js:33 +#: prefs.js:30 msgid "Poll Sensors Every (sec)" -msgstr "查詢傳感器每(秒)" +msgstr "更新速率(每秒)" -#: prefs.js:39 +#: prefs.js:36 msgid "Show Decimal Value" msgstr "顯示小數部分" -#: prefs.js:40 +#: prefs.js:37 schemas/org.gnome.shell.extensions.sensors.gschema.xml:33 msgid "Show one digit after decimal" -msgstr "顯示小數點後一位數字" +msgstr "顯示小數點後一位數" -#: prefs.js:45 +#: prefs.js:42 msgid "Temperature Unit" msgstr "溫度單位" -#: prefs.js:51 +#: prefs.js:46 +msgid "Left" +msgstr "左" + +#: prefs.js:46 +msgid "Center" +msgstr "中" + +#: prefs.js:46 +msgid "Right" +msgstr "右" + +#: prefs.js:48 schemas/org.gnome.shell.extensions.sensors.gschema.xml:62 msgid "Position in Panel" msgstr "面板位置" -#: prefs.js:55 +#: prefs.js:56 schemas/org.gnome.shell.extensions.sensors.gschema.xml:20 msgid "Show Icon on Panel" -msgstr "在面板顯示圖標" +msgstr "在面板顯示圖示" -#: prefs.js:58 +#: prefs.js:59 msgid "Show Fan Speed" msgstr "顯示風扇轉速" -#: prefs.js:61 +#: prefs.js:62 msgid "Show Power Supply Voltage" msgstr "顯示電源電壓" -#: prefs.js:64 +#: prefs.js:65 msgid "Group Temperature Items" -msgstr "編組溫度項" +msgstr "聚集溫度項目" -#: prefs.js:65 +#: prefs.js:66 msgid "Works if you have more than three temperature sensors" -msgstr "如果你有超過三個溫度傳感器時可用" +msgstr "如果您有超過三個溫度感測器時可用" -#: prefs.js:68 +#: prefs.js:69 msgid "Group Voltage Items" -msgstr "編組電壓項" +msgstr "聚集電壓項目" -#: prefs.js:69 +#: prefs.js:70 msgid "Works if you have more than three voltage sensors" -msgstr "如果你有超過三個電壓傳感器時可用" +msgstr "如果您有超過三個電壓感測器時可用" -#: prefs.js:74 +#: prefs.js:75 msgid "HDD/SSD Temperature Utility" msgstr "HDD/SSD 溫度工具" -#: prefs.js:79 +#: prefs.js:80 msgid "None" msgstr "無" -#: prefs.js:80 +#: prefs.js:81 msgid "NVIDIA" msgstr "NVIDIA" -#: prefs.js:81 +#: prefs.js:82 msgid "Catalyst" msgstr "Catalyst" -#: prefs.js:84 +#: prefs.js:85 msgid "Video Card Temperature Utility" -msgstr "顯卡溫度工具" +msgstr "顯示卡溫度工具" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:8 +msgid "Seconds before next update" +msgstr "每幾秒從工具讀取最新數據" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:9 +msgid "" +"This is the seconds after CPU temperature extension updates the data from " +"the syetem" +msgstr "從溫度工具讀取數據的頻率" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:14 +msgid "Unit" +msgstr "單位" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:15 +msgid "" +"The unit ('centigrade' or 'fahrenheit') the extension should display the " +"temperature in" +msgstr "使用攝氏或是華氏顯示溫度" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:21 +msgid "Show sensor icon on top panel" +msgstr "在面板顯示圖示" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:26 +msgid "Sensors to show in panel" +msgstr "面板中顯示的感測器" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:27 +msgid "Select the sensord whose values has to be shown in the panel" +msgstr "選擇面板中要顯示的感測器" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:32 +msgid "Show decimal value" +msgstr "顯示小數部分" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:38 +msgid "Display Fan RPM" +msgstr "顯示風扇每分鐘轉速" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:39 +msgid "Display fan rotation per minute" +msgstr "顯示風扇每分鐘轉速" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:44 +msgid "Display voltage" +msgstr "顯示電壓" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:45 +msgid "Display voltage of various components" +msgstr "顯示套件電壓" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:50 +msgid "Utility for detect HDD/SSD temperature" +msgstr "偵測 HDD/SSD 溫度工具" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:51 +msgid "Utility for detect HDD/SSD temperature ('none', 'hddtemp' or 'udisks2')" +msgstr "偵測 HDD/SSD 溫度工具(無、hddtemp、udisks2)" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:56 +msgid "Utility for detect video card temperature" +msgstr "偵測顯示卡溫度工具" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:57 +msgid "" +"Utility for detect video card temperature ('none', 'nvidia-settings' or " +"'aticonfig')" +msgstr "偵測顯示卡溫度工具(無、nvidia-settings、aticonfig)" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:63 +msgid "Position in Panel ('left', 'center', 'right')" +msgstr "面板位置(左、中、右)" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:68 +msgid "Index in panel box" +msgstr "面板順位" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:69 +msgid "" +"Index within the selected panel box (0: first, 1: second, ..., -1: last)" +msgstr "面板順位(0為第一、1為第二、以此類推;-1為倒數第一)" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:74 +msgid "Group temperature menu items" +msgstr "組合溫度項目" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:75 +msgid "Group more than three sensors temperature menu items" +msgstr "如果您有超過三個溫度感測器時可用" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:80 +msgid "Group voltage menu items" +msgstr "組合電壓項目" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:81 +msgid "Group more than three voltage menu items" +msgstr "如果您有超過三個電壓感測器時可用" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:86 +msgid "Enable debug logging" +msgstr "啟用開發者輸出" + +#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:87 +msgid "Enable debug logging from the extension" +msgstr "從擴充啟用開發者輸出" From a9154daa6467b8bb6088e01b0cde27ce3ba3b061 Mon Sep 17 00:00:00 2001 From: l3nn4rt Date: Wed, 17 Jun 2020 17:44:10 +0200 Subject: [PATCH 168/224] Create styleshell.css Add padding to panel labels if icons not shown --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 6 +++++- freon@UshakovVasilii_Github.yahoo.com/stylesheet.css | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/stylesheet.css diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index fb7c277..3043766 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -136,6 +136,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend text: '\u26a0', // ⚠, warning y_expand: true, y_align: Clutter.ActorAlign.CENTER}); + l.set_style_class_name(showIcon ? 'freon-panel-icon-label' : 'freon-panel-no-icon-label'); this._hotLabels[s] = l; this._menuLayout.add(l); } @@ -167,7 +168,8 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend } _showIconOnPanelChanged(){ - if(this._settings.get_boolean('show-icon-on-panel')) { + let showIcon = this._settings.get_boolean('show-icon-on-panel'); + if (showIcon) { let index = 0; for(let k in this._hotLabels){ let i = new St.Icon({ style_class: 'system-status-icon'}); @@ -181,6 +183,8 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._hotIcons[k].destroy(); this._hotIcons = {}; } + for (let l in this._hotLabels) + this._hotLabels[l].set_style_class_name(showIcon ? 'freon-panel-icon-label' : 'freon-panel-no-icon-label'); } _driveUtilityChanged(){ diff --git a/freon@UshakovVasilii_Github.yahoo.com/stylesheet.css b/freon@UshakovVasilii_Github.yahoo.com/stylesheet.css new file mode 100644 index 0000000..9b10182 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/stylesheet.css @@ -0,0 +1,7 @@ +.freon-panel-icon-label { + padding: 0 0; +} + +.freon-panel-no-icon-label { + padding: 0 4px; +} From a9422c8741e9d8bde72c8f0e8ea53d98bf048637 Mon Sep 17 00:00:00 2001 From: uno20001 Date: Fri, 17 Jul 2020 18:16:00 +0200 Subject: [PATCH 169/224] update Hungarian translation, create mo file --- .../locale/hu/LC_MESSAGES/freon.mo | Bin 0 -> 2603 bytes freon@UshakovVasilii_Github.yahoo.com/po/hu.po | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/locale/hu/LC_MESSAGES/freon.mo diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/hu/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/hu/LC_MESSAGES/freon.mo new file mode 100644 index 0000000000000000000000000000000000000000..32c7b98f445bfeecbb94af8385fe3c87af9f92d0 GIT binary patch literal 2603 zcma)+&yN&E6vs=&U*m85?TWr7ZiKMC>@FC{l1+sD0V4}c*kv@)gw#ye%ryO@I#tyR zGci%3@gy0sp?m+zV+U# z`g!Y?&ji{io)_`Fa+eUh!STECLi-iG7yJ#pAN;-GpWs&X{{|lbx85Vfec%ZA6u2FH z7TgCu37!B)z&f}Ed=F%QAA&sZ<6`_%@HG0LgWJKsz~{gbOnL&`3$mU?@G)=+d>niS zWIZwXDENNS{{(y<{Vze@-&K(H`~>p6>)=b^4UqM0gY(zGF>nfe8zjW!0*IgZ8e-Y* zJCJo>#f#U?L5{<;016F z`~#c@XRrwCk3mQl=fS7Jj|zTK@LQ1g^#jQ9y9T}hvU6U41T29^LDp3T_kye7!{Ap% z|9fy2{p%pYu&MFBx$!=>;bHv`;oa{W7q_G&YV-wSjsyMi+jBF}#D2r>6 zswqXg=yG;hv}lx0=xh)M;;_+KN-HW(;m2i0QQ4{3 z7UNYNIe0I|j?B;RUS6KxWPQp7QQ+EQNj01}CeHEtzCraf8)C87%t!(nDqn3)&ajHi_J;Z-Vfn1|fZ5*_^7PWO|sF+PUb7|&A2mVc# z3_f|ja;ok~S~6O@2~p8lc)7nSEg)cR+F@0FCqCG~1qeluP(>yx5+{RZ%Za`%rZ^WQ zO6^QRs%Nj=A~0JG(9;z=}qqQruNa){+X#gyU?F3ElKOV6(bWHNv92FF3F^sp*+16 zCF7y~47IY-vGTEnjm4)XCQEY~#~^`^c8W!uI_Gw$kqnXpRBuURm76`avgqyKu;aBF z%6JP&UHd468QNb9Ta8eG*=+^VT&};`G zPGKyL!W@$j^i@o~qbi5anyAE{prza=wN>mqXkqH?4=3U&+_f#!!woj0EyR?skiD zQV{p9?U3ocGiXQ##k77g9Q-Zn3X$j}7?O!u=HZ~KQEK~{Qv*} literal 0 HcmV?d00001 diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/hu.po b/freon@UshakovVasilii_Github.yahoo.com/po/hu.po index cd4b5be..5652bba 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/hu.po +++ b/freon@UshakovVasilii_Github.yahoo.com/po/hu.po @@ -3,15 +3,15 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-10-06 17:05-0300\n" -"PO-Revision-Date: 2020-05-12 14:10+0200\n" +"PO-Revision-Date: 2020-07-17 18:13+0200\n" +"Last-Translator: \n" "Language-Team: \n" +"Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.3\n" -"Last-Translator: \n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Language: hu\n" #: bumblebeeNvidiaUtil.js:75 prefs.js:82 msgid "Bumblebee + NVIDIA" From dc88f1bb01f294e68d73a218637ef433134c4327 Mon Sep 17 00:00:00 2001 From: hlechner Date: Mon, 20 Jul 2020 20:32:14 -0300 Subject: [PATCH 170/224] add an option to hide/show the degrees celsius or degrees fahrenheit on panel --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 8 +++++++- freon@UshakovVasilii_Github.yahoo.com/prefs.js | 5 ++++- .../org.gnome.shell.extensions.sensors.gschema.xml | 6 ++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 3043766..d321ada 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -98,6 +98,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._settingChangedSignals = []; this._addSettingChangedSignal('update-time', this._updateTimeChanged.bind(this)); this._addSettingChangedSignal('unit', this._querySensors.bind(this)); + this._addSettingChangedSignal('show-degrees-on-panel', this._updateUI.bind(this)); this._addSettingChangedSignal('show-icon-on-panel', this._showIconOnPanelChanged.bind(this)); this._addSettingChangedSignal('hot-sensors', this._querySensors.bind(this)); this._addSettingChangedSignal('show-decimal-value', this._querySensors.bind(this)); @@ -623,7 +624,12 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend format = '%.0f'; } format += '%s'; - return format.format(value, (this._settings.get_string('unit')=='fahrenheit') ? "\u00b0F" : "\u00b0C"); + + if(this._settings.get_boolean('show-degrees-on-panel')){ + return format.format(value, (this._settings.get_string('unit')=='fahrenheit') ? "\u00b0F" : "\u00b0C" ); + } else { + return format.format(value, ""); + } } get positionInPanel(){ diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 12296d5..e491f5d 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -51,7 +51,10 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex let panelBoxIndex = Gtk.SpinButton.new_with_range (-1, 20, 1); this.attach(panelBoxIndex, 2, i, 1, 1); this._settings.bind('panel-box-index', panelBoxIndex, 'value', Gio.SettingsBindFlags.DEFAULT); - + + this._addSwitch({key : 'show-degrees-on-panel', y : i++, x : 3, + label : _('Show \u00b0C/\u00b0F on Panel')}); + this._addSwitch({key : 'show-icon-on-panel', y : i++, x : 3, label : _('Show Icon on Panel')}); diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml index d14f84b..499c572 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml +++ b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml @@ -14,6 +14,12 @@ Unit The unit ('centigrade' or 'fahrenheit') the extension should display the temperature in + + + true + Show degrees celsius/fahrenheit on Panel + Show degrees celsius/fahrenheit on Panel + true From 9240372a1cf57b97320dd92289fbe41c8f8ddfdb Mon Sep 17 00:00:00 2001 From: Andrew Gaul Date: Tue, 4 Aug 2020 22:17:31 +0900 Subject: [PATCH 171/224] Exclude negative temperatures from average These are unlikely to be valid and ruin the average. I observed -263 degC for temp1 on an Intel NUC8. --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index d321ada..5652fd0 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -353,7 +353,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend let sum = 0; let max = 0; for (let i of tempInfo){ - if(i.temp !== null){ + if(i.temp !== null && i.temp >= 0){ total++; sum += i.temp; if (i.temp > max) From 96af75371a2eec5b6f47e7ca3817fd34cf96d68e Mon Sep 17 00:00:00 2001 From: ignapk Date: Thu, 13 Aug 2020 19:37:50 +0200 Subject: [PATCH 172/224] use ClutterActor's expand/align properties BoxLayout meta child (expand/align) properties have long been depracated and recently fully removed in gnome shell 3.37.2 (!1274), in favor of ClutterActor's ones. Embrace the change to provide compatibility with upcoming gnome shell 3.38 release --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 5652fd0..6fe9d2b 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -483,14 +483,14 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); let wiki = new PopupMenu.PopupBaseMenuItem(); - wiki.actor.add(new St.Label({ text: _("Go to the Freon wiki") }), { expand: true, x_fill: false }); + wiki.actor.add_child(new St.Label({ text: _("Go to the Freon wiki"), x_align: Clutter.ActorAlign.CENTER, x_expand: true })); wiki.connect('activate', function () { Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki"]); }); this.menu.addMenuItem(wiki); let settings = new PopupMenu.PopupBaseMenuItem(); - settings.actor.add(new St.Label({ text: _("Sensor Settings") }), { expand: true, x_fill: false }); + settings.actor.add_child(new St.Label({ text: _("Sensor Settings"), x_align: Clutter.ActorAlign.CENTER, x_expand: true })); settings.connect('activate', function () { Util.spawn(["gnome-extensions", "prefs", Me.metadata.uuid]); }); From 6b8d1693dd00b5b2c0c2ad149c9480b11f7ac191 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sat, 3 Oct 2020 13:40:26 +0300 Subject: [PATCH 173/224] fix metadata --- freon@UshakovVasilii_Github.yahoo.com/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index d730083..fd19b7a 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": ["3.36"], + "shell-version": ["3.38"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", "description": "Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", From 3029f4f7b8740e078b5cc7cf2776627c110ab572 Mon Sep 17 00:00:00 2001 From: Michael Ott Date: Thu, 8 Oct 2020 20:22:49 +0200 Subject: [PATCH 174/224] fix "Error meta is null on Gnome 3.38" --- freon@UshakovVasilii_Github.yahoo.com/freonItem.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js index 05d623d..84c4c89 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js +++ b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js @@ -1,6 +1,7 @@ const GObject = imports.gi.GObject; const PopupMenu = imports.ui.popupMenu; const St = imports.gi.St; +const Clutter = imports.gi.Clutter; var FreonItem = GObject.registerClass(class FreonItem extends PopupMenu.PopupBaseMenuItem { @@ -10,9 +11,9 @@ var FreonItem = GObject.registerClass(class FreonItem extends PopupMenu.PopupBas this._key = key; this._gIcon = gIcon; - this._labelActor = new St.Label({text: displayName ? displayName : label}); + this._labelActor = new St.Label({text: displayName ? displayName : label, x_align: Clutter.ActorAlign.CENTER, x_expand: true}); this.actor.add(new St.Icon({ style_class: 'popup-menu-icon', gicon : gIcon})); - this.actor.add(this._labelActor, {x_fill: true, expand: true}); + this.actor.add_child(this._labelActor); this._valueLabel = new St.Label({text: value}); this.actor.add(this._valueLabel); } From 3ba5d03f9007cde1c1dc50230284e82c99c7505c Mon Sep 17 00:00:00 2001 From: Muha Aliss Date: Thu, 29 Oct 2020 16:24:11 +0300 Subject: [PATCH 175/224] Turkish translations added --- .../locale/tr/LC_MESSAGES/tr.mo | Bin 0 -> 2479 bytes .../po/tr.po | 149 ++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/locale/tr/LC_MESSAGES/tr.mo create mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/tr.po diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/tr/LC_MESSAGES/tr.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/tr/LC_MESSAGES/tr.mo new file mode 100644 index 0000000000000000000000000000000000000000..f3f16653037b6a23d122ce144a634c61e0210c73 GIT binary patch literal 2479 zcmai!O>7%Q6vu~BC>Y8|TPWYWwyFwh*Gi&Ohgty3UI! zWxTRtHX)B+ThWYFiJ@yc)MC~qX@?e6+<_jST19hS#je<2Od=2M#ojy9)5mMI={rte z_BztOE6%H?7xVJEj?-8a4qQl#64gjar$`$IZz77~D^3}gSXVC1HQ|kR)JT*wM?AGv z)Hz1=NY_KW!xgw|RVT3?zWO$GlhjfnO-brIsXwr(-==2sub`p4s(X@-Y?Ao0s3uN( zjfl0Osx&GRmvpP`MJ;!PYRY?UTCP~Tp^bKOjiyyy$1YRAg~*7&)PaZfW?}L{+FUP%nl{FmTM>v3J>MFBWw}B{U^% zH1u9#Lr1#F8KbsbRum_k&Nlq^ZHp#BjkgM3WK{gW)N;`dn-W!}qrn12~Q%@SGdWFW9v@g9M%qqhZkk|@U6V*U{#>ywlqj1GR zJ&Q$yf9KP-q{&D-M{mV=m;Cy6Coae8OsN{BRz|^0Vq;e!)5(`^V(c^xUMF5NbYOx; zUq8JSBiy#IKQJ29(BpMAHE_N{1Mlye`HL2#BxCuXL(hlA_Mji>DniqVTEAD9Vbt%1 z)UxSPO4)jURYl5bk$2D4e{FA0z1x=Tq5=E8xZdw!Q`C|OlOMX_(f=R`#rbT*HqdE9*OWjp^ki!idAP9(4QvPB3H~-T zRH!LT3_fEu*k448v*2DZ0#0y2pMZ3 z8C(0a*+#ZTq3jwMMrirCUA\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: tr\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: bumblebeeNvidiaUtil.js:75 prefs.js:82 +msgid "Bumblebee + NVIDIA" +msgstr "Bumblebee + NVIDIA" + +#: extension.js:319 +msgid "Average" +msgstr "Ortalama" + +#: extension.js:320 +msgid "Maximum" +msgstr "Maksimum" + +#: extension.js:341 +#, javascript-format +msgid "%drpm" +msgstr "%drpm" + +#: extension.js:350 +#, javascript-format +msgid "%s%.2fV" +msgstr "%s%.2fV" + +#: extension.js:396 +msgid "Please run sensors-detect as root." +msgstr "Lütfen sensör-algılamayı yönetici olarak çalıştırın." + +#: extension.js:397 +msgid "" +"Please install lm_sensors.\n" +"If this doesn't help, click here to report with your sensors output!" +msgstr "" +"Lütfen lm_sensors yükleyin.\n" +"Bu işe yaramazsa, sensör çıktılarınızla raporlamak için burayı tıklayın!" + +#: extension.js:488 +msgid "Temperature Sensors" +msgstr "Sıcaklık sensörleri" + +#: extension.js:495 +msgid "Voltage" +msgstr "Voltaj" + +#: extension.js:509 +msgid "Sensors Settings" +msgstr "Sensör ayarları" + +#: prefs.js:33 +msgid "Poll Sensors Every (sec)" +msgstr "" + +#: prefs.js:39 +msgid "Show Decimal Value" +msgstr "Ondalık değeri göster" + +#: prefs.js:40 +msgid "Show one digit after decimal" +msgstr "Ondalıktan sonra bir rakam göster" + +#: prefs.js:45 +msgid "Temperature Unit" +msgstr "Sıcaklık birimi" + +#: prefs.js:51 +msgid "Position in Panel" +msgstr "Paneldeki konum" + +#: prefs.js:55 +msgid "Show Icon on Panel" +msgstr "Panelde simgeyi göster" + +#: prefs.js:58 +msgid "Show Fan Speed" +msgstr "Fan hızını göster" + +#: prefs.js:61 +msgid "Show Power Supply Voltage" +msgstr "Güç kaynağı voltajını göster" + +#: prefs.js:64 +msgid "Group Temperature Items" +msgstr "Sıcaklık grubu öğeleri" + +#: prefs.js:65 +msgid "Works if you have more than three temperature sensors" +msgstr "Üçten fazla sıcaklık sensörünüz varsa çalışır" + +#: prefs.js:68 +msgid "Group Voltage Items" +msgstr "Voltaj grubu öğeleri" + +#: prefs.js:69 +msgid "Works if you have more than three voltage sensors" +msgstr "Üçten fazla voltaj sensörünüz varsa çalışır" + +#: prefs.js:74 +msgid "HDD/SSD Temperature Utility" +msgstr "HDD/SSD sıcaklık yardımcısı" + +#: prefs.js:79 +msgid "None" +msgstr "Yok" + +#: prefs.js:80 +msgid "NVIDIA" +msgstr "NVIDIA" + +#: prefs.js:81 +msgid "Catalyst" +msgstr "Catalyst" + +#: prefs.js:84 +msgid "Video Card Temperature Utility" +msgstr "Ekran kartı sıcaklık yardımcısı" + +#: prefs.js:49 +msgid "Left" +msgstr "Sol" + +#: prefs.js:49 +msgid "Center" +msgstr "Orta" + +#: prefs.js:49 +msgid "Right" +msgstr "Sağ" + +#: extension.js:479 +msgid "Go to the Freon wiki" +msgstr "Freon wiki'ye git" + +#: extension.js:486 +msgid "Sensor Settings" +msgstr "Sensör ayarları" From ef8614ab3aa1a3237643d40baf71530ea38070f5 Mon Sep 17 00:00:00 2001 From: Heimen Stoffels Date: Sun, 1 Nov 2020 14:13:56 +0100 Subject: [PATCH 176/224] Added Dutch translation --- .../locale/nl/LC_MESSAGES/freon.mo | Bin 0 -> 2489 bytes .../po/nl.po | 148 ++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/locale/nl/LC_MESSAGES/freon.mo create mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/nl.po diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/nl/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/nl/LC_MESSAGES/freon.mo new file mode 100644 index 0000000000000000000000000000000000000000..89807385af17de996fc7d5ac6cc539cd8e892809 GIT binary patch literal 2489 zcmai!&u<(x6vqveUkelnzbU0oMMSD*w%MqNk`hFkUtK9_SKTy46sdA{-tM~Vu}8Ki zX}C}cE=VAdP!VTtocIU0apEsP96(%<;867l5)$xzJF{sbRn(f@&)DPl{QQ3XGIrpG zz!=BxCH!8wM~D;P)V=t__#M0-`~!RtyjAf}a18T*!H2-H`-FG^JOn-s9tEERUk9H8 z&x41+4tN0k0Azh1fh_k)wf+To1@o`Kqu^iQ^WY%}Jqex!*`8(aac~uU0(=i-dou7K zc)gl`2EKs#*C5~TJCN=931qpO;LG4YAlq{o%3lK~zy^33Y{Dm>f_TJ_FqZfI3_cA0 z2J*SLK=#AE_=s2W2*~SW;9+nAWPdDxeBNb{^}P?W+;x!UJ_ccm_#C_h-T>K-n;^&N z2sX1H=0V=y2Kk(KD`wy`m|q9kZ(o9Z|8K!(!5_dE!Cyg^`@7;nT;>So;~>aG1ZQ%Iu-Ep))`Ur_14~`GVh6mqqG-}lg z--~_tST%nXWS?*z@Eu{|Fvs|Q>|@SD_T_L)q(0BYM3|`0bT`EO7J1bpai+*N4Q&$1 zwuxFv~ zw&fyqbf%2lP^KW!=A~t2WjiNI%W1O%-FQmf!yPTROizjlUv^_05edPnixr^(|$*J4>yt1K7K3TFImm<=$^3*jGcpC|7oEy|TE_* z<`N2>Y@e`A_Pis690FCAB$_+Go^{lH!iAsgCP(4>g~>}>#HzM~P}aUuW>owuI6ySZ zswbrL-ol@Ur&1NA)l^n}oRR~h2UxVSud&-@67tfkoXekEkjoKKnW+KUaaf8yRkDrB zz2M4$VwGmvA_~L!$w_Vj$LhN!oRct8hC*2@tSqJe1Ms1fC;$Ke literal 0 HcmV?d00001 diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/nl.po b/freon@UshakovVasilii_Github.yahoo.com/po/nl.po new file mode 100644 index 0000000..3a21783 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/po/nl.po @@ -0,0 +1,148 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-06 17:05-0300\n" +"PO-Revision-Date: 2020-11-01 14:11+0100\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 2.4.1\n" +"Last-Translator: Heimen Stoffels \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: nl\n" + +#: bumblebeeNvidiaUtil.js:75 prefs.js:82 +msgid "Bumblebee + NVIDIA" +msgstr "Bumblebee + NVIDIA" + +#: extension.js:319 +msgid "Average" +msgstr "Gemiddeld" + +#: extension.js:320 +msgid "Maximum" +msgstr "Maximaal" + +#: extension.js:341 +#, javascript-format +msgid "%drpm" +msgstr "%drpm" + +#: extension.js:350 +#, javascript-format +msgid "%s%.2fV" +msgstr "%s%.2fV" + +#: extension.js:396 +msgid "Please run sensors-detect as root." +msgstr "Voer sensors-detect uit als administrator (root)." + +#: extension.js:397 +msgid "" +"Please install lm_sensors.\n" +"If this doesn't help, click here to report with your sensors output!" +msgstr "" +"Installeer lm_sensors.\n" +"Als dat niet helpt, klik dan hier om een rapportage op te maken!" + +#: extension.js:488 +msgid "Temperature Sensors" +msgstr "Temperatuursensors" + +#: extension.js:495 +msgid "Voltage" +msgstr "Voltage" + +#: extension.js:509 +msgid "Sensors Settings" +msgstr "Sensorinstellingen" + +#: prefs.js:33 +msgid "Poll Sensors Every (sec)" +msgstr "Sensors peilen, elke... (in sec.)" + +#: prefs.js:39 +msgid "Show Decimal Value" +msgstr "Decimale waarde tonen" + +#: prefs.js:40 +msgid "Show one digit after decimal" +msgstr "Eén getal achter de komma" + +#: prefs.js:45 +msgid "Temperature Unit" +msgstr "Temperatuureenheid" + +#: prefs.js:51 +msgid "Position in Panel" +msgstr "Positie op paneel" + +#: prefs.js:55 +msgid "Show Icon on Panel" +msgstr "Pictogram tonen op paneel" + +#: prefs.js:58 +msgid "Show Fan Speed" +msgstr "Ventilatorsnelheid tonen" + +#: prefs.js:61 +msgid "Show Power Supply Voltage" +msgstr "Netstroomvoltage tonen" + +#: prefs.js:64 +msgid "Group Temperature Items" +msgstr "Temperatuureenheden groeperen" + +#: prefs.js:65 +msgid "Works if you have more than three temperature sensors" +msgstr "Werkt alleen als je meer dan drie temperatuursensors hebt" + +#: prefs.js:68 +msgid "Group Voltage Items" +msgstr "Voltage-items groeperen" + +#: prefs.js:69 +msgid "Works if you have more than three voltage sensors" +msgstr "Werkt alleen als je meer dan drie voltagesensors hebt" + +#: prefs.js:74 +msgid "HDD/SSD Temperature Utility" +msgstr "HDD-/SSD-temperatuurhulpmiddel" + +#: prefs.js:79 +msgid "None" +msgstr "Geen" + +#: prefs.js:80 +msgid "NVIDIA" +msgstr "NVIDIA" + +#: prefs.js:81 +msgid "Catalyst" +msgstr "Catalyst" + +#: prefs.js:84 +msgid "Video Card Temperature Utility" +msgstr "Videokaarttemperatuurhulpmiddel" + +#: prefs.js:49 +msgid "Left" +msgstr "Links" + +#: prefs.js:49 +msgid "Center" +msgstr "Midden" + +#: prefs.js:49 +msgid "Right" +msgstr "Rechts" + +#: extension.js:479 +msgid "Go to the Freon wiki" +msgstr "Open de Freon-wiki" + +#: extension.js:486 +msgid "Sensor Settings" +msgstr "Sensorinstellingen" From 8e245647228df2f8bfbcd85924384e413788886e Mon Sep 17 00:00:00 2001 From: brianegan Date: Thu, 1 Apr 2021 14:14:05 +0200 Subject: [PATCH 177/224] Update to Gnome Forty --- freon@UshakovVasilii_Github.yahoo.com/metadata.json | 2 +- freon@UshakovVasilii_Github.yahoo.com/prefs.js | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index fd19b7a..3128c58 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": ["3.38"], + "shell-version": ["40.0"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", "description": "Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index e491f5d..2c4ede6 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -130,7 +130,5 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex }); function buildPrefsWidget() { - let w = new FreonPrefsWidget(); - w.show_all(); - return w; + return new FreonPrefsWidget(); } From e29ce35aae95305d94844103f2e143430a7e9bdc Mon Sep 17 00:00:00 2001 From: Audrey Toskin Date: Tue, 20 Apr 2021 10:52:21 -0700 Subject: [PATCH 178/224] More consistent .mo file names Every other compiled locale file uses the name "freon.mo" under the relevant language-specific directory, so Turkish should too. --- .../locale/tr/LC_MESSAGES/{tr.mo => freon.mo} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename freon@UshakovVasilii_Github.yahoo.com/locale/tr/LC_MESSAGES/{tr.mo => freon.mo} (100%) diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/tr/LC_MESSAGES/tr.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/tr/LC_MESSAGES/freon.mo similarity index 100% rename from freon@UshakovVasilii_Github.yahoo.com/locale/tr/LC_MESSAGES/tr.mo rename to freon@UshakovVasilii_Github.yahoo.com/locale/tr/LC_MESSAGES/freon.mo From e37b6c6c6e9809596f2ed0bcd4c9e575dd20cd40 Mon Sep 17 00:00:00 2001 From: Andy Holmes Date: Sun, 25 Apr 2021 21:49:36 -0700 Subject: [PATCH 179/224] commandLineUtil: refactor to use GSubprocess This means doing all IO in a background thread, rather than popping lines synchronously off a pipe. --- .../commandLineUtil.js | 49 ++++++------------- 1 file changed, 15 insertions(+), 34 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js index 813fe59..0a288b2 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js @@ -12,42 +12,23 @@ var CommandLineUtil = class { execute(callback) { try{ this._callback = callback; - let [exit, pid, stdinFd, stdoutFd, stderrFd] = - GLib.spawn_async_with_pipes(null, /* cwd */ - this._argv, /* args */ - null, /* env */ - GLib.SpawnFlags.DO_NOT_REAP_CHILD, - null /* child_setup */); - let stdout = new Gio.UnixInputStream({fd: stdoutFd, close_fd: true}); - let outReader = new Gio.DataInputStream({base_stream: stdout}); - let stderr = new Gio.UnixInputStream({fd: stderrFd, close_fd: true}); - let errReader = new Gio.DataInputStream({base_stream: stderr}); - - GLib.close(stdinFd); - - let childWatch = GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, (pid, status, requestObj) => { - let output = []; - let error_output = []; - let [line, size] = [null, 0]; - - while (([line, size] = outReader.read_line(null)) != null && line != null) { - if(line) - output.push(ByteArray.toString(line)); + let proc = Gio.Subprocess.new(this._argv, + Gio.SubprocessFlags.STDOUT_PIPE | + Gio.SubprocessFlags.STDERR_PIPE); + + proc.communicate_utf8_async(null, null, (proc, result) => { + try { + let [, stdout, stderr] = proc.communicate_utf8_finish(result); + + this._output = stdout ? stdout.split('\n') : []; + this._error_output = stderr ? stderr.split('\n') : []; + } catch (e) { + logError(e); + } finally { + this._updated = true; + callback(); } - stdout.close(null); - - while (([line, size] = errReader.read_line(null)) != null && line != null) { - if(line) - error_output.push(ByteArray.toString(line)); - } - stderr.close(null); - - GLib.source_remove(childWatch); - this._output = output; - this._error_output = error_output; - this._updated = true; - callback(); }); } catch(e){ global.log(e.toString()); From cb33301cc748c49a71c615652d9bbfdabdbc4b47 Mon Sep 17 00:00:00 2001 From: Jonas Malaco Date: Wed, 28 Apr 2021 05:05:44 -0300 Subject: [PATCH 180/224] commandLineUtil: toggle _updated after the callback returns The callback can be used to process the received data a single time, and in that case this._updated should only be toggled after the callback has completed, since other methods may depend on its side effects. In other scenarios the order does not matter (either way). --- freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js index 0a288b2..0d970d0 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/commandLineUtil.js @@ -26,8 +26,8 @@ var CommandLineUtil = class { } catch (e) { logError(e); } finally { - this._updated = true; callback(); + this._updated = true; } }); } catch(e){ From 824282e0d60da1127d114ba33a3944511f0a1769 Mon Sep 17 00:00:00 2001 From: Jonas Malaco Date: Tue, 20 Apr 2021 19:31:29 -0300 Subject: [PATCH 181/224] sensorsUtil: prevent re-parsing of the JSON output --- .../sensorsUtil.js | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js index 50ff2bc..62fa580 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -12,6 +12,30 @@ var SensorsUtil = class extends CommandLineUtil.CommandLineUtil { this._argv = path ? [path, '-A', '-j'] : null; } + // Avoid parsing the data more than once. + execute(callback) { + super.execute(() => { + let data = []; + try { + data = JSON.parse(this._output.join('')); + } catch (e) { + try { + // fix for wrong lm_sensors output + // https://github.com/UshakovVasilii/gnome-shell-extension-freon/issues/114#issuecomment-491613545 + let lineRemoved = this._output.filter(l => l.trim() !== ',').join('\n'); + let errorRemoved = lineRemoved.replace(/ERROR.*Can't read/, ""); + errorRemoved = errorRemoved.replace(/ERROR.*I\/O error/, ""); + data = JSON.parse(errorRemoved); + } catch (e) { + global.log(e.toString()); + return []; + } + } + this._data = data; + callback(); + }); + } + get temp() { return this._parseGenericSensorsOutput(/^temp\d+_input/, 'temp'); } @@ -37,25 +61,10 @@ var SensorsUtil = class extends CommandLineUtil.CommandLineUtil { } _parseSensorsOutput(sensorFilter, sensorType, gpuFlag) { - if(!this._output) + if(!this._data) return []; - let data = [] - try { - data = JSON.parse(this._output.join('')); - } catch (e) { - try { - // fix for wrong lm_sensors output - // https://github.com/UshakovVasilii/gnome-shell-extension-freon/issues/114#issuecomment-491613545 - let lineRemoved = this._output.filter(l => l.trim() !== ',').join('\n'); - let errorRemoved = lineRemoved.replace(/ERROR.*Can't read/, ""); - errorRemoved = errorRemoved.replace(/ERROR.*I\/O error/, ""); - data = JSON.parse(errorRemoved); - } catch (e) { - global.log(e.toString()); - return []; - } - } + const data = this._data; let sensors = []; for (var chipset in data) { From 626a79be6eae978def58bdfee19d110399dd50f4 Mon Sep 17 00:00:00 2001 From: Valentin <40423291+Valent-in@users.noreply.github.com> Date: Sun, 23 May 2021 16:23:22 +0300 Subject: [PATCH 182/224] remove redeclaration of _onDestroy() --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 6fe9d2b..4f31b6d 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -111,7 +111,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._addSettingChangedSignal('group-temperature', this._querySensors.bind(this)) this._addSettingChangedSignal('group-voltage', this._rerender.bind(this)) - this.connect('destroy', this._onDestroy.bind(this)); + this.connect('destroy', this._onButtonDestroy.bind(this)); // don't postprone the first call by update-time. this._querySensors(); @@ -264,7 +264,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._settingChangedSignals.push(this._settings.connect('changed::' + key, callback)); } - _onDestroy(){ + _onButtonDestroy(){ this._destroyDriveUtility(); this._destroyGpuUtility(); Mainloop.source_remove(this._timeoutId); From 5e42baea87a2baf03370ff5b51d1874355429067 Mon Sep 17 00:00:00 2001 From: Ashesh Singh Date: Sun, 23 May 2021 18:02:15 -0500 Subject: [PATCH 183/224] Update metadata.json --- freon@UshakovVasilii_Github.yahoo.com/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index 3128c58..6d9b157 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": ["40.0"], + "shell-version": ["40"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", "description": "Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", From a3eb96ff7ce8babc5bcc59a6f2ebeaece43eb86d Mon Sep 17 00:00:00 2001 From: Ashesh Singh Date: Thu, 27 May 2021 04:12:56 -0500 Subject: [PATCH 184/224] Left align Pop-up menu items (#205) * Left align FeronItem * Left align static Pop-up menu items --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 4 ++-- freon@UshakovVasilii_Github.yahoo.com/freonItem.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 4f31b6d..d24b0db 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -483,14 +483,14 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); let wiki = new PopupMenu.PopupBaseMenuItem(); - wiki.actor.add_child(new St.Label({ text: _("Go to the Freon wiki"), x_align: Clutter.ActorAlign.CENTER, x_expand: true })); + wiki.actor.add_child(new St.Label({ text: _("Go to the Freon wiki"), x_align: Clutter.ActorAlign.START, x_expand: true })); wiki.connect('activate', function () { Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki"]); }); this.menu.addMenuItem(wiki); let settings = new PopupMenu.PopupBaseMenuItem(); - settings.actor.add_child(new St.Label({ text: _("Sensor Settings"), x_align: Clutter.ActorAlign.CENTER, x_expand: true })); + settings.actor.add_child(new St.Label({ text: _("Sensor Settings"), x_align: Clutter.ActorAlign.START, x_expand: true })); settings.connect('activate', function () { Util.spawn(["gnome-extensions", "prefs", Me.metadata.uuid]); }); diff --git a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js index 84c4c89..1ab388d 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js +++ b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js @@ -11,7 +11,7 @@ var FreonItem = GObject.registerClass(class FreonItem extends PopupMenu.PopupBas this._key = key; this._gIcon = gIcon; - this._labelActor = new St.Label({text: displayName ? displayName : label, x_align: Clutter.ActorAlign.CENTER, x_expand: true}); + this._labelActor = new St.Label({text: displayName ? displayName : label, x_align: Clutter.ActorAlign.START, x_expand: true}); this.actor.add(new St.Icon({ style_class: 'popup-menu-icon', gicon : gIcon})); this.actor.add_child(this._labelActor); this._valueLabel = new St.Label({text: value}); From 1730654c55882b392f27e300550c37ded6661742 Mon Sep 17 00:00:00 2001 From: Jonas Malaco Date: Tue, 20 Jul 2021 07:01:50 -0300 Subject: [PATCH 185/224] liquidctlUtil: add support for sensors from liquidctl (#202) Requires liquidctl v1.7.0 or later, or a current git snapshot. --- .../extension.js | 28 ++++++ .../liquidctlUtil.js | 90 +++++++++++++++++++ .../prefs.js | 6 +- ...gnome.shell.extensions.sensors.gschema.xml | 6 ++ 4 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/liquidctlUtil.js diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index d24b0db..7a918fc 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -16,6 +16,7 @@ const AticonfigUtil = Me.imports.aticonfigUtil; const NvidiaUtil = Me.imports.nvidiaUtil; const HddtempUtil = Me.imports.hddtempUtil; const SensorsUtil = Me.imports.sensorsUtil; +const liquidctlUtil = Me.imports.liquidctlUtil; const smartctlUtil = Me.imports.smartctlUtil; const nvmecliUtil = Me.imports.nvmecliUtil; const BumblebeeNvidiaUtil = Me.imports.bumblebeeNvidiaUtil; @@ -68,6 +69,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend }; this._initDriveUtility(); this._initGpuUtility(); + this._initLiquidctlUtility(); let temperatureIcon = Gio.icon_new_for_string(Me.path + '/icons/material-icons/material-temperature-symbolic.svg'); this._sensorIcons = { @@ -106,6 +108,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._addSettingChangedSignal('show-voltage', this._querySensors.bind(this)); this._addSettingChangedSignal('drive-utility', this._driveUtilityChanged.bind(this)); this._addSettingChangedSignal('gpu-utility', this._gpuUtilityChanged.bind(this)); + this._addSettingChangedSignal('show-liquidctl', this._liquidctlUtilityChanged.bind(this)); this._addSettingChangedSignal('position-in-panel', this._positionInPanelChanged.bind(this)); this._addSettingChangedSignal('panel-box-index', this._positionInPanelChanged.bind(this)); this._addSettingChangedSignal('group-temperature', this._querySensors.bind(this)) @@ -247,6 +250,24 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._querySensors(); } + _initLiquidctlUtility() { + if (this._settings.get_boolean('show-liquidctl')) + this._utils.liquidctl = new liquidctlUtil.LiquidctlUtil(); + } + + _destroyLiquidctlUtility() { + if (this._utils.liquidctl) { + this._utils.liquidctl.destroy(); + delete this._utils.liquidctl; + } + } + + _liquidctlUtilityChanged() { + this._destroyLiquidctlUtility(); + this._initLiquidctlUtility(); + this._querySensors(); + } + _updateTimeChanged(){ Mainloop.source_remove(this._timeoutId); this._addTimer(); @@ -267,6 +288,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend _onButtonDestroy(){ this._destroyDriveUtility(); this._destroyGpuUtility(); + this._destroyLiquidctlUtility(); Mainloop.source_remove(this._timeoutId); Mainloop.source_remove(this._updateUITimeoutId); @@ -341,6 +363,12 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend driveTempInfo = this._utils.disks.temp; } + if (this._utils.liquidctl && this._utils.liquidctl.available) { + sensorsTempInfo = sensorsTempInfo.concat(this._utils.liquidctl.temp); + fanInfo = fanInfo.concat(this._utils.liquidctl.rpm); + voltageInfo = voltageInfo.concat(this._utils.liquidctl.volt); + } + sensorsTempInfo.sort(function(a,b) { return a.label.localeCompare(b.label) }); driveTempInfo.sort(function(a,b) { return a.label.localeCompare(b.label) }); fanInfo.sort(function(a,b) { return a.label.localeCompare(b.label) }); diff --git a/freon@UshakovVasilii_Github.yahoo.com/liquidctlUtil.js b/freon@UshakovVasilii_Github.yahoo.com/liquidctlUtil.js new file mode 100644 index 0000000..766bf62 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/liquidctlUtil.js @@ -0,0 +1,90 @@ +// Provide sensor data from liquidctl. + +const GLib = imports.gi.GLib; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const commandLineUtil = Me.imports.commandLineUtil; + +var LiquidctlUtil = class extends commandLineUtil.CommandLineUtil { + constructor() { + super(); + const path = GLib.find_program_in_path('liquidctl'); + this._argv = path ? [path, 'status', '--json'] : null; + } + + // Avoid processing the data more than once. + execute(callback) { + super.execute(() => { + try { + const output = this._output.join(''); + if (output == '') + throw 'no data (liquidctl probably exited with an error)'; + + let temp = []; + let rpm = []; + let volt = []; + + let dest = null; + let type = null; + + for (const device of JSON.parse(output)) { + // use a shorter device name to reduce visual noise: + // - omit manufacturer name + // - omit details in parenthesis + const shortDevice = device.description.replace(/(^.+? )|( \(.+)/g, ''); + + for (const item of device.status) { + switch (item.unit) { + case '°C': + dest = temp; + type = 'temp'; + break; + case 'rpm': + dest = rpm; + type = 'rpm'; + break; + case 'V': + dest = volt; + type = 'volt'; + break; + default: + continue; + } + + // use a shorter sensor name to reduce visual noise: + // - omit temperature|speed|voltage suffix + const shortKey = item.key.replace(/ (temperature|speed|voltage)/, ''); + + const feature = { + label: shortDevice + ' ' + shortKey, + [type]: item.value, + }; + dest.push(feature); + } + } + + this._temp = temp; + this._rpm = rpm; + this._volt = volt; + callback(); + } catch (e) { + this._temp = null; + this._rpm = null; + this._volt = null; + global.log('failed to process data from liquidctl: ' + e.toString()); + } + }); + } + + get temp() { + return this._temp || []; + } + + get rpm() { + return this._rpm || []; + } + + get volt() { + return this._volt || []; + } +}; diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 2c4ede6..c91ace5 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -84,9 +84,13 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex 'nvidia-settings' : _('NVIDIA'), 'aticonfig' : _('Catalyst'), 'bumblebee-nvidia-smi': _('Bumblebee + NVIDIA') }, - key: 'gpu-utility', y : i, x : 3, + key: 'gpu-utility', y : i++, x : 3, label: _('Video Card Temperature Utility') }); + + this._addSwitch({key : 'show-liquidctl', y : i++, x : 3, + label : _('Show liquidctl Sensors'), + help : _('Show data from liquidctl v1.7.0 or later')}); } _addSwitch(params){ diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml index 499c572..3b8d146 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml +++ b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml @@ -63,6 +63,12 @@ Utility for detect video card temperature ('none', 'nvidia-settings' or 'aticonfig') + + false + Show liquidctl sensors + Show data from liquidctl v1.7.0 or later + + 'right' Position in Panel From 3c3d01a54a34e58303ab1cac75c196edc8c700bc Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 30 Sep 2021 09:22:38 +0300 Subject: [PATCH 186/224] add shell version 41 --- freon@UshakovVasilii_Github.yahoo.com/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index 6d9b157..411649e 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": ["40"], + "shell-version": ["40", "41"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", "description": "Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", From a11b1ea1ded419d63e008f182d437dee5e2f3364 Mon Sep 17 00:00:00 2001 From: Adam <71682312+duonggiakhanhb@users.noreply.github.com> Date: Mon, 18 Oct 2021 12:36:29 +0700 Subject: [PATCH 187/224] fix average and temperature sensors (#214) * fix average and temperature sensors Get length except for any temp equal to 0 * fix average of temperature (liquidctl sensors) --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 7a918fc..8555e0a 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -381,7 +381,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend let sum = 0; let max = 0; for (let i of tempInfo){ - if(i.temp !== null && i.temp >= 0){ + if(i.temp !== null && i.temp > 0){ total++; sum += i.temp; if (i.temp > max) @@ -424,13 +424,15 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend if(sensorsTempInfo.length > 0 && this._settings.get_boolean('group-temperature')){ sum = 0; + let sensorsTempLength = 0 for (let i of sensorsTempInfo){ sum += i.temp; + if(i.temp > 0) sensorsTempLength++; } sensors.push({ type:'temperature-group', label:'temperature-group', - value: this._formatTemp(sum / sensorsTempInfo.length)}); + value: this._formatTemp(sum / sensorsTempLength)}); } for (let fan of fanInfo){ From e8848c2baabfcddeae29e503d8f8d824b5995aa3 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Wed, 17 Nov 2021 14:10:36 +0100 Subject: [PATCH 188/224] sensorsUtil: read drivetemp sensors as disk temperature sensors (#217) --- .../extension.js | 10 +++--- .../sensorsUtil.js | 32 +++++++++++-------- 2 files changed, 22 insertions(+), 20 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 8555e0a..63ed5d8 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -358,9 +358,9 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend if (this._settings.get_boolean('show-voltage')) voltageInfo = this._utils.sensors.volt; - let driveTempInfo = []; + let driveTempInfo = this._utils.sensors.disks; if(this._utils.disks && this._utils.disks.available) { - driveTempInfo = this._utils.disks.temp; + driveTempInfo = driveTempInfo.concat(this._utils.disks.temp); } if (this._utils.liquidctl && this._utils.liquidctl.available) { @@ -381,7 +381,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend let sum = 0; let max = 0; for (let i of tempInfo){ - if(i.temp !== null && i.temp > 0){ + if(i.temp !== null && i.temp >= 0){ total++; sum += i.temp; if (i.temp > max) @@ -424,15 +424,13 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend if(sensorsTempInfo.length > 0 && this._settings.get_boolean('group-temperature')){ sum = 0; - let sensorsTempLength = 0 for (let i of sensorsTempInfo){ sum += i.temp; - if(i.temp > 0) sensorsTempLength++; } sensors.push({ type:'temperature-group', label:'temperature-group', - value: this._formatTemp(sum / sensorsTempLength)}); + value: this._formatTemp(sum / sensorsTempInfo.length)}); } for (let fan of fanInfo){ diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js index 62fa580..98c84df 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -37,30 +37,26 @@ var SensorsUtil = class extends CommandLineUtil.CommandLineUtil { } get temp() { - return this._parseGenericSensorsOutput(/^temp\d+_input/, 'temp'); + return this._parseSensorsOutput(/^temp\d+_input/, 'temp', 'generic'); } get gpu() { - return this._parseGpuSensorsOutput(/^temp\d+_input/, 'temp'); + return this._parseSensorsOutput(/^temp\d+_input/, 'temp', 'gpu'); } - get rpm() { - return this._parseGenericSensorsOutput(/^fan\d+_input/, 'rpm'); + get disks() { + return this._parseSensorsOutput(/^temp\d+_input/, 'temp', 'disk'); } - get volt() { - return this._parseGenericSensorsOutput(/^in\d+_input/, 'volt'); - } - - _parseGenericSensorsOutput(sensorFilter, sensorType) { - return this._parseSensorsOutput(sensorFilter, sensorType, false); + get rpm() { + return this._parseSensorsOutput(/^fan\d+_input/, 'rpm', 'generic'); } - _parseGpuSensorsOutput(sensorFilter, sensorType) { - return this._parseSensorsOutput(sensorFilter, sensorType, true); + get volt() { + return this._parseSensorsOutput(/^in\d+_input/, 'volt', 'generic'); } - _parseSensorsOutput(sensorFilter, sensorType, gpuFlag) { + _parseSensorsOutput(sensorFilter, sensorType, sensorFamily) { if(!this._data) return []; @@ -68,8 +64,16 @@ var SensorsUtil = class extends CommandLineUtil.CommandLineUtil { let sensors = []; for (var chipset in data) { + let tempType = (sensorType === 'temp') + let gpuFilter = /(radeon|amdgpu|nouveau)/; - if (!data.hasOwnProperty(chipset) || (gpuFlag != gpuFilter.test(chipset) && sensorType === 'temp')) + let gpuFamily = (sensorFamily === 'gpu') + if (!data.hasOwnProperty(chipset) || (gpuFamily != gpuFilter.test(chipset) && tempType)) + continue; + + let diskFilter = /(drivetemp)/; + let diskFamily = (sensorFamily === 'disk') + if (!data.hasOwnProperty(chipset) || (diskFamily != diskFilter.test(chipset) && tempType)) continue; let chipsetSensors = data[chipset] From 84021045ee93124c2a41e5a8d020306e20ed5b41 Mon Sep 17 00:00:00 2001 From: Jonas Malaco Date: Thu, 18 Nov 2021 01:54:34 -0300 Subject: [PATCH 189/224] sensorsUtil: read nvme sensors as disk temperature sensors (#218) Extend e8848c2baabf ("sensorsUtil: read drivetemp sensors as disk temperature sensors (#217)") to also identify NVMe temperature sensors. --- freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js index 98c84df..bd6de61 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -71,7 +71,7 @@ var SensorsUtil = class extends CommandLineUtil.CommandLineUtil { if (!data.hasOwnProperty(chipset) || (gpuFamily != gpuFilter.test(chipset) && tempType)) continue; - let diskFilter = /(drivetemp)/; + let diskFilter = /(drivetemp|nvme)/; let diskFamily = (sensorFamily === 'disk') if (!data.hasOwnProperty(chipset) || (diskFamily != diskFilter.test(chipset) && tempType)) continue; From 65fd12d1c417f93ec987b480712709eea18a47ca Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Thu, 18 Nov 2021 12:19:26 +0100 Subject: [PATCH 190/224] extension: only display liquidctl fan and voltage if related options are enabled (#219) --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 63ed5d8..13931e4 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -365,8 +365,10 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend if (this._utils.liquidctl && this._utils.liquidctl.available) { sensorsTempInfo = sensorsTempInfo.concat(this._utils.liquidctl.temp); - fanInfo = fanInfo.concat(this._utils.liquidctl.rpm); - voltageInfo = voltageInfo.concat(this._utils.liquidctl.volt); + if (this._settings.get_boolean('show-fan-rpm')) + fanInfo = fanInfo.concat(this._utils.liquidctl.rpm); + if (this._settings.get_boolean('show-voltage')) + voltageInfo = voltageInfo.concat(this._utils.liquidctl.volt); } sensorsTempInfo.sort(function(a,b) { return a.label.localeCompare(b.label) }); From dbf90c61457e20c91c1c39196bec0135707cfaad Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Thu, 18 Nov 2021 15:02:41 +0100 Subject: [PATCH 191/224] smartctlUtil: do not reference error when not failing, do not return empty data if none (#221) The `smartctl -j --scan` command may not fail and list drives properly while `smartctl -j --info /dev/sda` may fail because of missing permissions. This error was making the extension on fail entirely when smartctl was selected as a disk temperature sensor provider while the user does not have enogh permission to do so. Also makes sure smartctl can be properly called if path contains a whitespace. --- .../smartctlUtil.js | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js b/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js index 03d469b..53e8981 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js @@ -4,7 +4,7 @@ const Me = imports.misc.extensionUtils.getCurrentExtension(); const ByteArray = imports.byteArray; function getSmartData (argv){ const smartctl = GLib.find_program_in_path('smartctl') - return JSON.parse(ByteArray.toString( GLib.spawn_command_line_sync(`${smartctl} ${argv} -j`)[1] )) + return JSON.parse(ByteArray.toString( GLib.spawn_command_line_sync(`'${smartctl}' ${argv} -j`)[1] )) } var smartctlUtil = class { @@ -12,10 +12,9 @@ var smartctlUtil = class { this._smartDevices = []; try { this._smartDevices = getSmartData("--scan")["devices"] - global.log('[FREON] test devices: ' + e); } catch (e) { global.log('[FREON] Unable to find smart devices: ' + e); - } + } this._updated = true; } @@ -33,11 +32,19 @@ var smartctlUtil = class { get temp() { return this._smartDevices.map(device => { + const info = getSmartData(`--info ${device["name"]}`); + if (info["smartctl"]["exit_status"] != 0) + return null; + + const attributes = getSmartData(`--attributes ${device["name"]}`); + if (attributes["smartctl"]["exit_status"] != 0) + return null; + return { - label: getSmartData(`--info ${device["name"]}`)["model_name"], - temp: parseFloat(getSmartData(`--attributes ${device["name"]}`).temperature.current) + label: info["model_name"], + temp: parseFloat(attributes.temperature.current) } - }) + }).filter(entry => entry != null); } destroy(callback) { From c66b63d92da96677d0594727095b6ebc2fc70230 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Thu, 18 Nov 2021 15:03:05 +0100 Subject: [PATCH 192/224] bikeshedding: fix some indentation discrepancies (#222) --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 14 +++++++------- .../nvmecliUtil.js | 6 +++--- freon@UshakovVasilii_Github.yahoo.com/prefs.js | 9 ++++----- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 13931e4..7f8e347 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -385,9 +385,9 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend for (let i of tempInfo){ if(i.temp !== null && i.temp >= 0){ total++; - sum += i.temp; - if (i.temp > max) - max = i.temp; + sum += i.temp; + if (i.temp > max) + max = i.temp; } } @@ -613,13 +613,13 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend if(!temperatureGroup) { temperatureGroup = new PopupMenu.PopupSubMenuMenuItem(_('Temperature Sensors'), true); temperatureGroup.icon.gicon = this._sensorIcons['temperature']; - if(!temperatureGroup.status) { // gnome 3.18 and hight + if(!temperatureGroup.status) { // gnome 3.18 and hight temperatureGroup.status = new St.Label({ - style_class: 'popup-status-menu-item', + style_class: 'popup-status-menu-item', y_expand: true, y_align: Clutter.ActorAlign.CENTER }); temperatureGroup.actor.insert_child_at_index(temperatureGroup.status, 4); - } + } this.menu.addMenuItem(temperatureGroup); } temperatureGroup.menu.addMenuItem(item); @@ -654,7 +654,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend format = '%.0f'; } format += '%s'; - + if(this._settings.get_boolean('show-degrees-on-panel')){ return format.format(value, (this._settings.get_string('unit')=='fahrenheit') ? "\u00b0F" : "\u00b0C" ); } else { diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js index ae2ea93..a475ec3 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js @@ -14,7 +14,7 @@ var nvmecliUtil = class { this._nvmeDevices = getNvmeData("list")["Devices"] } catch (e) { global.log('[FREON] Unable to find nvme devices: ' + e); - } + } this._updated = true; } @@ -34,8 +34,8 @@ var nvmecliUtil = class { let sensors = []; for (let device of this._nvmeDevices) { var smart_log = getNvmeData(`smart-log ${device["DevicePath"]}`); - if( smart_log.hasOwnProperty('temperature_sensor_2') ){ - sensors.push({ label: device["ModelNumber"] + " S1", + if( smart_log.hasOwnProperty('temperature_sensor_2') ){ + sensors.push({ label: device["ModelNumber"] + " S1", temp: parseFloat(smart_log.temperature_sensor_1) - 273.15 }); sensors.push({ label: device["ModelNumber"] + " S2", temp: parseFloat(smart_log.temperature_sensor_2) - 273.15 }); diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index c91ace5..8e63e0e 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -51,10 +51,10 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex let panelBoxIndex = Gtk.SpinButton.new_with_range (-1, 20, 1); this.attach(panelBoxIndex, 2, i, 1, 1); this._settings.bind('panel-box-index', panelBoxIndex, 'value', Gio.SettingsBindFlags.DEFAULT); - + this._addSwitch({key : 'show-degrees-on-panel', y : i++, x : 3, label : _('Show \u00b0C/\u00b0F on Panel')}); - + this._addSwitch({key : 'show-icon-on-panel', y : i++, x : 3, label : _('Show Icon on Panel')}); @@ -73,7 +73,7 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex help : _("Works if you have more than three voltage sensors")}); this._addComboBox({ - items : {none : 'None', hddtemp : 'Hddtemp', udisks2 : 'UDisks2', smartctl : 'smartctl', nvmecli : 'nvme-cli'}, + items : {none : _('None'), hddtemp : 'Hddtemp', udisks2 : 'UDisks2', smartctl : 'smartctl', nvmecli : 'nvme-cli'}, key: 'drive-utility', y : i, x : 0, label: _('HDD/SSD Temperature Utility') }); @@ -119,7 +119,7 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex } combobox.set_active(Object.keys(params.items).indexOf(this._settings.get_string(params.key))); - + combobox.connect('changed', (entry) => { let [success, iter] = combobox.get_active_iter(); if (!success) @@ -130,7 +130,6 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex this.attach(new Gtk.Label({ label: params.label, halign : Gtk.Align.END}), params.x, params.y, 1, 1); this.attach(combobox, params.x + 1, params.y, 1, 1); } - }); function buildPrefsWidget() { From a5488c23c38c16d415bd2041137f9a7a944ef129 Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Sat, 20 Nov 2021 07:13:58 +0100 Subject: [PATCH 193/224] prefs: revamp the preference window and make various providers selectable independently, ref #223 (#224) --- .../extension.js | 395 +++++++++++++----- .../nvmecliUtil.js | 2 +- .../prefs.js | 172 ++++++-- ...gnome.shell.extensions.sensors.gschema.xml | 128 ++++-- .../smartctlUtil.js | 2 +- 5 files changed, 509 insertions(+), 190 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 7f8e347..25cc389 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -11,14 +11,14 @@ const GObject = imports.gi.GObject; const ExtensionUtils = imports.misc.extensionUtils; const Me = ExtensionUtils.getCurrentExtension(); -const UDisks2 = Me.imports.udisks2; +const UDisks2Util = Me.imports.udisks2; const AticonfigUtil = Me.imports.aticonfigUtil; const NvidiaUtil = Me.imports.nvidiaUtil; const HddtempUtil = Me.imports.hddtempUtil; const SensorsUtil = Me.imports.sensorsUtil; -const liquidctlUtil = Me.imports.liquidctlUtil; -const smartctlUtil = Me.imports.smartctlUtil; -const nvmecliUtil = Me.imports.nvmecliUtil; +const LiquidctlUtil = Me.imports.liquidctlUtil; +const SmartctlUtil = Me.imports.smartctlUtil; +const NvmecliUtil = Me.imports.nvmecliUtil; const BumblebeeNvidiaUtil = Me.imports.bumblebeeNvidiaUtil; const FreonItem = Me.imports.freonItem; @@ -64,13 +64,20 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._sensorMenuItems = {}; - this._utils = { - sensors: new SensorsUtil.SensorsUtil() - }; - this._initDriveUtility(); - this._initGpuUtility(); + this._utils = {}; + + this._initSensorsUtility(); this._initLiquidctlUtility(); + this._initNvidiaUtility(); + this._initBumblebeeNvidiaUtility(); + this._initAticonfigUtility(); + + this._initUdisks2Utility(); + this._initHddtempUtility(); + this._initSmartctlUtility(); + this._initNvmecliUtility(); + let temperatureIcon = Gio.icon_new_for_string(Me.path + '/icons/material-icons/material-temperature-symbolic.svg'); this._sensorIcons = { 'temperature' : temperatureIcon, @@ -98,20 +105,39 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this.add_actor(this._menuLayout); this._settingChangedSignals = []; - this._addSettingChangedSignal('update-time', this._updateTimeChanged.bind(this)); - this._addSettingChangedSignal('unit', this._querySensors.bind(this)); - this._addSettingChangedSignal('show-degrees-on-panel', this._updateUI.bind(this)); - this._addSettingChangedSignal('show-icon-on-panel', this._showIconOnPanelChanged.bind(this)); + this._addSettingChangedSignal('hot-sensors', this._querySensors.bind(this)); - this._addSettingChangedSignal('show-decimal-value', this._querySensors.bind(this)); - this._addSettingChangedSignal('show-fan-rpm', this._querySensors.bind(this)); - this._addSettingChangedSignal('show-voltage', this._querySensors.bind(this)); - this._addSettingChangedSignal('drive-utility', this._driveUtilityChanged.bind(this)); - this._addSettingChangedSignal('gpu-utility', this._gpuUtilityChanged.bind(this)); - this._addSettingChangedSignal('show-liquidctl', this._liquidctlUtilityChanged.bind(this)); + + this._addSettingChangedSignal('update-time', this._updateTimeChanged.bind(this)); this._addSettingChangedSignal('position-in-panel', this._positionInPanelChanged.bind(this)); this._addSettingChangedSignal('panel-box-index', this._positionInPanelChanged.bind(this)); - this._addSettingChangedSignal('group-temperature', this._querySensors.bind(this)) + this._addSettingChangedSignal('show-icon-on-panel', this._showIconOnPanelChanged.bind(this)); + + this._addSettingChangedSignal('show-degrees-on-panel', this._updateUI.bind(this)); + this._addSettingChangedSignal('unit', this._querySensors.bind(this)); + this._addSettingChangedSignal('show-rpm-on-panel', this._updateUI.bind(this)); + this._addSettingChangedSignal('show-volts-on-panel', this._updateUI.bind(this)); + + this._addSettingChangedSignal('show-decimal-value', this._querySensors.bind(this)); + + this._addSettingChangedSignal('use-generic-lmsensors', this._sensorsUtilityChanged.bind(this)); + this._addSettingChangedSignal('use-generic-liquidctl', this._liquidctlUtilityChanged.bind(this)); + + this._addSettingChangedSignal('use-gpu-nvidia', this._nvidiaUtilityChanged.bind(this)); + this._addSettingChangedSignal('use-gpu-nvidiabumblebee', this._nvidiabumblebeeUtilityChanged.bind(this)); + this._addSettingChangedSignal('use-gpu-aticonfig', this._aticonfigUtilityChanged.bind(this)); + + this._addSettingChangedSignal('use-drive-udisks2', this._udisks2UtilityChanged.bind(this)); + this._addSettingChangedSignal('use-drive-hddtemp', this._hddtempUtilityChanged.bind(this)); + this._addSettingChangedSignal('use-drive-smartctl', this._smartctlUtilityChanged.bind(this)); + this._addSettingChangedSignal('use-drive-nvmecli', this._nvmecliUtilityChanged.bind(this)); + + this._addSettingChangedSignal('show-temperature', this._rerender.bind(this)); + this._addSettingChangedSignal('show-fan-rpm', this._rerender.bind(this)); + this._addSettingChangedSignal('show-voltage', this._rerender.bind(this)); + + this._addSettingChangedSignal('group-temperature', this._rerender.bind(this)) + this._addSettingChangedSignal('group-rpm', this._rerender.bind(this)) this._addSettingChangedSignal('group-voltage', this._rerender.bind(this)) this.connect('destroy', this._onButtonDestroy.bind(this)); @@ -191,81 +217,177 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._hotLabels[l].set_style_class_name(showIcon ? 'freon-panel-icon-label' : 'freon-panel-no-icon-label'); } - _driveUtilityChanged(){ - this._destroyDriveUtility(); - this._initDriveUtility(); + _initSensorsUtility() { + if (this._settings.get_boolean('use-generic-lmsensors')) + this._utils.sensors = new SensorsUtil.SensorsUtil(); + } + + _destroySensorsUtility() { + if (this._utils.sensors) { + this._utils.sensors.destroy(); + delete this._utils.sensors; + } + } + + _sensorsUtilityChanged() { + this._destroySensorsUtility(); + this._initSensorsUtility(); this._querySensors(); + this._updateUI(true); } - _initDriveUtility(){ - switch(this._settings.get_string('drive-utility')){ - case 'hddtemp': - this._utils.disks = new HddtempUtil.HddtempUtil(); - break; - case 'udisks2': - this._utils.disks = new UDisks2.UDisks2(() => { - // this._updateDisplay(); we cannot change actor in background thread #74 - }); - break; - case 'smartctl': - this._utils.disks = new smartctlUtil.smartctlUtil(); - break; - case 'nvmecli': - this._utils.disks = new nvmecliUtil.nvmecliUtil(); - break; + _initLiquidctlUtility() { + if (this._settings.get_boolean('use-generic-liquidctl')) + this._utils.liquidctl = new LiquidctlUtil.LiquidctlUtil(); + } + + _destroyLiquidctlUtility() { + if (this._utils.liquidctl) { + this._utils.liquidctl.destroy(); + delete this._utils.liquidctl; } } - _destroyDriveUtility(){ - if(this._utils.disks){ - this._utils.disks.destroy(); - delete this._utils.disks; + _liquidctlUtilityChanged() { + this._destroyLiquidctlUtility(); + this._initLiquidctlUtility(); + this._querySensors(); + this._updateUI(true); + } + + _initNvidiaUtility() { + if (this._settings.get_boolean('use-gpu-nvidia')) + this._utils.nvidia = new NvidiaUtil.NvidiaUtil(); + } + + _destroyNvidiaUtility() { + if (this._utils.nvidia) { + this._utils.nvidia.destroy(); + delete this._utils.nvidia; } } - _initGpuUtility(){ - switch(this._settings.get_string('gpu-utility')){ - case 'nvidia-settings': - this._utils.gpu = new NvidiaUtil.NvidiaUtil(); - break; - case 'aticonfig': - this._utils.gpu = new AticonfigUtil.AticonfigUtil(); - break; - case 'bumblebee-nvidia-smi': - this._utils.gpu = new BumblebeeNvidiaUtil.BumblebeeNvidiaUtil(); - break; + _nvidiaUtilityChanged() { + this._destroyNvidiaUtility(); + this._initNvidiaUtility(); + this._querySensors(); + this._updateUI(true); + } + + _initBumblebeeNvidiaUtility() { + if (this._settings.get_boolean('use-gpu-bumblebeenvidia')) + this._utils.nvidiabumblebee = new BumblebeeNvidiaUtil.BumblebeeNvidiaUtil(); + } + + _destroyBumblebeeNvidiaUtility() { + if (this._utils.nvidiabumblebee) { + this._utils.nvidiabumblebee.destroy(); + delete this._utils.nvidiabumblebee; } } - _destroyGpuUtility(){ - if(this._utils.gpu){ - this._utils.gpu.destroy(); - delete this._utils.gpu; + _nvidiabumblebeeUtilityChanged() { + this._destroyBumblebeeNvidiaUtility(); + this._initBumblebeeNvidiaUtility(); + this._querySensors(); + this._updateUI(true); + } + + _initAticonfigUtility() { + if (this._settings.get_boolean('use-gpu-aticonfig')) + this._utils.aticonfig = new AticonfigUtil.AticonfigUtil(); + } + + _destroyAticonfigUtility() { + if (this._utils.aticonfig) { + this._utils.aticonfig.destroy(); + delete this._utils.aticonfig; } } - _gpuUtilityChanged(){ - this._destroyGpuUtility(); - this._initGpuUtility(); + _aticonfigUtilityChanged() { + this._destroyAticonfigUtility(); + this._initAticonfigUtility(); this._querySensors(); + this._updateUI(true); } - _initLiquidctlUtility() { - if (this._settings.get_boolean('show-liquidctl')) - this._utils.liquidctl = new liquidctlUtil.LiquidctlUtil(); + _initUdisks2Utility() { + if (this._settings.get_boolean('use-drive-udisks2')) + this._utils.udisks2 = new UDisks2Util.UDisks2(() => { + // this._updateDisplay(); we cannot change actor in background thread #74 + }); } - _destroyLiquidctlUtility() { - if (this._utils.liquidctl) { - this._utils.liquidctl.destroy(); - delete this._utils.liquidctl; + _destroyUdisks2Utility() { + if (this._utils.udisks2) { + this._utils.udisks2.destroy(); + delete this._utils.udisks2; } } - _liquidctlUtilityChanged() { - this._destroyLiquidctlUtility(); - this._initLiquidctlUtility(); + _udisks2UtilityChanged() { + this._destroyUdisks2Utility(); + this._initUdisks2Utility(); + this._querySensors(); + this._updateUI(true); + } + + _initHddtempUtility() { + if (this._settings.get_boolean('use-drive-hddtemp')) + this._utils.hddtemp = new HddtempUtil.HddtempUtil(); + } + + _destroyHddtempUtility() { + if (this._utils.hddtemp) { + this._utils.hddtemp.destroy(); + delete this._utils.hddtemp; + } + } + + _hddtempUtilityChanged() { + this._destroyHddtempUtility(); + this._initHddtempUtility(); + this._querySensors(); + this._updateUI(true); + } + + _initSmartctlUtility() { + if (this._settings.get_boolean('use-drive-smartctl')) + this._utils.smartctl = new SmartctlUtil.SmartctlUtil(); + } + + _destroySmartctlUtility() { + if (this._utils.smartctl) { + this._utils.smartctl.destroy(); + delete this._utils.smartctl; + } + } + + _smartctlUtilityChanged() { + this._destroySmartctlUtility(); + this._initSmartctlUtility(); + this._querySensors(); + this._updateUI(true); + } + + _initNvmecliUtility() { + if (this._settings.get_boolean('use-drive-nvmecli')) + this._utils.nvmecli = new NvmecliUtil.NvmecliUtil(); + } + + _destroyNvmecliUtility() { + if (this._utils.nvmecli) { + this._utils.nvmecli.destroy(); + delete this._utils.nvmecli; + } + } + + _nvmecliUtilityChanged() { + this._destroyNvmecliUtility(); + this._initNvmecliUtility(); this._querySensors(); + this._updateUI(true); } _updateTimeChanged(){ @@ -343,34 +465,62 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend } _updateDisplay(){ - let gpuTempInfo = this._utils.sensors.gpu; - - if (this._utils.gpu && this._utils.gpu.available) - gpuTempInfo = gpuTempInfo.concat(this._utils.gpu.temp); - - let sensorsTempInfo = this._utils.sensors.temp; - + let sensorsTempInfo = []; + let gpuTempInfo = [] + let driveTempInfo = []; let fanInfo = []; - if (this._settings.get_boolean('show-fan-rpm')) - fanInfo = this._utils.sensors.rpm; - let voltageInfo = []; - if (this._settings.get_boolean('show-voltage')) - voltageInfo = this._utils.sensors.volt; - let driveTempInfo = this._utils.sensors.disks; - if(this._utils.disks && this._utils.disks.available) { - driveTempInfo = driveTempInfo.concat(this._utils.disks.temp); + if (this._utils.sensors && this._utils.sensors.available) { + if (this._settings.get_boolean('show-temperature')) { + sensorsTempInfo = sensorsTempInfo.concat(this._utils.sensors.temp); + gpuTempInfo = gpuTempInfo.concat(this._utils.sensors.gpu); + driveTempInfo = driveTempInfo.concat(this._utils.sensors.disks); + } + + if (this._settings.get_boolean('show-fan-rpm')) + fanInfo = fanInfo.concat(this._utils.sensors.rpm); + if (this._settings.get_boolean('show-voltage')) + voltageInfo = voltageInfo.concat(this._utils.sensors.volt); } if (this._utils.liquidctl && this._utils.liquidctl.available) { - sensorsTempInfo = sensorsTempInfo.concat(this._utils.liquidctl.temp); + if (this._settings.get_boolean('show-temperature')) + sensorsTempInfo = sensorsTempInfo.concat(this._utils.liquidctl.temp); if (this._settings.get_boolean('show-fan-rpm')) fanInfo = fanInfo.concat(this._utils.liquidctl.rpm); if (this._settings.get_boolean('show-voltage')) voltageInfo = voltageInfo.concat(this._utils.liquidctl.volt); } + if (this._utils.nvidia && this._utils.nvidia.available) + if (this._settings.get_boolean('show-temperature')) + gpuTempInfo = gpuTempInfo.concat(this._utils.nvidia.temp); + + if (this._utils.bumblebeenvidia && this._utils.bumblebeenvidia.available) + if (this._settings.get_boolean('show-temperature')) + gpuTempInfo = gpuTempInfo.concat(this._utils.bumblebeenvidia.temp); + + if (this._utils.aticonfig && this._utils.aticonfig.available) + if (this._settings.get_boolean('show-temperature')) + gpuTempInfo = gpuTempInfo.concat(this._utils.aticonfig.temp); + + if (this._utils.udisks2 && this._utils.udisks2.available) + if (this._settings.get_boolean('show-temperature')) + driveTempInfo = driveTempInfo.concat(this._utils.udisks2.temp); + + if (this._utils.hddtemp && this._utils.hddtemp.available) + if (this._settings.get_boolean('show-temperature')) + driveTempInfo = driveTempInfo.concat(this._utils.hddtemp.temp); + + if (this._utils.smartctl && this._utils.smartctl.available) + if (this._settings.get_boolean('show-temperature')) + driveTempInfo = driveTempInfo.concat(this._utils.smartctl.temp); + + if (this._utils.nvmecli && this._utils.nvmecli.available) + if (this._settings.get_boolean('show-temperature')) + driveTempInfo = driveTempInfo.concat(this._utils.nvmecli.temp); + sensorsTempInfo.sort(function(a,b) { return a.label.localeCompare(b.label) }); driveTempInfo.sort(function(a,b) { return a.label.localeCompare(b.label) }); fanInfo.sort(function(a,b) { return a.label.localeCompare(b.label) }); @@ -378,7 +528,26 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend let tempInfo = gpuTempInfo.concat(sensorsTempInfo).concat(driveTempInfo); - if (tempInfo.length > 0){ + if (tempInfo.length == 0 + && fanInfo.length == 0 + && voltageInfo.length == 0) { + this._sensorMenuItems = {}; + this.menu.removeAll(); + + let item = new PopupMenu.PopupMenuItem( + this._utils.sensors && this._utils.sensors.available + ? _("Please run sensors-detect as root.") + : _("Please install lm_sensors.\nIf this doesn\'t help, click here to report with your sensors output!") + ); + item.connect('activate',function() { + Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki/Dependency"]); + }); + this.menu.addMenuItem(item); + this._appendStaticMenuItems(); + + for (let k in this._hotLabels) + this._hotLabels[k].set_text('\u26a0'); // ⚠, warning + } else { let total = 0; let sum = 0; let max = 0; @@ -400,9 +569,11 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend value: this._formatTemp(i.temp), displayName: i.displayName}); } + for (let i of sensorsTempInfo){ sensors.push({type:'temperature', label: i.label, value:this._formatTemp(i.temp)}); } + for (let i of driveTempInfo){ sensors.push({type:'drive-temperature', label: i.label, value:this._formatTemp(i.temp)}); } @@ -436,20 +607,24 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend } for (let fan of fanInfo){ + const unit = this._settings.get_boolean('show-rpm-on-panel') ? 'rpm': ''; + sensors.push({ - type:'fan', - label:fan.label, - value:_("%drpm").format(fan.rpm)}); + type: 'fan', + label: fan.label, + value: _("%d%s").format(fan.rpm, unit)}); } if (fanInfo.length > 0 && voltageInfo.length > 0){ sensors.push({type : 'separator'}); } for (let voltage of voltageInfo){ + const unit = this._settings.get_boolean('show-volts-on-panel') ? 'V': ''; + sensors.push({ type : 'voltage', - label:voltage.label, - value:_("%s%.2fV").format(((voltage.volt >= 0) ? '+' : ''), - voltage.volt)}); + label: voltage.label, + value: _("%s%.2f%s").format(((voltage.volt >= 0) ? '+' : ''), + voltage.volt, unit)}); } this._fixNames(sensors); @@ -491,20 +666,6 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this.menu.removeAll(); this._appendMenuItems(sensors); } - } else { - this._sensorMenuItems = {}; - this.menu.removeAll(); - - let item = new PopupMenu.PopupMenuItem( - this._utils.sensors.available - ? _("Please run sensors-detect as root.") - : _("Please install lm_sensors.\nIf this doesn\'t help, click here to report with your sensors output!") - ); - item.connect('activate',function() { - Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki/Dependency"]); - }); - this.menu.addMenuItem(item); - this._appendStaticMenuItems(); } } @@ -531,8 +692,18 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._lastSensorsCount = sensors.length; this._sensorMenuItems = {}; let needGroupTemperature = this._settings.get_boolean('group-temperature'); + let needGroupRpm = this._settings.get_boolean('group-rpm'); let needGroupVoltage = this._settings.get_boolean('group-voltage'); + if(needGroupRpm){ + let i = 0; + for (let s of sensors) + if(s.type == 'fan') + i++; + if(i < 2) + needGroupRpm = false; + } + if(needGroupVoltage){ let i = 0; for (let s of sensors) @@ -543,6 +714,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend } let temperatureGroup = null; + let rpmGroup = null; let voltageGroup = null; for (let s of sensors){ @@ -623,6 +795,13 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this.menu.addMenuItem(temperatureGroup); } temperatureGroup.menu.addMenuItem(item); + } else if(needGroupVoltage && s.type == 'fan') { + if(!fanGroup) { + fanGroup = new PopupMenu.PopupSubMenuMenuItem(_('Fan Speed'), true); + fanGroup.icon.gicon = this._sensorIcons['fan']; + this.menu.addMenuItem(fanGroup); + } + fanGroup.menu.addMenuItem(item); } else if(needGroupVoltage && s.type == 'voltage') { if(!voltageGroup) { voltageGroup = new PopupMenu.PopupSubMenuMenuItem(_('Voltage'), true); diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js index a475ec3..98a61df 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js @@ -7,7 +7,7 @@ function getNvmeData (argv){ return JSON.parse(GLib.spawn_command_line_sync(`${nvme} ${argv} -o json`)[1].toString()) } -var nvmecliUtil = class { +var NvmecliUtil = class { constructor(callback) { this._nvmeDevices = []; try { diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 8e63e0e..f6bb92d 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -26,82 +26,161 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex this._settings = ExtensionUtils.getSettings(); let i = 0; + let j = 0; + + this._addLabel({ + label: _('Display Options'), + y : i++, x : j + }); + + this._addLabel({ + label: _('Poll Sensors Every (sec)'), + y : i, x : j + }); - this.attach(new Gtk.Label({ label: _('Poll Sensors Every (sec)'), halign : Gtk.Align.END}), 0, i, 1, 1); let updateTime = Gtk.SpinButton.new_with_range (1, 60, 1); - this.attach(updateTime, 1, i++, 1, 1); + this.attach(updateTime, j + 1, i++, 1, 1); this._settings.bind('update-time', updateTime, 'value', Gio.SettingsBindFlags.DEFAULT); - this._addSwitch({key : 'show-decimal-value', y : i, x : 0, - label : _('Show Decimal Value'), - help : _("Show one digit after decimal")}); - this._addComboBox({ - items : {centigrade : "\u00b0C", fahrenheit : "\u00b0F"}, - key: 'unit', y : i++, x : 3, - label: _('Temperature Unit') + label: _('Position in Panel'), + items : {left : _('Left'), center : _('Center'), right : _('Right')}, + key: 'position-in-panel', y : i++, x : j }); - this._addComboBox({ - items : {left : _('Left'), center : _('Center'), right : _('Right')}, - key: 'position-in-panel', y : i, x : 0, - label: _('Position in Panel') + this._addLabel({ + label: _('Index in Panel'), + y : i, x : j }); let panelBoxIndex = Gtk.SpinButton.new_with_range (-1, 20, 1); - this.attach(panelBoxIndex, 2, i, 1, 1); + this.attach(panelBoxIndex, j + 1, i++, 1, 1); this._settings.bind('panel-box-index', panelBoxIndex, 'value', Gio.SettingsBindFlags.DEFAULT); - this._addSwitch({key : 'show-degrees-on-panel', y : i++, x : 3, - label : _('Show \u00b0C/\u00b0F on Panel')}); + this._addSwitch({key : 'show-icon-on-panel', y : i++, x : j, + label : _('Show Icon')}); - this._addSwitch({key : 'show-icon-on-panel', y : i++, x : 3, - label : _('Show Icon on Panel')}); + this._addComboBox({ + label: 'Temperature Unit', + items : {centigrade : "\u00b0C", fahrenheit : "\u00b0F"}, + key: 'unit', y : i++, x : j + }); - this._addSwitch({key : 'show-fan-rpm', y : i, x : 0, - label : _('Show Fan Speed')}); + this._addSwitch({key : 'show-degrees-on-panel', y : i++, x : j, + label : _('Show Temperature Unit')}); - this._addSwitch({key : 'show-voltage', y : i++, x : 3, - label : _('Show Power Supply Voltage')}); + this._addSwitch({key : 'show-rpm-on-panel', y : i++, x : j, + label : _('Show Fan Speed Unit')}); - this._addSwitch({key : 'group-temperature', y : i, x : 0, - label : _('Group Temperature Items'), - help : _("Works if you have more than three temperature sensors")}); + this._addSwitch({key : 'show-volts-on-panel', y : i++, x : j, + label : _('Show Voltage Unit')}); - this._addSwitch({key : 'group-voltage', y : i++, x : 3, - label : _('Group Voltage Items'), - help : _("Works if you have more than three voltage sensors")}); + this._addSwitch({key : 'show-decimal-value', y : i++, x : j, + label : _('Show Decimal Value'), + help : _("Show one digit after decimal")}); - this._addComboBox({ - items : {none : _('None'), hddtemp : 'Hddtemp', udisks2 : 'UDisks2', smartctl : 'smartctl', nvmecli : 'nvme-cli'}, - key: 'drive-utility', y : i, x : 0, - label: _('HDD/SSD Temperature Utility') + i = 0; + j = 3; + + this._addLabel({ + label: _('Generic sensors'), + y : i++, x : j }); - this._addComboBox({ - items : { - 'none' : _('None'), - 'nvidia-settings' : _('NVIDIA'), - 'aticonfig' : _('Catalyst'), - 'bumblebee-nvidia-smi': _('Bumblebee + NVIDIA') }, - key: 'gpu-utility', y : i++, x : 3, - label: _('Video Card Temperature Utility') + this._addSwitch({key : 'use-generic-lmsensors', y : i++, x : j, + label : 'lm-sensors', + help : _('Read sensors using sensors from lm-sensors')}); + + this._addSwitch({key : 'use-generic-liquidctl', y : i++, x : j, + label : 'liquidctl', + help : _('Read sensors using liquidctl v1.7.0 or later')}); + + this._addLabel({ + label: _('GPU sensors'), + y : i++, x : j }); - this._addSwitch({key : 'show-liquidctl', y : i++, x : 3, - label : _('Show liquidctl Sensors'), - help : _('Show data from liquidctl v1.7.0 or later')}); + this._addSwitch({key : 'use-gpu-nvidia', y : i++, x : j, + label : 'Nvidia'}); + + this._addSwitch({key : 'use-gpu-bumblebeenvidia', y : i++, x : j, + label : 'Bumblebee + Nvidia'}); + + this._addSwitch({key : 'use-gpu-aticonfig', y : i++, x : j, + label : 'Catalyst'}); + + this._addLabel({ + label: _('Drive sensors'), + y : i++, x : j + }); + + this._addSwitch({key : 'use-drive-udisks2', y : i++, x : j, + label : 'Udisks2'}); + + this._addSwitch({key : 'use-drive-hddtemp', y : i++, x : j, + label : 'Hddtemp'}); + + this._addSwitch({key : 'use-drive-smartctl', y : i++, x : j, + label : 'smartctl', + help : _('Read drive sensors from smartctl from smartmontools')}); + + this._addSwitch({key : 'use-drive-nvmecli', y : i++, x : j, + label : 'nvme-cli'}); + + i = 0; + j = 6; + + this._addLabel({ + label: _('Show Sensors'), + y : i++, x : j + }); + + this._addSwitch({key : 'show-temperature', y : i++, x : j, + label : _('Temperature')}); + + this._addSwitch({key : 'show-fan-rpm', y : i++, x : j, + label : _('Fan Speed')}); + + this._addSwitch({key : 'show-voltage', y : i++, x : j, + label : _('Voltage')}); + + this._addLabel({ + label: _('Group Items'), + y : i++, x : j + }); + + this._addSwitch({key : 'group-temperature', y : i++, x : j, + label : _('Temperature'), + help : _("Works if you have more than three temperature sensors")}); + + this._addSwitch({key : 'group-rpm', y : i++, x : j, + label : _('Fan speed'), + help : _("Works if you have more than three fan speed sensors")}); + + this._addSwitch({key : 'group-voltage', y : i++, x : j, + label : _('Voltage'), + help : _("Works if you have more than three voltage sensors")}); } - _addSwitch(params){ + _addLabel(params){ let lbl = new Gtk.Label({label: params.label,halign : Gtk.Align.END}); this.attach(lbl, params.x, params.y, 1, 1); + + if(params.help){ + lbl.set_tooltip_text(params.help); + } + } + + _addSwitch(params){ + this._addLabel(params); + let sw = new Gtk.Switch({halign : Gtk.Align.END, valign : Gtk.Align.CENTER}); this.attach(sw, params.x + 1, params.y, 1, 1); + if(params.help){ - lbl.set_tooltip_text(params.help); sw.set_tooltip_text(params.help); } + this._settings.bind(params.key, sw, 'active', Gio.SettingsBindFlags.DEFAULT); } @@ -127,7 +206,8 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex this._settings.set_string(params.key, model.get_value(iter, 0)) }); - this.attach(new Gtk.Label({ label: params.label, halign : Gtk.Align.END}), params.x, params.y, 1, 1); + this._addLabel(params); + this.attach(combobox, params.x + 1, params.y, 1, 1); } }); diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml index 3b8d146..caabdd1 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml +++ b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml @@ -3,34 +3,64 @@ + + ["__average__", "__max__"] + Sensors to show in panel + Select the sensord whose values has to be shown in the panel + + 5 Seconds before next update This is the seconds after CPU temperature extension updates the data from the syetem + + 'right' + Position in Panel + Position in Panel ('left', 'center', 'right') + + + + 0 + Index in panel box + Index within the selected panel box (0: first, 1: second, ..., -1: last) + + + + true + Show Icon on Panel + Show sensor icon on top panel + + + + true + Display Temperature + Display temperature + + 'centigrade' Unit The unit ('centigrade' or 'fahrenheit') the extension should display the temperature in - + true Show degrees celsius/fahrenheit on Panel Show degrees celsius/fahrenheit on Panel - + true - Show Icon on Panel - Show sensor icon on top panel + Show RPM on Panel + Show RPM on Panel - - ["__average__", "__max__"] - Sensors to show in panel - Select the sensord whose values has to be shown in the panel + + true + Show volts on Panel + Show volts on Panel @@ -39,46 +69,70 @@ Show one digit after decimal - + true - Display Fan RPM - Display fan rotation per minute + Read sensors using lm-sensors + Read sensors using sensors from lm-sensors - - true - Display voltage - Display voltage of various components + + false + Read sensors using liquidctl + Read sensors using liquidctl v1.7.0 or later - - 'udisks2' - Utility for detect HDD/SSD temperature - Utility for detect HDD/SSD temperature ('none', 'hddtemp' or 'udisks2') + + false + Read GPU sensors from NVidia driver + Read GPU sensors from NVidia driver - - 'none' - Utility for detect video card temperature - Utility for detect video card temperature ('none', 'nvidia-settings' or 'aticonfig') + + false + Read GPU sensors from Bumblebee + NVidia driver + Read GPU sensors from Bumblebee + NVidia driver - + false - Show liquidctl sensors - Show data from liquidctl v1.7.0 or later + Read GPU sensors from Catalyst driver + Read GPU sensors from Catalyst driver - - 'right' - Position in Panel - Position in Panel ('left', 'center', 'right') + + false + Read drive sensors from Udisks2 + Read drive sensors from Udisks2 - - 0 - Index in panel box - Index within the selected panel box (0: first, 1: second, ..., -1: last) + + false + Read drive sensors using Hddtemp + Read drive sensors using Hddtemp + + + + false + Read drive sensors using smartctl + Read drive sensors using smartctl from smartmontool + + + + false + Read drive sensors using nvme-cli + Read drive sensors using nvme-cli + + + + true + Display Fan RPM + Display fan rotation per minute + + + + true + Display voltage + Display voltage of various components @@ -87,6 +141,12 @@ Group more than three sensors temperature menu items + + true + Group Fan speed menu items + Group more than three fan speed menu items + + true Group voltage menu items diff --git a/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js b/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js index 53e8981..4888323 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js @@ -7,7 +7,7 @@ function getSmartData (argv){ return JSON.parse(ByteArray.toString( GLib.spawn_command_line_sync(`'${smartctl}' ${argv} -j`)[1] )) } -var smartctlUtil = class { +var SmartctlUtil = class { constructor(callback) { this._smartDevices = []; try { From 308dfb9fbe86072a96f1fdac3ad10f51669fc8f6 Mon Sep 17 00:00:00 2001 From: Vasilii Date: Sat, 20 Nov 2021 09:27:08 +0300 Subject: [PATCH 194/224] Revert "prefs: revamp the preference window and make various providers selectable independently, ref #223 (#224)" (#225) This reverts commit a5488c23c38c16d415bd2041137f9a7a944ef129. --- .../extension.js | 395 +++++------------- .../nvmecliUtil.js | 2 +- .../prefs.js | 172 ++------ ...gnome.shell.extensions.sensors.gschema.xml | 128 ++---- .../smartctlUtil.js | 2 +- 5 files changed, 190 insertions(+), 509 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 25cc389..7f8e347 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -11,14 +11,14 @@ const GObject = imports.gi.GObject; const ExtensionUtils = imports.misc.extensionUtils; const Me = ExtensionUtils.getCurrentExtension(); -const UDisks2Util = Me.imports.udisks2; +const UDisks2 = Me.imports.udisks2; const AticonfigUtil = Me.imports.aticonfigUtil; const NvidiaUtil = Me.imports.nvidiaUtil; const HddtempUtil = Me.imports.hddtempUtil; const SensorsUtil = Me.imports.sensorsUtil; -const LiquidctlUtil = Me.imports.liquidctlUtil; -const SmartctlUtil = Me.imports.smartctlUtil; -const NvmecliUtil = Me.imports.nvmecliUtil; +const liquidctlUtil = Me.imports.liquidctlUtil; +const smartctlUtil = Me.imports.smartctlUtil; +const nvmecliUtil = Me.imports.nvmecliUtil; const BumblebeeNvidiaUtil = Me.imports.bumblebeeNvidiaUtil; const FreonItem = Me.imports.freonItem; @@ -64,20 +64,13 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._sensorMenuItems = {}; - this._utils = {}; - - this._initSensorsUtility(); + this._utils = { + sensors: new SensorsUtil.SensorsUtil() + }; + this._initDriveUtility(); + this._initGpuUtility(); this._initLiquidctlUtility(); - this._initNvidiaUtility(); - this._initBumblebeeNvidiaUtility(); - this._initAticonfigUtility(); - - this._initUdisks2Utility(); - this._initHddtempUtility(); - this._initSmartctlUtility(); - this._initNvmecliUtility(); - let temperatureIcon = Gio.icon_new_for_string(Me.path + '/icons/material-icons/material-temperature-symbolic.svg'); this._sensorIcons = { 'temperature' : temperatureIcon, @@ -105,39 +98,20 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this.add_actor(this._menuLayout); this._settingChangedSignals = []; - - this._addSettingChangedSignal('hot-sensors', this._querySensors.bind(this)); - this._addSettingChangedSignal('update-time', this._updateTimeChanged.bind(this)); - this._addSettingChangedSignal('position-in-panel', this._positionInPanelChanged.bind(this)); - this._addSettingChangedSignal('panel-box-index', this._positionInPanelChanged.bind(this)); - this._addSettingChangedSignal('show-icon-on-panel', this._showIconOnPanelChanged.bind(this)); - - this._addSettingChangedSignal('show-degrees-on-panel', this._updateUI.bind(this)); this._addSettingChangedSignal('unit', this._querySensors.bind(this)); - this._addSettingChangedSignal('show-rpm-on-panel', this._updateUI.bind(this)); - this._addSettingChangedSignal('show-volts-on-panel', this._updateUI.bind(this)); - + this._addSettingChangedSignal('show-degrees-on-panel', this._updateUI.bind(this)); + this._addSettingChangedSignal('show-icon-on-panel', this._showIconOnPanelChanged.bind(this)); + this._addSettingChangedSignal('hot-sensors', this._querySensors.bind(this)); this._addSettingChangedSignal('show-decimal-value', this._querySensors.bind(this)); - - this._addSettingChangedSignal('use-generic-lmsensors', this._sensorsUtilityChanged.bind(this)); - this._addSettingChangedSignal('use-generic-liquidctl', this._liquidctlUtilityChanged.bind(this)); - - this._addSettingChangedSignal('use-gpu-nvidia', this._nvidiaUtilityChanged.bind(this)); - this._addSettingChangedSignal('use-gpu-nvidiabumblebee', this._nvidiabumblebeeUtilityChanged.bind(this)); - this._addSettingChangedSignal('use-gpu-aticonfig', this._aticonfigUtilityChanged.bind(this)); - - this._addSettingChangedSignal('use-drive-udisks2', this._udisks2UtilityChanged.bind(this)); - this._addSettingChangedSignal('use-drive-hddtemp', this._hddtempUtilityChanged.bind(this)); - this._addSettingChangedSignal('use-drive-smartctl', this._smartctlUtilityChanged.bind(this)); - this._addSettingChangedSignal('use-drive-nvmecli', this._nvmecliUtilityChanged.bind(this)); - - this._addSettingChangedSignal('show-temperature', this._rerender.bind(this)); - this._addSettingChangedSignal('show-fan-rpm', this._rerender.bind(this)); - this._addSettingChangedSignal('show-voltage', this._rerender.bind(this)); - - this._addSettingChangedSignal('group-temperature', this._rerender.bind(this)) - this._addSettingChangedSignal('group-rpm', this._rerender.bind(this)) + this._addSettingChangedSignal('show-fan-rpm', this._querySensors.bind(this)); + this._addSettingChangedSignal('show-voltage', this._querySensors.bind(this)); + this._addSettingChangedSignal('drive-utility', this._driveUtilityChanged.bind(this)); + this._addSettingChangedSignal('gpu-utility', this._gpuUtilityChanged.bind(this)); + this._addSettingChangedSignal('show-liquidctl', this._liquidctlUtilityChanged.bind(this)); + this._addSettingChangedSignal('position-in-panel', this._positionInPanelChanged.bind(this)); + this._addSettingChangedSignal('panel-box-index', this._positionInPanelChanged.bind(this)); + this._addSettingChangedSignal('group-temperature', this._querySensors.bind(this)) this._addSettingChangedSignal('group-voltage', this._rerender.bind(this)) this.connect('destroy', this._onButtonDestroy.bind(this)); @@ -217,177 +191,81 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._hotLabels[l].set_style_class_name(showIcon ? 'freon-panel-icon-label' : 'freon-panel-no-icon-label'); } - _initSensorsUtility() { - if (this._settings.get_boolean('use-generic-lmsensors')) - this._utils.sensors = new SensorsUtil.SensorsUtil(); - } - - _destroySensorsUtility() { - if (this._utils.sensors) { - this._utils.sensors.destroy(); - delete this._utils.sensors; - } - } - - _sensorsUtilityChanged() { - this._destroySensorsUtility(); - this._initSensorsUtility(); - this._querySensors(); - this._updateUI(true); - } - - _initLiquidctlUtility() { - if (this._settings.get_boolean('use-generic-liquidctl')) - this._utils.liquidctl = new LiquidctlUtil.LiquidctlUtil(); - } - - _destroyLiquidctlUtility() { - if (this._utils.liquidctl) { - this._utils.liquidctl.destroy(); - delete this._utils.liquidctl; - } - } - - _liquidctlUtilityChanged() { - this._destroyLiquidctlUtility(); - this._initLiquidctlUtility(); - this._querySensors(); - this._updateUI(true); - } - - _initNvidiaUtility() { - if (this._settings.get_boolean('use-gpu-nvidia')) - this._utils.nvidia = new NvidiaUtil.NvidiaUtil(); - } - - _destroyNvidiaUtility() { - if (this._utils.nvidia) { - this._utils.nvidia.destroy(); - delete this._utils.nvidia; - } - } - - _nvidiaUtilityChanged() { - this._destroyNvidiaUtility(); - this._initNvidiaUtility(); - this._querySensors(); - this._updateUI(true); - } - - _initBumblebeeNvidiaUtility() { - if (this._settings.get_boolean('use-gpu-bumblebeenvidia')) - this._utils.nvidiabumblebee = new BumblebeeNvidiaUtil.BumblebeeNvidiaUtil(); - } - - _destroyBumblebeeNvidiaUtility() { - if (this._utils.nvidiabumblebee) { - this._utils.nvidiabumblebee.destroy(); - delete this._utils.nvidiabumblebee; - } - } - - _nvidiabumblebeeUtilityChanged() { - this._destroyBumblebeeNvidiaUtility(); - this._initBumblebeeNvidiaUtility(); + _driveUtilityChanged(){ + this._destroyDriveUtility(); + this._initDriveUtility(); this._querySensors(); - this._updateUI(true); - } - - _initAticonfigUtility() { - if (this._settings.get_boolean('use-gpu-aticonfig')) - this._utils.aticonfig = new AticonfigUtil.AticonfigUtil(); } - _destroyAticonfigUtility() { - if (this._utils.aticonfig) { - this._utils.aticonfig.destroy(); - delete this._utils.aticonfig; + _initDriveUtility(){ + switch(this._settings.get_string('drive-utility')){ + case 'hddtemp': + this._utils.disks = new HddtempUtil.HddtempUtil(); + break; + case 'udisks2': + this._utils.disks = new UDisks2.UDisks2(() => { + // this._updateDisplay(); we cannot change actor in background thread #74 + }); + break; + case 'smartctl': + this._utils.disks = new smartctlUtil.smartctlUtil(); + break; + case 'nvmecli': + this._utils.disks = new nvmecliUtil.nvmecliUtil(); + break; } } - _aticonfigUtilityChanged() { - this._destroyAticonfigUtility(); - this._initAticonfigUtility(); - this._querySensors(); - this._updateUI(true); - } - - _initUdisks2Utility() { - if (this._settings.get_boolean('use-drive-udisks2')) - this._utils.udisks2 = new UDisks2Util.UDisks2(() => { - // this._updateDisplay(); we cannot change actor in background thread #74 - }); - } - - _destroyUdisks2Utility() { - if (this._utils.udisks2) { - this._utils.udisks2.destroy(); - delete this._utils.udisks2; + _destroyDriveUtility(){ + if(this._utils.disks){ + this._utils.disks.destroy(); + delete this._utils.disks; } } - _udisks2UtilityChanged() { - this._destroyUdisks2Utility(); - this._initUdisks2Utility(); - this._querySensors(); - this._updateUI(true); - } - - _initHddtempUtility() { - if (this._settings.get_boolean('use-drive-hddtemp')) - this._utils.hddtemp = new HddtempUtil.HddtempUtil(); - } - - _destroyHddtempUtility() { - if (this._utils.hddtemp) { - this._utils.hddtemp.destroy(); - delete this._utils.hddtemp; + _initGpuUtility(){ + switch(this._settings.get_string('gpu-utility')){ + case 'nvidia-settings': + this._utils.gpu = new NvidiaUtil.NvidiaUtil(); + break; + case 'aticonfig': + this._utils.gpu = new AticonfigUtil.AticonfigUtil(); + break; + case 'bumblebee-nvidia-smi': + this._utils.gpu = new BumblebeeNvidiaUtil.BumblebeeNvidiaUtil(); + break; } } - _hddtempUtilityChanged() { - this._destroyHddtempUtility(); - this._initHddtempUtility(); - this._querySensors(); - this._updateUI(true); - } - - _initSmartctlUtility() { - if (this._settings.get_boolean('use-drive-smartctl')) - this._utils.smartctl = new SmartctlUtil.SmartctlUtil(); - } - - _destroySmartctlUtility() { - if (this._utils.smartctl) { - this._utils.smartctl.destroy(); - delete this._utils.smartctl; + _destroyGpuUtility(){ + if(this._utils.gpu){ + this._utils.gpu.destroy(); + delete this._utils.gpu; } } - _smartctlUtilityChanged() { - this._destroySmartctlUtility(); - this._initSmartctlUtility(); + _gpuUtilityChanged(){ + this._destroyGpuUtility(); + this._initGpuUtility(); this._querySensors(); - this._updateUI(true); } - _initNvmecliUtility() { - if (this._settings.get_boolean('use-drive-nvmecli')) - this._utils.nvmecli = new NvmecliUtil.NvmecliUtil(); + _initLiquidctlUtility() { + if (this._settings.get_boolean('show-liquidctl')) + this._utils.liquidctl = new liquidctlUtil.LiquidctlUtil(); } - _destroyNvmecliUtility() { - if (this._utils.nvmecli) { - this._utils.nvmecli.destroy(); - delete this._utils.nvmecli; + _destroyLiquidctlUtility() { + if (this._utils.liquidctl) { + this._utils.liquidctl.destroy(); + delete this._utils.liquidctl; } } - _nvmecliUtilityChanged() { - this._destroyNvmecliUtility(); - this._initNvmecliUtility(); + _liquidctlUtilityChanged() { + this._destroyLiquidctlUtility(); + this._initLiquidctlUtility(); this._querySensors(); - this._updateUI(true); } _updateTimeChanged(){ @@ -465,62 +343,34 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend } _updateDisplay(){ - let sensorsTempInfo = []; - let gpuTempInfo = [] - let driveTempInfo = []; + let gpuTempInfo = this._utils.sensors.gpu; + + if (this._utils.gpu && this._utils.gpu.available) + gpuTempInfo = gpuTempInfo.concat(this._utils.gpu.temp); + + let sensorsTempInfo = this._utils.sensors.temp; + let fanInfo = []; - let voltageInfo = []; + if (this._settings.get_boolean('show-fan-rpm')) + fanInfo = this._utils.sensors.rpm; - if (this._utils.sensors && this._utils.sensors.available) { - if (this._settings.get_boolean('show-temperature')) { - sensorsTempInfo = sensorsTempInfo.concat(this._utils.sensors.temp); - gpuTempInfo = gpuTempInfo.concat(this._utils.sensors.gpu); - driveTempInfo = driveTempInfo.concat(this._utils.sensors.disks); - } + let voltageInfo = []; + if (this._settings.get_boolean('show-voltage')) + voltageInfo = this._utils.sensors.volt; - if (this._settings.get_boolean('show-fan-rpm')) - fanInfo = fanInfo.concat(this._utils.sensors.rpm); - if (this._settings.get_boolean('show-voltage')) - voltageInfo = voltageInfo.concat(this._utils.sensors.volt); + let driveTempInfo = this._utils.sensors.disks; + if(this._utils.disks && this._utils.disks.available) { + driveTempInfo = driveTempInfo.concat(this._utils.disks.temp); } if (this._utils.liquidctl && this._utils.liquidctl.available) { - if (this._settings.get_boolean('show-temperature')) - sensorsTempInfo = sensorsTempInfo.concat(this._utils.liquidctl.temp); + sensorsTempInfo = sensorsTempInfo.concat(this._utils.liquidctl.temp); if (this._settings.get_boolean('show-fan-rpm')) fanInfo = fanInfo.concat(this._utils.liquidctl.rpm); if (this._settings.get_boolean('show-voltage')) voltageInfo = voltageInfo.concat(this._utils.liquidctl.volt); } - if (this._utils.nvidia && this._utils.nvidia.available) - if (this._settings.get_boolean('show-temperature')) - gpuTempInfo = gpuTempInfo.concat(this._utils.nvidia.temp); - - if (this._utils.bumblebeenvidia && this._utils.bumblebeenvidia.available) - if (this._settings.get_boolean('show-temperature')) - gpuTempInfo = gpuTempInfo.concat(this._utils.bumblebeenvidia.temp); - - if (this._utils.aticonfig && this._utils.aticonfig.available) - if (this._settings.get_boolean('show-temperature')) - gpuTempInfo = gpuTempInfo.concat(this._utils.aticonfig.temp); - - if (this._utils.udisks2 && this._utils.udisks2.available) - if (this._settings.get_boolean('show-temperature')) - driveTempInfo = driveTempInfo.concat(this._utils.udisks2.temp); - - if (this._utils.hddtemp && this._utils.hddtemp.available) - if (this._settings.get_boolean('show-temperature')) - driveTempInfo = driveTempInfo.concat(this._utils.hddtemp.temp); - - if (this._utils.smartctl && this._utils.smartctl.available) - if (this._settings.get_boolean('show-temperature')) - driveTempInfo = driveTempInfo.concat(this._utils.smartctl.temp); - - if (this._utils.nvmecli && this._utils.nvmecli.available) - if (this._settings.get_boolean('show-temperature')) - driveTempInfo = driveTempInfo.concat(this._utils.nvmecli.temp); - sensorsTempInfo.sort(function(a,b) { return a.label.localeCompare(b.label) }); driveTempInfo.sort(function(a,b) { return a.label.localeCompare(b.label) }); fanInfo.sort(function(a,b) { return a.label.localeCompare(b.label) }); @@ -528,26 +378,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend let tempInfo = gpuTempInfo.concat(sensorsTempInfo).concat(driveTempInfo); - if (tempInfo.length == 0 - && fanInfo.length == 0 - && voltageInfo.length == 0) { - this._sensorMenuItems = {}; - this.menu.removeAll(); - - let item = new PopupMenu.PopupMenuItem( - this._utils.sensors && this._utils.sensors.available - ? _("Please run sensors-detect as root.") - : _("Please install lm_sensors.\nIf this doesn\'t help, click here to report with your sensors output!") - ); - item.connect('activate',function() { - Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki/Dependency"]); - }); - this.menu.addMenuItem(item); - this._appendStaticMenuItems(); - - for (let k in this._hotLabels) - this._hotLabels[k].set_text('\u26a0'); // ⚠, warning - } else { + if (tempInfo.length > 0){ let total = 0; let sum = 0; let max = 0; @@ -569,11 +400,9 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend value: this._formatTemp(i.temp), displayName: i.displayName}); } - for (let i of sensorsTempInfo){ sensors.push({type:'temperature', label: i.label, value:this._formatTemp(i.temp)}); } - for (let i of driveTempInfo){ sensors.push({type:'drive-temperature', label: i.label, value:this._formatTemp(i.temp)}); } @@ -607,24 +436,20 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend } for (let fan of fanInfo){ - const unit = this._settings.get_boolean('show-rpm-on-panel') ? 'rpm': ''; - sensors.push({ - type: 'fan', - label: fan.label, - value: _("%d%s").format(fan.rpm, unit)}); + type:'fan', + label:fan.label, + value:_("%drpm").format(fan.rpm)}); } if (fanInfo.length > 0 && voltageInfo.length > 0){ sensors.push({type : 'separator'}); } for (let voltage of voltageInfo){ - const unit = this._settings.get_boolean('show-volts-on-panel') ? 'V': ''; - sensors.push({ type : 'voltage', - label: voltage.label, - value: _("%s%.2f%s").format(((voltage.volt >= 0) ? '+' : ''), - voltage.volt, unit)}); + label:voltage.label, + value:_("%s%.2fV").format(((voltage.volt >= 0) ? '+' : ''), + voltage.volt)}); } this._fixNames(sensors); @@ -666,6 +491,20 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this.menu.removeAll(); this._appendMenuItems(sensors); } + } else { + this._sensorMenuItems = {}; + this.menu.removeAll(); + + let item = new PopupMenu.PopupMenuItem( + this._utils.sensors.available + ? _("Please run sensors-detect as root.") + : _("Please install lm_sensors.\nIf this doesn\'t help, click here to report with your sensors output!") + ); + item.connect('activate',function() { + Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki/Dependency"]); + }); + this.menu.addMenuItem(item); + this._appendStaticMenuItems(); } } @@ -692,18 +531,8 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._lastSensorsCount = sensors.length; this._sensorMenuItems = {}; let needGroupTemperature = this._settings.get_boolean('group-temperature'); - let needGroupRpm = this._settings.get_boolean('group-rpm'); let needGroupVoltage = this._settings.get_boolean('group-voltage'); - if(needGroupRpm){ - let i = 0; - for (let s of sensors) - if(s.type == 'fan') - i++; - if(i < 2) - needGroupRpm = false; - } - if(needGroupVoltage){ let i = 0; for (let s of sensors) @@ -714,7 +543,6 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend } let temperatureGroup = null; - let rpmGroup = null; let voltageGroup = null; for (let s of sensors){ @@ -795,13 +623,6 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this.menu.addMenuItem(temperatureGroup); } temperatureGroup.menu.addMenuItem(item); - } else if(needGroupVoltage && s.type == 'fan') { - if(!fanGroup) { - fanGroup = new PopupMenu.PopupSubMenuMenuItem(_('Fan Speed'), true); - fanGroup.icon.gicon = this._sensorIcons['fan']; - this.menu.addMenuItem(fanGroup); - } - fanGroup.menu.addMenuItem(item); } else if(needGroupVoltage && s.type == 'voltage') { if(!voltageGroup) { voltageGroup = new PopupMenu.PopupSubMenuMenuItem(_('Voltage'), true); diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js index 98a61df..a475ec3 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js @@ -7,7 +7,7 @@ function getNvmeData (argv){ return JSON.parse(GLib.spawn_command_line_sync(`${nvme} ${argv} -o json`)[1].toString()) } -var NvmecliUtil = class { +var nvmecliUtil = class { constructor(callback) { this._nvmeDevices = []; try { diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index f6bb92d..8e63e0e 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -26,161 +26,82 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex this._settings = ExtensionUtils.getSettings(); let i = 0; - let j = 0; - - this._addLabel({ - label: _('Display Options'), - y : i++, x : j - }); - - this._addLabel({ - label: _('Poll Sensors Every (sec)'), - y : i, x : j - }); + this.attach(new Gtk.Label({ label: _('Poll Sensors Every (sec)'), halign : Gtk.Align.END}), 0, i, 1, 1); let updateTime = Gtk.SpinButton.new_with_range (1, 60, 1); - this.attach(updateTime, j + 1, i++, 1, 1); + this.attach(updateTime, 1, i++, 1, 1); this._settings.bind('update-time', updateTime, 'value', Gio.SettingsBindFlags.DEFAULT); - this._addComboBox({ - label: _('Position in Panel'), - items : {left : _('Left'), center : _('Center'), right : _('Right')}, - key: 'position-in-panel', y : i++, x : j - }); - - this._addLabel({ - label: _('Index in Panel'), - y : i, x : j - }); - - let panelBoxIndex = Gtk.SpinButton.new_with_range (-1, 20, 1); - this.attach(panelBoxIndex, j + 1, i++, 1, 1); - this._settings.bind('panel-box-index', panelBoxIndex, 'value', Gio.SettingsBindFlags.DEFAULT); - - this._addSwitch({key : 'show-icon-on-panel', y : i++, x : j, - label : _('Show Icon')}); - - this._addComboBox({ - label: 'Temperature Unit', - items : {centigrade : "\u00b0C", fahrenheit : "\u00b0F"}, - key: 'unit', y : i++, x : j - }); - - this._addSwitch({key : 'show-degrees-on-panel', y : i++, x : j, - label : _('Show Temperature Unit')}); - - this._addSwitch({key : 'show-rpm-on-panel', y : i++, x : j, - label : _('Show Fan Speed Unit')}); - - this._addSwitch({key : 'show-volts-on-panel', y : i++, x : j, - label : _('Show Voltage Unit')}); - - this._addSwitch({key : 'show-decimal-value', y : i++, x : j, + this._addSwitch({key : 'show-decimal-value', y : i, x : 0, label : _('Show Decimal Value'), help : _("Show one digit after decimal")}); - i = 0; - j = 3; - - this._addLabel({ - label: _('Generic sensors'), - y : i++, x : j + this._addComboBox({ + items : {centigrade : "\u00b0C", fahrenheit : "\u00b0F"}, + key: 'unit', y : i++, x : 3, + label: _('Temperature Unit') }); - this._addSwitch({key : 'use-generic-lmsensors', y : i++, x : j, - label : 'lm-sensors', - help : _('Read sensors using sensors from lm-sensors')}); - - this._addSwitch({key : 'use-generic-liquidctl', y : i++, x : j, - label : 'liquidctl', - help : _('Read sensors using liquidctl v1.7.0 or later')}); - - this._addLabel({ - label: _('GPU sensors'), - y : i++, x : j + this._addComboBox({ + items : {left : _('Left'), center : _('Center'), right : _('Right')}, + key: 'position-in-panel', y : i, x : 0, + label: _('Position in Panel') }); - this._addSwitch({key : 'use-gpu-nvidia', y : i++, x : j, - label : 'Nvidia'}); - - this._addSwitch({key : 'use-gpu-bumblebeenvidia', y : i++, x : j, - label : 'Bumblebee + Nvidia'}); - - this._addSwitch({key : 'use-gpu-aticonfig', y : i++, x : j, - label : 'Catalyst'}); + let panelBoxIndex = Gtk.SpinButton.new_with_range (-1, 20, 1); + this.attach(panelBoxIndex, 2, i, 1, 1); + this._settings.bind('panel-box-index', panelBoxIndex, 'value', Gio.SettingsBindFlags.DEFAULT); - this._addLabel({ - label: _('Drive sensors'), - y : i++, x : j - }); + this._addSwitch({key : 'show-degrees-on-panel', y : i++, x : 3, + label : _('Show \u00b0C/\u00b0F on Panel')}); - this._addSwitch({key : 'use-drive-udisks2', y : i++, x : j, - label : 'Udisks2'}); + this._addSwitch({key : 'show-icon-on-panel', y : i++, x : 3, + label : _('Show Icon on Panel')}); - this._addSwitch({key : 'use-drive-hddtemp', y : i++, x : j, - label : 'Hddtemp'}); + this._addSwitch({key : 'show-fan-rpm', y : i, x : 0, + label : _('Show Fan Speed')}); - this._addSwitch({key : 'use-drive-smartctl', y : i++, x : j, - label : 'smartctl', - help : _('Read drive sensors from smartctl from smartmontools')}); + this._addSwitch({key : 'show-voltage', y : i++, x : 3, + label : _('Show Power Supply Voltage')}); - this._addSwitch({key : 'use-drive-nvmecli', y : i++, x : j, - label : 'nvme-cli'}); + this._addSwitch({key : 'group-temperature', y : i, x : 0, + label : _('Group Temperature Items'), + help : _("Works if you have more than three temperature sensors")}); - i = 0; - j = 6; + this._addSwitch({key : 'group-voltage', y : i++, x : 3, + label : _('Group Voltage Items'), + help : _("Works if you have more than three voltage sensors")}); - this._addLabel({ - label: _('Show Sensors'), - y : i++, x : j + this._addComboBox({ + items : {none : _('None'), hddtemp : 'Hddtemp', udisks2 : 'UDisks2', smartctl : 'smartctl', nvmecli : 'nvme-cli'}, + key: 'drive-utility', y : i, x : 0, + label: _('HDD/SSD Temperature Utility') }); - this._addSwitch({key : 'show-temperature', y : i++, x : j, - label : _('Temperature')}); - - this._addSwitch({key : 'show-fan-rpm', y : i++, x : j, - label : _('Fan Speed')}); - - this._addSwitch({key : 'show-voltage', y : i++, x : j, - label : _('Voltage')}); - - this._addLabel({ - label: _('Group Items'), - y : i++, x : j + this._addComboBox({ + items : { + 'none' : _('None'), + 'nvidia-settings' : _('NVIDIA'), + 'aticonfig' : _('Catalyst'), + 'bumblebee-nvidia-smi': _('Bumblebee + NVIDIA') }, + key: 'gpu-utility', y : i++, x : 3, + label: _('Video Card Temperature Utility') }); - this._addSwitch({key : 'group-temperature', y : i++, x : j, - label : _('Temperature'), - help : _("Works if you have more than three temperature sensors")}); - - this._addSwitch({key : 'group-rpm', y : i++, x : j, - label : _('Fan speed'), - help : _("Works if you have more than three fan speed sensors")}); - - this._addSwitch({key : 'group-voltage', y : i++, x : j, - label : _('Voltage'), - help : _("Works if you have more than three voltage sensors")}); + this._addSwitch({key : 'show-liquidctl', y : i++, x : 3, + label : _('Show liquidctl Sensors'), + help : _('Show data from liquidctl v1.7.0 or later')}); } - _addLabel(params){ + _addSwitch(params){ let lbl = new Gtk.Label({label: params.label,halign : Gtk.Align.END}); this.attach(lbl, params.x, params.y, 1, 1); - - if(params.help){ - lbl.set_tooltip_text(params.help); - } - } - - _addSwitch(params){ - this._addLabel(params); - let sw = new Gtk.Switch({halign : Gtk.Align.END, valign : Gtk.Align.CENTER}); this.attach(sw, params.x + 1, params.y, 1, 1); - if(params.help){ + lbl.set_tooltip_text(params.help); sw.set_tooltip_text(params.help); } - this._settings.bind(params.key, sw, 'active', Gio.SettingsBindFlags.DEFAULT); } @@ -206,8 +127,7 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex this._settings.set_string(params.key, model.get_value(iter, 0)) }); - this._addLabel(params); - + this.attach(new Gtk.Label({ label: params.label, halign : Gtk.Align.END}), params.x, params.y, 1, 1); this.attach(combobox, params.x + 1, params.y, 1, 1); } }); diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml index caabdd1..3b8d146 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml +++ b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml @@ -3,64 +3,34 @@ - - ["__average__", "__max__"] - Sensors to show in panel - Select the sensord whose values has to be shown in the panel - - 5 Seconds before next update This is the seconds after CPU temperature extension updates the data from the syetem - - 'right' - Position in Panel - Position in Panel ('left', 'center', 'right') - - - - 0 - Index in panel box - Index within the selected panel box (0: first, 1: second, ..., -1: last) - - - - true - Show Icon on Panel - Show sensor icon on top panel - - - - true - Display Temperature - Display temperature - - 'centigrade' Unit The unit ('centigrade' or 'fahrenheit') the extension should display the temperature in - + true Show degrees celsius/fahrenheit on Panel Show degrees celsius/fahrenheit on Panel - + true - Show RPM on Panel - Show RPM on Panel + Show Icon on Panel + Show sensor icon on top panel - - true - Show volts on Panel - Show volts on Panel + + ["__average__", "__max__"] + Sensors to show in panel + Select the sensord whose values has to be shown in the panel @@ -69,70 +39,46 @@ Show one digit after decimal - + true - Read sensors using lm-sensors - Read sensors using sensors from lm-sensors - - - - false - Read sensors using liquidctl - Read sensors using liquidctl v1.7.0 or later - - - - false - Read GPU sensors from NVidia driver - Read GPU sensors from NVidia driver - - - - false - Read GPU sensors from Bumblebee + NVidia driver - Read GPU sensors from Bumblebee + NVidia driver - - - - false - Read GPU sensors from Catalyst driver - Read GPU sensors from Catalyst driver + Display Fan RPM + Display fan rotation per minute - - false - Read drive sensors from Udisks2 - Read drive sensors from Udisks2 + + true + Display voltage + Display voltage of various components - - false - Read drive sensors using Hddtemp - Read drive sensors using Hddtemp + + 'udisks2' + Utility for detect HDD/SSD temperature + Utility for detect HDD/SSD temperature ('none', 'hddtemp' or 'udisks2') - - false - Read drive sensors using smartctl - Read drive sensors using smartctl from smartmontool + + 'none' + Utility for detect video card temperature + Utility for detect video card temperature ('none', 'nvidia-settings' or 'aticonfig') - + false - Read drive sensors using nvme-cli - Read drive sensors using nvme-cli + Show liquidctl sensors + Show data from liquidctl v1.7.0 or later - - true - Display Fan RPM - Display fan rotation per minute + + 'right' + Position in Panel + Position in Panel ('left', 'center', 'right') - - true - Display voltage - Display voltage of various components + + 0 + Index in panel box + Index within the selected panel box (0: first, 1: second, ..., -1: last) @@ -141,12 +87,6 @@ Group more than three sensors temperature menu items - - true - Group Fan speed menu items - Group more than three fan speed menu items - - true Group voltage menu items diff --git a/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js b/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js index 4888323..53e8981 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js @@ -7,7 +7,7 @@ function getSmartData (argv){ return JSON.parse(ByteArray.toString( GLib.spawn_command_line_sync(`'${smartctl}' ${argv} -j`)[1] )) } -var SmartctlUtil = class { +var smartctlUtil = class { constructor(callback) { this._smartDevices = []; try { From e4bc02da10d74225911d7bed1b967e23711a7aee Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Sat, 20 Nov 2021 07:27:18 +0100 Subject: [PATCH 195/224] freeipmiUtil: implement IPMI reading using ipmi-sensors from FreeIPMI project (#220) Also add an option tu use sudo non-interactively. --- .../extension.js | 40 ++++++- .../freeipmiUtil.js | 100 ++++++++++++++++++ .../prefs.js | 17 +++ ...gnome.shell.extensions.sensors.gschema.xml | 12 +++ 4 files changed, 166 insertions(+), 3 deletions(-) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/freeipmiUtil.js diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 7f8e347..8b52dd9 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -20,6 +20,7 @@ const liquidctlUtil = Me.imports.liquidctlUtil; const smartctlUtil = Me.imports.smartctlUtil; const nvmecliUtil = Me.imports.nvmecliUtil; const BumblebeeNvidiaUtil = Me.imports.bumblebeeNvidiaUtil; +const FreeipmiUtil = Me.imports.freeipmiUtil; const FreonItem = Me.imports.freonItem; const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); @@ -67,8 +68,10 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._utils = { sensors: new SensorsUtil.SensorsUtil() }; + this._initDriveUtility(); this._initGpuUtility(); + this._initIpmiUtility(); this._initLiquidctlUtility(); let temperatureIcon = Gio.icon_new_for_string(Me.path + '/icons/material-icons/material-temperature-symbolic.svg'); @@ -108,6 +111,8 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._addSettingChangedSignal('show-voltage', this._querySensors.bind(this)); this._addSettingChangedSignal('drive-utility', this._driveUtilityChanged.bind(this)); this._addSettingChangedSignal('gpu-utility', this._gpuUtilityChanged.bind(this)); + this._addSettingChangedSignal('ipmi-utility', this._ipmiUtilityChanged.bind(this)); + this._addSettingChangedSignal('method-ipmi-utility', this._ipmiUtilityChanged.bind(this)); this._addSettingChangedSignal('show-liquidctl', this._liquidctlUtilityChanged.bind(this)); this._addSettingChangedSignal('position-in-panel', this._positionInPanelChanged.bind(this)); this._addSettingChangedSignal('panel-box-index', this._positionInPanelChanged.bind(this)); @@ -250,6 +255,27 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._querySensors(); } + _initIpmiUtility(){ + switch(this._settings.get_string('ipmi-utility')){ + case 'freeipmi': + this._utils.ipmi = new FreeipmiUtil.FreeipmiUtil(); + break; + } + } + + _destroyIpmiUtility(){ + if(this._utils.ipmi){ + this._utils.ipmi.destroy(); + delete this._utils.ipmi; + } + } + + _ipmiUtilityChanged(){ + this._destroyIpmiUtility(); + this._initIpmiUtility(); + this._querySensors(); + } + _initLiquidctlUtility() { if (this._settings.get_boolean('show-liquidctl')) this._utils.liquidctl = new liquidctlUtil.LiquidctlUtil(); @@ -288,6 +314,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend _onButtonDestroy(){ this._destroyDriveUtility(); this._destroyGpuUtility(); + this._destroyIpmiUtility(); this._destroyLiquidctlUtility(); Mainloop.source_remove(this._timeoutId); Mainloop.source_remove(this._updateUITimeoutId); @@ -343,13 +370,12 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend } _updateDisplay(){ - let gpuTempInfo = this._utils.sensors.gpu; + let sensorsTempInfo = this._utils.sensors.temp; + let gpuTempInfo = this._utils.sensors.gpu; if (this._utils.gpu && this._utils.gpu.available) gpuTempInfo = gpuTempInfo.concat(this._utils.gpu.temp); - let sensorsTempInfo = this._utils.sensors.temp; - let fanInfo = []; if (this._settings.get_boolean('show-fan-rpm')) fanInfo = this._utils.sensors.rpm; @@ -363,6 +389,14 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend driveTempInfo = driveTempInfo.concat(this._utils.disks.temp); } + if (this._utils.ipmi && this._utils.ipmi.available) { + sensorsTempInfo = sensorsTempInfo.concat(this._utils.ipmi.temp); + if (this._settings.get_boolean('show-fan-rpm')) + fanInfo = fanInfo.concat(this._utils.ipmi.rpm); + if (this._settings.get_boolean('show-voltage')) + voltageInfo = voltageInfo.concat(this._utils.ipmi.volt); + } + if (this._utils.liquidctl && this._utils.liquidctl.available) { sensorsTempInfo = sensorsTempInfo.concat(this._utils.liquidctl.temp); if (this._settings.get_boolean('show-fan-rpm')) diff --git a/freon@UshakovVasilii_Github.yahoo.com/freeipmiUtil.js b/freon@UshakovVasilii_Github.yahoo.com/freeipmiUtil.js new file mode 100644 index 0000000..7b9c6f0 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/freeipmiUtil.js @@ -0,0 +1,100 @@ +const GLib = imports.gi.GLib; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const CommandLineUtil = Me.imports.commandLineUtil; + +var FreeipmiUtil = class extends CommandLineUtil.CommandLineUtil { + constructor() { + super(); + + const path = GLib.find_program_in_path('ipmi-sensors'); + // --comma-separated-output: pseudo csv output format, splitting on comma may be good enough for the values we read. + this._argv = path ? [path, '--comma-separated-output'] : null; + + if (this._argv) { + const ExtensionUtils = imports.misc.extensionUtils; + const Me = ExtensionUtils.getCurrentExtension(); + if (ExtensionUtils.getSettings().get_string('method-ipmi-utility') === 'sudo') + { + const sudo_path = GLib.find_program_in_path('sudo'); + // --non-interactive: do not ask for password, return if no permission. + this._argv = sudo_path ? [sudo_path, '--non-interactive'].concat(this._argv) : null; + } + } + } + + // Avoid parsing the data more than once. + execute(callback) { + super.execute(() => { + let data = []; + + for (const line of this._output) { + if (!line) + continue; + + const value_list = line.split(','); + + if (value_list.length <= 1) + break; + + const id = value_list[0]; + + if (id === 'ID') + continue; + + const name = value_list[1]; + const value = value_list[3]; + const unit = value_list[4]; + + if (value !== 'N/A' && unit !== 'N/A') { + data[name] = {}; + data[name]["value"] = value; + data[name]["unit"] = unit; + } + } + + this._data = data; + callback(); + }); + } + + get temp() { + return this._parseSensorsOutput(/^(C|C per minute)$/, 'temp'); + } + + get rpm() { + return this._parseSensorsOutput(/^RPM$/, 'rpm'); + } + + get volt() { + return this._parseSensorsOutput(/^V$/, 'volt'); + } + + _parseSensorsOutput(sensorFilter, sensorType) { + if(!this._data) + return []; + + const data = this._data; + + let sensors = []; + for (const name in data) { + if (!data.hasOwnProperty(name)) + continue; + + const value = data[name]["value"] + const unit = data[name]["unit"] + + if (!sensorFilter.test(unit)) + continue; + + const feature = { + label: name, + [sensorType]: parseFloat(value) + }; + + sensors.push(feature); + } + + return sensors; + } +}; diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 8e63e0e..47b5aa3 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -88,9 +88,26 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex label: _('Video Card Temperature Utility') }); + this._addComboBox({ + items : { + 'none' : _('None'), + 'freeipmi' : _('FreeIPMI') }, + key: 'ipmi-utility', y : i, x : 0, + label: _('IPMI Sensors Utility') + }); + + this._addComboBox({ + items : { + 'direct' : 'Direct', + 'sudo' : 'sudo' }, + key: 'method-ipmi-utility', y : i, x : 1, + label: '' + }); + this._addSwitch({key : 'show-liquidctl', y : i++, x : 3, label : _('Show liquidctl Sensors'), help : _('Show data from liquidctl v1.7.0 or later')}); + } _addSwitch(params){ diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml index 3b8d146..09bc886 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml +++ b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml @@ -63,6 +63,18 @@ Utility for detect video card temperature ('none', 'nvidia-settings' or 'aticonfig') + + 'none' + Utility for reading IPMI sensors + Utility reading IPMI sensors ('none', 'freeipmi') + + + + 'direct' + Method to run IPMI utility + Method to run IPMI utility + + false Show liquidctl sensors From f3afa64c8b94715ccc23b720e8fa9ba7ab6a4c4c Mon Sep 17 00:00:00 2001 From: Thomas Debesse Date: Sun, 21 Nov 2021 13:29:06 +0100 Subject: [PATCH 196/224] prefs: revamp the preference window and make various providers selectable independently, ref #223 (#226) --- .../extension.js | 633 ++++++++++++------ .../freeipmiUtil.js | 2 +- .../nvmecliUtil.js | 2 +- .../prefs.js | 185 +++-- ...gnome.shell.extensions.sensors.gschema.xml | 150 +++-- .../smartctlUtil.js | 2 +- 6 files changed, 679 insertions(+), 295 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 8b52dd9..54309b6 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -11,17 +11,21 @@ const GObject = imports.gi.GObject; const ExtensionUtils = imports.misc.extensionUtils; const Me = ExtensionUtils.getCurrentExtension(); -const UDisks2 = Me.imports.udisks2; -const AticonfigUtil = Me.imports.aticonfigUtil; -const NvidiaUtil = Me.imports.nvidiaUtil; -const HddtempUtil = Me.imports.hddtempUtil; -const SensorsUtil = Me.imports.sensorsUtil; -const liquidctlUtil = Me.imports.liquidctlUtil; -const smartctlUtil = Me.imports.smartctlUtil; -const nvmecliUtil = Me.imports.nvmecliUtil; -const BumblebeeNvidiaUtil = Me.imports.bumblebeeNvidiaUtil; -const FreeipmiUtil = Me.imports.freeipmiUtil; -const FreonItem = Me.imports.freonItem; + +const SensorsUtil = Me.imports.sensorsUtil.SensorsUtil; +const FreeipmiUtil = Me.imports.freeipmiUtil.FreeipmiUtil; +const LiquidctlUtil = Me.imports.liquidctlUtil.LiquidctlUtil; + +const NvidiaUtil = Me.imports.nvidiaUtil.NvidiaUtil; +const BumblebeeNvidiaUtil = Me.imports.bumblebeeNvidiaUtil.BumblebeeNvidiaUtil; +const AticonfigUtil = Me.imports.aticonfigUtil.AtiConfigUtil; + +const Udisks2Util = Me.imports.udisks2.UDisks2; +const HddtempUtil = Me.imports.hddtempUtil.HddtempUtil; +const SmartctlUtil = Me.imports.smartctlUtil.SmartctlUtil; +const NvmecliUtil = Me.imports.nvmecliUtil.NvmecliUtil; + +const FreonItem = Me.imports.freonItem.FreonItem; const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); const _ = Gettext.gettext; @@ -65,16 +69,23 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._sensorMenuItems = {}; - this._utils = { - sensors: new SensorsUtil.SensorsUtil() - }; + this._utils = {}; - this._initDriveUtility(); - this._initGpuUtility(); - this._initIpmiUtility(); + this._initSensorsUtility(); + this._initFreeipmiUtility(); this._initLiquidctlUtility(); + this._initNvidiaUtility(); + this._initBumblebeeNvidiaUtility(); + this._initAticonfigUtility(); + + this._initUdisks2Utility(); + this._initHddtempUtility(); + this._initSmartctlUtility(); + this._initNvmecliUtility(); + let temperatureIcon = Gio.icon_new_for_string(Me.path + '/icons/material-icons/material-temperature-symbolic.svg'); + this._sensorIcons = { 'temperature' : temperatureIcon, 'temperature-average' : temperatureIcon, @@ -86,10 +97,13 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend } this._menuLayout = new St.BoxLayout(); + this._hotLabels = {}; this._hotIcons = {}; + let hotSensors = this._settings.get_strv('hot-sensors'); let showIcon = this._settings.get_boolean('show-icon-on-panel'); + for (let s of hotSensors){ this._createHotItem(s, showIcon); } @@ -101,22 +115,41 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this.add_actor(this._menuLayout); this._settingChangedSignals = []; - this._addSettingChangedSignal('update-time', this._updateTimeChanged.bind(this)); - this._addSettingChangedSignal('unit', this._querySensors.bind(this)); - this._addSettingChangedSignal('show-degrees-on-panel', this._updateUI.bind(this)); - this._addSettingChangedSignal('show-icon-on-panel', this._showIconOnPanelChanged.bind(this)); + this._addSettingChangedSignal('hot-sensors', this._querySensors.bind(this)); - this._addSettingChangedSignal('show-decimal-value', this._querySensors.bind(this)); - this._addSettingChangedSignal('show-fan-rpm', this._querySensors.bind(this)); - this._addSettingChangedSignal('show-voltage', this._querySensors.bind(this)); - this._addSettingChangedSignal('drive-utility', this._driveUtilityChanged.bind(this)); - this._addSettingChangedSignal('gpu-utility', this._gpuUtilityChanged.bind(this)); - this._addSettingChangedSignal('ipmi-utility', this._ipmiUtilityChanged.bind(this)); - this._addSettingChangedSignal('method-ipmi-utility', this._ipmiUtilityChanged.bind(this)); - this._addSettingChangedSignal('show-liquidctl', this._liquidctlUtilityChanged.bind(this)); + + this._addSettingChangedSignal('update-time', this._updateTimeChanged.bind(this)); this._addSettingChangedSignal('position-in-panel', this._positionInPanelChanged.bind(this)); this._addSettingChangedSignal('panel-box-index', this._positionInPanelChanged.bind(this)); - this._addSettingChangedSignal('group-temperature', this._querySensors.bind(this)) + this._addSettingChangedSignal('show-icon-on-panel', this._showIconOnPanelChanged.bind(this)); + + this._addSettingChangedSignal('show-temperature-unit', this._updateUI.bind(this)); + this._addSettingChangedSignal('unit', this._querySensors.bind(this)); + this._addSettingChangedSignal('show-rotationrate-unit', this._updateUI.bind(this)); + this._addSettingChangedSignal('show-voltage-unit', this._updateUI.bind(this)); + + this._addSettingChangedSignal('show-decimal-value', this._querySensors.bind(this)); + + this._addSettingChangedSignal('use-generic-lmsensors', this._sensorsUtilityChanged.bind(this)); + this._addSettingChangedSignal('use-generic-freeipmi', this._freeipmiUtilityChanged.bind(this)); + this._addSettingChangedSignal('exec-method-freeipmi', this._freeipmiUtilityChanged.bind(this)); + this._addSettingChangedSignal('use-generic-liquidctl', this._liquidctlUtilityChanged.bind(this)); + + this._addSettingChangedSignal('use-gpu-nvidia', this._nvidiaUtilityChanged.bind(this)); + this._addSettingChangedSignal('use-gpu-nvidiabumblebee', this._nvidiabumblebeeUtilityChanged.bind(this)); + this._addSettingChangedSignal('use-gpu-aticonfig', this._aticonfigUtilityChanged.bind(this)); + + this._addSettingChangedSignal('use-drive-udisks2', this._udisks2UtilityChanged.bind(this)); + this._addSettingChangedSignal('use-drive-hddtemp', this._hddtempUtilityChanged.bind(this)); + this._addSettingChangedSignal('use-drive-smartctl', this._smartctlUtilityChanged.bind(this)); + this._addSettingChangedSignal('use-drive-nvmecli', this._nvmecliUtilityChanged.bind(this)); + + this._addSettingChangedSignal('show-temperature', this._rerender.bind(this)); + this._addSettingChangedSignal('show-rotationrate', this._rerender.bind(this)); + this._addSettingChangedSignal('show-voltage', this._rerender.bind(this)); + + this._addSettingChangedSignal('group-temperature', this._rerender.bind(this)) + this._addSettingChangedSignal('group-rotationrate', this._rerender.bind(this)) this._addSettingChangedSignal('group-voltage', this._rerender.bind(this)) this.connect('destroy', this._onButtonDestroy.bind(this)); @@ -137,8 +170,10 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend if(showIcon){ let i = new St.Icon({ style_class: 'system-status-icon'}); this._hotIcons[s] = i; + if(gicon) i.gicon = gicon; + this._menuLayout.add(i); } let l = new St.Label({ @@ -146,6 +181,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend y_expand: true, y_align: Clutter.ActorAlign.CENTER}); l.set_style_class_name(showIcon ? 'freon-panel-icon-label' : 'freon-panel-no-icon-label'); + this._hotLabels[s] = l; this._menuLayout.add(l); } @@ -196,102 +232,196 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._hotLabels[l].set_style_class_name(showIcon ? 'freon-panel-icon-label' : 'freon-panel-no-icon-label'); } - _driveUtilityChanged(){ - this._destroyDriveUtility(); - this._initDriveUtility(); + _initSensorsUtility() { + if (this._settings.get_boolean('use-generic-lmsensors')) + this._utils.sensors = new SensorsUtil(); + } + + _destroySensorsUtility() { + if (this._utils.sensors) { + this._utils.sensors.destroy(); + delete this._utils.sensors; + } + } + + _sensorsUtilityChanged() { + this._destroySensorsUtility(); + this._initSensorsUtility(); this._querySensors(); + this._updateUI(true); } - _initDriveUtility(){ - switch(this._settings.get_string('drive-utility')){ - case 'hddtemp': - this._utils.disks = new HddtempUtil.HddtempUtil(); - break; - case 'udisks2': - this._utils.disks = new UDisks2.UDisks2(() => { - // this._updateDisplay(); we cannot change actor in background thread #74 - }); - break; - case 'smartctl': - this._utils.disks = new smartctlUtil.smartctlUtil(); - break; - case 'nvmecli': - this._utils.disks = new nvmecliUtil.nvmecliUtil(); - break; + _initFreeipmiUtility() { + if (this._settings.get_boolean('use-generic-freeipmi')) + this._utils.freeipmi = new FreeipmiUtil(); + } + + _destroyFreeipmiUtility() { + if(this._utils.freeipmi) { + this._utils.freeipmi.destroy(); + delete this._utils.freeipmi; + } + } + + _freeipmiUtilityChanged() { + this._destroyFreeipmiUtility(); + this._initFreeipmiUtility(); + this._querySensors(); + this._updateUI(true); + } + + _initLiquidctlUtility() { + if (this._settings.get_boolean('use-generic-liquidctl')) + this._utils.liquidctl = new LiquidctlUtil(); + } + + _destroyLiquidctlUtility() { + if (this._utils.liquidctl) { + this._utils.liquidctl.destroy(); + delete this._utils.liquidctl; } } - _destroyDriveUtility(){ - if(this._utils.disks){ - this._utils.disks.destroy(); - delete this._utils.disks; + _liquidctlUtilityChanged() { + this._destroyLiquidctlUtility(); + this._initLiquidctlUtility(); + this._querySensors(); + this._updateUI(true); + } + + _initNvidiaUtility() { + if (this._settings.get_boolean('use-gpu-nvidia')) + this._utils.nvidia = new NvidiaUtil(); + } + + _destroyNvidiaUtility() { + if (this._utils.nvidia) { + this._utils.nvidia.destroy(); + delete this._utils.nvidia; } } - _initGpuUtility(){ - switch(this._settings.get_string('gpu-utility')){ - case 'nvidia-settings': - this._utils.gpu = new NvidiaUtil.NvidiaUtil(); - break; - case 'aticonfig': - this._utils.gpu = new AticonfigUtil.AticonfigUtil(); - break; - case 'bumblebee-nvidia-smi': - this._utils.gpu = new BumblebeeNvidiaUtil.BumblebeeNvidiaUtil(); - break; + _nvidiaUtilityChanged() { + this._destroyNvidiaUtility(); + this._initNvidiaUtility(); + this._querySensors(); + this._updateUI(true); + } + + _initBumblebeeNvidiaUtility() { + if (this._settings.get_boolean('use-gpu-bumblebeenvidia')) + this._utils.nvidiabumblebee = new BumblebeeNvidiaUtil(); + } + + _destroyBumblebeeNvidiaUtility() { + if (this._utils.nvidiabumblebee) { + this._utils.nvidiabumblebee.destroy(); + delete this._utils.nvidiabumblebee; } } - _destroyGpuUtility(){ - if(this._utils.gpu){ - this._utils.gpu.destroy(); - delete this._utils.gpu; + _nvidiabumblebeeUtilityChanged() { + this._destroyBumblebeeNvidiaUtility(); + this._initBumblebeeNvidiaUtility(); + this._querySensors(); + this._updateUI(true); + } + + _initAticonfigUtility() { + if (this._settings.get_boolean('use-gpu-aticonfig')) + this._utils.aticonfig = new AticonfigUtil(); + } + + _destroyAticonfigUtility() { + if (this._utils.aticonfig) { + this._utils.aticonfig.destroy(); + delete this._utils.aticonfig; } } - _gpuUtilityChanged(){ - this._destroyGpuUtility(); - this._initGpuUtility(); + _aticonfigUtilityChanged() { + this._destroyAticonfigUtility(); + this._initAticonfigUtility(); this._querySensors(); + this._updateUI(true); } - _initIpmiUtility(){ - switch(this._settings.get_string('ipmi-utility')){ - case 'freeipmi': - this._utils.ipmi = new FreeipmiUtil.FreeipmiUtil(); - break; + _initUdisks2Utility() { + if (this._settings.get_boolean('use-drive-udisks2')) + this._utils.udisks2 = new Udisks2Util(() => { + // this._updateDisplay(); we cannot change actor in background thread #74 + }); + } + + _destroyUdisks2Utility() { + if (this._utils.udisks2) { + this._utils.udisks2.destroy(); + delete this._utils.udisks2; } } - _destroyIpmiUtility(){ - if(this._utils.ipmi){ - this._utils.ipmi.destroy(); - delete this._utils.ipmi; + _udisks2UtilityChanged() { + this._destroyUdisks2Utility(); + this._initUdisks2Utility(); + this._querySensors(); + this._updateUI(true); + } + + _initHddtempUtility() { + if (this._settings.get_boolean('use-drive-hddtemp')) + this._utils.hddtemp = new HddtempUtil(); + } + + _destroyHddtempUtility() { + if (this._utils.hddtemp) { + this._utils.hddtemp.destroy(); + delete this._utils.hddtemp; } } - _ipmiUtilityChanged(){ - this._destroyIpmiUtility(); - this._initIpmiUtility(); + _hddtempUtilityChanged() { + this._destroyHddtempUtility(); + this._initHddtempUtility(); this._querySensors(); + this._updateUI(true); } - _initLiquidctlUtility() { - if (this._settings.get_boolean('show-liquidctl')) - this._utils.liquidctl = new liquidctlUtil.LiquidctlUtil(); + _initSmartctlUtility() { + if (this._settings.get_boolean('use-drive-smartctl')) + this._utils.smartctl = new SmartctlUtil(); } - _destroyLiquidctlUtility() { - if (this._utils.liquidctl) { - this._utils.liquidctl.destroy(); - delete this._utils.liquidctl; + _destroySmartctlUtility() { + if (this._utils.smartctl) { + this._utils.smartctl.destroy(); + delete this._utils.smartctl; } } - _liquidctlUtilityChanged() { - this._destroyLiquidctlUtility(); - this._initLiquidctlUtility(); + _smartctlUtilityChanged() { + this._destroySmartctlUtility(); + this._initSmartctlUtility(); + this._querySensors(); + this._updateUI(true); + } + + _initNvmecliUtility() { + if (this._settings.get_boolean('use-drive-nvmecli')) + this._utils.nvmecli = new NvmecliUtil(); + } + + _destroyNvmecliUtility() { + if (this._utils.nvmecli) { + this._utils.nvmecli.destroy(); + delete this._utils.nvmecli; + } + } + + _nvmecliUtilityChanged() { + this._destroyNvmecliUtility(); + this._initNvmecliUtility(); this._querySensors(); + this._updateUI(true); } _updateTimeChanged(){ @@ -312,10 +442,19 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend } _onButtonDestroy(){ - this._destroyDriveUtility(); - this._destroyGpuUtility(); - this._destroyIpmiUtility(); + this._destroySensorsUtility(); + this._destroyFreeipmiUtility(); this._destroyLiquidctlUtility(); + + this._destroyNvidiaUtility(); + this._destroyBumblebeeNvidiaUtility(); + this._destroyAticonfigUtility(); + + this._destroyUdisks2Utility(); + this._destroyHddtempUtility(); + this._destroySmartctlUtility(); + this._destroyNvmecliUtility(); + Mainloop.source_remove(this._timeoutId); Mainloop.source_remove(this._updateUITimeoutId); @@ -342,6 +481,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend needUpdate = true; } } + if(needUpdate) { this._updateDisplay(); // #74 this.debug('update display'); @@ -350,61 +490,96 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend _fixNames(sensors){ let names = []; + for (let s of sensors){ if(s.type == 'separator' || s.type == 'temperature-group' || s.type == 'temperature-average' || s.type == 'temperature-maximum') continue; + let name = s.label; let i = 1; + while(names.indexOf(name) >= 0){ name = s.label + '-' + i++; } + if(name != s.label){ s.displayName = s.label; s.label = name; } + names.push(name); } } _updateDisplay(){ - let sensorsTempInfo = this._utils.sensors.temp; - - let gpuTempInfo = this._utils.sensors.gpu; - if (this._utils.gpu && this._utils.gpu.available) - gpuTempInfo = gpuTempInfo.concat(this._utils.gpu.temp); - + let sensorsTempInfo = []; + let gpuTempInfo = [] + let driveTempInfo = []; let fanInfo = []; - if (this._settings.get_boolean('show-fan-rpm')) - fanInfo = this._utils.sensors.rpm; - let voltageInfo = []; - if (this._settings.get_boolean('show-voltage')) - voltageInfo = this._utils.sensors.volt; - let driveTempInfo = this._utils.sensors.disks; - if(this._utils.disks && this._utils.disks.available) { - driveTempInfo = driveTempInfo.concat(this._utils.disks.temp); + if (this._utils.sensors && this._utils.sensors.available) { + if (this._settings.get_boolean('show-temperature')) { + sensorsTempInfo = sensorsTempInfo.concat(this._utils.sensors.temp); + gpuTempInfo = gpuTempInfo.concat(this._utils.sensors.gpu); + driveTempInfo = driveTempInfo.concat(this._utils.sensors.disks); + } + + if (this._settings.get_boolean('show-rotationrate')) + fanInfo = fanInfo.concat(this._utils.sensors.rpm); + if (this._settings.get_boolean('show-voltage')) + voltageInfo = voltageInfo.concat(this._utils.sensors.volt); } - if (this._utils.ipmi && this._utils.ipmi.available) { - sensorsTempInfo = sensorsTempInfo.concat(this._utils.ipmi.temp); - if (this._settings.get_boolean('show-fan-rpm')) - fanInfo = fanInfo.concat(this._utils.ipmi.rpm); + if (this._utils.freeipmi && this._utils.freeipmi.available) { + if (this._settings.get_boolean('show-temperature')) + sensorsTempInfo = sensorsTempInfo.concat(this._utils.freeipmi.temp); + if (this._settings.get_boolean('show-rotationrate')) + fanInfo = fanInfo.concat(this._utils.freeipmi.rpm); if (this._settings.get_boolean('show-voltage')) - voltageInfo = voltageInfo.concat(this._utils.ipmi.volt); + voltageInfo = voltageInfo.concat(this._utils.freeipmi.volt); } if (this._utils.liquidctl && this._utils.liquidctl.available) { - sensorsTempInfo = sensorsTempInfo.concat(this._utils.liquidctl.temp); - if (this._settings.get_boolean('show-fan-rpm')) + if (this._settings.get_boolean('show-temperature')) + sensorsTempInfo = sensorsTempInfo.concat(this._utils.liquidctl.temp); + if (this._settings.get_boolean('show-rotationrate')) fanInfo = fanInfo.concat(this._utils.liquidctl.rpm); if (this._settings.get_boolean('show-voltage')) voltageInfo = voltageInfo.concat(this._utils.liquidctl.volt); } + if (this._utils.nvidia && this._utils.nvidia.available) + if (this._settings.get_boolean('show-temperature')) + gpuTempInfo = gpuTempInfo.concat(this._utils.nvidia.temp); + + if (this._utils.bumblebeenvidia && this._utils.bumblebeenvidia.available) + if (this._settings.get_boolean('show-temperature')) + gpuTempInfo = gpuTempInfo.concat(this._utils.bumblebeenvidia.temp); + + if (this._utils.aticonfig && this._utils.aticonfig.available) + if (this._settings.get_boolean('show-temperature')) + gpuTempInfo = gpuTempInfo.concat(this._utils.aticonfig.temp); + + if (this._utils.udisks2 && this._utils.udisks2.available) + if (this._settings.get_boolean('show-temperature')) + driveTempInfo = driveTempInfo.concat(this._utils.udisks2.temp); + + if (this._utils.hddtemp && this._utils.hddtemp.available) + if (this._settings.get_boolean('show-temperature')) + driveTempInfo = driveTempInfo.concat(this._utils.hddtemp.temp); + + if (this._utils.smartctl && this._utils.smartctl.available) + if (this._settings.get_boolean('show-temperature')) + driveTempInfo = driveTempInfo.concat(this._utils.smartctl.temp); + + if (this._utils.nvmecli && this._utils.nvmecli.available) + if (this._settings.get_boolean('show-temperature')) + driveTempInfo = driveTempInfo.concat(this._utils.nvmecli.temp); + sensorsTempInfo.sort(function(a,b) { return a.label.localeCompare(b.label) }); driveTempInfo.sort(function(a,b) { return a.label.localeCompare(b.label) }); fanInfo.sort(function(a,b) { return a.label.localeCompare(b.label) }); @@ -412,78 +587,127 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend let tempInfo = gpuTempInfo.concat(sensorsTempInfo).concat(driveTempInfo); - if (tempInfo.length > 0){ - let total = 0; - let sum = 0; - let max = 0; - for (let i of tempInfo){ - if(i.temp !== null && i.temp >= 0){ + if (tempInfo.length == 0 + && fanInfo.length == 0 + && voltageInfo.length == 0) { + this._sensorMenuItems = {}; + this.menu.removeAll(); + + let item = new PopupMenu.PopupMenuItem( + this._utils.sensors && this._utils.sensors.available + ? _("Please run sensors-detect as root.") + : _("Please install lm_sensors.\nIf this doesn\'t help, click here to report with your sensors output!") + ); + + item.connect('activate',function() { + Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki/Dependency"]); + }); + + this.menu.addMenuItem(item); + this._appendStaticMenuItems(); + + for (let k in this._hotLabels) + this._hotLabels[k].set_text('\u26a0'); // ⚠, warning + } else { + let tempMean = 0; + let tempMax = 0; + + for (let i of tempInfo) { + let sum = 0; + let total = 0; + + if (i.temp !== null && i.temp >= 0) { total++; sum += i.temp; - if (i.temp > max) - max = i.temp; + + if (i.temp > tempMax) + tempMax = i.temp; } + + if (total != 0) + tempMean = sum / total; } let sensors = []; - for (let i of gpuTempInfo){ + for (let i of gpuTempInfo) { sensors.push({ - type: 'gpu-temperature', + icon: 'gpu-temperature', + type: 'temperature', label: i.label, value: this._formatTemp(i.temp), displayName: i.displayName}); } - for (let i of sensorsTempInfo){ - sensors.push({type:'temperature', label: i.label, value:this._formatTemp(i.temp)}); + + for (let i of sensorsTempInfo) { + sensors.push({ + icon: 'temperature', + type: 'temperature', + label: i.label, + value: this._formatTemp(i.temp)}); } - for (let i of driveTempInfo){ - sensors.push({type:'drive-temperature', label: i.label, value:this._formatTemp(i.temp)}); + + for (let i of driveTempInfo) { + sensors.push({ + icon: 'drive-temperature', + type: 'temperature', + label: i.label, + value: this._formatTemp(i.temp)}); } - if (tempInfo.length > 0){ + if (tempInfo.length > 0) { sensors.push({type : 'separator'}); // Add average and maximum entries - sensors.push({type: 'temperature-average', - key: '__average__', - label: _("Average"), - value: this._formatTemp(sum/total)}); - sensors.push({type: 'temperature-maximum', - key: '__max__', - label: _("Maximum"), - value: this._formatTemp(max)}); - - if(fanInfo.length > 0 || voltageInfo.length > 0) + sensors.push({ + icon: 'temperature-average', + type: 'temperature-average', + key: '__average__', + label: _("Average"), + value: this._formatTemp(tempMean)}); + + sensors.push({ + icon: 'temperature-maximum', + type: 'temperature-maximum', + key: '__max__', + label: _("Maximum"), + value: this._formatTemp(tempMax)}); + + if (fanInfo.length > 0 || voltageInfo.length > 0) sensors.push({type : 'separator'}); } - if(sensorsTempInfo.length > 0 && this._settings.get_boolean('group-temperature')){ - sum = 0; - for (let i of sensorsTempInfo){ - sum += i.temp; - } + if (tempInfo.length > 0 && this._settings.get_boolean('group-temperature')) { sensors.push({ - type:'temperature-group', - label:'temperature-group', - value: this._formatTemp(sum / sensorsTempInfo.length)}); + icon: 'temperature-group', + type: 'temperature-group', + label: 'temperature-group', + value: this._formatTemp(tempMean)}); } for (let fan of fanInfo){ + const unit = this._settings.get_boolean('show-rotationrate-unit') ? _('rpm'): ''; + sensors.push({ - type:'fan', - label:fan.label, - value:_("%drpm").format(fan.rpm)}); + icon: 'fan', + type: 'fan', + label: fan.label, + value: _("%d%s").format(fan.rpm, unit)}); } + if (fanInfo.length > 0 && voltageInfo.length > 0){ sensors.push({type : 'separator'}); } + for (let voltage of voltageInfo){ + const unit = this._settings.get_boolean('show-voltage-unit') ? _('V'): ''; + sensors.push({ - type : 'voltage', - label:voltage.label, - value:_("%s%.2fV").format(((voltage.volt >= 0) ? '+' : ''), - voltage.volt)}); + icon: 'voltage', + type: 'voltage', + label: voltage.label, + value: _("%s%.2f%s").format(((voltage.volt >= 0) ? '+' : ''), + voltage.volt, unit)}); } this._fixNames(sensors); @@ -525,20 +749,6 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this.menu.removeAll(); this._appendMenuItems(sensors); } - } else { - this._sensorMenuItems = {}; - this.menu.removeAll(); - - let item = new PopupMenu.PopupMenuItem( - this._utils.sensors.available - ? _("Please run sensors-detect as root.") - : _("Please install lm_sensors.\nIf this doesn\'t help, click here to report with your sensors output!") - ); - item.connect('activate',function() { - Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki/Dependency"]); - }); - this.menu.addMenuItem(item); - this._appendStaticMenuItems(); } } @@ -549,8 +759,9 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend let wiki = new PopupMenu.PopupBaseMenuItem(); wiki.actor.add_child(new St.Label({ text: _("Go to the Freon wiki"), x_align: Clutter.ActorAlign.START, x_expand: true })); wiki.connect('activate', function () { - Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki"]); + Util.spawn(["xdg-open", "https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki"]); }); + this.menu.addMenuItem(wiki); let settings = new PopupMenu.PopupBaseMenuItem(); @@ -558,6 +769,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend settings.connect('activate', function () { Util.spawn(["gnome-extensions", "prefs", Me.metadata.uuid]); }); + this.menu.addMenuItem(settings); } @@ -565,23 +777,38 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend this._lastSensorsCount = sensors.length; this._sensorMenuItems = {}; let needGroupTemperature = this._settings.get_boolean('group-temperature'); + let needGroupRotationRate = this._settings.get_boolean('group-rotationrate'); let needGroupVoltage = this._settings.get_boolean('group-voltage'); - if(needGroupVoltage){ + if (needGroupRotationRate) { let i = 0; + for (let s of sensors) - if(s.type == 'voltage') + if (s.type == 'fan') i++; - if(i < 2) + + if (i < 2) + needGroupRotationRate = false; + } + + if (needGroupVoltage) { + let i = 0; + + for (let s of sensors) + if (s.type == 'voltage') + i++; + + if (i < 2) needGroupVoltage = false; } let temperatureGroup = null; + let rotationrateGroup = null; let voltageGroup = null; for (let s of sensors){ - if(s.type == 'separator'){ - this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + if(s.type == 'separator') { + this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); } else if (s.type == 'temperature-group') { if(temperatureGroup) { temperatureGroup.status.text = s.value; @@ -589,46 +816,54 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend } } else { let key = s.key || s.label; - let item = new FreonItem.FreonItem(this._sensorIcons[s.type], key, s.label, s.value, s.displayName || undefined); + let item = new FreonItem(this._sensorIcons[s.icon], key, s.label, s.value, s.displayName || undefined); + item.connect('activate', (self) => { let l = this._hotLabels[self.key]; let hotSensors = this._settings.get_strv('hot-sensors'); - if(l){ + + if (l) { hotSensors.splice(hotSensors.indexOf(self.key), 1); delete this._hotLabels[self.key]; l.destroy(); // destroy is called after dict cleanup to prevert set_label on not exist actor let i = this._hotIcons[self.key]; - if(i){ + + if (i) { i.destroy(); delete this._hotIcons[self.key]; } + self.main = false; } else { hotSensors.push(self.key); - if(Object.keys(this._hotLabels).length == 0){ + + if (Object.keys(this._hotLabels).length == 0) { this._initialIcon.destroy(); this._initialIcon = null; } + let showIcon = this._settings.get_boolean('show-icon-on-panel'); this._createHotItem(self.key, showIcon, self.gicon); self.main = true; } - for(let i = hotSensors.length -1; i >= 0 ; i--){ + for (let i = hotSensors.length -1; i >= 0 ; i--) { let k = hotSensors[i]; - if(!this._sensorMenuItems[k]){ + + if (!this._sensorMenuItems[k]) { hotSensors.splice(i, 1); let ll = this._hotLabels[k] delete this._hotLabels[k]; ll.destroy(); // destroy is called after dict cleanup to prevert set_label on not exist actor - if(this._hotIcons[k]){ + + if (this._hotIcons[k]) { this._hotIcons[k].destroy(); delete this._hotIcons[k]; } } } - if(Object.keys(this._hotLabels).length == 0) + if (Object.keys(this._hotLabels).length == 0) this._createInitialIcon(); this._settings.set_strv('hot-sensors', hotSensors.filter( @@ -636,33 +871,47 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend return hotSensors.indexOf(item) == pos; })); }); + if (this._hotLabels[key]) { item.main = true; if(this._hotIcons[key]) this._hotIcons[key].gicon = item.gicon; } + this._sensorMenuItems[key] = item; - if(needGroupTemperature && s.type == 'temperature') { - if(!temperatureGroup) { - temperatureGroup = new PopupMenu.PopupSubMenuMenuItem(_('Temperature Sensors'), true); + if (needGroupTemperature && s.type == 'temperature') { + if (!temperatureGroup) { + temperatureGroup = new PopupMenu.PopupSubMenuMenuItem(_('Temperature'), true); temperatureGroup.icon.gicon = this._sensorIcons['temperature']; - if(!temperatureGroup.status) { // gnome 3.18 and hight + + if (!temperatureGroup.status) { // gnome 3.18 and hight temperatureGroup.status = new St.Label({ style_class: 'popup-status-menu-item', y_expand: true, y_align: Clutter.ActorAlign.CENTER }); temperatureGroup.actor.insert_child_at_index(temperatureGroup.status, 4); } + this.menu.addMenuItem(temperatureGroup); } + temperatureGroup.menu.addMenuItem(item); - } else if(needGroupVoltage && s.type == 'voltage') { - if(!voltageGroup) { + } else if (needGroupRotationRate && s.type == 'fan') { + if (!rotationrateGroup) { + rotationrateGroup = new PopupMenu.PopupSubMenuMenuItem(_('Rotation Rate'), true); + rotationrateGroup.icon.gicon = this._sensorIcons['fan']; + this.menu.addMenuItem(rotationrateGroup); + } + + rotationrateGroup.menu.addMenuItem(item); + } else if (needGroupVoltage && s.type == 'voltage') { + if (!voltageGroup) { voltageGroup = new PopupMenu.PopupSubMenuMenuItem(_('Voltage'), true); voltageGroup.icon.gicon = this._sensorIcons['voltage']; this.menu.addMenuItem(voltageGroup); } + voltageGroup.menu.addMenuItem(item); } else { this.menu.addMenuItem(item); @@ -689,7 +938,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend } format += '%s'; - if(this._settings.get_boolean('show-degrees-on-panel')){ + if(this._settings.get_boolean('show-temperature-unit')){ return format.format(value, (this._settings.get_string('unit')=='fahrenheit') ? "\u00b0F" : "\u00b0C" ); } else { return format.format(value, ""); diff --git a/freon@UshakovVasilii_Github.yahoo.com/freeipmiUtil.js b/freon@UshakovVasilii_Github.yahoo.com/freeipmiUtil.js index 7b9c6f0..3576fa4 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/freeipmiUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/freeipmiUtil.js @@ -14,7 +14,7 @@ var FreeipmiUtil = class extends CommandLineUtil.CommandLineUtil { if (this._argv) { const ExtensionUtils = imports.misc.extensionUtils; const Me = ExtensionUtils.getCurrentExtension(); - if (ExtensionUtils.getSettings().get_string('method-ipmi-utility') === 'sudo') + if (ExtensionUtils.getSettings().get_string('exec-method-freeipmi') === 'sudo') { const sudo_path = GLib.find_program_in_path('sudo'); // --non-interactive: do not ask for password, return if no permission. diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js index a475ec3..98a61df 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvmecliUtil.js @@ -7,7 +7,7 @@ function getNvmeData (argv){ return JSON.parse(GLib.spawn_command_line_sync(`${nvme} ${argv} -o json`)[1].toString()) } -var nvmecliUtil = class { +var NvmecliUtil = class { constructor(callback) { this._nvmeDevices = []; try { diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 47b5aa3..a3b038e 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -26,99 +26,173 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex this._settings = ExtensionUtils.getSettings(); let i = 0; + let j = 0; + + this._addLabel({ + label: _('Display Options'), + y : i++, x : j + }); + + this._addLabel({ + label: _('Poll Sensors Every (sec)'), + y : i, x : j + }); - this.attach(new Gtk.Label({ label: _('Poll Sensors Every (sec)'), halign : Gtk.Align.END}), 0, i, 1, 1); let updateTime = Gtk.SpinButton.new_with_range (1, 60, 1); - this.attach(updateTime, 1, i++, 1, 1); + this.attach(updateTime, j + 1, i++, 1, 1); this._settings.bind('update-time', updateTime, 'value', Gio.SettingsBindFlags.DEFAULT); - this._addSwitch({key : 'show-decimal-value', y : i, x : 0, - label : _('Show Decimal Value'), - help : _("Show one digit after decimal")}); - this._addComboBox({ - items : {centigrade : "\u00b0C", fahrenheit : "\u00b0F"}, - key: 'unit', y : i++, x : 3, - label: _('Temperature Unit') + label: _('Position on Panel'), + items : {left : _('Left'), center : _('Center'), right : _('Right')}, + key: 'position-in-panel', y : i++, x : j }); - this._addComboBox({ - items : {left : _('Left'), center : _('Center'), right : _('Right')}, - key: 'position-in-panel', y : i, x : 0, - label: _('Position in Panel') + this._addLabel({ + label: _('Index on Panel'), + y : i, x : j }); let panelBoxIndex = Gtk.SpinButton.new_with_range (-1, 20, 1); - this.attach(panelBoxIndex, 2, i, 1, 1); + this.attach(panelBoxIndex, j + 1, i++, 1, 1); this._settings.bind('panel-box-index', panelBoxIndex, 'value', Gio.SettingsBindFlags.DEFAULT); - this._addSwitch({key : 'show-degrees-on-panel', y : i++, x : 3, - label : _('Show \u00b0C/\u00b0F on Panel')}); - - this._addSwitch({key : 'show-icon-on-panel', y : i++, x : 3, + this._addSwitch({key : 'show-icon-on-panel', y : i++, x : j, label : _('Show Icon on Panel')}); - this._addSwitch({key : 'show-fan-rpm', y : i, x : 0, - label : _('Show Fan Speed')}); + this._addComboBox({ + label: 'Temperature Unit', + items : {centigrade : _("\u00b0C"), fahrenheit : _("\u00b0F")}, + key: 'unit', y : i++, x : j + }); - this._addSwitch({key : 'show-voltage', y : i++, x : 3, - label : _('Show Power Supply Voltage')}); + this._addSwitch({key : 'show-temperature-unit', y : i++, x : j, + label : _('Show Temperature Unit')}); - this._addSwitch({key : 'group-temperature', y : i, x : 0, - label : _('Group Temperature Items'), - help : _("Works if you have more than three temperature sensors")}); + this._addSwitch({key : 'show-rotationrate-unit', y : i++, x : j, + label : _('Show Rotation Rate Unit')}); - this._addSwitch({key : 'group-voltage', y : i++, x : 3, - label : _('Group Voltage Items'), - help : _("Works if you have more than three voltage sensors")}); + this._addSwitch({key : 'show-voltage-unit', y : i++, x : j, + label : _('Show Voltage Unit')}); - this._addComboBox({ - items : {none : _('None'), hddtemp : 'Hddtemp', udisks2 : 'UDisks2', smartctl : 'smartctl', nvmecli : 'nvme-cli'}, - key: 'drive-utility', y : i, x : 0, - label: _('HDD/SSD Temperature Utility') - }); + this._addSwitch({key : 'show-decimal-value', y : i++, x : j, + label : _('Show Decimal Values'), + help : _("Show additionnal digits after decimal point")}); - this._addComboBox({ - items : { - 'none' : _('None'), - 'nvidia-settings' : _('NVIDIA'), - 'aticonfig' : _('Catalyst'), - 'bumblebee-nvidia-smi': _('Bumblebee + NVIDIA') }, - key: 'gpu-utility', y : i++, x : 3, - label: _('Video Card Temperature Utility') - }); + i = 0; + j = 2; - this._addComboBox({ - items : { - 'none' : _('None'), - 'freeipmi' : _('FreeIPMI') }, - key: 'ipmi-utility', y : i, x : 0, - label: _('IPMI Sensors Utility') + this._addLabel({ + label: _('Generic Sensor Providers'), + y : i++, x : j }); + this._addSwitch({key : 'use-generic-lmsensors', y : i++, x : j, + label : 'lm-sensors', + help : _('Read sensors from lm-sensors')}); + + this._addSwitch({key : 'use-generic-freeipmi', y : i, x : j, + label : 'FreeIPMI', + help : _('Read sensors using ipmi-sensors from FreeIPMI')}); + this._addComboBox({ items : { 'direct' : 'Direct', 'sudo' : 'sudo' }, - key: 'method-ipmi-utility', y : i, x : 1, + key: 'exec-method-freeipmi', y : i++, x : j + 1, label: '' }); - this._addSwitch({key : 'show-liquidctl', y : i++, x : 3, - label : _('Show liquidctl Sensors'), - help : _('Show data from liquidctl v1.7.0 or later')}); + this._addSwitch({key : 'use-generic-liquidctl', y : i++, x : j, + label : 'liquidctl', + help : _('Read sensors from liquidctl (requires v1.7.0 or later)')}); + + this._addLabel({ + label: _('GPU Sensor Providers'), + y : i++, x : j + }); + + this._addSwitch({key : 'use-gpu-nvidia', y : i++, x : j, + label : 'Nvidia'}); + + this._addSwitch({key : 'use-gpu-bumblebeenvidia', y : i++, x : j, + label : 'Bumblebee + Nvidia'}); + + this._addSwitch({key : 'use-gpu-aticonfig', y : i++, x : j, + label : 'Catalyst'}); + + this._addLabel({ + label: _('Drive Sensor Providers'), + y : i++, x : j + }); + + this._addSwitch({key : 'use-drive-udisks2', y : i++, x : j, + label : 'Udisks2'}); + + this._addSwitch({key : 'use-drive-hddtemp', y : i++, x : j, + label : 'Hddtemp'}); + + this._addSwitch({key : 'use-drive-smartctl', y : i++, x : j, + label : 'smartctl', + help : _('Read drive sensors from smartctl from smartmontools')}); + + this._addSwitch({key : 'use-drive-nvmecli', y : i++, x : j, + label : 'nvme-cli'}); + + i = 0; + j = 5; + + this._addLabel({ + label: _('Show Sensors'), + y : i++, x : j + }); + + this._addSwitch({key : 'show-temperature', y : i++, x : j, + label : _('Temperature')}); + + this._addSwitch({key : 'show-rotationrate', y : i++, x : j, + label : _('Rotation Rate')}); + + this._addSwitch({key : 'show-voltage', y : i++, x : j, + label : _('Voltage')}); + + this._addLabel({ + label: _('Group Items'), + y : i++, x : j + }); + + this._addSwitch({key : 'group-temperature', y : i++, x : j, + label : _('Temperature'), + help : _("Group three or more temperature sensors")}); + + this._addSwitch({key : 'group-rotationrate', y : i++, x : j, + label : _('Rotation Rate'), + help : _("Group three or more rotation rate sensors")}); + this._addSwitch({key : 'group-voltage', y : i++, x : j, + label : _('Voltage'), + help : _("Group three or more voltage sensors")}); } - _addSwitch(params){ + _addLabel(params){ let lbl = new Gtk.Label({label: params.label,halign : Gtk.Align.END}); this.attach(lbl, params.x, params.y, 1, 1); + + if(params.help){ + lbl.set_tooltip_text(params.help); + } + } + + _addSwitch(params){ + this._addLabel(params); + let sw = new Gtk.Switch({halign : Gtk.Align.END, valign : Gtk.Align.CENTER}); this.attach(sw, params.x + 1, params.y, 1, 1); + if(params.help){ - lbl.set_tooltip_text(params.help); sw.set_tooltip_text(params.help); } + this._settings.bind(params.key, sw, 'active', Gio.SettingsBindFlags.DEFAULT); } @@ -144,7 +218,8 @@ var FreonPrefsWidget = new GObject.registerClass(class Freon_FreonPrefsWidget ex this._settings.set_string(params.key, model.get_value(iter, 0)) }); - this.attach(new Gtk.Label({ label: params.label, halign : Gtk.Align.END}), params.x, params.y, 1, 1); + this._addLabel(params); + this.attach(combobox, params.x + 1, params.y, 1, 1); } }); diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml index 09bc886..63ea4c7 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml +++ b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml @@ -3,34 +3,64 @@ + + ["__average__", "__max__"] + Sensors to show in panel + Select the sensord whose values has to be shown in the panel + + 5 Seconds before next update This is the seconds after CPU temperature extension updates the data from the syetem + + 'right' + Position in Panel + Position in Panel ('left', 'center', 'right') + + + + 0 + Index in panel box + Index within the selected panel box (0: first, 1: second, ..., -1: last) + + + + true + Show Icon on Panel + Show sensor icon on top panel + + + + true + Display Temperature + Display temperature + + 'centigrade' Unit The unit ('centigrade' or 'fahrenheit') the extension should display the temperature in - - + + true Show degrees celsius/fahrenheit on Panel Show degrees celsius/fahrenheit on Panel - + true - Show Icon on Panel - Show sensor icon on top panel + Show RPM on Panel + Show RPM on Panel - - ["__average__", "__max__"] - Sensors to show in panel - Select the sensord whose values has to be shown in the panel + + true + Show volts on Panel + Show volts on Panel @@ -39,70 +69,100 @@ Show one digit after decimal - + true - Display Fan RPM - Display fan rotation per minute + Read sensors from lm-sensors + Read sensors from lm-sensors - - true - Display voltage - Display voltage of various components + + false + Read sensors using ipmi-sensors from FreeIPMI + Read sensors using ipmi-sensors from FreeIPMI - - 'udisks2' - Utility for detect HDD/SSD temperature - Utility for detect HDD/SSD temperature ('none', 'hddtemp' or 'udisks2') + + 'direct' + Method to run FreeIPMI utility + Method to run FreeIPMI utility - - 'none' - Utility for detect video card temperature - Utility for detect video card temperature ('none', 'nvidia-settings' or 'aticonfig') + + false + Read sensors from liquidctl + Read sensors from (requires liquidctl v1.7.0 or later) - - 'none' - Utility for reading IPMI sensors - Utility reading IPMI sensors ('none', 'freeipmi') + + false + Read GPU sensors from NVidia driver + Read GPU sensors from NVidia driver - - 'direct' - Method to run IPMI utility - Method to run IPMI utility + + false + Read GPU sensors from Bumblebee + NVidia driver + Read GPU sensors from Bumblebee + NVidia driver - + false - Show liquidctl sensors - Show data from liquidctl v1.7.0 or later + Read GPU sensors from Catalyst driver + Read GPU sensors from Catalyst driver - - 'right' - Position in Panel - Position in Panel ('left', 'center', 'right') + + false + Read drive sensors from Udisks2 + Read drive sensors from Udisks2 - - 0 - Index in panel box - Index within the selected panel box (0: first, 1: second, ..., -1: last) + + false + Read drive sensors using Hddtemp + Read drive sensors using Hddtemp + + + + false + Read drive sensors using smartctl + Read drive sensors using smartctl from smartmontool + + + + false + Read drive sensors using nvme-cli + Read drive sensors using nvme-cli + + + + true + Display rotationrate + Display rotation rate (per minute) + + + + true + Display voltage + Display voltage of various components true Group temperature menu items - Group more than three sensors temperature menu items + Group three or more temperature sensors + + + + true + Group Fan speed menu items + Group three or more fan sensors true Group voltage menu items - Group more than three voltage menu items + Group three or more voltage sensors diff --git a/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js b/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js index 53e8981..4888323 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/smartctlUtil.js @@ -7,7 +7,7 @@ function getSmartData (argv){ return JSON.parse(ByteArray.toString( GLib.spawn_command_line_sync(`'${smartctl}' ${argv} -j`)[1] )) } -var smartctlUtil = class { +var SmartctlUtil = class { constructor(callback) { this._smartDevices = []; try { From 010c363d9bff8ed28000cbf8df2226dad65078fb Mon Sep 17 00:00:00 2001 From: Shem Pasamba Date: Sat, 5 Feb 2022 17:26:11 +0800 Subject: [PATCH 197/224] Add 42 since it works there too (#228) --- freon@UshakovVasilii_Github.yahoo.com/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index 411649e..8880c5e 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": ["40", "41"], + "shell-version": ["40", "41", "42"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", "description": "Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", From 05c7aa96d864dafb0ff86dc03ba79828c04bb627 Mon Sep 17 00:00:00 2001 From: KuroeHanako <78864678+kuroehanako@users.noreply.github.com> Date: Tue, 22 Feb 2022 23:19:40 +0900 Subject: [PATCH 198/224] Add Korean Translation (#229) --- .../po/ko.po | 148 ++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/ko.po diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/ko.po b/freon@UshakovVasilii_Github.yahoo.com/po/ko.po new file mode 100644 index 0000000..b4cc4a3 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/po/ko.po @@ -0,0 +1,148 @@ +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-06 17:05-0300\n" +"PO-Revision-Date: 2022-02-22 18:15+0900\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Poedit 3.0.1\n" + +#: bumblebeeNvidiaUtil.js:75 prefs.js:82 +msgid "Bumblebee + NVIDIA" +msgstr "Bumblebee + NVIDIA" + +#: extension.js:319 +msgid "Average" +msgstr "평균" + +#: extension.js:320 +msgid "Maximum" +msgstr "최대" + +#: extension.js:341 +#, javascript-format +msgid "%drpm" +msgstr "%drpm" + +#: extension.js:350 +#, javascript-format +msgid "%s%.2fV" +msgstr "%s%.2fV" + +#: extension.js:396 +msgid "Please run sensors-detect as root." +msgstr "먼저 루트 권한으로 sensors-detect를 실행하십시오." + +#: extension.js:397 +msgid "" +"Please install lm_sensors.\n" +"If this doesn't help, click here to report with your sensors output!" +msgstr "" +"lm_sensors를 설치하십시오.\n" +"도움이 안 된다면, 클릭하여 장치의 센서 출력이 포함된 오류 보고를 보내십시오!" + +#: extension.js:488 +msgid "Temperature Sensors" +msgstr "온도 센서" + +#: extension.js:495 +msgid "Voltage" +msgstr "전압" + +#: extension.js:509 +msgid "Sensors Settings" +msgstr "센서 설정" + +#: prefs.js:33 +msgid "Poll Sensors Every (sec)" +msgstr "폴링 센서 (초)" + +#: prefs.js:39 +msgid "Show Decimal Value" +msgstr "십진법으로 표시" + +#: prefs.js:40 +msgid "Show one digit after decimal" +msgstr "십진법 옆에 한 자릿 수 표시" + +#: prefs.js:45 +msgid "Temperature Unit" +msgstr "온도 단위" + +#: prefs.js:51 +msgid "Position in Panel" +msgstr "패널 내 아이콘 위치" + +#: prefs.js:55 +msgid "Show Icon on Panel" +msgstr "패널에 아이콘 표시" + +#: prefs.js:58 +msgid "Show Fan Speed" +msgstr "팬 속도 표시" + +#: prefs.js:61 +msgid "Show Power Supply Voltage" +msgstr "전원 공급 장치 전압 표시" + +#: prefs.js:64 +msgid "Group Temperature Items" +msgstr "그룹화된 온도 항목" + +#: prefs.js:65 +msgid "Works if you have more than three temperature sensors" +msgstr "3개 이상의 온도 센서가 감지되었을 때 동작" + +#: prefs.js:68 +msgid "Group Voltage Items" +msgstr "그룹화된 전압 항목" + +#: prefs.js:69 +msgid "Works if you have more than three voltage sensors" +msgstr "3개 이상의 전압 센서가 감지되었을 때 동작" + +#: prefs.js:74 +msgid "HDD/SSD Temperature Utility" +msgstr "하드디스크/SSD 온도 유틸리티" + +#: prefs.js:79 +msgid "None" +msgstr "없음" + +#: prefs.js:80 +msgid "NVIDIA" +msgstr "NVIDIA" + +#: prefs.js:81 +msgid "Catalyst" +msgstr "AMD 카탈리스트" + +#: prefs.js:84 +msgid "Video Card Temperature Utility" +msgstr "그래픽 카드 온도 유틸리티" + +#: prefs.js:49 +msgid "Left" +msgstr "왼쪽" + +#: prefs.js:49 +msgid "Center" +msgstr "가운데" + +#: prefs.js:49 +msgid "Right" +msgstr "오른쪽" + +#: extension.js:479 +msgid "Go to the Freon wiki" +msgstr "프레온 위키로 이동" + +#: extension.js:486 +msgid "Sensor Settings" +msgstr "센서 설정" From 4aafc9f670ecbfa302966fc27d2e3cb3b2768458 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sun, 27 Mar 2022 20:00:10 +0300 Subject: [PATCH 199/224] remove po folder --- .../po/de.po | 127 --------- .../po/es_AR.po | 128 --------- .../po/es_ES.po | 140 ---------- .../po/fr.po | 128 --------- .../po/freon.pot | 144 ---------- .../po/hu.po | 148 ---------- .../po/it.po | 148 ---------- .../po/ko.po | 148 ---------- .../po/nl.po | 148 ---------- .../po/pl.po | 133 --------- .../po/pt_BR.po | 128 --------- .../po/ru.po | 151 ----------- .../po/tr.po | 149 ----------- .../po/uk_UA.po | 151 ----------- .../po/zh_CN.po | 128 --------- .../po/zh_TW.po | 253 ------------------ 16 files changed, 2352 deletions(-) delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/de.po delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/es_AR.po delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/fr.po delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/freon.pot delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/hu.po delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/it.po delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/ko.po delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/nl.po delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/pl.po delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/pt_BR.po delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/ru.po delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/tr.po delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/zh_CN.po delete mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/de.po b/freon@UshakovVasilii_Github.yahoo.com/po/de.po deleted file mode 100644 index bea26fb..0000000 --- a/freon@UshakovVasilii_Github.yahoo.com/po/de.po +++ /dev/null @@ -1,127 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-06 17:05-0300\n" -"PO-Revision-Date: 2018-08-07 11:27+0200\n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Last-Translator: Dennis M. Pöpperl \n" -"Language-Team: \n" -"X-Generator: Poedit 2.0.9\n" - -#: bumblebeeNvidiaUtil.js:75 prefs.js:82 -msgid "Bumblebee + NVIDIA" -msgstr "Bumblebee + NVIDIA" - -#: extension.js:319 -msgid "Average" -msgstr "Durchschnitt" - -#: extension.js:320 -msgid "Maximum" -msgstr "Maximum" - -#: extension.js:341 -#, javascript-format -msgid "%drpm" -msgstr "%d1/min" - -#: extension.js:350 -#, javascript-format -msgid "%s%.2fV" -msgstr "%s%.2fV" - -#: extension.js:396 -msgid "Please run sensors-detect as root." -msgstr "Bitte sensors-detect als root ausführen." - -#: extension.js:397 -msgid "" -"Please install lm_sensors.\n" -"If this doesn't help, click here to report with your sensors output!" -msgstr "" -"Bitte lm_sensors installieren.\n" -"Falls dies nicht hilft, hier klicken, um einen Bericht mit den Sensorausgaben zu erstellen!" - -#: extension.js:488 -msgid "Temperature Sensors" -msgstr "Temperatursensoren" - -#: extension.js:495 -msgid "Voltage" -msgstr "Spannung" - -#: extension.js:509 -msgid "Sensors Settings" -msgstr "Sensoreinstellungen" - -#: prefs.js:33 -msgid "Poll Sensors Every (sec)" -msgstr "Sensoren abfragen alle (Sekunden)" - -#: prefs.js:39 -msgid "Show Decimal Value" -msgstr "Dezimalwert anzeigen" - -#: prefs.js:40 -msgid "Show one digit after decimal" -msgstr "Eine Nachkommastelle anzeigen" - -#: prefs.js:45 -msgid "Temperature Unit" -msgstr "Temperatureinheit" - -#: prefs.js:51 -msgid "Position in Panel" -msgstr "Position auf der Leiste" - -#: prefs.js:55 -msgid "Show Icon on Panel" -msgstr "Symbol auf der Leiste anzeigen" - -#: prefs.js:58 -msgid "Show Fan Speed" -msgstr "Lüftergeschwindigkeit anzeigen" - -#: prefs.js:61 -msgid "Show Power Supply Voltage" -msgstr "Versorgungsspannung anzeigen" - -#: prefs.js:64 -msgid "Group Temperature Items" -msgstr "Temperatureinträge gruppieren" - -#: prefs.js:65 -msgid "Works if you have more than three temperature sensors" -msgstr "Funktioniert, wenn es mindestens drei Temperatursensoren gibt" - -#: prefs.js:68 -msgid "Group Voltage Items" -msgstr "Spannungseinträge gruppieren" - -#: prefs.js:69 -msgid "Works if you have more than three voltage sensors" -msgstr "Funktioniert, wenn es mindestens drei Spannungssensoren gibt" - -#: prefs.js:74 -msgid "HDD/SSD Temperature Utility" -msgstr "HDD/SSD-Temperaturdienst" - -#: prefs.js:79 -msgid "None" -msgstr "Keiner" - -#: prefs.js:80 -msgid "NVIDIA" -msgstr "NVIDIA" - -#: prefs.js:81 -msgid "Catalyst" -msgstr "Catalyst" - -#: prefs.js:84 -msgid "Video Card Temperature Utility" -msgstr "Grafikkartendienst" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/es_AR.po b/freon@UshakovVasilii_Github.yahoo.com/po/es_AR.po deleted file mode 100644 index fe7adcc..0000000 --- a/freon@UshakovVasilii_Github.yahoo.com/po/es_AR.po +++ /dev/null @@ -1,128 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-04-15 09:27-0300\n" -"PO-Revision-Date: 2016-04-15 09:27-0300\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.4\n" -"Last-Translator: Martin Benvenuti \n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"Language: es_AR\n" - -#: bumblebeeNvidiaUtil.js:75 prefs.js:82 -msgid "Bumblebee + NVIDIA" -msgstr "Bumblebee + NVIDIA" - -#: extension.js:319 -msgid "Average" -msgstr "Promedio" - -#: extension.js:320 -msgid "Maximum" -msgstr "Máxima" - -#: extension.js:341 -#, javascript-format -msgid "%drpm" -msgstr "%drpm" - -#: extension.js:350 -#, javascript-format -msgid "%s%.2fV" -msgstr "%s%.2fV" - -#: extension.js:396 -msgid "Please run sensors-detect as root." -msgstr "Por favor ejecute sensors-detect como root." - -#: extension.js:397 -msgid "" -"Please install lm_sensors.\n" -"If this doesn't help, click here to report with your sensors output!" -msgstr "" -"Por favor, instale lm_sensors.\n" -"Si esto no ayuda, haga click aquí para reportar con la salida de sus sensores." - -#: extension.js:488 -msgid "Temperature Sensors" -msgstr "Sensores de temperatura" - -#: extension.js:495 -msgid "Voltage" -msgstr "Voltaje" - -#: extension.js:509 -msgid "Sensors Settings" -msgstr "Configuraciones de sensores" - -#: prefs.js:33 -msgid "Poll Sensors Every (sec)" -msgstr "Obtener información de sensores cada (seg)" - -#: prefs.js:39 -msgid "Show Decimal Value" -msgstr "Mostrar valor decimal" - -#: prefs.js:40 -msgid "Show one digit after decimal" -msgstr "Mostrar un dígito decimal después de la coma" - -#: prefs.js:45 -msgid "Temperature Unit" -msgstr "Unidad de temperatura" - -#: prefs.js:51 -msgid "Position in Panel" -msgstr "Posición en el panel" - -#: prefs.js:55 -msgid "Show Icon on Panel" -msgstr "Mostrar ícono en el panel" - -#: prefs.js:58 -msgid "Show Fan Speed" -msgstr "Mostrar velocidad del fan" - -#: prefs.js:61 -msgid "Show Power Supply Voltage" -msgstr "Mostrar voltaje de alimentación" - -#: prefs.js:64 -msgid "Group Temperature Items" -msgstr "Agrupar items de temperatura" - -#: prefs.js:65 -msgid "Works if you have more than three temperature sensors" -msgstr "Funciona si tenés más de tres sensores de temperatura" - -#: prefs.js:68 -msgid "Group Voltage Items" -msgstr "Agrupar items de voltaje" - -#: prefs.js:69 -msgid "Works if you have more than three voltage sensors" -msgstr "Funciona si tenés más de tres sensores de voltaje" - -#: prefs.js:74 -msgid "HDD/SSD Temperature Utility" -msgstr "Utilidad de temperatura del HDD/SSD" - -#: prefs.js:79 -msgid "None" -msgstr "Ninguna" - -#: prefs.js:80 -msgid "NVIDIA" -msgstr "NVIDIA" - -#: prefs.js:81 -msgid "Catalyst" -msgstr "Catalyst" - -#: prefs.js:84 -msgid "Video Card Temperature Utility" -msgstr "Utilidad de temperatura de la placa de video" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po b/freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po deleted file mode 100644 index d8fc691..0000000 --- a/freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po +++ /dev/null @@ -1,140 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-12-01 21:29+0100\n" -"PO-Revision-Date: 2016-12-01 21:37+0100\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.11\n" -"Last-Translator: Suriem Kumite \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Language: es_ES\n" - -#: bumblebeeNvidiaUtil.js:75 prefs.js:82 -msgid "Bumblebee + NVIDIA" -msgstr "Bumblebee + NVIDIA" - -#: extension.js:319 -msgid "Average" -msgstr "Promedio" - -#: extension.js:320 -msgid "Maximum" -msgstr "Máxima" - -#: extension.js:341 -#, javascript-format -msgid "%drpm" -msgstr "%drpm" - -#: extension.js:350 -#, javascript-format -msgid "%s%.2fV" -msgstr "%s%.2fV" - -#: extension.js:396 -msgid "Please run sensors-detect as root." -msgstr "Por favor ejecute sensors-detect como root." - -#: extension.js:397 -msgid "" -"Please install lm_sensors.\n" -"If this doesn't help, click here to report with your sensors output!" -msgstr "" -"Por favor, instale lm_sensors.\n" -"Si esto no ayuda, haga click aquí para informar adjuntando la salida de sus sensores." - -#: extension.js:488 -msgid "Temperature Sensors" -msgstr "Sensores de temperatura" - -#: extension.js:495 -msgid "Voltage" -msgstr "Voltaje" - -#: extension.js:509 -msgid "Sensors Settings" -msgstr "Configuraciones de los sensores" - -#: prefs.js:33 -msgid "Poll Sensors Every (sec)" -msgstr "Sondear sensores cada (seg)" - -#: prefs.js:39 -msgid "Show Decimal Value" -msgstr "Mostrar valor decimal" - -#: prefs.js:40 -msgid "Show one digit after decimal" -msgstr "Mostrar un decimal después de la coma" - -#: prefs.js:45 -msgid "Temperature Unit" -msgstr "Unidad de temperatura" - -#: prefs.js:51 -msgid "Position in Panel" -msgstr "Posición en el panel" - -#: prefs.js:55 -msgid "Show Icon on Panel" -msgstr "Mostrar ícono en el panel" - -#: prefs.js:58 -msgid "Show Fan Speed" -msgstr "Mostrar velocidad del ventilador" - -#: prefs.js:61 -msgid "Show Power Supply Voltage" -msgstr "Mostrar voltaje de la fuente de alimentación" - -#: prefs.js:64 -msgid "Group Temperature Items" -msgstr "Agrupar elementos de temperatura" - -#: prefs.js:65 -msgid "Works if you have more than three temperature sensors" -msgstr "Funciona si tienes más de tres sensores de temperatura" - -#: prefs.js:68 -msgid "Group Voltage Items" -msgstr "Agrupar elementos de voltaje" - -#: prefs.js:69 -msgid "Works if you have more than three voltage sensors" -msgstr "Funciona si tienes más de tres sensores de voltaje" - -#: prefs.js:74 -msgid "HDD/SSD Temperature Utility" -msgstr "Utilidad de temperatura del HDD/SSD" - -#: prefs.js:79 -msgid "None" -msgstr "Ninguna" - -#: prefs.js:80 -msgid "NVIDIA" -msgstr "NVIDIA" - -#: prefs.js:81 -msgid "Catalyst" -msgstr "Catalyst" - -#: prefs.js:84 -msgid "Video Card Temperature Utility" -msgstr "Utilidad de temperatura de la placa de video" - -#: prefs.js:49 -msgid "Left" -msgstr "Izquierda" - -#: prefs.js:49 -msgid "Center" -msgstr "Centro" - -#: prefs.js:49 -msgid "Right" -msgstr "Derecha" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/fr.po b/freon@UshakovVasilii_Github.yahoo.com/po/fr.po deleted file mode 100644 index 1a900cd..0000000 --- a/freon@UshakovVasilii_Github.yahoo.com/po/fr.po +++ /dev/null @@ -1,128 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-09-26 21:32+0200\n" -"PO-Revision-Date: 2016-09-26 22:21+0200\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.8\n" -"Last-Translator: mr-intrepide \n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"Language: fr\n" - -#: bumblebeeNvidiaUtil.js:75 prefs.js:82 -msgid "Bumblebee + NVIDIA" -msgstr "Bumblebee + NVIDIA" - -#: extension.js:319 -msgid "Average" -msgstr "Moyenne" - -#: extension.js:320 -msgid "Maximum" -msgstr "Maximum" - -#: extension.js:341 -#, javascript-format -msgid "%drpm" -msgstr "%drpm" - -#: extension.js:350 -#, javascript-format -msgid "%s%.2fV" -msgstr "%s%.2fV" - -#: extension.js:396 -msgid "Please run sensors-detect as root." -msgstr "Exécuter \"sensors-detect\" en mode super utilisateur." - -#: extension.js:397 -msgid "" -"Please install lm_sensors.\n" -"If this doesn't help, click here to report with your sensors output!" -msgstr "" -"Installer \"lm_sensors\"\n" -"Si cela n'aide pas, cliquez ici pour le signaler avec votre sortie de commande \"sensors\" !" - -#: extension.js:488 -msgid "Temperature Sensors" -msgstr "Capteurs de température" - -#: extension.js:495 -msgid "Voltage" -msgstr "Tension" - -#: extension.js:509 -msgid "Sensors Settings" -msgstr "Paramètres des capteurs" - -#: prefs.js:33 -msgid "Poll Sensors Every (sec)" -msgstr "Rafraichir toutes les (s)" - -#: prefs.js:39 -msgid "Show Decimal Value" -msgstr "Afficher après la virgule" - -#: prefs.js:40 -msgid "Show one digit after decimal" -msgstr "Affiche un chiffre après la virgule" - -#: prefs.js:45 -msgid "Temperature Unit" -msgstr "Unité de température" - -#: prefs.js:51 -msgid "Position in Panel" -msgstr "Position dans le panneau" - -#: prefs.js:55 -msgid "Show Icon on Panel" -msgstr "Afficher l'icône sur le panneau" - -#: prefs.js:58 -msgid "Show Fan Speed" -msgstr "Afficher vitesse ventilateur" - -#: prefs.js:61 -msgid "Show Power Supply Voltage" -msgstr "Afficher tension alimentation" - -#: prefs.js:64 -msgid "Group Temperature Items" -msgstr "Groupe température" - -#: prefs.js:65 -msgid "Works if you have more than three temperature sensors" -msgstr "Fonctionne si vous avez plus de trois capteurs de température" - -#: prefs.js:68 -msgid "Group Voltage Items" -msgstr "Groupe tension" - -#: prefs.js:69 -msgid "Works if you have more than three voltage sensors" -msgstr "Fonctionne si vous avez plus de trois capteurs de tension" - -#: prefs.js:74 -msgid "HDD/SSD Temperature Utility" -msgstr "Programme température HDD/SSD" - -#: prefs.js:79 -msgid "None" -msgstr "Aucun" - -#: prefs.js:80 -msgid "NVIDIA" -msgstr "NVIDIA" - -#: prefs.js:81 -msgid "Catalyst" -msgstr "Catalyst" - -#: prefs.js:84 -msgid "Video Card Temperature Utility" -msgstr "Programme température carte vidéo" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/freon.pot b/freon@UshakovVasilii_Github.yahoo.com/po/freon.pot deleted file mode 100644 index cafa337..0000000 --- a/freon@UshakovVasilii_Github.yahoo.com/po/freon.pot +++ /dev/null @@ -1,144 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-06 17:05-0300\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" - -#: bumblebeeNvidiaUtil.js:75 prefs.js:82 -msgid "Bumblebee + NVIDIA" -msgstr "" - -#: extension.js:319 -msgid "Average" -msgstr "" - -#: extension.js:320 -msgid "Maximum" -msgstr "" - -#: extension.js:341 -#, javascript-format -msgid "%drpm" -msgstr "" - -#: extension.js:350 -#, javascript-format -msgid "%s%.2fV" -msgstr "" - -#: extension.js:396 -msgid "Please run sensors-detect as root." -msgstr "" - -#: extension.js:397 -msgid "" -"Please install lm_sensors.\n" -"If this doesn't help, click here to report with your sensors output!" -msgstr "" - -#: extension.js:488 -msgid "Temperature Sensors" -msgstr "" - -#: extension.js:495 -msgid "Voltage" -msgstr "" - -#: extension.js:509 -msgid "Sensors Settings" -msgstr "" - -#: prefs.js:33 -msgid "Poll Sensors Every (sec)" -msgstr "" - -#: prefs.js:39 -msgid "Show Decimal Value" -msgstr "" - -#: prefs.js:40 -msgid "Show one digit after decimal" -msgstr "" - -#: prefs.js:45 -msgid "Temperature Unit" -msgstr "" - -#: prefs.js:51 -msgid "Position in Panel" -msgstr "" - -#: prefs.js:55 -msgid "Show Icon on Panel" -msgstr "" - -#: prefs.js:58 -msgid "Show Fan Speed" -msgstr "" - -#: prefs.js:61 -msgid "Show Power Supply Voltage" -msgstr "" - -#: prefs.js:64 -msgid "Group Temperature Items" -msgstr "" - -#: prefs.js:65 -msgid "Works if you have more than three temperature sensors" -msgstr "" - -#: prefs.js:68 -msgid "Group Voltage Items" -msgstr "" - -#: prefs.js:69 -msgid "Works if you have more than three voltage sensors" -msgstr "" - -#: prefs.js:74 -msgid "HDD/SSD Temperature Utility" -msgstr "" - -#: prefs.js:79 -msgid "None" -msgstr "" - -#: prefs.js:80 -msgid "NVIDIA" -msgstr "" - -#: prefs.js:81 -msgid "Catalyst" -msgstr "" - -#: prefs.js:84 -msgid "Video Card Temperature Utility" -msgstr "" - -#: prefs.js:49 -msgid "Left" -msgstr "" - -#: prefs.js:49 -msgid "Center" -msgstr "" - -#: prefs.js:49 -msgid "Right" -msgstr "" - -#: extension.js:479 -msgid "Go to the Freon wiki" -msgstr "" - -#: extension.js:486 -msgid "Sensor Settings" -msgstr "" \ No newline at end of file diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/hu.po b/freon@UshakovVasilii_Github.yahoo.com/po/hu.po deleted file mode 100644 index 5652bba..0000000 --- a/freon@UshakovVasilii_Github.yahoo.com/po/hu.po +++ /dev/null @@ -1,148 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-06 17:05-0300\n" -"PO-Revision-Date: 2020-07-17 18:13+0200\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: hu\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.3\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: bumblebeeNvidiaUtil.js:75 prefs.js:82 -msgid "Bumblebee + NVIDIA" -msgstr "Bumblebee + NVIDIA" - -#: extension.js:319 -msgid "Average" -msgstr "Átlag" - -#: extension.js:320 -msgid "Maximum" -msgstr "Maximum" - -#: extension.js:341 -#, javascript-format -msgid "%drpm" -msgstr "%drpm" - -#: extension.js:350 -#, javascript-format -msgid "%s%.2fV" -msgstr "%s%.2fV" - -#: extension.js:396 -msgid "Please run sensors-detect as root." -msgstr "Kérlek futtasd a sensors-detect programot root felhasználóként." - -#: extension.js:397 -msgid "" -"Please install lm_sensors.\n" -"If this doesn't help, click here to report with your sensors output!" -msgstr "" -"Kérlek telepítsd az lm_sensors csomagot.\n" -"Ha nem segít, akkor kattints ide a probléma jelentéséhez!" - -#: extension.js:488 -msgid "Temperature Sensors" -msgstr "Hőmérők" - -#: extension.js:495 -msgid "Voltage" -msgstr "Feszültség" - -#: extension.js:509 -msgid "Sensors Settings" -msgstr "Szenzorbeállítások" - -#: prefs.js:33 -msgid "Poll Sensors Every (sec)" -msgstr "Szenzoradatok lekérdezés ennyi másodpercenként" - -#: prefs.js:39 -msgid "Show Decimal Value" -msgstr "Tizedesjegy mutatása" - -#: prefs.js:40 -msgid "Show one digit after decimal" -msgstr "Egy tizedesjegy mutatása az egész rész után" - -#: prefs.js:45 -msgid "Temperature Unit" -msgstr "Hőmérséklet mértékegysége" - -#: prefs.js:51 -msgid "Position in Panel" -msgstr "Pozíció a panelen" - -#: prefs.js:55 -msgid "Show Icon on Panel" -msgstr "Ikon mutatása a panelen" - -#: prefs.js:58 -msgid "Show Fan Speed" -msgstr "Ventilátorsebesség mutatása" - -#: prefs.js:61 -msgid "Show Power Supply Voltage" -msgstr "Tápfeszültség mutatása" - -#: prefs.js:64 -msgid "Group Temperature Items" -msgstr "Hőmérsékletek csoportosítása" - -#: prefs.js:65 -msgid "Works if you have more than three temperature sensors" -msgstr "Akkor működik, ha több, mint három hőmérő van" - -#: prefs.js:68 -msgid "Group Voltage Items" -msgstr "Feszültségek csoportosítása" - -#: prefs.js:69 -msgid "Works if you have more than three voltage sensors" -msgstr "Akkor működik, ha több, mint három feszültségmérő van" - -#: prefs.js:74 -msgid "HDD/SSD Temperature Utility" -msgstr "HDD/SSD hőmérsékletének lekérdezése ezzel" - -#: prefs.js:79 -msgid "None" -msgstr "Egyik sem" - -#: prefs.js:80 -msgid "NVIDIA" -msgstr "NVIDIA" - -#: prefs.js:81 -msgid "Catalyst" -msgstr "Catalyst" - -#: prefs.js:84 -msgid "Video Card Temperature Utility" -msgstr "Videokártya hőmérsékletének lekérdezése ezzel" - -#: prefs.js:49 -msgid "Left" -msgstr "Bal" - -#: prefs.js:49 -msgid "Center" -msgstr "Közép" - -#: prefs.js:49 -msgid "Right" -msgstr "Jobb" - -#: extension.js:479 -msgid "Go to the Freon wiki" -msgstr "Freon wiki megnyitása" - -#: extension.js:486 -msgid "Sensor Settings" -msgstr "Szenzorbeállítások" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/it.po b/freon@UshakovVasilii_Github.yahoo.com/po/it.po deleted file mode 100644 index 8e7041c..0000000 --- a/freon@UshakovVasilii_Github.yahoo.com/po/it.po +++ /dev/null @@ -1,148 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-06 17:05-0300\n" -"PO-Revision-Date: 2020-05-12 11:59+0200\n" -"Language-Team: Jimmy Scionti \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.3\n" -"Last-Translator: Jimmy Scionti \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Language: it\n" - -#: bumblebeeNvidiaUtil.js:75 prefs.js:82 -msgid "Bumblebee + NVIDIA" -msgstr "Bumblebee + NVIDIA" - -#: extension.js:319 -msgid "Average" -msgstr "Media" - -#: extension.js:320 -msgid "Maximum" -msgstr "Massimo" - -#: extension.js:341 -#, javascript-format -msgid "%drpm" -msgstr "%drpm" - -#: extension.js:350 -#, javascript-format -msgid "%s%.2fV" -msgstr "%s%.2fV" - -#: extension.js:396 -msgid "Please run sensors-detect as root." -msgstr "Eseguire sensors-detect come amministratore di sistema." - -#: extension.js:397 -msgid "" -"Please install lm_sensors.\n" -"If this doesn't help, click here to report with your sensors output!" -msgstr "" -"Installare lm_sensors.\n" -"Se il problema persiste, cliccare qui per inviare la segnalazione con l'elenco dei sensori!" - -#: extension.js:488 -msgid "Temperature Sensors" -msgstr "Sensori di temperatura" - -#: extension.js:495 -msgid "Voltage" -msgstr "Voltaggio" - -#: extension.js:509 -msgid "Sensors Settings" -msgstr "Impostazioni sensori" - -#: prefs.js:33 -msgid "Poll Sensors Every (sec)" -msgstr "Interrogare i sensori ogni (sec)" - -#: prefs.js:39 -msgid "Show Decimal Value" -msgstr "Mostrare valori decimali" - -#: prefs.js:40 -msgid "Show one digit after decimal" -msgstr "Mostrare solo un decimale" - -#: prefs.js:45 -msgid "Temperature Unit" -msgstr "Unità temperatura" - -#: prefs.js:51 -msgid "Position in Panel" -msgstr "Posizione nel pannello" - -#: prefs.js:55 -msgid "Show Icon on Panel" -msgstr "Mostrare icona sul pannello" - -#: prefs.js:58 -msgid "Show Fan Speed" -msgstr "Mostrare velocità ventola" - -#: prefs.js:61 -msgid "Show Power Supply Voltage" -msgstr "Mostrare tensione di alimentazione" - -#: prefs.js:64 -msgid "Group Temperature Items" -msgstr "Raggruppare i sensori di temperatura" - -#: prefs.js:65 -msgid "Works if you have more than three temperature sensors" -msgstr "Funziona solo se sono disponibili più di tre sensori di temperatura" - -#: prefs.js:68 -msgid "Group Voltage Items" -msgstr "Raggruppare i sensori di tensione" - -#: prefs.js:69 -msgid "Works if you have more than three voltage sensors" -msgstr "Funziona solo se sono disponibili più di tre sensori di tensione" - -#: prefs.js:74 -msgid "HDD/SSD Temperature Utility" -msgstr "Utilità di temperatura HDD/SSD" - -#: prefs.js:79 -msgid "None" -msgstr "Nessuno" - -#: prefs.js:80 -msgid "NVIDIA" -msgstr "NVIDIA" - -#: prefs.js:81 -msgid "Catalyst" -msgstr "Catalyst" - -#: prefs.js:84 -msgid "Video Card Temperature Utility" -msgstr "Utilità di temperatura scheda video" - -#: prefs.js:49 -msgid "Left" -msgstr "Sinistra" - -#: prefs.js:49 -msgid "Center" -msgstr "Centro" - -#: prefs.js:49 -msgid "Right" -msgstr "Destra" - -#: extension.js:479 -msgid "Go to the Freon wiki" -msgstr "Visitare wiki Freon" - -#: extension.js:486 -msgid "Sensor Settings" -msgstr "Impostazioni sensore" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/ko.po b/freon@UshakovVasilii_Github.yahoo.com/po/ko.po deleted file mode 100644 index b4cc4a3..0000000 --- a/freon@UshakovVasilii_Github.yahoo.com/po/ko.po +++ /dev/null @@ -1,148 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-06 17:05-0300\n" -"PO-Revision-Date: 2022-02-22 18:15+0900\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: ko\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 3.0.1\n" - -#: bumblebeeNvidiaUtil.js:75 prefs.js:82 -msgid "Bumblebee + NVIDIA" -msgstr "Bumblebee + NVIDIA" - -#: extension.js:319 -msgid "Average" -msgstr "평균" - -#: extension.js:320 -msgid "Maximum" -msgstr "최대" - -#: extension.js:341 -#, javascript-format -msgid "%drpm" -msgstr "%drpm" - -#: extension.js:350 -#, javascript-format -msgid "%s%.2fV" -msgstr "%s%.2fV" - -#: extension.js:396 -msgid "Please run sensors-detect as root." -msgstr "먼저 루트 권한으로 sensors-detect를 실행하십시오." - -#: extension.js:397 -msgid "" -"Please install lm_sensors.\n" -"If this doesn't help, click here to report with your sensors output!" -msgstr "" -"lm_sensors를 설치하십시오.\n" -"도움이 안 된다면, 클릭하여 장치의 센서 출력이 포함된 오류 보고를 보내십시오!" - -#: extension.js:488 -msgid "Temperature Sensors" -msgstr "온도 센서" - -#: extension.js:495 -msgid "Voltage" -msgstr "전압" - -#: extension.js:509 -msgid "Sensors Settings" -msgstr "센서 설정" - -#: prefs.js:33 -msgid "Poll Sensors Every (sec)" -msgstr "폴링 센서 (초)" - -#: prefs.js:39 -msgid "Show Decimal Value" -msgstr "십진법으로 표시" - -#: prefs.js:40 -msgid "Show one digit after decimal" -msgstr "십진법 옆에 한 자릿 수 표시" - -#: prefs.js:45 -msgid "Temperature Unit" -msgstr "온도 단위" - -#: prefs.js:51 -msgid "Position in Panel" -msgstr "패널 내 아이콘 위치" - -#: prefs.js:55 -msgid "Show Icon on Panel" -msgstr "패널에 아이콘 표시" - -#: prefs.js:58 -msgid "Show Fan Speed" -msgstr "팬 속도 표시" - -#: prefs.js:61 -msgid "Show Power Supply Voltage" -msgstr "전원 공급 장치 전압 표시" - -#: prefs.js:64 -msgid "Group Temperature Items" -msgstr "그룹화된 온도 항목" - -#: prefs.js:65 -msgid "Works if you have more than three temperature sensors" -msgstr "3개 이상의 온도 센서가 감지되었을 때 동작" - -#: prefs.js:68 -msgid "Group Voltage Items" -msgstr "그룹화된 전압 항목" - -#: prefs.js:69 -msgid "Works if you have more than three voltage sensors" -msgstr "3개 이상의 전압 센서가 감지되었을 때 동작" - -#: prefs.js:74 -msgid "HDD/SSD Temperature Utility" -msgstr "하드디스크/SSD 온도 유틸리티" - -#: prefs.js:79 -msgid "None" -msgstr "없음" - -#: prefs.js:80 -msgid "NVIDIA" -msgstr "NVIDIA" - -#: prefs.js:81 -msgid "Catalyst" -msgstr "AMD 카탈리스트" - -#: prefs.js:84 -msgid "Video Card Temperature Utility" -msgstr "그래픽 카드 온도 유틸리티" - -#: prefs.js:49 -msgid "Left" -msgstr "왼쪽" - -#: prefs.js:49 -msgid "Center" -msgstr "가운데" - -#: prefs.js:49 -msgid "Right" -msgstr "오른쪽" - -#: extension.js:479 -msgid "Go to the Freon wiki" -msgstr "프레온 위키로 이동" - -#: extension.js:486 -msgid "Sensor Settings" -msgstr "센서 설정" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/nl.po b/freon@UshakovVasilii_Github.yahoo.com/po/nl.po deleted file mode 100644 index 3a21783..0000000 --- a/freon@UshakovVasilii_Github.yahoo.com/po/nl.po +++ /dev/null @@ -1,148 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-06 17:05-0300\n" -"PO-Revision-Date: 2020-11-01 14:11+0100\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.1\n" -"Last-Translator: Heimen Stoffels \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Language: nl\n" - -#: bumblebeeNvidiaUtil.js:75 prefs.js:82 -msgid "Bumblebee + NVIDIA" -msgstr "Bumblebee + NVIDIA" - -#: extension.js:319 -msgid "Average" -msgstr "Gemiddeld" - -#: extension.js:320 -msgid "Maximum" -msgstr "Maximaal" - -#: extension.js:341 -#, javascript-format -msgid "%drpm" -msgstr "%drpm" - -#: extension.js:350 -#, javascript-format -msgid "%s%.2fV" -msgstr "%s%.2fV" - -#: extension.js:396 -msgid "Please run sensors-detect as root." -msgstr "Voer sensors-detect uit als administrator (root)." - -#: extension.js:397 -msgid "" -"Please install lm_sensors.\n" -"If this doesn't help, click here to report with your sensors output!" -msgstr "" -"Installeer lm_sensors.\n" -"Als dat niet helpt, klik dan hier om een rapportage op te maken!" - -#: extension.js:488 -msgid "Temperature Sensors" -msgstr "Temperatuursensors" - -#: extension.js:495 -msgid "Voltage" -msgstr "Voltage" - -#: extension.js:509 -msgid "Sensors Settings" -msgstr "Sensorinstellingen" - -#: prefs.js:33 -msgid "Poll Sensors Every (sec)" -msgstr "Sensors peilen, elke... (in sec.)" - -#: prefs.js:39 -msgid "Show Decimal Value" -msgstr "Decimale waarde tonen" - -#: prefs.js:40 -msgid "Show one digit after decimal" -msgstr "Eén getal achter de komma" - -#: prefs.js:45 -msgid "Temperature Unit" -msgstr "Temperatuureenheid" - -#: prefs.js:51 -msgid "Position in Panel" -msgstr "Positie op paneel" - -#: prefs.js:55 -msgid "Show Icon on Panel" -msgstr "Pictogram tonen op paneel" - -#: prefs.js:58 -msgid "Show Fan Speed" -msgstr "Ventilatorsnelheid tonen" - -#: prefs.js:61 -msgid "Show Power Supply Voltage" -msgstr "Netstroomvoltage tonen" - -#: prefs.js:64 -msgid "Group Temperature Items" -msgstr "Temperatuureenheden groeperen" - -#: prefs.js:65 -msgid "Works if you have more than three temperature sensors" -msgstr "Werkt alleen als je meer dan drie temperatuursensors hebt" - -#: prefs.js:68 -msgid "Group Voltage Items" -msgstr "Voltage-items groeperen" - -#: prefs.js:69 -msgid "Works if you have more than three voltage sensors" -msgstr "Werkt alleen als je meer dan drie voltagesensors hebt" - -#: prefs.js:74 -msgid "HDD/SSD Temperature Utility" -msgstr "HDD-/SSD-temperatuurhulpmiddel" - -#: prefs.js:79 -msgid "None" -msgstr "Geen" - -#: prefs.js:80 -msgid "NVIDIA" -msgstr "NVIDIA" - -#: prefs.js:81 -msgid "Catalyst" -msgstr "Catalyst" - -#: prefs.js:84 -msgid "Video Card Temperature Utility" -msgstr "Videokaarttemperatuurhulpmiddel" - -#: prefs.js:49 -msgid "Left" -msgstr "Links" - -#: prefs.js:49 -msgid "Center" -msgstr "Midden" - -#: prefs.js:49 -msgid "Right" -msgstr "Rechts" - -#: extension.js:479 -msgid "Go to the Freon wiki" -msgstr "Open de Freon-wiki" - -#: extension.js:486 -msgid "Sensor Settings" -msgstr "Sensorinstellingen" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/pl.po b/freon@UshakovVasilii_Github.yahoo.com/po/pl.po deleted file mode 100644 index 8c55592..0000000 --- a/freon@UshakovVasilii_Github.yahoo.com/po/pl.po +++ /dev/null @@ -1,133 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-06 17:05-0300\n" -"PO-Revision-Date: 2018-02-03 01:30+0100\n" -"Language-Team: POLISH \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.6\n" -"Last-Translator: Jakub Żywiec \n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"Language: pl\n" -"X-Poedit-SourceCharset: UTF-8\n" - -#: bumblebeeNvidiaUtil.js:75 prefs.js:82 -msgid "Bumblebee + NVIDIA" -msgstr "Bumblebee + NVIDIA" - -#: extension.js:319 -msgid "Average" -msgstr "Średnia" - -#: extension.js:320 -msgid "Maximum" -msgstr "Maksymalna" - -#: extension.js:341 -#, javascript-format -msgid "%drpm" -msgstr "%drpm" - -#: extension.js:350 -#, javascript-format -msgid "%s%.2fV" -msgstr "%s%.2fV" - -#: extension.js:396 -msgid "Please run sensors-detect as root." -msgstr "Uruchom \"sensors-detect\" jako użytkownik root." - -#: extension.js:397 -msgid "" -"Please install lm_sensors.\n" -"If this doesn't help, click here to report with your sensors output!" -msgstr "" -"Zainstaluj \"lm_sensors\"\n" -"Jeśli to nie pomoże, kliknij tutaj, aby zgłosić wyniki czujników!" - -#: extension.js:488 -msgid "Temperature Sensors" -msgstr "Czujnik temperatury" - -#: extension.js:495 -msgid "Voltage" -msgstr "Napięcie" - -#: extension.js:509 -msgid "Sensors Settings" -msgstr "Ustawienia czujników" - -#: prefs.js:33 -msgid "Poll Sensors Every (sec)" -msgstr "Aktualizuj czujniki co (sek)" - -#: prefs.js:39 -msgid "Show Decimal Value" -msgstr "Pokaż wartość dziesiętną" - -#: prefs.js:40 -msgid "Show one digit after decimal" -msgstr "Wyświetlaj do jednego miejsca po przecinku" - -#: prefs.js:45 -msgid "Temperature Unit" -msgstr "Jednostka temperatury" - -#: prefs.js:51 -msgid "Position in Panel" -msgstr "Pozycja w Panelu" - -#: prefs.js:55 -msgid "Show Icon on Panel" -msgstr "Pokaż ikonę w Panelu" - -#: prefs.js:58 -msgid "Show Fan Speed" -msgstr "Pokaż prędkość wentylatora" - -#: prefs.js:61 -msgid "Show Power Supply Voltage" -msgstr "Pokaż napięcie zasilacza" - -#: prefs.js:64 -msgid "Group Temperature Items" -msgstr "Grupuj temperatury" - -#: prefs.js:65 -msgid "Works if you have more than three temperature sensors" -msgstr "Zadziała, jeśli funkcjonują co najmniej trzy czujniki temperatury" - -#: prefs.js:68 -msgid "Group Voltage Items" -msgstr "Grupuj napięcia" - -#: prefs.js:69 -msgid "Works if you have more than three voltage sensors" -msgstr "Zadziała, jeśli funkcjonują co najmniej trzy czujniki napięcia" - -#: prefs.js:74 -msgid "HDD/SSD Temperature Utility" -msgstr "" -"Narzędzie do pomiaru\n" -"temperatury twardego dysku" - -#: prefs.js:79 -msgid "None" -msgstr "Brak" - -#: prefs.js:80 -msgid "NVIDIA" -msgstr "NVIDIA" - -#: prefs.js:81 -msgid "Catalyst" -msgstr "Catalyst" - -#: prefs.js:84 -msgid "Video Card Temperature Utility" -msgstr "" -"Narzędzie do pomiaru\n" -"temperatury karty graficzenej" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/pt_BR.po b/freon@UshakovVasilii_Github.yahoo.com/po/pt_BR.po deleted file mode 100644 index 94cbf63..0000000 --- a/freon@UshakovVasilii_Github.yahoo.com/po/pt_BR.po +++ /dev/null @@ -1,128 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-06 17:05-0300\n" -"PO-Revision-Date: 2015-10-06 17:31-0300\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.4\n" -"Last-Translator: Fábio Nogueira \n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" -"Language: pt_BR\n" - -#: bumblebeeNvidiaUtil.js:75 prefs.js:82 -msgid "Bumblebee + NVIDIA" -msgstr "Bumblebee + NVIDIA" - -#: extension.js:319 -msgid "Average" -msgstr "Média" - -#: extension.js:320 -msgid "Maximum" -msgstr "Máxima" - -#: extension.js:341 -#, javascript-format -msgid "%drpm" -msgstr "%drpm" - -#: extension.js:350 -#, javascript-format -msgid "%s%.2fV" -msgstr "%s%.2fV" - -#: extension.js:396 -msgid "Please run sensors-detect as root." -msgstr "Por favor execute sensors-detect como root." - -#: extension.js:397 -msgid "" -"Please install lm_sensors.\n" -"If this doesn't help, click here to report with your sensors output!" -msgstr "" -"Por favor, instale lm_sensors.\n" -"Se isto não ajudar, clique aqui para reportar com suas saídas de sensores!" - -#: extension.js:488 -msgid "Temperature Sensors" -msgstr "Sensores de temperatura" - -#: extension.js:495 -msgid "Voltage" -msgstr "Voltagem" - -#: extension.js:509 -msgid "Sensors Settings" -msgstr "Configurações dos sensores" - -#: prefs.js:33 -msgid "Poll Sensors Every (sec)" -msgstr "Sensores de sondagem a cada (seg)" - -#: prefs.js:39 -msgid "Show Decimal Value" -msgstr "Exibir valor decimal" - -#: prefs.js:40 -msgid "Show one digit after decimal" -msgstr "Exibir um dígito após o decimal" - -#: prefs.js:45 -msgid "Temperature Unit" -msgstr "Unidade de temperatura" - -#: prefs.js:51 -msgid "Position in Panel" -msgstr "Posição no painel" - -#: prefs.js:55 -msgid "Show Icon on Panel" -msgstr "Exibir ícone no painel" - -#: prefs.js:58 -msgid "Show Fan Speed" -msgstr "Exibir velocidade da ventoinha" - -#: prefs.js:61 -msgid "Show Power Supply Voltage" -msgstr "Exibir tensão da alimentação" - -#: prefs.js:64 -msgid "Group Temperature Items" -msgstr "Itens do grupo de temperatura" - -#: prefs.js:65 -msgid "Works if you have more than three temperature sensors" -msgstr "Funciona se você tiver mais que três sensores de temperatura" - -#: prefs.js:68 -msgid "Group Voltage Items" -msgstr "Itens do grupo de tensão" - -#: prefs.js:69 -msgid "Works if you have more than three voltage sensors" -msgstr "Funciona se você tiver mais que três sensores de tensão" - -#: prefs.js:74 -msgid "HDD/SSD Temperature Utility" -msgstr "Utilitário de temperatura HDD/SSD" - -#: prefs.js:79 -msgid "None" -msgstr "Nenhum" - -#: prefs.js:80 -msgid "NVIDIA" -msgstr "NVIDIA" - -#: prefs.js:81 -msgid "Catalyst" -msgstr "Catalyst" - -#: prefs.js:84 -msgid "Video Card Temperature Utility" -msgstr "Utilitário de temperatura da placa de vídeo" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/ru.po b/freon@UshakovVasilii_Github.yahoo.com/po/ru.po deleted file mode 100644 index 31a2fb9..0000000 --- a/freon@UshakovVasilii_Github.yahoo.com/po/ru.po +++ /dev/null @@ -1,151 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-06 17:05-0300\n" -"PO-Revision-Date: 2019-09-19 17:58+0300\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: ru\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.3\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#: bumblebeeNvidiaUtil.js:75 prefs.js:82 -msgid "Bumblebee + NVIDIA" -msgstr "Bumblebee + NVIDIA" - -#: extension.js:319 -msgid "Average" -msgstr "Средняя" - -#: extension.js:320 -msgid "Maximum" -msgstr "Максимальная" - -#: extension.js:341 -#, javascript-format -msgid "%drpm" -msgstr "%d об/мин" - -#: extension.js:350 -#, javascript-format -msgid "%s%.2fV" -msgstr "%s%.2f В" - -#: extension.js:396 -msgid "Please run sensors-detect as root." -msgstr "Пожалуйста, запустите sensors-detect как суперпользователь" - -#: extension.js:397 -msgid "" -"Please install lm_sensors.\n" -"If this doesn't help, click here to report with your sensors output!" -msgstr "" -"Пожалуйста, установите lm_sensors.\n" -"Если это не поможет, нажмите здесь, чтобы сообщить с выходом датчиков!" - -#: extension.js:488 -msgid "Temperature Sensors" -msgstr "Датчики температуры" - -#: extension.js:495 -msgid "Voltage" -msgstr "Напряжение" - -#: extension.js:509 -msgid "Sensors Settings" -msgstr "Настройки" - -#: prefs.js:33 -msgid "Poll Sensors Every (sec)" -msgstr "Опрос датчиков каждые (сек)" - -#: prefs.js:39 -msgid "Show Decimal Value" -msgstr "Показывать десятичные значения" - -#: prefs.js:40 -msgid "Show one digit after decimal" -msgstr "Показывать одну цифру после запятой" - -#: prefs.js:45 -msgid "Temperature Unit" -msgstr "Единица измерения температуры" - -#: prefs.js:51 -msgid "Position in Panel" -msgstr "Позиция на панели" - -#: prefs.js:55 -msgid "Show Icon on Panel" -msgstr "Отображать иконку на панели" - -#: prefs.js:58 -msgid "Show Fan Speed" -msgstr "Отображать скорость вентилятора" - -#: prefs.js:61 -msgid "Show Power Supply Voltage" -msgstr "Отображать напряжение питания" - -#: prefs.js:64 -msgid "Group Temperature Items" -msgstr "Объединить показания температуры" - -#: prefs.js:65 -msgid "Works if you have more than three temperature sensors" -msgstr "Работает если у вас более трёх датчиков температуры" - -#: prefs.js:68 -msgid "Group Voltage Items" -msgstr "Объединить показания напряжения" - -#: prefs.js:69 -msgid "Works if you have more than three voltage sensors" -msgstr "Работает если у вас более трёх датчиков напряжения" - -#: prefs.js:74 -msgid "HDD/SSD Temperature Utility" -msgstr "Утилита для определения температуры HDD/SSD" - -#: prefs.js:79 -msgid "None" -msgstr "Нет" - -#: prefs.js:80 -msgid "NVIDIA" -msgstr "NVIDIA" - -#: prefs.js:81 -msgid "Catalyst" -msgstr "Catalyst" - -#: prefs.js:84 -msgid "Video Card Temperature Utility" -msgstr "Утилита для определения температуры видеокарты" - -#: prefs.js:49 -msgid "Left" -msgstr "Слева" - -#: prefs.js:49 -msgid "Center" -msgstr "По центру" - -#: prefs.js:49 -msgid "Right" -msgstr "Справа" - -#: extension.js:479 -msgid "Go to the Freon wiki" -msgstr "Перейти на wiki Freon" - -#: extension.js:486 -#, fuzzy -#| msgid "Sensors Settings" -msgid "Sensor Settings" -msgstr "Настройки" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/tr.po b/freon@UshakovVasilii_Github.yahoo.com/po/tr.po deleted file mode 100644 index 75f3eed..0000000 --- a/freon@UshakovVasilii_Github.yahoo.com/po/tr.po +++ /dev/null @@ -1,149 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: Freon\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-06 17:05-0300\n" -"PO-Revision-Date: 2020-10-29 16:21+0300\n" -"Language-Team: Turkish\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.4.1\n" -"Last-Translator: Muha Aliss \n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"Language: tr\n" -"X-Poedit-SourceCharset: UTF-8\n" - -#: bumblebeeNvidiaUtil.js:75 prefs.js:82 -msgid "Bumblebee + NVIDIA" -msgstr "Bumblebee + NVIDIA" - -#: extension.js:319 -msgid "Average" -msgstr "Ortalama" - -#: extension.js:320 -msgid "Maximum" -msgstr "Maksimum" - -#: extension.js:341 -#, javascript-format -msgid "%drpm" -msgstr "%drpm" - -#: extension.js:350 -#, javascript-format -msgid "%s%.2fV" -msgstr "%s%.2fV" - -#: extension.js:396 -msgid "Please run sensors-detect as root." -msgstr "Lütfen sensör-algılamayı yönetici olarak çalıştırın." - -#: extension.js:397 -msgid "" -"Please install lm_sensors.\n" -"If this doesn't help, click here to report with your sensors output!" -msgstr "" -"Lütfen lm_sensors yükleyin.\n" -"Bu işe yaramazsa, sensör çıktılarınızla raporlamak için burayı tıklayın!" - -#: extension.js:488 -msgid "Temperature Sensors" -msgstr "Sıcaklık sensörleri" - -#: extension.js:495 -msgid "Voltage" -msgstr "Voltaj" - -#: extension.js:509 -msgid "Sensors Settings" -msgstr "Sensör ayarları" - -#: prefs.js:33 -msgid "Poll Sensors Every (sec)" -msgstr "" - -#: prefs.js:39 -msgid "Show Decimal Value" -msgstr "Ondalık değeri göster" - -#: prefs.js:40 -msgid "Show one digit after decimal" -msgstr "Ondalıktan sonra bir rakam göster" - -#: prefs.js:45 -msgid "Temperature Unit" -msgstr "Sıcaklık birimi" - -#: prefs.js:51 -msgid "Position in Panel" -msgstr "Paneldeki konum" - -#: prefs.js:55 -msgid "Show Icon on Panel" -msgstr "Panelde simgeyi göster" - -#: prefs.js:58 -msgid "Show Fan Speed" -msgstr "Fan hızını göster" - -#: prefs.js:61 -msgid "Show Power Supply Voltage" -msgstr "Güç kaynağı voltajını göster" - -#: prefs.js:64 -msgid "Group Temperature Items" -msgstr "Sıcaklık grubu öğeleri" - -#: prefs.js:65 -msgid "Works if you have more than three temperature sensors" -msgstr "Üçten fazla sıcaklık sensörünüz varsa çalışır" - -#: prefs.js:68 -msgid "Group Voltage Items" -msgstr "Voltaj grubu öğeleri" - -#: prefs.js:69 -msgid "Works if you have more than three voltage sensors" -msgstr "Üçten fazla voltaj sensörünüz varsa çalışır" - -#: prefs.js:74 -msgid "HDD/SSD Temperature Utility" -msgstr "HDD/SSD sıcaklık yardımcısı" - -#: prefs.js:79 -msgid "None" -msgstr "Yok" - -#: prefs.js:80 -msgid "NVIDIA" -msgstr "NVIDIA" - -#: prefs.js:81 -msgid "Catalyst" -msgstr "Catalyst" - -#: prefs.js:84 -msgid "Video Card Temperature Utility" -msgstr "Ekran kartı sıcaklık yardımcısı" - -#: prefs.js:49 -msgid "Left" -msgstr "Sol" - -#: prefs.js:49 -msgid "Center" -msgstr "Orta" - -#: prefs.js:49 -msgid "Right" -msgstr "Sağ" - -#: extension.js:479 -msgid "Go to the Freon wiki" -msgstr "Freon wiki'ye git" - -#: extension.js:486 -msgid "Sensor Settings" -msgstr "Sensör ayarları" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po b/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po deleted file mode 100644 index 4f41d8f..0000000 --- a/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po +++ /dev/null @@ -1,151 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-06 17:05-0300\n" -"PO-Revision-Date: 2019-09-19 17:53+0300\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: uk_UA\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.2.3\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" -"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" - -#: bumblebeeNvidiaUtil.js:75 prefs.js:82 -msgid "Bumblebee + NVIDIA" -msgstr "Bumblebee + NVIDIA" - -#: extension.js:319 -msgid "Average" -msgstr "Середня" - -#: extension.js:320 -msgid "Maximum" -msgstr "Максимальна" - -#: extension.js:341 -#, javascript-format -msgid "%drpm" -msgstr "%dоб/хв" - -#: extension.js:350 -#, javascript-format -msgid "%s%.2fV" -msgstr "%s%.2fВ" - -#: extension.js:396 -msgid "Please run sensors-detect as root." -msgstr "Будь ласка, запустіть детектор сенсорів як root." - -#: extension.js:397 -msgid "" -"Please install lm_sensors.\n" -"If this doesn't help, click here to report with your sensors output!" -msgstr "" -"Будь ласка, встановіть lm_sensors.\n" -"Якщо це не допоможе, натисніть тут, щоб повідомити про відсутність сенсорів!" - -#: extension.js:488 -msgid "Temperature Sensors" -msgstr "Сенсори температури" - -#: extension.js:495 -msgid "Voltage" -msgstr "Напруга" - -#: extension.js:509 -msgid "Sensors Settings" -msgstr "Налаштування сенсорів" - -#: prefs.js:33 -msgid "Poll Sensors Every (sec)" -msgstr "Опитувати сенсори кожні (сек)" - -#: prefs.js:39 -msgid "Show Decimal Value" -msgstr "Показувати десяткове значення" - -#: prefs.js:40 -msgid "Show one digit after decimal" -msgstr "Показувати одну цифру після десяткового знаку" - -#: prefs.js:45 -msgid "Temperature Unit" -msgstr "Одиниця виміру температури" - -#: prefs.js:51 -msgid "Position in Panel" -msgstr "Положення на панелі" - -#: prefs.js:55 -msgid "Show Icon on Panel" -msgstr "Показувати значок на панелі" - -#: prefs.js:58 -msgid "Show Fan Speed" -msgstr "Показувати швидкість вентилятора" - -#: prefs.js:61 -msgid "Show Power Supply Voltage" -msgstr "Показувати напругу живлення" - -#: prefs.js:64 -msgid "Group Temperature Items" -msgstr "Групувати елементи температури" - -#: prefs.js:65 -msgid "Works if you have more than three temperature sensors" -msgstr "Працює, якщо у вас більше трьох сенсорів температури" - -#: prefs.js:68 -msgid "Group Voltage Items" -msgstr "Групувати елементи напруги" - -#: prefs.js:69 -msgid "Works if you have more than three voltage sensors" -msgstr "Працює, якщо у вас більше трьох сенсорів напруги" - -#: prefs.js:74 -msgid "HDD/SSD Temperature Utility" -msgstr "Утиліта для визначення температури HDD/SSD" - -#: prefs.js:79 -msgid "None" -msgstr "Ніяка" - -#: prefs.js:80 -msgid "NVIDIA" -msgstr "NVIDIA" - -#: prefs.js:81 -msgid "Catalyst" -msgstr "Catalyst" - -#: prefs.js:84 -msgid "Video Card Temperature Utility" -msgstr "Утиліта для визначення температури відеокарти" - -#: prefs.js:49 -msgid "Left" -msgstr "Ліворуч" - -#: prefs.js:49 -msgid "Center" -msgstr "В центрі" - -#: prefs.js:49 -msgid "Right" -msgstr "Праворуч" - -#: extension.js:479 -msgid "Go to the Freon wiki" -msgstr "Перейти на wiki Freon" - -#: extension.js:486 -#, fuzzy -#| msgid "Sensors Settings" -msgid "Sensor Settings" -msgstr "Налаштування сенсорів" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/zh_CN.po b/freon@UshakovVasilii_Github.yahoo.com/po/zh_CN.po deleted file mode 100644 index a5fd5f0..0000000 --- a/freon@UshakovVasilii_Github.yahoo.com/po/zh_CN.po +++ /dev/null @@ -1,128 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2016-02-20 19:18+0800\n" -"PO-Revision-Date: 2016-02-20 19:19+0800\n" -"Last-Translator: Dingzhong Chen \n" -"Language-Team: \n" -"Language: zh_CN\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.8.7\n" -"Plural-Forms: nplurals=1; plural=0;\n" - -#: bumblebeeNvidiaUtil.js:75 prefs.js:82 -msgid "Bumblebee + NVIDIA" -msgstr "Bumblebee + NVIDIA" - -#: extension.js:319 -msgid "Average" -msgstr "平均值" - -#: extension.js:320 -msgid "Maximum" -msgstr "最大值" - -#: extension.js:341 -#, javascript-format -msgid "%drpm" -msgstr "%drpm" - -#: extension.js:350 -#, javascript-format -msgid "%s%.2fV" -msgstr "%s%.2fV" - -#: extension.js:396 -msgid "Please run sensors-detect as root." -msgstr "请以 root 运行 sensors-detect。" - -#: extension.js:397 -msgid "" -"Please install lm_sensors.\n" -"If this doesn't help, click here to report with your sensors output!" -msgstr "" -"请安装 lm_sensors。\n" -"如果这不管用,点击这里并报告你的传感器输出!" - -#: extension.js:488 -msgid "Temperature Sensors" -msgstr "温度传感器" - -#: extension.js:495 -msgid "Voltage" -msgstr "电压" - -#: extension.js:509 -msgid "Sensors Settings" -msgstr "传感器设置" - -#: prefs.js:33 -msgid "Poll Sensors Every (sec)" -msgstr "查询传感器每(秒)" - -#: prefs.js:39 -msgid "Show Decimal Value" -msgstr "显示小数部分" - -#: prefs.js:40 -msgid "Show one digit after decimal" -msgstr "显示小数点后一位数字" - -#: prefs.js:45 -msgid "Temperature Unit" -msgstr "温度单位" - -#: prefs.js:51 -msgid "Position in Panel" -msgstr "面板位置" - -#: prefs.js:55 -msgid "Show Icon on Panel" -msgstr "在面板显示图标" - -#: prefs.js:58 -msgid "Show Fan Speed" -msgstr "显示风扇转速" - -#: prefs.js:61 -msgid "Show Power Supply Voltage" -msgstr "显示电源电压" - -#: prefs.js:64 -msgid "Group Temperature Items" -msgstr "编组温度项" - -#: prefs.js:65 -msgid "Works if you have more than three temperature sensors" -msgstr "如果你有超过三个温度传感器时可用" - -#: prefs.js:68 -msgid "Group Voltage Items" -msgstr "编组电压项" - -#: prefs.js:69 -msgid "Works if you have more than three voltage sensors" -msgstr "如果你有超过三个电压传感器时可用" - -#: prefs.js:74 -msgid "HDD/SSD Temperature Utility" -msgstr "HDD/SSD 温度工具" - -#: prefs.js:79 -msgid "None" -msgstr "无" - -#: prefs.js:80 -msgid "NVIDIA" -msgstr "NVIDIA" - -#: prefs.js:81 -msgid "Catalyst" -msgstr "Catalyst" - -#: prefs.js:84 -msgid "Video Card Temperature Utility" -msgstr "显卡温度工具" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po b/freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po deleted file mode 100644 index 534129b..0000000 --- a/freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po +++ /dev/null @@ -1,253 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-05-31 11:23-0700\n" -"PO-Revision-Date: 2020-05-31 11:53-0700\n" -"Last-Translator: Bowie Chen \n" -"Language-Team: \n" -"Language: zh_TW\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.3\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Poedit-Basepath: ..\n" -"X-Poedit-SearchPath-0: .\n" - -#: bumblebeeNvidiaUtil.js:79 prefs.js:83 -msgid "Bumblebee + NVIDIA" -msgstr "Bumblebee + NVIDIA" - -#: extension.js:381 -msgid "Average" -msgstr "平均值" - -#: extension.js:385 -msgid "Maximum" -msgstr "最大值" - -#: extension.js:407 -#, javascript-format -msgid "%drpm" -msgstr "%drpm" - -#: extension.js:416 -#, javascript-format -msgid "%s%.2fV" -msgstr "%s%.2fV" - -#: extension.js:465 -msgid "Please run sensors-detect as root." -msgstr "請以 root 執行 sensors-detect。" - -#: extension.js:466 -msgid "" -"Please install lm_sensors.\n" -"If this doesn't help, click here to report with your sensors output!" -msgstr "" -"請安裝 lm_sensors。\n" -"如果沒有改進,點擊這裡並輸出您的感測器數據!" - -#: extension.js:481 -msgid "Go to the Freon wiki" -msgstr "到 Freon 的 wiki" - -#: extension.js:488 -msgid "Sensor Settings" -msgstr "感測器設定" - -#: extension.js:579 -msgid "Temperature Sensors" -msgstr "溫度感測器" - -#: extension.js:593 -msgid "Voltage" -msgstr "電壓" - -#: prefs.js:30 -msgid "Poll Sensors Every (sec)" -msgstr "更新速率(每秒)" - -#: prefs.js:36 -msgid "Show Decimal Value" -msgstr "顯示小數部分" - -#: prefs.js:37 schemas/org.gnome.shell.extensions.sensors.gschema.xml:33 -msgid "Show one digit after decimal" -msgstr "顯示小數點後一位數" - -#: prefs.js:42 -msgid "Temperature Unit" -msgstr "溫度單位" - -#: prefs.js:46 -msgid "Left" -msgstr "左" - -#: prefs.js:46 -msgid "Center" -msgstr "中" - -#: prefs.js:46 -msgid "Right" -msgstr "右" - -#: prefs.js:48 schemas/org.gnome.shell.extensions.sensors.gschema.xml:62 -msgid "Position in Panel" -msgstr "面板位置" - -#: prefs.js:56 schemas/org.gnome.shell.extensions.sensors.gschema.xml:20 -msgid "Show Icon on Panel" -msgstr "在面板顯示圖示" - -#: prefs.js:59 -msgid "Show Fan Speed" -msgstr "顯示風扇轉速" - -#: prefs.js:62 -msgid "Show Power Supply Voltage" -msgstr "顯示電源電壓" - -#: prefs.js:65 -msgid "Group Temperature Items" -msgstr "聚集溫度項目" - -#: prefs.js:66 -msgid "Works if you have more than three temperature sensors" -msgstr "如果您有超過三個溫度感測器時可用" - -#: prefs.js:69 -msgid "Group Voltage Items" -msgstr "聚集電壓項目" - -#: prefs.js:70 -msgid "Works if you have more than three voltage sensors" -msgstr "如果您有超過三個電壓感測器時可用" - -#: prefs.js:75 -msgid "HDD/SSD Temperature Utility" -msgstr "HDD/SSD 溫度工具" - -#: prefs.js:80 -msgid "None" -msgstr "無" - -#: prefs.js:81 -msgid "NVIDIA" -msgstr "NVIDIA" - -#: prefs.js:82 -msgid "Catalyst" -msgstr "Catalyst" - -#: prefs.js:85 -msgid "Video Card Temperature Utility" -msgstr "顯示卡溫度工具" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:8 -msgid "Seconds before next update" -msgstr "每幾秒從工具讀取最新數據" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:9 -msgid "" -"This is the seconds after CPU temperature extension updates the data from " -"the syetem" -msgstr "從溫度工具讀取數據的頻率" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:14 -msgid "Unit" -msgstr "單位" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:15 -msgid "" -"The unit ('centigrade' or 'fahrenheit') the extension should display the " -"temperature in" -msgstr "使用攝氏或是華氏顯示溫度" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:21 -msgid "Show sensor icon on top panel" -msgstr "在面板顯示圖示" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:26 -msgid "Sensors to show in panel" -msgstr "面板中顯示的感測器" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:27 -msgid "Select the sensord whose values has to be shown in the panel" -msgstr "選擇面板中要顯示的感測器" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:32 -msgid "Show decimal value" -msgstr "顯示小數部分" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:38 -msgid "Display Fan RPM" -msgstr "顯示風扇每分鐘轉速" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:39 -msgid "Display fan rotation per minute" -msgstr "顯示風扇每分鐘轉速" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:44 -msgid "Display voltage" -msgstr "顯示電壓" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:45 -msgid "Display voltage of various components" -msgstr "顯示套件電壓" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:50 -msgid "Utility for detect HDD/SSD temperature" -msgstr "偵測 HDD/SSD 溫度工具" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:51 -msgid "Utility for detect HDD/SSD temperature ('none', 'hddtemp' or 'udisks2')" -msgstr "偵測 HDD/SSD 溫度工具(無、hddtemp、udisks2)" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:56 -msgid "Utility for detect video card temperature" -msgstr "偵測顯示卡溫度工具" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:57 -msgid "" -"Utility for detect video card temperature ('none', 'nvidia-settings' or " -"'aticonfig')" -msgstr "偵測顯示卡溫度工具(無、nvidia-settings、aticonfig)" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:63 -msgid "Position in Panel ('left', 'center', 'right')" -msgstr "面板位置(左、中、右)" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:68 -msgid "Index in panel box" -msgstr "面板順位" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:69 -msgid "" -"Index within the selected panel box (0: first, 1: second, ..., -1: last)" -msgstr "面板順位(0為第一、1為第二、以此類推;-1為倒數第一)" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:74 -msgid "Group temperature menu items" -msgstr "組合溫度項目" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:75 -msgid "Group more than three sensors temperature menu items" -msgstr "如果您有超過三個溫度感測器時可用" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:80 -msgid "Group voltage menu items" -msgstr "組合電壓項目" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:81 -msgid "Group more than three voltage menu items" -msgstr "如果您有超過三個電壓感測器時可用" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:86 -msgid "Enable debug logging" -msgstr "啟用開發者輸出" - -#: schemas/org.gnome.shell.extensions.sensors.gschema.xml:87 -msgid "Enable debug logging from the extension" -msgstr "從擴充啟用開發者輸出" From 3ea64e37390bc2cd8a0706f49d74777af9a831dd Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sun, 27 Mar 2022 20:00:48 +0300 Subject: [PATCH 200/224] update gitignore for po --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9bec7b1..95753f4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.zip freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled +freon@UshakovVasilii_Github.yahoo.com/po/ \ No newline at end of file From dab4b63c2e6a0d92f6ca66dbb4311c0853efa0b5 Mon Sep 17 00:00:00 2001 From: joickle Date: Fri, 8 Apr 2022 10:06:19 -0300 Subject: [PATCH 201/224] Add space to rpm (#231) --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 54309b6..58c3d44 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -686,7 +686,7 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend } for (let fan of fanInfo){ - const unit = this._settings.get_boolean('show-rotationrate-unit') ? _('rpm'): ''; + const unit = this._settings.get_boolean('show-rotationrate-unit') ? _(' rpm'): ''; sensors.push({ icon: 'fan', From 2dfe76624f9269ef50f31011651860bddadafbc1 Mon Sep 17 00:00:00 2001 From: Sync1211 Date: Mon, 16 May 2022 16:00:26 +0200 Subject: [PATCH 202/224] * Fixed incorrect class name for nvidiabumblebee being used in _updateDisplay() (#238) --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 58c3d44..61120a9 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -556,9 +556,9 @@ const FreonMenuButton = GObject.registerClass(class Freon_FreonMenuButton extend if (this._settings.get_boolean('show-temperature')) gpuTempInfo = gpuTempInfo.concat(this._utils.nvidia.temp); - if (this._utils.bumblebeenvidia && this._utils.bumblebeenvidia.available) + if (this._utils.nvidiabumblebee && this._utils.nvidiabumblebee.available) if (this._settings.get_boolean('show-temperature')) - gpuTempInfo = gpuTempInfo.concat(this._utils.bumblebeenvidia.temp); + gpuTempInfo = gpuTempInfo.concat(this._utils.nvidiabumblebee.temp); if (this._utils.aticonfig && this._utils.aticonfig.available) if (this._settings.get_boolean('show-temperature')) From dab42ffc5c8405a74f835316acb38c32474d2243 Mon Sep 17 00:00:00 2001 From: polter Date: Sat, 9 Jul 2022 08:21:51 +0300 Subject: [PATCH 203/224] nvidiaUtil: code cleanup, fix recognizing the card (#242) Since the card list is populated only in constructor, to update it we had to toggle "Nvidia" switch `on`->`off`->`on`. The fix is to get the temperature along with the card name in one `nvidia-smi` call. Also some code cleanup was made, removed old unused code. Fixes #241 Signed-off-by: Pavel Artsishevsky --- .../nvidiaUtil.js | 58 ++++--------------- 1 file changed, 12 insertions(+), 46 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js index 78d9f79..c5a2243 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js @@ -10,59 +10,25 @@ var NvidiaUtil = class extends CommandLineUtil.CommandLineUtil { constructor() { super(); let path = GLib.find_program_in_path('nvidia-smi'); - this._argv = path ? [path, '--query-gpu=temperature.gpu', '--format=csv,noheader'] : null; - this._labels = []; - if(this._argv){ - // [0] ushakov-pc:0[gpu:0] (GeForce GTX 770) - let [exit, pid, stdinFd, stdoutFd, stderrFd] = - GLib.spawn_async_with_pipes(null, /* cwd */ - [path, '--query-gpu=name', '--format=csv,noheader'], /* args */ - null, /* env */ - GLib.SpawnFlags.DO_NOT_REAP_CHILD, - null /* child_setup */); - - let stdout = new Gio.UnixInputStream({fd: stdoutFd, close_fd: true}); - let outReader = new Gio.DataInputStream({base_stream: stdout}); - - GLib.close(stdinFd); - GLib.close(stderrFd); - let childWatch = GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, (pid, status, requestObj) => { - let output = []; - let [line, size] = [null, 0]; - - while (([line, size] = outReader.read_line(null)) != null && line != null) { - this._labels.push(ByteArray.toString(line)); - } - - stdout.close(null); - GLib.source_remove(childWatch); - }); - } + this._argv = path ? [path, '--query-gpu=name,temperature.gpu', '--format=csv,noheader'] : null; } get temp() { - let output = []; - if(this._output) - output.push(...this._output) - if(this._error_output) - output.push(...this._error_output) + let gpus = []; - if(output.length === 0) - return []; - let temps = []; - for (let line of this._output) { - let convertedLine = parseFloat(line); + if (this._output) { + for (let line of this._output) { + let values = line.split(','); + if (values.length < 2) + continue; - if(!line || !convertedLine) - continue; - temps.push(convertedLine); - } + let label = values[0].trim(); + let temp = parseFloat(values[1]); - let gpus = []; + if(!label || !temp) + continue; - if(this._labels.length == temps.length){ - for(let i = 0; i < this._labels.length; i++){ - gpus.push({ label: this._labels[i], temp: temps[i] }) + gpus.push({ label: label, temp: temp }); } } From c655ccb6cfdbd132100a6cd70cda82528a1b4599 Mon Sep 17 00:00:00 2001 From: jssotomdz <105805873+jssotomdz@users.noreply.github.com> Date: Thu, 22 Sep 2022 14:39:51 +0200 Subject: [PATCH 204/224] Add Gnome Shell 43 compatibility (#245) --- freon@UshakovVasilii_Github.yahoo.com/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index 8880c5e..1ce819a 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": ["40", "41", "42"], + "shell-version": ["40", "41", "42", "43"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", "description": "Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", From 9939f2888ae2e74ff778a4e1accf9f8812356693 Mon Sep 17 00:00:00 2001 From: Erick Howard <78889625+DivineBicycle@users.noreply.github.com> Date: Wed, 28 Sep 2022 14:23:31 +0800 Subject: [PATCH 205/224] Update screenshots in wiki (#246) Co-authored-by: Divine Bicycle --- img/panel_menu.jpg | Bin 38026 -> 26995 bytes img/prefs-1.png | Bin 32802 -> 85497 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/img/panel_menu.jpg b/img/panel_menu.jpg index eb67ad8581fb6332e7275ded54592ef8f103522a..e8436482c2caf7e217571f59c478fd16ab108b7e 100644 GIT binary patch literal 26995 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

(79-7GGc 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 diff --git a/img/prefs-1.jpg b/img/prefs-1.jpg deleted file mode 100644 index 39e62fed8e202462115c94c06533e86f26bdfa2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36841 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 diff --git a/img/prefs-1.png b/img/prefs-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7231f35e42019e653b71224201ee4093961ec115 GIT binary patch literal 32802 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≫;s8=zCg;)3mXpcgw^=Nt}>6rA08v}g?> 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 MsH{k?(5rX<3qTw@M*si- literal 0 HcmV?d00001 From 0ed7944459935fed906fce5456da21009ca67fee Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sat, 4 Apr 2015 08:32:17 +0300 Subject: [PATCH 059/224] Support GNOME Shell 3.16 --- freon@UshakovVasilii_Github.yahoo.com/freonItem.js | 2 +- freon@UshakovVasilii_Github.yahoo.com/metadata.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js index 6a62afc..2cb4d35 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js +++ b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js @@ -12,7 +12,7 @@ const FreonItem = new Lang.Class({ this._label = label; this._gIcon = gIcon; - this.actor.add(new St.Icon({ style_class: 'system-status-icon', gicon : gIcon})); + this.actor.add(new St.Icon({ style_class: 'popup-menu-icon', gicon : gIcon})); this.actor.add(new St.Label({text: label}), {x_fill: true, expand: true}); this._valueLabel = new St.Label({text: value}); this.actor.add(this._valueLabel); diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index 31d77ea..20c8ab0 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": ["3.12", "3.14"], + "shell-version": ["3.12", "3.14", "3.16"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", "description": "Shows CPU temperature, HDD/SSD temperature, video card temperature (Nvidia/Catalyst), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", From d5777b70d8125fbe8aa9fa3ba76a4b4845d643b1 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sat, 11 Apr 2015 01:01:16 +0300 Subject: [PATCH 060/224] clean code --- .../aticonfigUtil.js | 4 +- .../bumblebeeNvidiaUtil.js | 0 .../extension.js | 48 ++++++++----------- .../hddtempUtil.js | 11 ++--- .../nvidiaUtil.js | 4 +- .../sensorsUtil.js | 4 +- .../udisks2.js | 6 +-- 7 files changed, 34 insertions(+), 43 deletions(-) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js diff --git a/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js b/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js index fa579f6..c85ab5f 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/aticonfigUtil.js @@ -8,10 +8,10 @@ const AticonfigUtil = new Lang.Class({ Name: 'AticonfigUtil', Extends: CommandLineUtil.CommandLineUtil, - detect: function(){ + _init: function() { + this.parent(); let path = GLib.find_program_in_path('aticonfig'); this._argv = path ? [path, '--odgt'] : null; - return this._argv != null; }, /* diff --git a/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js new file mode 100644 index 0000000..e69de29 diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index d612b28..221ef2c 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -27,17 +27,15 @@ const FreonMenuButton = new Lang.Class({ _init: function(){ this.parent(St.Align.START); + this._settings = Convenience.getSettings(); + this._sensorMenuItems = {}; this._utils = { - aticonfig: new AticonfigUtil.AticonfigUtil(), - hddtemp: new HddtempUtil.HddtempUtil(), - sensors: new SensorsUtil.SensorsUtil(), - nvidia: new NvidiaUtil.NvidiaUtil() + sensors: new SensorsUtil.SensorsUtil() }; - this._udisks2 = new UDisks2.UDisks2(); - - this._settings = Convenience.getSettings(); + this._initDriveUtility(); + this._initGpuUtility(); let temperatureIcon = Gio.icon_new_for_string(Me.path + '/icons/freon-temperature-symbolic.svg'); this._sensorIcons = { @@ -65,10 +63,6 @@ const FreonMenuButton = new Lang.Class({ this.actor.add_actor(this._menuLayout); - this._utils.sensors.detect(); - this._initDriveUtility(); - this._initGpuUtility(); - this._settingChangedSignals = []; this._addSettingChangedSignal('update-time', Lang.bind(this, this._updateTimeChanged)); this._addSettingChangedSignal('unit', Lang.bind(this, this._querySensors)); @@ -158,10 +152,10 @@ const FreonMenuButton = new Lang.Class({ _initDriveUtility : function(){ switch(this._settings.get_string('drive-utility')){ case 'hddtemp': - this._utils.hddtemp.detect(); + this._utils.disks = new HddtempUtil.HddtempUtil(); break; case 'udisks2': - this._udisks2.detect(Lang.bind(this, function() { + this._utils.disks = new UDisks2.UDisks2(Lang.bind(this, function() { this._updateDisplay(); })); break; @@ -169,24 +163,28 @@ const FreonMenuButton = new Lang.Class({ }, _destroyDriveUtility : function(){ - this._udisks2.destroy(); - this._utils.hddtemp.destroy(); + if(this._utils.disks){ + this._utils.disks.destroy(); + delete this._utils.disks; + } }, _initGpuUtility : function(){ switch(this._settings.get_string('gpu-utility')){ case 'nvidia-settings': - this._utils.nvidia.detect(); + this._utils.gpu = new NvidiaUtil.NvidiaUtil(); break; case 'aticonfig': - this._utils.aticonfig.detect(); + this._utils.gpu = new AticonfigUtil.AticonfigUtil(); break; } }, _destroyGpuUtility : function(){ - this._utils.nvidia.destroy(); - this._utils.aticonfig.destroy(); + if(this._utils.gpu){ + this._utils.gpu.destroy(); + delete this._utils.gpu; + } }, _gpuUtilityChanged : function(){ @@ -233,10 +231,8 @@ const FreonMenuButton = new Lang.Class({ _updateDisplay: function(){ let gpuTempInfo = []; - if (this._utils.aticonfig.available) - gpuTempInfo = gpuTempInfo.concat(this._utils.aticonfig.temp); - if (this._utils.nvidia.available) - gpuTempInfo = gpuTempInfo.concat(this._utils.nvidia.temp); + if (this._utils.gpu && this._utils.gpu.available) + gpuTempInfo = gpuTempInfo.concat(this._utils.gpu.temp); let sensorsTempInfo = this._utils.sensors.temp; @@ -249,10 +245,8 @@ const FreonMenuButton = new Lang.Class({ voltageInfo = this._utils.sensors.volt; let driveTempInfo = []; - if(this._utils.hddtemp.available) { - driveTempInfo = this._utils.hddtemp.temp; - } else if(this._udisks2.available){ - driveTempInfo = this._udisks2.temp; + if(this._utils.disks && this._utils.disks.available) { + driveTempInfo = this._utils.disks.temp; } sensorsTempInfo.sort(function(a,b) { return a.label.localeCompare(b.label) }); diff --git a/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js b/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js index 6865596..ef320aa 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/hddtempUtil.js @@ -8,18 +8,19 @@ const HddtempUtil = new Lang.Class({ Name: 'HddtempUtil', Extends: CommandLineUtil.CommandLineUtil, - detect: function(){ + _init: function() { + this.parent(); let hddtempArgv = GLib.find_program_in_path('hddtemp'); if(hddtempArgv) { // check if this user can run hddtemp directly. if(!GLib.spawn_command_line_sync(hddtempArgv)[3]){ this._argv = [hddtempArgv]; - return true; + return; } } // doesn't seem to be the case… is it running as a daemon? - // Check first for systemd + // Check first for systemd let systemctl = GLib.find_program_in_path('systemctl'); let pidof = GLib.find_program_in_path('pidof'); let nc = GLib.find_program_in_path('nc'); @@ -50,11 +51,7 @@ const HddtempUtil = new Lang.Class({ let port = match ? parseInt(match[2]) : 7634; // use net cat to get data this._argv = [nc, 'localhost', port.toString()]; - return true; } - - // not found - return false; }, get temp() { diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js index 7d71152..3eb76bd 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js @@ -8,7 +8,8 @@ const NvidiaUtil = new Lang.Class({ Name: 'NvidiaUtil', Extends: CommandLineUtil.CommandLineUtil, - detect: function(){ + _init: function() { + this.parent(); let path = GLib.find_program_in_path('nvidia-settings'); this._argv = path ? [path, '-q', 'gpucoretemp', '-t'] : null; this._label = 'NVIDIA'; @@ -22,7 +23,6 @@ const NvidiaUtil = new Lang.Class({ } } } - return this._argv != null; }, get temp() { diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js index 44b2c0b..5bfe887 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -8,10 +8,10 @@ const SensorsUtil = new Lang.Class({ Name: 'SensorsUtil', Extends: CommandLineUtil.CommandLineUtil, - detect: function(){ + _init: function() { + this.parent(); let path = GLib.find_program_in_path('sensors'); this._argv = path ? [path] : null; - return this._argv != null; }, get temp() { diff --git a/freon@UshakovVasilii_Github.yahoo.com/udisks2.js b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js index f88de66..c6227ed 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/udisks2.js +++ b/freon@UshakovVasilii_Github.yahoo.com/udisks2.js @@ -35,10 +35,8 @@ const UDisks2 = new Lang.Class({ Name: 'UDisks2', _init: function(callback) { + this.parent(); this._udisksProxies = []; - }, - - detect: function(callback){ this._get_drive_ata_proxies(Lang.bind(this, function(proxies) { this._udisksProxies = proxies; callback(); @@ -114,4 +112,6 @@ const UDisks2 = new Lang.Class({ this._udisksProxies = []; }, + execute: function(callback) {}, + }); From 27ea44ed56142706c969d32e3f18f69fbaf74c6f Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sat, 11 Apr 2015 03:46:57 +0300 Subject: [PATCH 061/224] add utility for Bumblebee & NVIDIA, #5 --- .../bumblebeeNvidiaUtil.js | 95 +++++++++++++++++++ .../extension.js | 32 +++++-- .../freonItem.js | 9 +- .../prefs.js | 6 +- 4 files changed, 132 insertions(+), 10 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js index e69de29..a7c9e7e 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js @@ -0,0 +1,95 @@ +const Lang = imports.lang; +const GLib = imports.gi.GLib; +const Gio = imports.gi.Gio; + +const Me = imports.misc.extensionUtils.getCurrentExtension(); +const CommandLineUtil = Me.imports.commandLineUtil; + +const BumblebeeNvidiaUtil = new Lang.Class({ + Name: 'BumblebeeNvidiaUtil', + Extends: CommandLineUtil.CommandLineUtil, + + _init: function() { + this.parent(); + // optirun nvidia-smi -q -d TEMPERATURE + this._path = GLib.find_program_in_path('optirun'); + this._argv = this._path ? [this._path, 'nvidia-smi', '-q', '-d', 'TEMPERATURE'] : null; + + // original source here: + // https://github.com/meden/gse-bumblebee-indicator + // thank meden! + let virtualDisplay = ':8'; + let configFile = Gio.File.new_for_path('/etc/bumblebee/bumblebee.conf'); + let contents = configFile.load_contents(null); + if (contents[0]) { + let pattern = /^VirtualDisplay=.*$/m + let match = new String(pattern.exec(new String(contents))); + virtualDisplay = match.substr(16); + } + let lockFile = '/tmp/.X' + virtualDisplay + '-lock'; + this._lockMonitor = Gio.File.new_for_path( + lockFile).monitor_file(Gio.FileMonitorFlags.NONE, null + ); + this._lockMonitor.id = this._lockMonitor.connect( + 'changed', Lang.bind(this, this._statusChanged) + ); + }, + + _detectLabel: function() { + // optirun nvidia-smi -L + // GPU 0: GeForce GT 525M (UUID: GPU-...) + for each(let line in GLib.spawn_command_line_sync(this._path + " nvidia-smi -L")){ + let match = /.*GPU [\d]:([\w\d\ ]+).*/.exec(line); + if(match){ + this._label = match[1]; + if(this._label) + this._label = this._label.trim(); + break; + } + } + }, + + _statusChanged: function(monitor, a_file, other_file, event_type) { + if (event_type == Gio.FileMonitorEvent.CREATED) { + if(this._argv && !this._label) + this._detectLabel(); + this._active = true; + } else if (event_type == Gio.FileMonitorEvent.DELETED) { + this._active = false; + } + }, + + execute: function(callback) { + if(this._active) + this.parent(callback); + else + this._output = []; + }, + + get temp() { + let key = 'bumblebee-nvidia' + let label = this._label ? this._label : _('Bumblebee + NVIDIA'); + if(!this._active || !this._output) + return [{label: key, temp: null, displayName: label}]; + // GPU Current Temp : 37 C + for each(let line in this._output) { + if(!line) + continue; + let r; + if(line.indexOf('GPU Current Temp') > 0) + return [{ + label: key, + temp: (r = /[\s]*GPU Current Temp[\s]*:[\s]*(\d{1,3}).*/.exec(line)) ? parseFloat(r[1]) : null, + displayName: label + }]; + } + + return []; + }, + + destroy: function(){ + this.parent(); + this._lockMonitor.disconnect(this._lockMonitor.id); + } + +}); diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 221ef2c..605efa0 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -15,6 +15,7 @@ const AticonfigUtil = Me.imports.aticonfigUtil; const NvidiaUtil = Me.imports.nvidiaUtil; const HddtempUtil = Me.imports.hddtempUtil; const SensorsUtil = Me.imports.sensorsUtil; +const BumblebeeNvidiaUtil = Me.imports.bumblebeeNvidiaUtil; const FreonItem = Me.imports.freonItem; const Gettext = imports.gettext.domain(Me.metadata['gettext-domain']); @@ -177,6 +178,9 @@ const FreonMenuButton = new Lang.Class({ case 'aticonfig': this._utils.gpu = new AticonfigUtil.AticonfigUtil(); break; + case 'bumblebee-nvidia-smi': + this._utils.gpu = new BumblebeeNvidiaUtil.BumblebeeNvidiaUtil(); + break; } }, @@ -212,6 +216,7 @@ const FreonMenuButton = new Lang.Class({ _onDestroy: function(){ this._destroyDriveUtility(); + this._destroyGpuUtility(); Mainloop.source_remove(this._timeoutId); for each (let signal in this._settingChangedSignals){ @@ -257,18 +262,26 @@ const FreonMenuButton = new Lang.Class({ let tempInfo = gpuTempInfo.concat(sensorsTempInfo).concat(driveTempInfo); if (tempInfo.length > 0){ + let total = 0; let sum = 0; let max = 0; for each (let i in tempInfo){ - sum += i.temp; - if (i.temp > max) - max = i.temp; + if(i.temp !== 'N/A'){ + total++; + sum += i.temp; + if (i.temp > max) + max = i.temp; + } } let sensors = []; for each (let i in gpuTempInfo){ - sensors.push({type:'gpu-temperature', label: i.label, value:this._formatTemp(i.temp)}); + sensors.push({ + type: 'gpu-temperature', + label: i.label, + value: this._formatTemp(i.temp), + displayName: i.displayName}); } for each (let i in sensorsTempInfo){ sensors.push({type:'temperature', label: i.label, value:this._formatTemp(i.temp)}); @@ -281,7 +294,7 @@ const FreonMenuButton = new Lang.Class({ sensors.push({type : 'separator'}); // Add average and maximum entries - sensors.push({type:'temperature-average', label:_("Average"), value:this._formatTemp(sum/tempInfo.length)}); + sensors.push({type:'temperature-average', label:_("Average"), value:this._formatTemp(sum/total)}); sensors.push({type:'temperature-maximum', label:_("Maximum"), value:this._formatTemp(max)}); if(fanInfo.length > 0 || voltageInfo.length > 0) @@ -330,8 +343,11 @@ const FreonMenuButton = new Lang.Class({ if(item) { if(s.type == 'temperature-group') item.status.text = s.value; - else + else { item.value = s.value; + if(s.displayName) + item.display_name = s.displayName; + } } else { this._needRerender = true; } @@ -399,7 +415,7 @@ const FreonMenuButton = new Lang.Class({ this._sensorMenuItems['temperature-group'] = temperatureGroup; } } else { - let item = new FreonItem.FreonItem(this._sensorIcons[s.type], s.label, s.value); + let item = new FreonItem.FreonItem(this._sensorIcons[s.type], s.label, s.value, s.displayName); item.connect('activate', Lang.bind(this, function (self) { let l = this._hotLabels[self.label]; let hotSensors = this._settings.get_strv('hot-sensors'); @@ -489,6 +505,8 @@ const FreonMenuButton = new Lang.Class({ }, _formatTemp: function(value) { + if(value === null) + return 'N/A'; if (this._settings.get_string('unit')=='fahrenheit'){ value = this._toFahrenheit(value); } diff --git a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js index 2cb4d35..4d49ade 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js +++ b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js @@ -6,14 +6,15 @@ const FreonItem = new Lang.Class({ Name: 'FreonItem', Extends: PopupMenu.PopupBaseMenuItem, - _init: function(gIcon, label, value) { + _init: function(gIcon, label, value, displayName) { this.parent(); this._main = false; this._label = label; this._gIcon = gIcon; + this._labelActor = new St.Label({text: displayName ? displayName : label}); this.actor.add(new St.Icon({ style_class: 'popup-menu-icon', gicon : gIcon})); - this.actor.add(new St.Label({text: label}), {x_fill: true, expand: true}); + this.actor.add(this._labelActor, {x_fill: true, expand: true}); this._valueLabel = new St.Label({text: value}); this.actor.add(this._valueLabel); }, @@ -34,6 +35,10 @@ const FreonItem = new Lang.Class({ return this._label; }, + set display_name(text) { + return this._labelActor.text = text; + }, + get gicon() { return this._gIcon; }, diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 1df4332..2d515fa 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -75,7 +75,11 @@ const FreonPrefsWidget = new GObject.Class({ }); this._addComboBox({ - items : {none : 'None', 'nvidia-settings' : 'Nvidia', aticonfig : 'Catalyst'}, + items : { + 'none' : _('None'), + 'nvidia-settings' : _('NVIDIA'), + 'aticonfig' : _('Catalyst'), + 'bumblebee-nvidia-smi': _('Bumblebee + NVIDIA') }, key: 'gpu-utility', y : i, x : 2, label: _('Video Card Temperature Utility') }); From 7bd8722a1a15dc98aed94e5786b63cac3d3ad259 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sat, 11 Apr 2015 09:58:13 +0300 Subject: [PATCH 062/224] fix bumblebee+nvidia if bumblebee not installed, #5 --- .../bumblebeeNvidiaUtil.js | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js index a7c9e7e..0abcb59 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js @@ -19,20 +19,26 @@ const BumblebeeNvidiaUtil = new Lang.Class({ // https://github.com/meden/gse-bumblebee-indicator // thank meden! let virtualDisplay = ':8'; - let configFile = Gio.File.new_for_path('/etc/bumblebee/bumblebee.conf'); - let contents = configFile.load_contents(null); - if (contents[0]) { - let pattern = /^VirtualDisplay=.*$/m - let match = new String(pattern.exec(new String(contents))); - virtualDisplay = match.substr(16); + + let bumblebeeConfPath = '/etc/bumblebee/bumblebee.conf'; + if(GLib.file_test(bumblebeeConfPath, GLib.FileTest.EXISTS)){ + let configFile = Gio.File.new_for_path(bumblebeeConfPath); + let contents = configFile.load_contents(null); + if (contents[0]) { + let pattern = /^VirtualDisplay=.*$/m + let match = new String(pattern.exec(new String(contents))); + virtualDisplay = match.substr(16); + } + } + let lockFilePath = '/tmp/.X' + virtualDisplay + '-lock'; + if(GLib.file_test(lockFilePath, GLib.FileTest.EXISTS)){ + this._lockMonitor = Gio.File.new_for_path( + lockFilePath).monitor_file(Gio.FileMonitorFlags.NONE, null + ); + this._lockMonitor.id = this._lockMonitor.connect( + 'changed', Lang.bind(this, this._statusChanged) + ); } - let lockFile = '/tmp/.X' + virtualDisplay + '-lock'; - this._lockMonitor = Gio.File.new_for_path( - lockFile).monitor_file(Gio.FileMonitorFlags.NONE, null - ); - this._lockMonitor.id = this._lockMonitor.connect( - 'changed', Lang.bind(this, this._statusChanged) - ); }, _detectLabel: function() { @@ -89,7 +95,8 @@ const BumblebeeNvidiaUtil = new Lang.Class({ destroy: function(){ this.parent(); - this._lockMonitor.disconnect(this._lockMonitor.id); + if(this._lockMonitor) + this._lockMonitor.disconnect(this._lockMonitor.id); } }); From 1b3ef0948227ad978035dbe09518fb8b3afcae2f Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sat, 11 Apr 2015 10:09:52 +0300 Subject: [PATCH 063/224] fix regression with lockMonitor, #5 --- .../bumblebeeNvidiaUtil.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js index 0abcb59..106dd55 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js @@ -31,14 +31,12 @@ const BumblebeeNvidiaUtil = new Lang.Class({ } } let lockFilePath = '/tmp/.X' + virtualDisplay + '-lock'; - if(GLib.file_test(lockFilePath, GLib.FileTest.EXISTS)){ - this._lockMonitor = Gio.File.new_for_path( - lockFilePath).monitor_file(Gio.FileMonitorFlags.NONE, null - ); - this._lockMonitor.id = this._lockMonitor.connect( - 'changed', Lang.bind(this, this._statusChanged) - ); - } + this._lockMonitor = Gio.File.new_for_path( + lockFilePath).monitor_file(Gio.FileMonitorFlags.NONE, null + ); + this._lockMonitor.id = this._lockMonitor.connect( + 'changed', Lang.bind(this, this._statusChanged) + ); }, _detectLabel: function() { @@ -95,8 +93,7 @@ const BumblebeeNvidiaUtil = new Lang.Class({ destroy: function(){ this.parent(); - if(this._lockMonitor) - this._lockMonitor.disconnect(this._lockMonitor.id); + this._lockMonitor.disconnect(this._lockMonitor.id); } }); From 8cb3d38d4e79e00f2d89aa7b5b03abb9667499c3 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sat, 11 Apr 2015 10:20:58 +0300 Subject: [PATCH 064/224] improve initial icon showing logic --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 605efa0..d1472fa 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -173,7 +173,7 @@ const FreonMenuButton = new Lang.Class({ _initGpuUtility : function(){ switch(this._settings.get_string('gpu-utility')){ case 'nvidia-settings': - this._utils.gpu = new NvidiaUtil.NvidiaUtil(); + this._utils.gpu = new NvidiaUtil.NvidiaUtil(); break; case 'aticonfig': this._utils.gpu = new AticonfigUtil.AticonfigUtil(); @@ -428,8 +428,6 @@ const FreonMenuButton = new Lang.Class({ i.destroy(); delete this._hotIcons[self.label]; } - if(Object.keys(this._hotLabels).length == 0) - this._createInitialIcon(); self.main = false; } else { hotSensors.push(self.label); @@ -455,6 +453,9 @@ const FreonMenuButton = new Lang.Class({ } } + if(Object.keys(this._hotLabels).length == 0) + this._createInitialIcon(); + this._settings.set_strv('hot-sensors', hotSensors.filter( function(item, pos) { return hotSensors.indexOf(item) == pos; From 13cae5e1170d69ac347745711c92cf4c3f3583aa Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Mon, 13 Apr 2015 21:04:38 +0300 Subject: [PATCH 065/224] UI optimization, #5 --- .../bumblebeeNvidiaUtil.js | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js index 106dd55..8902770 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/bumblebeeNvidiaUtil.js @@ -73,22 +73,21 @@ const BumblebeeNvidiaUtil = new Lang.Class({ get temp() { let key = 'bumblebee-nvidia' let label = this._label ? this._label : _('Bumblebee + NVIDIA'); - if(!this._active || !this._output) - return [{label: key, temp: null, displayName: label}]; - // GPU Current Temp : 37 C - for each(let line in this._output) { - if(!line) - continue; - let r; - if(line.indexOf('GPU Current Temp') > 0) - return [{ - label: key, - temp: (r = /[\s]*GPU Current Temp[\s]*:[\s]*(\d{1,3}).*/.exec(line)) ? parseFloat(r[1]) : null, - displayName: label - }]; + if(this._active && this._output){ + // GPU Current Temp : 37 C + for each(let line in this._output) { + if(!line) + continue; + let r; + if(line.indexOf('GPU Current Temp') > 0) + return [{ + label: key, + temp: (r = /[\s]*GPU Current Temp[\s]*:[\s]*(\d{1,3}).*/.exec(line)) ? parseFloat(r[1]) : null, + displayName: label + }]; + } } - - return []; + return [{label: key, temp: null, displayName: label}]; }, destroy: function(){ From f2c272ca45a5e4d131a31b07af7a9d0cd4a9c8bb Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Mon, 13 Apr 2015 21:15:53 +0300 Subject: [PATCH 066/224] update description --- README.md | 2 +- freon@UshakovVasilii_Github.yahoo.com/metadata.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cc2c46d..093c8a2 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ gnome-shell-extension-freon ==================================== -Freon is forked from [gnome-shell-extension-sensors](https://github.com/xtranophilist/gnome-shell-extension-sensors). Freon is an extension for displaying CPU temperature, HDD/SSD temperature, video card temperature (Nvidia/Catalyst), voltage and fan RPM in GNOME Shell. +Freon is forked from [gnome-shell-extension-sensors](https://github.com/xtranophilist/gnome-shell-extension-sensors). Freon is an extension for displaying CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM in GNOME Shell. More info in [wiki](https://github.com/UshakovVasilii/gnome-shell-extension-freon/wiki) diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index 20c8ab0..0caa4aa 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -2,7 +2,7 @@ "shell-version": ["3.12", "3.14", "3.16"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", - "description": "Shows CPU temperature, HDD/SSD temperature, video card temperature (Nvidia/Catalyst), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", + "description": "Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", "settings-schema": "org.gnome.shell.extensions.freon", "gettext-domain": "freon", "url": "https://github.com/UshakovVasilii/gnome-shell-extension-freon" From 4cd7302da4c9108ff4166a3df10eb631a3673acd Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 17 Apr 2015 14:18:12 +0300 Subject: [PATCH 067/224] fix total sensor count detection, close #6 --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index d1472fa..f299d63 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -266,7 +266,7 @@ const FreonMenuButton = new Lang.Class({ let sum = 0; let max = 0; for each (let i in tempInfo){ - if(i.temp !== 'N/A'){ + if(i.temp !== null){ total++; sum += i.temp; if (i.temp > max) From 6b01b4bf8257d68fa7e7bc073ba8eaea4a34b02a Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 1 May 2015 15:47:21 +0300 Subject: [PATCH 068/224] rid full rerander with grouping and temperature sensors count less 3, fix #8 --- .../extension.js | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index f299d63..d722765 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -301,7 +301,7 @@ const FreonMenuButton = new Lang.Class({ sensors.push({type : 'separator'}); } - if(this._settings.get_boolean('group-temperature')){ + if(sensorsTempInfo.length > 0 && this._settings.get_boolean('group-temperature')){ sum = 0; for each (let i in sensorsTempInfo){ sum += i.temp; @@ -309,7 +309,7 @@ const FreonMenuButton = new Lang.Class({ sensors.push({ type:'temperature-group', label:'temperature-group', - value: this._formatTemp(sum/sensorsTempInfo.length)}); + value: this._formatTemp(sum / sensorsTempInfo.length)}); } for each (let fan in fanInfo){ @@ -385,21 +385,12 @@ const FreonMenuButton = new Lang.Class({ let needGroupTemperature = this._settings.get_boolean('group-temperature'); let needGroupVoltage = this._settings.get_boolean('group-voltage'); - if(needGroupTemperature){ - let i = 0; - for each (let s in sensors) - if(s.type == 'temperature') - i++; - if(i <= 3) - needGroupTemperature = false; - } - if(needGroupVoltage){ let i = 0; for each (let s in sensors) if(s.type == 'voltage') i++; - if(i <= 3) + if(i < 2) needGroupVoltage = false; } From a15349b29cf2934323c7593bbb7dfbd3424a8ed5 Mon Sep 17 00:00:00 2001 From: aromanos Date: Fri, 1 May 2015 19:01:11 +0200 Subject: [PATCH 069/224] Handle sensors of radeon & nouveau drivers as GPUs --- .../extension.js | 3 +- .../sensorsUtil.js | 35 ++++++++++++++++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index f299d63..a34ed70 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -235,7 +235,8 @@ const FreonMenuButton = new Lang.Class({ }, _updateDisplay: function(){ - let gpuTempInfo = []; + let gpuTempInfo = this._utils.sensors.gpu; + if (this._utils.gpu && this._utils.gpu.available) gpuTempInfo = gpuTempInfo.concat(this._utils.gpu.temp); diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js index 5bfe887..53722e8 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -15,24 +15,39 @@ const SensorsUtil = new Lang.Class({ }, get temp() { - let s = this._parseSensorsOutput(this._parseSensorsTemperatureLine); + let s = this._parseGenericSensorsOutput(this._parseSensorsTemperatureLine); + return s.filter(function(e){ + return e.temp > 0 && e.temp < 115; + }); + }, + + get gpu() { + let s = this._parseGpuSensorsOutput(this._parseSensorsTemperatureLine); return s.filter(function(e){ return e.temp > 0 && e.temp < 115; }); }, get rpm() { - let s = this._parseSensorsOutput(this._parseFanRPMLine); + let s = this._parseGenericSensorsOutput(this._parseFanRPMLine); return s.filter(function(e){ return e.rpm > 0; }); }, get volt() { - return this._parseSensorsOutput(this._parseVoltageLine); + return this._parseGenericSensorsOutput(this._parseVoltageLine); + }, + + _parseGenericSensorsOutput: function(parser) { + return this._parseSensorsOutput(parser, false); }, - _parseSensorsOutput: function(parser) { + _parseGpuSensorsOutput: function(parser) { + return this._parseSensorsOutput(parser, true); + }, + + _parseSensorsOutput: function(parser, gpuFlag) { if(!this._output) return []; @@ -41,8 +56,18 @@ const SensorsUtil = new Lang.Class({ let sensors = []; //iterate through each lines for(let i = 0; i < this._output.length; i++){ - // ignore chipset driver name and 'Adapter:' line for now + + let isGpuDriver = this._output[i].indexOf("radeon") != -1 + || this._output[i].indexOf("nouveau") != -1; + + if (gpuFlag != isGpuDriver) { + // skip driver if gpu requested and driver is not a gpu or the opposite + continue; + } + + // skip chipset driver name and 'Adapter:' lines i += 2; + // get every feature of the chip while(this._output[i]){ // if it is not a continutation of a feature line From c1ae9ce317cfa6efe1efa5d02df922047560a670 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Tue, 5 May 2015 09:37:49 +0300 Subject: [PATCH 070/224] fix same name problem --- .../extension.js | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index c1c6e60..f20b53f 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -234,6 +234,25 @@ const FreonMenuButton = new Lang.Class({ } }, + _fixNames: function(sensors){ + let names = []; + for each (let s in sensors){ + if(s.type == 'separator' || + s.type == 'temperature-group' || + s.type == 'temperature-average' || + s.type == 'temperature-maximum') + continue; + let name = s.label; + let i = 1; + while(names.indexOf(name) >= 0){ + name = s.label + '-' + i++; + } + s.displayName = s.label; + s.label = name; + names.push(name); + } + }, + _updateDisplay: function(){ let gpuTempInfo = this._utils.sensors.gpu; @@ -330,6 +349,8 @@ const FreonMenuButton = new Lang.Class({ voltage.volt)}); } + this._fixNames(sensors); + for each (let s in sensors) if(s.type != 'separator') { let l = this._hotLabels[s.label]; From 5378922d2d28aad765ec47798b458264a837400d Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Tue, 5 May 2015 10:01:04 +0300 Subject: [PATCH 071/224] fill display name if label is different only --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index f20b53f..f1f999b 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -247,8 +247,10 @@ const FreonMenuButton = new Lang.Class({ while(names.indexOf(name) >= 0){ name = s.label + '-' + i++; } - s.displayName = s.label; - s.label = name; + if(name != s.label){ + s.displayName = s.label; + s.label = name; + } names.push(name); } }, From 12ecebd02e370b3de9bc90d50419083023571f1f Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Mon, 25 May 2015 17:33:59 +0300 Subject: [PATCH 072/224] display fans with 0 value, fix #11 --- freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js index 53722e8..5abf306 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -29,10 +29,8 @@ const SensorsUtil = new Lang.Class({ }, get rpm() { - let s = this._parseGenericSensorsOutput(this._parseFanRPMLine); - return s.filter(function(e){ - return e.rpm > 0; - }); + // 0 is normal value for turned off fan + return this._parseGenericSensorsOutput(this._parseFanRPMLine); }, get volt() { From a7893c748fe5186ca6b1f29201d38f7a6e34e96f Mon Sep 17 00:00:00 2001 From: Bob131 Date: Sun, 4 Oct 2015 08:32:53 +1100 Subject: [PATCH 073/224] Add support for GNOME 3.18 A very brief test leads me to believe this patch does the trick. Resolves #10 (maybe) --- freon@UshakovVasilii_Github.yahoo.com/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index 0caa4aa..d911aa7 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": ["3.12", "3.14", "3.16"], + "shell-version": ["3.12", "3.14", "3.16", "3.18"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", "description": "Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", From 2dbeb442035ea178d4a54edba64619b1b73da809 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Nogueira?= Date: Tue, 6 Oct 2015 17:39:39 -0300 Subject: [PATCH 074/224] pt_BR translations --- .../locale/pt_BR/LC_MESSAGES/freon.mo | Bin 0 -> 2383 bytes .../po/freon.pot | 130 +++++++++++++++++ .../po/pt_BR.po | 133 ++++++++++++++++++ 3 files changed, 263 insertions(+) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/locale/pt_BR/LC_MESSAGES/freon.mo create mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/freon.pot create mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/pt_BR.po diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/pt_BR/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/pt_BR/LC_MESSAGES/freon.mo new file mode 100644 index 0000000000000000000000000000000000000000..f87069500b0a6bc211b27d493846fc6426ff58c5 GIT binary patch literal 2383 zcmbW1O^6&t6vs=AU!(COCVqds2#bkHZ)OssVPY1O{fG57s185gm@BsAAA)21bhTs16j{^;6va~)&F(yDg566+4k+& zl=Z$0vfKptJa`6V{RTV?_Q3}D1z6yW*FZksJdERY?|^J)2QSvEK|bHR;B(*yAnUyX zvfbZ;EO#BmBYvy+2Y3PhH^F^i2a9%tAA)S>mmu5yJ-8G66=ZvFg6zj#Q2GKGfh;!% z^0);b2QPsU_$i1-{D9X4_%ql9cit}qhmiLkwFmLB3!Tq9Y8<0cdm10?WA;D7GCUXi zfbHbQc5g?20G(q66{3dzFgiDcV(1&TlWl}+hp}M4aAP~gSmN?bjQO$ggG&qIcwaf$ zRpLaEbyC$)iuTdzh1sdu<6=?}tv(lYs>7<7lPfwaGEwb++8QNVsghoiHXh1SO0z|;jJM8@*JhU}^t7kMDsNs2 z)Kh7`pW;-<7w`=$f+eSN>jEw7(4$pbII5({79lUf?$Q3PFr%p`Q9;Flq$g)>7#A%I z#qClnO~W6nw8yJ>FDASW+8S6#EooFLMyuK?1Z}!rw0m}$rc|smnbLwx3snxyNJH&h zsigd!jj;=!Y8Mu2*=6OZUF3PXN|g`G#c&HHx~pO0Qox#|++J)9KxN3Lv2#WTv7i%W zX;Qjm%Mgqdy=C16PkM=+Mm^bAlv(y@4|a#1!!AVWZ&dtw6N7mOlY5bCM(X@$ef*a7JBOM)TZ$~GU;pDKciO8x1!E1~k z8GogAN_uS1Vre-$Gq~K*mQLGlp|q3qdZIc};jw2&zEN}v6N>TJW)rnmS~!_TGuCCk zNhTlu`eO%=Qu%pokD&=_>^%w{1bO@iB#k)&8Al8ZvOEDD3q*e+vXhUT(>YqX@h2p1;4W?>6ch6P1= zF}W12&s1oC7u?3Kksm>tAnh}p` zzQ`yUtf7LydHLWgPaK_LjjAeGdBF7)mjcD3G-Gq, YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-06 17:05-0300\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" + +#: bumblebeeNvidiaUtil.js:75 prefs.js:82 +msgid "Bumblebee + NVIDIA" +msgstr "" + +#: extension.js:319 +msgid "Average" +msgstr "" + +#: extension.js:320 +msgid "Maximum" +msgstr "" + +#: extension.js:341 +#, javascript-format +msgid "%drpm" +msgstr "" + +#: extension.js:350 +#, javascript-format +msgid "%s%.2fV" +msgstr "" + +#: extension.js:396 +msgid "Please run sensors-detect as root." +msgstr "" + +#: extension.js:397 +msgid "" +"Please install lm_sensors.\n" +"If this doesn't help, click here to report with your sensors output!" +msgstr "" + +#: extension.js:488 +msgid "Temperature Sensors" +msgstr "" + +#: extension.js:495 +msgid "Voltage" +msgstr "" + +#: extension.js:509 +msgid "Sensors Settings" +msgstr "" + +#: prefs.js:33 +msgid "Poll Sensors Every (sec)" +msgstr "" + +#: prefs.js:39 +msgid "Show Decimal Value" +msgstr "" + +#: prefs.js:40 +msgid "Show one digit after decimal" +msgstr "" + +#: prefs.js:45 +msgid "Temperature Unit" +msgstr "" + +#: prefs.js:51 +msgid "Position in Panel" +msgstr "" + +#: prefs.js:55 +msgid "Show Icon on Panel" +msgstr "" + +#: prefs.js:58 +msgid "Show Fan Speed" +msgstr "" + +#: prefs.js:61 +msgid "Show Power Supply Voltage" +msgstr "" + +#: prefs.js:64 +msgid "Group Temperature Items" +msgstr "" + +#: prefs.js:65 +msgid "Works if you have more than three temperature sensors" +msgstr "" + +#: prefs.js:68 +msgid "Group Voltage Items" +msgstr "" + +#: prefs.js:69 +msgid "Works if you have more than three voltage sensors" +msgstr "" + +#: prefs.js:74 +msgid "HDD/SSD Temperature Utility" +msgstr "" + +#: prefs.js:79 +msgid "None" +msgstr "" + +#: prefs.js:80 +msgid "NVIDIA" +msgstr "" + +#: prefs.js:81 +msgid "Catalyst" +msgstr "" + +#: prefs.js:84 +msgid "Video Card Temperature Utility" +msgstr "" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/pt_BR.po b/freon@UshakovVasilii_Github.yahoo.com/po/pt_BR.po new file mode 100644 index 0000000..8a29168 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/po/pt_BR.po @@ -0,0 +1,133 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Fábio Nogueira , 2015. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-06 17:05-0300\n" +"PO-Revision-Date: 2015-10-06 17:31-0300\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.4\n" +"Last-Translator: Fábio Nogueira \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Language: pt_BR\n" + +#: bumblebeeNvidiaUtil.js:75 prefs.js:82 +msgid "Bumblebee + NVIDIA" +msgstr "Bumblebee + NVIDIA" + +#: extension.js:319 +msgid "Average" +msgstr "Média" + +#: extension.js:320 +msgid "Maximum" +msgstr "Máxima" + +#: extension.js:341 +#, javascript-format +msgid "%drpm" +msgstr "%drpm" + +#: extension.js:350 +#, javascript-format +msgid "%s%.2fV" +msgstr "%s%.2fV" + +#: extension.js:396 +msgid "Please run sensors-detect as root." +msgstr "Por favor execute sensors-detect como root." + +#: extension.js:397 +msgid "" +"Please install lm_sensors.\n" +"If this doesn't help, click here to report with your sensors output!" +msgstr "" +"Por favor, instale lm_sensors.\n" +"Se isto não ajudar, clique aqui para reportar com suas saídas de sensores!" + +#: extension.js:488 +msgid "Temperature Sensors" +msgstr "Sensores de temperatura" + +#: extension.js:495 +msgid "Voltage" +msgstr "Voltagem" + +#: extension.js:509 +msgid "Sensors Settings" +msgstr "Configurações dos sensores" + +#: prefs.js:33 +msgid "Poll Sensors Every (sec)" +msgstr "Sensores de sondagem a cada (seg)" + +#: prefs.js:39 +msgid "Show Decimal Value" +msgstr "Exibir valor decimal" + +#: prefs.js:40 +msgid "Show one digit after decimal" +msgstr "Exibir um dígito após o decimal" + +#: prefs.js:45 +msgid "Temperature Unit" +msgstr "Unidade de temperatura" + +#: prefs.js:51 +msgid "Position in Panel" +msgstr "Posição no painel" + +#: prefs.js:55 +msgid "Show Icon on Panel" +msgstr "Exibir ícone no painel" + +#: prefs.js:58 +msgid "Show Fan Speed" +msgstr "Exibir velocidade da ventoinha" + +#: prefs.js:61 +msgid "Show Power Supply Voltage" +msgstr "Exibir tensão da alimentação" + +#: prefs.js:64 +msgid "Group Temperature Items" +msgstr "Itens do grupo de temperatura" + +#: prefs.js:65 +msgid "Works if you have more than three temperature sensors" +msgstr "Funciona se você tiver mais que três sensores de temperatura" + +#: prefs.js:68 +msgid "Group Voltage Items" +msgstr "Itens do grupo de tensão" + +#: prefs.js:69 +msgid "Works if you have more than three voltage sensors" +msgstr "Funciona se você tiver mais que três sensores de tensão" + +#: prefs.js:74 +msgid "HDD/SSD Temperature Utility" +msgstr "Utilitário de temperatura HDD/SSD" + +#: prefs.js:79 +msgid "None" +msgstr "Nenhum" + +#: prefs.js:80 +msgid "NVIDIA" +msgstr "NVIDIA" + +#: prefs.js:81 +msgid "Catalyst" +msgstr "Catalyst" + +#: prefs.js:84 +msgid "Video Card Temperature Utility" +msgstr "Utilitário de temperatura da placa de vídeo" From 2dbddc7d8555d4cd257da103fd85be36c5a03e30 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 9 Oct 2015 10:12:23 +0300 Subject: [PATCH 075/224] fix status label for gnome 3.18 --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index f1f999b..68b0724 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -487,6 +487,13 @@ const FreonMenuButton = new Lang.Class({ if(!temperatureGroup) { temperatureGroup = new PopupMenu.PopupSubMenuMenuItem(_('Temperature Sensors'), true); temperatureGroup.icon.gicon = this._sensorIcons['temperature']; + if(!temperatureGroup.status) { // gnome 3.18 and hight + temperatureGroup.status = new St.Label({ + style_class: 'popup-status-menu-item', + y_expand: true, + y_align: Clutter.ActorAlign.CENTER }); + temperatureGroup.actor.insert_child_at_index(temperatureGroup.status, 4); + } this.menu.addMenuItem(temperatureGroup); } temperatureGroup.menu.addMenuItem(item); From 63ddf46cfccfb62c9a95e7f42321d0be241ceff7 Mon Sep 17 00:00:00 2001 From: alsoijw Date: Thu, 10 Dec 2015 16:28:45 +0200 Subject: [PATCH 076/224] Added Russian translation --- .../po/ru_RU.pot | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/ru_RU.pot diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/ru_RU.pot b/freon@UshakovVasilii_Github.yahoo.com/po/ru_RU.pot new file mode 100644 index 0000000..8838f73 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/po/ru_RU.pot @@ -0,0 +1,132 @@ +# 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: 2015-10-06 17:05-0300\n" +"PO-Revision-Date: 2015-12-10 16:04+0300\n" +"Last-Translator: alsoijw alsoijw@yandex.ru\n" +"Language-Team: \n" +"Language: ru_RU\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: bumblebeeNvidiaUtil.js:75 prefs.js:82 +msgid "Bumblebee + NVIDIA" +msgstr "Bumblebee + NVIDIA" + +#: extension.js:319 +msgid "Average" +msgstr "Средняя" + +#: extension.js:320 +msgid "Maximum" +msgstr "Максимальня" + +#: extension.js:341 +#, javascript-format +msgid "%drpm" +msgstr "%d об / мин" + +#: extension.js:350 +#, javascript-format +msgid "%s%.2fV" +msgstr "%s%.2f В" + +#: extension.js:396 +msgid "Please run sensors-detect as root." +msgstr "Пожалуйста запустите sensors-detect как суперпользователь" + +#: extension.js:397 +msgid "" +"Please install lm_sensors.\n" +"If this doesn't help, click here to report with your sensors output!" +msgstr "" +"Пожалуйста установите lm_sensors.\n" +"Если это не поможет, нажмите здесь, чтобы сообщить с выходом датчиков!" + +#: extension.js:488 +msgid "Temperature Sensors" +msgstr "Датчики температуры" + +#: extension.js:495 +msgid "Voltage" +msgstr "Напряжение" + +#: extension.js:509 +msgid "Sensors Settings" +msgstr "Настройки" + +#: prefs.js:33 +msgid "Poll Sensors Every (sec)" +msgstr "Опрос датчиков каждые (сек)" + +#: prefs.js:39 +msgid "Show Decimal Value" +msgstr "Показывать десятичные значения" + +#: prefs.js:40 +msgid "Show one digit after decimal" +msgstr "Показывать одну цифру после запятой" + +#: prefs.js:45 +msgid "Temperature Unit" +msgstr "Единица измерения температуры" + +#: prefs.js:51 +msgid "Position in Panel" +msgstr "Позиция на панели" + +#: prefs.js:55 +msgid "Show Icon on Panel" +msgstr "Иконка на панели" + +#: prefs.js:58 +msgid "Show Fan Speed" +msgstr "Скорость вентилятора" + +#: prefs.js:61 +msgid "Show Power Supply Voltage" +msgstr "Напряжение питания" + +#: prefs.js:64 +msgid "Group Temperature Items" +msgstr "Объеденить показания температуры" + +#: prefs.js:65 +msgid "Works if you have more than three temperature sensors" +msgstr "Работает если у вас более трёх датчиков температуры" + +#: prefs.js:68 +msgid "Group Voltage Items" +msgstr "Объеденить показания напряжения" + +#: prefs.js:69 +msgid "Works if you have more than three voltage sensors" +msgstr "Работает если у вас более трёх датчиков напряжения" + +#: prefs.js:74 +msgid "HDD/SSD Temperature Utility" +msgstr "HDD/SSD утилита наблюдения" + +#: prefs.js:79 +msgid "None" +msgstr "Нет" + +#: prefs.js:80 +msgid "NVIDIA" +msgstr "NVIDIA" + +#: prefs.js:81 +msgid "Catalyst" +msgstr "Catalyst" + +#: prefs.js:84 +msgid "Video Card Temperature Utility" +msgstr "Утилита наблюдения видеокарт" From 08948e0ad57a234a31ffa59fc746c36315b709bc Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Fri, 11 Dec 2015 22:20:30 +0300 Subject: [PATCH 077/224] Use CHECK instead of DOT for menuitem, fix #19 --- freon@UshakovVasilii_Github.yahoo.com/freonItem.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js index 4d49ade..fa070e4 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js +++ b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js @@ -21,7 +21,7 @@ const FreonItem = new Lang.Class({ set main(main) { if(main) - this.setOrnament(PopupMenu.Ornament.DOT); + this.setOrnament(PopupMenu.Ornament.CHECK); else this.setOrnament(PopupMenu.Ornament.NONE); this._main = main; From abd75481d019e42e354e16c0cd5f3114435a8777 Mon Sep 17 00:00:00 2001 From: wsxy162 Date: Sat, 20 Feb 2016 20:11:02 +0800 Subject: [PATCH 078/224] Added Chinese traslations, including Simplified Chinese and Traditional Chinese. --- .../locale/zh_CN/LC_MESSAGES/freon.mo | Bin 0 -> 2178 bytes .../locale/zh_TW/LC_MESSAGES/freon.mo | Bin 0 -> 2178 bytes .../po/zh_CN.po | 133 ++++++++++++++++++ .../po/zh_TW.po | 133 ++++++++++++++++++ 4 files changed, 266 insertions(+) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/locale/zh_CN/LC_MESSAGES/freon.mo create mode 100644 freon@UshakovVasilii_Github.yahoo.com/locale/zh_TW/LC_MESSAGES/freon.mo create mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/zh_CN.po create mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/zh_CN/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/zh_CN/LC_MESSAGES/freon.mo new file mode 100644 index 0000000000000000000000000000000000000000..3b00152f6a00841c7e2c98583c324db88f0db949 GIT binary patch literal 2178 zcmaizU2GIp6vwZMU#s|mpQtexBN4<|cAEfo5h8RcY(mS*meu%R9d>VbM`q`)Gk04S zO{^7Mi)}##5h&6Eg=(P180mML_~3&t#&<(Z+?m~t4?OUsG133+%oa*eZ}#qQ&Yg45 zIro3&US71|Fu{1rn}2~zF@L!Qe;Cj{|27{n{OlJaj*k?5Ihb(0A2uPo@wwt@Mq8d6^Pt?f9()?y2Fm;fxC(3qgW!2k!x=Aw@_buRob+o1?*`+b%=;!N&u4-6gYSCm z0w0Fm3rhcQK>WxA{!kM69(*1A0elu*g5Xl0dhlNG4N%701o5xs^bYfNR6fbXv?e~vNox& z98%wfnD=1HUdeO&FlAkG$aBk{$a6l532A40A?uR^CE?>rn%N9lYAyBGw8Y7VR%WUx zMmFX$J9V~`F}i{_#v|d#22!UARnJ?3Y&Ll=OPg3G3ty2l8I1^*vAp#-*99VYYg@wM zm9bcOp7#!+>6*xs26eZV$z_NazmXe^M0KWGjB193WIEL|%@#8(Zd!g{q=kyKX3->P zmhqgRX{Kjipb1?|?7}mu5S*GU%S}PsG?Auxo-?VpoAR8<=ERa}d^2ZMUnxl@SVBSeCJ*Yeo`?f}a;fZi@0YX3|(Lo7MBw)6jK>EHtU5G?dsP;FEO2lj|Gc z6*6yahoK1)*OH9WI@L_xv<1~fuX1yjMYR?w8cnOMjApo0G>y7N+Qeso4$rmQ6P5h` zu2%13sP2fG{4I#BM3PFJnHIzhQQ!92rYQ|pN=qsmb16${;#iJuYf|b=rb@|`uqs%H z)&zp9l|YSB6QIEtL&4e=f!aU-j>>k{s>x_K^;@;Z_1mgiLTNHp!_rm3%@7TvXM57z zNYT19Gw4fg*6w_8bDW1kbGZZB>m_4xh8q#MBIms@fsCC*54v=xc~HY`S)o zpg-WN}YjMI@FTb%53_MWtl4wk1svkT)_Cf}E#ixUI0ca@fB4wn17Zn(+FL!6TX z<>6CvyPe?!%Sz`yT}~<|PB|xLic{UCsUb4=x;!*3ZRd;W(wTAl;sNLI#mWbR_D3Ij zOO?|-PG_M!b-vPmlGwe2ZWPb`__Whk@EjqPGk(w&Y+g8d#DhJ>(RQRpbo;^);)*y| zgJ;{_hv6dk+TH#0boQdU3PK&Hx3hd{UwNib9PKQQetknY=g1}dz%cYB|F*%6H<$m~ GhJOHCw%_^y literal 0 HcmV?d00001 diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/zh_TW/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/zh_TW/LC_MESSAGES/freon.mo new file mode 100644 index 0000000000000000000000000000000000000000..9e2b8c5bef60481f4d305c11f4c424e259b947c1 GIT binary patch literal 2178 zcmaizUu;uV9LJA}s8#%fe^Fx&Mk0u}v`c_lga|8xCJZVq#rWX7v}f&=+k5K0ryE5R z%N)+Z_@fABumNTKsX>N>=;pd%;)4&q7~c&svG=x(4?OUsG12c?ZwDi&Cq4b#-?_i@ z`~A-MchA+ivknuCXWjW1xB&B)JMf2*xs#B)!FR!Xz%G{`fOBE@g7<<)!6(6C@KLY? zJ_G&)%6-3sv%%}&EbvdT9sC=79&Ephkf*?I@DcDB_%L_@lzFaz4}w3t_OIYP*w;Z> z`y2$7d0ztMzE$9J;3iP!H^8M}C+G*i1T~!TDk#sl9>qz&jo^J?43v4_2IcuI@FDPh zm;K;lum?fue+k5ol<WMsYIlJkSSHm#>4eg|f!Rko#n8dEUm5J!*`n@gOyp`lBsVddS+O zzH&%?=V0ECDSIW)?ZK3F$sx}zdm_*I1SX`N>V>RN4wQtCD`95RWP!E7+td*wt2>#g zCK*|iO>fiLHpb{;x-k|ChE|gnRj7K-5@empvl$v?=?r{D)?_p!SlV*eV_X-A;I6F? z2A4!4!5Q9Lgr;jEN7~dKS~{C1Zv2hhU?i+F)nZgLEF{yZo^H38VR6&)dO{skq%?~r zIJ1lw1x+zM^D>R=T6{a6QH9{tWEpM>+NFsU&GD>B-QARDMJ6leH{zRFqwz{fFu~%2 zsundl7hV$PNF1qWrE8%_jxMxVd=Xw)n$Wm`>S$Osm`)mA5hjFYBrOt2@h%!=5ut)WegT z8{if)V{MC}2@=y1jMEm?Ox(5wjYM0yx!s~#hZK#b)J{gzTq>GE-6Cb;GeC!@+wF=< z{(o1e`!O_jgiZbq#8yHHCB{q(Vg{&Z^HkH6HY=$mlr`C;r9?TF!<(W?i^)_exe`yImaD?GPcYx~>F z_E4{#pZL#D|u70}CtXK3zm=L#Ldf@5+<=Dw88*`gOHO-a;j!9>Mf>BA z+@;#7qSMz~o$RaSPY`>sSdZem4<2!f0}aPxC1?C#U9g$qO2_Rh{pGPdQX{&3;dA1O z*f?OrJ~9Fqx!2xTn4z;9wXPu4aR&RU-|VjK+Fu^)v-5jz3Fi!S+XpT}U-EAo>hY#E HxUu0Mqy62s literal 0 HcmV?d00001 diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/zh_CN.po b/freon@UshakovVasilii_Github.yahoo.com/po/zh_CN.po new file mode 100644 index 0000000..1bfddd7 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/po/zh_CN.po @@ -0,0 +1,133 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Dingzhong Chen , 2016 +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-02-20 19:18+0800\n" +"PO-Revision-Date: 2016-02-20 19:19+0800\n" +"Last-Translator: Dingzhong Chen \n" +"Language-Team: \n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: bumblebeeNvidiaUtil.js:75 prefs.js:82 +msgid "Bumblebee + NVIDIA" +msgstr "Bumblebee + NVIDIA" + +#: extension.js:319 +msgid "Average" +msgstr "平均值" + +#: extension.js:320 +msgid "Maximum" +msgstr "最大值" + +#: extension.js:341 +#, javascript-format +msgid "%drpm" +msgstr "%drpm" + +#: extension.js:350 +#, javascript-format +msgid "%s%.2fV" +msgstr "%s%.2fV" + +#: extension.js:396 +msgid "Please run sensors-detect as root." +msgstr "请以 root 运行 sensors-detect。" + +#: extension.js:397 +msgid "" +"Please install lm_sensors.\n" +"If this doesn't help, click here to report with your sensors output!" +msgstr "" +"请安装 lm_sensors。\n" +"如果这不管用,点击这里并报告你的传感器输出!" + +#: extension.js:488 +msgid "Temperature Sensors" +msgstr "温度传感器" + +#: extension.js:495 +msgid "Voltage" +msgstr "电压" + +#: extension.js:509 +msgid "Sensors Settings" +msgstr "传感器设置" + +#: prefs.js:33 +msgid "Poll Sensors Every (sec)" +msgstr "查询传感器每(秒)" + +#: prefs.js:39 +msgid "Show Decimal Value" +msgstr "显示小数部分" + +#: prefs.js:40 +msgid "Show one digit after decimal" +msgstr "显示小数点后一位数字" + +#: prefs.js:45 +msgid "Temperature Unit" +msgstr "温度单位" + +#: prefs.js:51 +msgid "Position in Panel" +msgstr "面板位置" + +#: prefs.js:55 +msgid "Show Icon on Panel" +msgstr "在面板显示图标" + +#: prefs.js:58 +msgid "Show Fan Speed" +msgstr "显示风扇转速" + +#: prefs.js:61 +msgid "Show Power Supply Voltage" +msgstr "显示电源电压" + +#: prefs.js:64 +msgid "Group Temperature Items" +msgstr "编组温度项" + +#: prefs.js:65 +msgid "Works if you have more than three temperature sensors" +msgstr "如果你有超过三个温度传感器时可用" + +#: prefs.js:68 +msgid "Group Voltage Items" +msgstr "编组电压项" + +#: prefs.js:69 +msgid "Works if you have more than three voltage sensors" +msgstr "如果你有超过三个电压传感器时可用" + +#: prefs.js:74 +msgid "HDD/SSD Temperature Utility" +msgstr "HDD/SSD 温度工具" + +#: prefs.js:79 +msgid "None" +msgstr "无" + +#: prefs.js:80 +msgid "NVIDIA" +msgstr "NVIDIA" + +#: prefs.js:81 +msgid "Catalyst" +msgstr "Catalyst" + +#: prefs.js:84 +msgid "Video Card Temperature Utility" +msgstr "显卡温度工具" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po b/freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po new file mode 100644 index 0000000..5333273 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po @@ -0,0 +1,133 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Dingzhong Chen , 2016 +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-02-20 19:18+0800\n" +"PO-Revision-Date: 2016-02-20 19:32+0800\n" +"Last-Translator: Dingzhong Chen \n" +"Language-Team: \n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: bumblebeeNvidiaUtil.js:75 prefs.js:82 +msgid "Bumblebee + NVIDIA" +msgstr "Bumblebee + NVIDIA" + +#: extension.js:319 +msgid "Average" +msgstr "平均值" + +#: extension.js:320 +msgid "Maximum" +msgstr "最大值" + +#: extension.js:341 +#, javascript-format +msgid "%drpm" +msgstr "%drpm" + +#: extension.js:350 +#, javascript-format +msgid "%s%.2fV" +msgstr "%s%.2fV" + +#: extension.js:396 +msgid "Please run sensors-detect as root." +msgstr "請以 root 運行 sensors-detect。" + +#: extension.js:397 +msgid "" +"Please install lm_sensors.\n" +"If this doesn't help, click here to report with your sensors output!" +msgstr "" +"請安裝 lm_sensors。\n" +"如果這不管用,點擊這裡並報告你的傳感器輸出!" + +#: extension.js:488 +msgid "Temperature Sensors" +msgstr "溫度傳感器" + +#: extension.js:495 +msgid "Voltage" +msgstr "電壓" + +#: extension.js:509 +msgid "Sensors Settings" +msgstr "傳感器設置" + +#: prefs.js:33 +msgid "Poll Sensors Every (sec)" +msgstr "查詢傳感器每(秒)" + +#: prefs.js:39 +msgid "Show Decimal Value" +msgstr "顯示小數部分" + +#: prefs.js:40 +msgid "Show one digit after decimal" +msgstr "顯示小數點後一位數字" + +#: prefs.js:45 +msgid "Temperature Unit" +msgstr "溫度單位" + +#: prefs.js:51 +msgid "Position in Panel" +msgstr "面板位置" + +#: prefs.js:55 +msgid "Show Icon on Panel" +msgstr "在面板顯示圖標" + +#: prefs.js:58 +msgid "Show Fan Speed" +msgstr "顯示風扇轉速" + +#: prefs.js:61 +msgid "Show Power Supply Voltage" +msgstr "顯示電源電壓" + +#: prefs.js:64 +msgid "Group Temperature Items" +msgstr "編組溫度項" + +#: prefs.js:65 +msgid "Works if you have more than three temperature sensors" +msgstr "如果你有超過三個溫度傳感器時可用" + +#: prefs.js:68 +msgid "Group Voltage Items" +msgstr "編組電壓項" + +#: prefs.js:69 +msgid "Works if you have more than three voltage sensors" +msgstr "如果你有超過三個電壓傳感器時可用" + +#: prefs.js:74 +msgid "HDD/SSD Temperature Utility" +msgstr "HDD/SSD 溫度工具" + +#: prefs.js:79 +msgid "None" +msgstr "無" + +#: prefs.js:80 +msgid "NVIDIA" +msgstr "NVIDIA" + +#: prefs.js:81 +msgid "Catalyst" +msgstr "Catalyst" + +#: prefs.js:84 +msgid "Video Card Temperature Utility" +msgstr "顯卡溫度工具" From 6cabafee81dc0ac27aebc75a9136487591d6b549 Mon Sep 17 00:00:00 2001 From: alsoijw Date: Sat, 20 Feb 2016 19:48:31 +0200 Subject: [PATCH 079/224] Fixed Russian translation --- .../po/{ru_RU.pot => ru.po} | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) rename freon@UshakovVasilii_Github.yahoo.com/po/{ru_RU.pot => ru.po} (82%) diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/ru_RU.pot b/freon@UshakovVasilii_Github.yahoo.com/po/ru.po similarity index 82% rename from freon@UshakovVasilii_Github.yahoo.com/po/ru_RU.pot rename to freon@UshakovVasilii_Github.yahoo.com/po/ru.po index 8838f73..230b19b 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/ru_RU.pot +++ b/freon@UshakovVasilii_Github.yahoo.com/po/ru.po @@ -3,19 +3,20 @@ # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # -#, fuzzy msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-10-06 17:05-0300\n" -"PO-Revision-Date: 2015-12-10 16:04+0300\n" -"Last-Translator: alsoijw alsoijw@yandex.ru\n" +"POT-Creation-Date: 2016-02-20 19:23+0200\n" +"PO-Revision-Date: 2016-02-20 19:31+0200\n" "Language-Team: \n" -"Language: ru_RU\n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.6\n" +"Last-Translator: \n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Language: ru\n" #: bumblebeeNvidiaUtil.js:75 prefs.js:82 msgid "Bumblebee + NVIDIA" @@ -23,11 +24,11 @@ msgstr "Bumblebee + NVIDIA" #: extension.js:319 msgid "Average" -msgstr "Средняя" +msgstr "Средняя температура" #: extension.js:320 msgid "Maximum" -msgstr "Максимальня" +msgstr "Максимальня температура" #: extension.js:341 #, javascript-format @@ -53,7 +54,7 @@ msgstr "" #: extension.js:488 msgid "Temperature Sensors" -msgstr "Датчики температуры" +msgstr "Датчик температуры" #: extension.js:495 msgid "Voltage" @@ -113,7 +114,7 @@ msgstr "Работает если у вас более трёх датчиков #: prefs.js:74 msgid "HDD/SSD Temperature Utility" -msgstr "HDD/SSD утилита наблюдения" +msgstr "HDD/SSD утилита мониторинга" #: prefs.js:79 msgid "None" @@ -129,4 +130,4 @@ msgstr "Catalyst" #: prefs.js:84 msgid "Video Card Temperature Utility" -msgstr "Утилита наблюдения видеокарт" +msgstr "Утилита мониторинга видеокарт" From 097cc07e1e764dea92618f2f716627af9d6e78c5 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sun, 21 Feb 2016 08:52:50 +0300 Subject: [PATCH 080/224] add mo file for ru translation, #25 --- .../locale/ru/LC_MESSAGES/freon.mo | Bin 0 -> 2950 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/locale/ru/LC_MESSAGES/freon.mo diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/ru/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/ru/LC_MESSAGES/freon.mo new file mode 100644 index 0000000000000000000000000000000000000000..d470a82f874ce7fee32a1c4c7464b25af3981016 GIT binary patch literal 2950 zcmb`HTWl0n7{`x_w^bDJe$7`+p%td=E=cOaVxR?VLSe&}>Wjf)_q01QJG0K5ZK;w7 ztw^+(24kb~PIxlWWGQT0O1r%Bq-S1@A-?;_n=#SJyiJJ5z)|o4@N;k#_&vyW8sL3k5bu8hAIJV0$iA#;YK|S8(ob@C3;5Pk?N<4sv`~z-?dvZUt9CsR8!Jd>h1- z_%>z@tYbd|z7Ce5gzf$S63E6_e+!raH-T$G7i7Ob0iOe>!5!dF@&4(A5S`d>kNFn( z5ccOm&gT{IHL&d-A-IHm*Btj^@h~RWvpKj%&G7^loMX;E$`a;{edPS|;QX${gzB(X za7ndgh=MJF4YFwmc*y zt)spDJ>5OqMVF~ed&E~_x93(X)F;aoyj4|CQjd~lKR)kwZ3PYS*~{JC8}j+?MXwJi z%eK^r=rxa6Vaz7Ge9)JU?|ObmqGy0q$?~b_O5a(ls3h&m zdMemf;V{G0it8yFwp58m+^R>hG`Uq(sj8Nyey{2@uZ*HpvY^QH$#Y%RA#yGZ z=Oe4M6ZsgSHeVLnap7CaavgX_In$B0Xuirzr7UOA7x|JqOx?0zl}(%aO}i?iqg|#$ z`HGaqXxmeO7W~CpSSaTXOONu^O2rU1}(9hNeW$ zbKgL+jh>>>FFha0%ur%~STv*8AGC_bj_ROq^tm|B?dvnTJZW;ujc!xP45gE)%|Zs>Egf%Lqd)eG_0fb>T~p9zlXy1t+nf{9>)f>CVd^<`bhaV;1P#+d*3wa{Pb zbHN9pj=EmZvk*E((9qCxx~69^`EY5~!MOOZ;?PplmxE)$gr0`6P^V~qecCkj z#gN}|f}%#ae4pPT#ldmXQ^9y}0;d-+=Lz7FokVt!n_0rp%y)C5_EGdEbLP|LKw5R4*~GTlA^Hpixe4H6 z)R|L!$3h5zh4~V_@hQK9Fw89D)Z*@o3K{krq!7w7UUG33f-wr?eHZ;Z7B)cG7h$ov zt3yBZMWH{wUcn{%l7BFh(8w*#DTJ@Hh Date: Thu, 24 Mar 2016 16:14:53 +0100 Subject: [PATCH 081/224] Support for Gnome 3.20 --- freon@UshakovVasilii_Github.yahoo.com/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index d911aa7..912d282 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": ["3.12", "3.14", "3.16", "3.18"], + "shell-version": ["3.12", "3.14", "3.16", "3.18", "3.20"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", "description": "Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", From b67b41d52966a7a120ecc099456c1c553ad24d47 Mon Sep 17 00:00:00 2001 From: zeratulmdq Date: Fri, 15 Apr 2016 09:48:11 -0300 Subject: [PATCH 082/224] Added es_AR spanish translation --- .../po/es_AR.po | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/es_AR.po diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/es_AR.po b/freon@UshakovVasilii_Github.yahoo.com/po/es_AR.po new file mode 100644 index 0000000..2aad4d9 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/po/es_AR.po @@ -0,0 +1,133 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Martin Benvenuti , 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-04-15 09:27-0300\n" +"PO-Revision-Date: 2016-04-15 09:27-0300\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.4\n" +"Last-Translator: Martin Benvenuti \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Language: es_AR\n" + +#: bumblebeeNvidiaUtil.js:75 prefs.js:82 +msgid "Bumblebee + NVIDIA" +msgstr "Bumblebee + NVIDIA" + +#: extension.js:319 +msgid "Average" +msgstr "Promedio" + +#: extension.js:320 +msgid "Maximum" +msgstr "Máxima" + +#: extension.js:341 +#, javascript-format +msgid "%drpm" +msgstr "%drpm" + +#: extension.js:350 +#, javascript-format +msgid "%s%.2fV" +msgstr "%s%.2fV" + +#: extension.js:396 +msgid "Please run sensors-detect as root." +msgstr "Por favor ejecute sensors-detect como root." + +#: extension.js:397 +msgid "" +"Please install lm_sensors.\n" +"If this doesn't help, click here to report with your sensors output!" +msgstr "" +"Por favor, instale lm_sensors.\n" +"Si esto no ayuda, haga click aquí para reportar con la salida de sus sensores." + +#: extension.js:488 +msgid "Temperature Sensors" +msgstr "Sensores de temperatura" + +#: extension.js:495 +msgid "Voltage" +msgstr "Voltaje" + +#: extension.js:509 +msgid "Sensors Settings" +msgstr "Configuraciones de sensores" + +#: prefs.js:33 +msgid "Poll Sensors Every (sec)" +msgstr "Obtener información de sensores cada (seg)" + +#: prefs.js:39 +msgid "Show Decimal Value" +msgstr "Mostrar valor decimal" + +#: prefs.js:40 +msgid "Show one digit after decimal" +msgstr "Mostrar un dígito decimal después de la coma" + +#: prefs.js:45 +msgid "Temperature Unit" +msgstr "Unidad de temperatura" + +#: prefs.js:51 +msgid "Position in Panel" +msgstr "Posición en el panel" + +#: prefs.js:55 +msgid "Show Icon on Panel" +msgstr "Mostrar ícono en el panel" + +#: prefs.js:58 +msgid "Show Fan Speed" +msgstr "Mostrar velocidad del fan" + +#: prefs.js:61 +msgid "Show Power Supply Voltage" +msgstr "Mostrar voltaje de alimentación" + +#: prefs.js:64 +msgid "Group Temperature Items" +msgstr "Agrupar items de temperatura" + +#: prefs.js:65 +msgid "Works if you have more than three temperature sensors" +msgstr "Funciona si tenés más de tres sensores de temperatura" + +#: prefs.js:68 +msgid "Group Voltage Items" +msgstr "Agrupar items de voltaje" + +#: prefs.js:69 +msgid "Works if you have more than three voltage sensors" +msgstr "Funciona si tenés más de tres sensores de voltaje" + +#: prefs.js:74 +msgid "HDD/SSD Temperature Utility" +msgstr "Utilidad de temperatura del HDD/SSD" + +#: prefs.js:79 +msgid "None" +msgstr "Ninguna" + +#: prefs.js:80 +msgid "NVIDIA" +msgstr "NVIDIA" + +#: prefs.js:81 +msgid "Catalyst" +msgstr "Catalyst" + +#: prefs.js:84 +msgid "Video Card Temperature Utility" +msgstr "Utilidad de temperatura de la placa de video" From f89ea98c30fb1487456568b563dc1bebc4c38dbf Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sun, 17 Apr 2016 08:02:40 +0300 Subject: [PATCH 083/224] add es_AR *.mo file --- .../locale/es_AR/LC_MESSAGES/freon.mo | Bin 0 -> 2402 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/locale/es_AR/LC_MESSAGES/freon.mo diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/es_AR/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/es_AR/LC_MESSAGES/freon.mo new file mode 100644 index 0000000000000000000000000000000000000000..261b768bf430eadcd8aab969dd781fed9c759869 GIT binary patch literal 2402 zcmb7^ONbmr7{^PEuhB$}?+5a!1QWA8ncXBNPTa-KKH@+o88Vwy@UYZ&*UVJXUDc_o zp3Q(D2;$9)c!{UrN#dS73PKq1D&9lzCc>73iCApyZ>qY!`o8*J*LUyu zjA6V`&cDGunAh&YKaBKl#_k0#fcJxIB|iXnWBoDs0C)*}8vFu$9Q+1+9{d6Ha=(E0 zfj7V%;9uYhcoTdXT)Bs_XTT4^$H33QN5OT_>-iSk1^!sBe*&My`UdE2--%1T-q%1c zHv_&1o(8>s1s(>6;3W7J_&(lv9rW*e561a(9Q5yzpx0~4^+%xB^9ktfyaK)geg}HF zpF#Yw-^%qLpu+klxF1wFQ{{P42=z18qGRKx4_KKA}cSn_+l5B$6R@c!M2 z`4Fb}0aUOW<|CMXAQbr(~jSvy_%ZlH#n(jG&eii7oe+b?k6Mx%c+`{DE$Fe%tA@ zPR7!WSesvzNtUqk{!>~B)`Sk#gkErxvaTso)NcJU6>^Yo?itE|d0F;Jo+dHeIW6LrUn&!BP{xt-Z zqIa}8Z%OvN(`dklf)edLI)L47V2}og@J6^xr?UT+8kWgWNpy@p2WJPZC|DN8!kJB~ zoymh1v~6ET!SSqbgC&ja&grFK&Is;Z9?Wwmnl#mzd_8C!3MLOzg`CL${$1aGo_w0@{|l3QHw#p2>? zn;WDK9T#dSROTeTndCdG)kYFsc&ndq8P`Ld%+xw@W_TPdYLnO|sWe~O>8WE>{G8sa zXoe>D9fPXkxlIywW%f+%mP$t`5*ViMSn9KVlcn5{^aYO0+mZ&H-S#n$_Bp}w0*`of zivX4}l?{Ql$Cpw4e53f`yi9S_n4umYYBN#x0I{tHbR`~xI#-(bD2w<6lC{svCcrOb z<8^|$yzB!o+!tER$?{l6+}mR_TUNfXzSc{1B#@Vx!}p@_tF8c_qpRe7;q)qU1NA3W z56R^DdbRrR?#n7MR7nV!mHD~T_C-BvXA(MNL2`Ub4p>>*47yqJmfKK zs%m^=SHwER3%pBXI7n@rAFtzynzpLh5c0)$4$VUlo}VDG3!^t=(FCLMIy#H46oNL* z#$V>P!EbmzFS}e}?`9j|3=QV?Am1VQJ`gCUFptB~Hzt<%A7sp8ro2xOD2WtP-hgC$ VxyU#J&6S({Teh0;f8?s{{0HNjp~wIL literal 0 HcmV?d00001 From 4266d39fca20be1364cffcc49408bba0696a2fef Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Tue, 20 Sep 2016 16:44:15 +0300 Subject: [PATCH 084/224] remove temperature filter for lm_sensors, #16 --- .../sensorsUtil.js | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js index 5abf306..8cb23e2 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -15,17 +15,15 @@ const SensorsUtil = new Lang.Class({ }, get temp() { - let s = this._parseGenericSensorsOutput(this._parseSensorsTemperatureLine); - return s.filter(function(e){ - return e.temp > 0 && e.temp < 115; - }); + return this._parseGenericSensorsOutput(this._parseSensorsTemperatureLine); + // wrong lm_sensors not problem of this application #16 + // return s.filter(function(e){ + // return e.temp > 0 && e.temp < 115; + // }); }, get gpu() { - let s = this._parseGpuSensorsOutput(this._parseSensorsTemperatureLine); - return s.filter(function(e){ - return e.temp > 0 && e.temp < 115; - }); + return this._parseGpuSensorsOutput(this._parseSensorsTemperatureLine); }, get rpm() { From 36f1b86112fd0dfd02aed441bedf66333559f763 Mon Sep 17 00:00:00 2001 From: hmsintrepide Date: Mon, 26 Sep 2016 22:34:10 +0200 Subject: [PATCH 085/224] french translation --- .../po/fr.po | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/fr.po diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/fr.po b/freon@UshakovVasilii_Github.yahoo.com/po/fr.po new file mode 100644 index 0000000..8ac4b47 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/po/fr.po @@ -0,0 +1,133 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# mr-intrepide , 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-09-26 21:32+0200\n" +"PO-Revision-Date: 2016-09-26 22:21+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.8\n" +"Last-Translator: mr-intrepide \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Language: fr\n" + +#: bumblebeeNvidiaUtil.js:75 prefs.js:82 +msgid "Bumblebee + NVIDIA" +msgstr "Bumblebee + NVIDIA" + +#: extension.js:319 +msgid "Average" +msgstr "Moyenne" + +#: extension.js:320 +msgid "Maximum" +msgstr "Maximum" + +#: extension.js:341 +#, javascript-format +msgid "%drpm" +msgstr "%drpm" + +#: extension.js:350 +#, javascript-format +msgid "%s%.2fV" +msgstr "%s%.2fV" + +#: extension.js:396 +msgid "Please run sensors-detect as root." +msgstr "Exécuter \"sensors-detect\" en mode super utilisateur." + +#: extension.js:397 +msgid "" +"Please install lm_sensors.\n" +"If this doesn't help, click here to report with your sensors output!" +msgstr "" +"Installer \"lm_sensors\"\n" +"Si cela n'aide pas, cliquez ici pour le signaler avec votre sortie de commande \"sensors\" !" + +#: extension.js:488 +msgid "Temperature Sensors" +msgstr "Capteurs de température" + +#: extension.js:495 +msgid "Voltage" +msgstr "Tension" + +#: extension.js:509 +msgid "Sensors Settings" +msgstr "Paramètres des capteurs" + +#: prefs.js:33 +msgid "Poll Sensors Every (sec)" +msgstr "Rafraichir toutes les (s)" + +#: prefs.js:39 +msgid "Show Decimal Value" +msgstr "Afficher après la virgule" + +#: prefs.js:40 +msgid "Show one digit after decimal" +msgstr "Affiche un chiffre après la virgule" + +#: prefs.js:45 +msgid "Temperature Unit" +msgstr "Unité de température" + +#: prefs.js:51 +msgid "Position in Panel" +msgstr "Position dans le panneau" + +#: prefs.js:55 +msgid "Show Icon on Panel" +msgstr "Afficher l'icône sur le panneau" + +#: prefs.js:58 +msgid "Show Fan Speed" +msgstr "Afficher vitesse ventilateur" + +#: prefs.js:61 +msgid "Show Power Supply Voltage" +msgstr "Afficher tension alimentation" + +#: prefs.js:64 +msgid "Group Temperature Items" +msgstr "Groupe température" + +#: prefs.js:65 +msgid "Works if you have more than three temperature sensors" +msgstr "Fonctionne si vous avez plus de trois capteurs de température" + +#: prefs.js:68 +msgid "Group Voltage Items" +msgstr "Groupe tension" + +#: prefs.js:69 +msgid "Works if you have more than three voltage sensors" +msgstr "Fonctionne si vous avez plus de trois capteurs de tension" + +#: prefs.js:74 +msgid "HDD/SSD Temperature Utility" +msgstr "Programme température HDD/SSD" + +#: prefs.js:79 +msgid "None" +msgstr "Aucun" + +#: prefs.js:80 +msgid "NVIDIA" +msgstr "NVIDIA" + +#: prefs.js:81 +msgid "Catalyst" +msgstr "Catalyst" + +#: prefs.js:84 +msgid "Video Card Temperature Utility" +msgstr "Programme température carte vidéo" From 57cd0ad8ebc3f77fabf6d024f568b5498d3a3b4c Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Tue, 27 Sep 2016 07:40:53 +0300 Subject: [PATCH 086/224] add MO file for FR translation --- .../locale/fr/LC_MESSAGES/freon.mo | Bin 0 -> 2365 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/locale/fr/LC_MESSAGES/freon.mo diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/fr/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/fr/LC_MESSAGES/freon.mo new file mode 100644 index 0000000000000000000000000000000000000000..27e131a8fd058ab92dc543ccdc14d5ba298aad0a GIT binary patch literal 2365 zcmbW1%a0UA9LGz+*C;;l{mhTm4IuWgGX}B@vT@l5j$vWK%&uMxDSB#VO1i6>s_NNY zE{Yfb0uqBqJ+O(M^rrDL-ZU|K@?eNJ4<5N06aD_SdstqE#LCosx~uE=sNbWm?A(4) zV7ySyzrjh&-|oU6Ms~Ll_kicX`@q$bAAmdY{xNtzcnN$O{0w{?{04j;{0U^aKf!y! ztKfF$py-X_E|;78zN;HTiD;FloV`3`&-{JDJp9eft=S3&lD2b8kiS3#DW z0bc@7f^6S_2f!g%1HS+>obd|C=Q|1Kc;9l#_dvF*KtA6Z$oemU?8ilr^?wes+z7-^ z{D42!_X~Iq{1s%oZ(|et`yt5Zyj1cl@HxEy2=Y1p014a6t{G zQHu7_iIwJjb5_jBAd__;#4%^{j5;dKus7sRQ8TF2m+LDw3D8iky){3-zulg{VfS*- zi4N;xNv`QMPerN!gf&XE5+%JNZ9I%6l%%JjJInFramtJ1V8g<{`_&uCacXoAIZptAdIHNl(t&P!%l;!|lQFFtr3v^DUKTGFUQjCZwF2-@_$XbR&l!n@wQr+UU8AA(x zr4|-y*;VDJoo89HPGt;>%?Jy1bzj59UcjDipM`=bKB~ut!YA!8oxlyZ5RpzV-%7m!1p21pBYhizuNNo;N zJdn<-aAdi&7)@{ObJF;pa?yf`Z5I{Lpy@L@RNjq_DZ|ZST?3g_T_mqoovuz-j!O^q zES3~sQx|CyP`5}Fy%7d#{C4QToBdSkq#E0FrqW7sCzEK=y3{wwWSg)4Nc}Jsk4N?x znxWd>!>~}CvOzspxv9IC?7A}OvO9Knk?+w)(ceX9^P1rx3uLkHWSZW%i^^WVxvyvQ zI5(nMbTsOBVymeqDs4@%N+g-xk^_)QzuD5~a&?|`tSRFrP850FH!^`VYBQ#xMZ^f# zLeS_9MF>$U4IU=SLYtsnVqtBx5$D`7j=F5z;*jAh2UyqN9vpoyK%+~_i7Bn`Fe z=ZV_-G}N$x8*hlZ)2ImuZhcI4>v;4v`rj8(7+buixXcL2M5j=&*(+ml!X1Zm^m+)@ ztq#nUPICCTx3A@zuZ_{hEzAFr^H{n7=XH0qVMV8`k40-@?pk(SBU!oUw4LWt Date: Thu, 13 Oct 2016 17:30:59 +0300 Subject: [PATCH 087/224] support gnome-shell 3.22 --- freon@UshakovVasilii_Github.yahoo.com/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index 912d282..93c99d5 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": ["3.12", "3.14", "3.16", "3.18", "3.20"], + "shell-version": ["3.12", "3.14", "3.16", "3.18", "3.20", "3.22"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", "description": "Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", From fe95a3acbf9fddfcaecdc880e69d591ca89145f7 Mon Sep 17 00:00:00 2001 From: "jaburgos@lorien.elves" Date: Thu, 1 Dec 2016 21:42:44 +0100 Subject: [PATCH 088/224] Added es_ES spanish translation --- .../po/es_ES.po | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po b/freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po new file mode 100644 index 0000000..517d9e8 --- /dev/null +++ b/freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po @@ -0,0 +1,133 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# Suriem Kumite , 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-12-01 21:29+0100\n" +"PO-Revision-Date: 2016-12-01 21:37+0100\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.11\n" +"Last-Translator: Suriem Kumite \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: es_ES\n" + +#: bumblebeeNvidiaUtil.js:75 prefs.js:82 +msgid "Bumblebee + NVIDIA" +msgstr "Bumblebee + NVIDIA" + +#: extension.js:319 +msgid "Average" +msgstr "Promedio" + +#: extension.js:320 +msgid "Maximum" +msgstr "Máxima" + +#: extension.js:341 +#, javascript-format +msgid "%drpm" +msgstr "%drpm" + +#: extension.js:350 +#, javascript-format +msgid "%s%.2fV" +msgstr "%s%.2fV" + +#: extension.js:396 +msgid "Please run sensors-detect as root." +msgstr "Por favor ejecute sensors-detect como root." + +#: extension.js:397 +msgid "" +"Please install lm_sensors.\n" +"If this doesn't help, click here to report with your sensors output!" +msgstr "" +"Por favor, instale lm_sensors.\n" +"Si esto no ayuda, haga click aquí para informar adjuntando la salida de sus sensores." + +#: extension.js:488 +msgid "Temperature Sensors" +msgstr "Sensores de temperatura" + +#: extension.js:495 +msgid "Voltage" +msgstr "Voltaje" + +#: extension.js:509 +msgid "Sensors Settings" +msgstr "Configuraciones de los sensores" + +#: prefs.js:33 +msgid "Poll Sensors Every (sec)" +msgstr "Sondear sensores cada (seg)" + +#: prefs.js:39 +msgid "Show Decimal Value" +msgstr "Mostrar valor decimal" + +#: prefs.js:40 +msgid "Show one digit after decimal" +msgstr "Mostrar un decimal después de la coma" + +#: prefs.js:45 +msgid "Temperature Unit" +msgstr "Unidad de temperatura" + +#: prefs.js:51 +msgid "Position in Panel" +msgstr "Posición en el panel" + +#: prefs.js:55 +msgid "Show Icon on Panel" +msgstr "Mostrar ícono en el panel" + +#: prefs.js:58 +msgid "Show Fan Speed" +msgstr "Mostrar velocidad del ventilador" + +#: prefs.js:61 +msgid "Show Power Supply Voltage" +msgstr "Mostrar voltaje de la fuente de alimentación" + +#: prefs.js:64 +msgid "Group Temperature Items" +msgstr "Agrupar elementos de temperatura" + +#: prefs.js:65 +msgid "Works if you have more than three temperature sensors" +msgstr "Funciona si tienes más de tres sensores de temperatura" + +#: prefs.js:68 +msgid "Group Voltage Items" +msgstr "Agrupar elementos de voltaje" + +#: prefs.js:69 +msgid "Works if you have more than three voltage sensors" +msgstr "Funciona si tienes más de tres sensores de voltaje" + +#: prefs.js:74 +msgid "HDD/SSD Temperature Utility" +msgstr "Utilidad de temperatura del HDD/SSD" + +#: prefs.js:79 +msgid "None" +msgstr "Ninguna" + +#: prefs.js:80 +msgid "NVIDIA" +msgstr "NVIDIA" + +#: prefs.js:81 +msgid "Catalyst" +msgstr "Catalyst" + +#: prefs.js:84 +msgid "Video Card Temperature Utility" +msgstr "Utilidad de temperatura de la placa de video" From 008564dc5f6ff3c1ec677231de5f360a0f00532b Mon Sep 17 00:00:00 2001 From: jakubzet Date: Sat, 11 Mar 2017 14:29:12 +0100 Subject: [PATCH 089/224] Polish translation added --- .../locale/pl/LC_MESSAGES/freon.mo | Bin 0 -> 2502 bytes .../po/pl.po | 138 ++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/locale/pl/LC_MESSAGES/freon.mo create mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/pl.po diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/pl/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/pl/LC_MESSAGES/freon.mo new file mode 100644 index 0000000000000000000000000000000000000000..31f27f687e1544e4a63f116064d62daaf9152e1b GIT binary patch literal 2502 zcmbW1O>7%Q6vr1RUxrd>`To*tL`qAtuI-dIxJ@7*{czQ^rcP3X5Y=Qow#U0Wv&_!M zU8@pOQPm4q4xvYG2u>VZaUmAsRB?d|s(LQR9*|Ha_>a9#8U(7u$m`$E?0awCy!Yna z+_~)w2jkW3xeJcs`RxJxVMGr)&com*;GTz-!W4bYzFSJ3WzE1TcR=66ABe+PsM zAb~mXeGs3Vk3g7oJn&<%1?~rb1Z_P20ImKmY-0U=1AGmf1g*cz;PYUTt$z-VVg5B} z<$nR618;*9p!0bD=Ntg%F`Wiy!OuXO!e{Xe$CG%my7s)oVSO5om+@j_Y~zo#^y6V; zVB>3t-G4itC-B%@VT=CRcYt;v75$vpI}EM#yPH4644?LBgmRWbE+5~#@YI^3Jfe{YbWOC z_t$FkTcnqa2!u(U1$IG%N$6zuPb2UFj&|k<#9nd;9Pq7Dgxu@2JWo51gS?jT<9mGj?h%)uDOriI4@f%z}gumX0w= zwTScjU|R8D1;5OSRjR5E*HlZQC`c)b;XoK+p}J@axY#g|sSnIM_a-27WXsx;6vkN= zb*^ZR>H5E>V7SparTv&h!v>97Y?V`}Y(!h|+q5*w02$s$cNSFV{#vV9F$^`TTD1{u zw^DbPxsDOcGUd+pljbhOO;LAelVxB%}T`o|-sJgV(9Oa%!qb?^1#Ad9+xVo+{CvJ^j}s zQwQwpUb|d4QY_HLi~V&gQ`iTcB6Ldo4sS%T45K*3z;(BVi{|mUK?uq;h`~SlO7Ba} z>r$}$G?pYv+V_-Nik{M6k}MMIYaaAZGu>TZt9J!1g`!A>g6Sl;S)D1F4yv6u71h(& zPtaxjIK_38&>b|gSZkRKM=kY@GUW{ zJx**TrEar#2_0em3UyK`d_i6}Y2)RG?>f7kC7pOJ71Bsn`B|44Ayk{9q<1|vzUn|a zYdSN&Nmw9YVQ7XtW&4hA`%X9Y+KkX7Y}ZMgB{+_1ML37T3_?EZT_>E~sNPjLWkUq- z){I=gJp3AIgw7v)@1T;?evNG?3t!3gwatBI8V%v0wIU9z*CT(p~f_i6qPoLbD~cC!wHX, 2016. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-09-26 21:32+0200\n" +"PO-Revision-Date: 2017-03-11 14:13+0100\n" +"Language-Team: POLISH \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7.1\n" +"Last-Translator: Jakub Żywiec \n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Language: pl\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: bumblebeeNvidiaUtil.js:75 prefs.js:82 +msgid "Bumblebee + NVIDIA" +msgstr "Bumblebee + NVIDIA" + +#: extension.js:319 +msgid "Average" +msgstr "Średnia" + +#: extension.js:320 +msgid "Maximum" +msgstr "Maksymalna" + +#: extension.js:341 +#, javascript-format +msgid "%drpm" +msgstr "%drpm" + +#: extension.js:350 +#, javascript-format +msgid "%s%.2fV" +msgstr "%s%.2fV" + +#: extension.js:396 +msgid "Please run sensors-detect as root." +msgstr "Uruchom \"sensors-detect\" jako użytkownik root." + +#: extension.js:397 +msgid "" +"Please install lm_sensors.\n" +"If this doesn't help, click here to report with your sensors output!" +msgstr "" +"Zainstaluj \"lm_sensors\"\n" +"Jeśli to nie pomoże, kliknij tutaj, aby zgłosić wyniki czujników!" + +#: extension.js:488 +msgid "Temperature Sensors" +msgstr "Czujnik temperatury" + +#: extension.js:495 +msgid "Voltage" +msgstr "Napięcie" + +#: extension.js:509 +msgid "Sensors Settings" +msgstr "Ustawienia czujnika" + +#: prefs.js:33 +msgid "Poll Sensors Every (sec)" +msgstr "Aktualizuj czujnik co (sek)" + +#: prefs.js:39 +msgid "Show Decimal Value" +msgstr "Pokaż wartość dziesiętną" + +#: prefs.js:40 +msgid "Show one digit after decimal" +msgstr "Wyświetlaj do jednego miejsca po przecinku" + +#: prefs.js:45 +msgid "Temperature Unit" +msgstr "Jednostka temperatury" + +#: prefs.js:51 +msgid "Position in Panel" +msgstr "Pozycja w Panelu" + +#: prefs.js:55 +msgid "Show Icon on Panel" +msgstr "Pokaż ikonę w Panelu" + +#: prefs.js:58 +msgid "Show Fan Speed" +msgstr "Pokaż prędkość wentylatora" + +#: prefs.js:61 +msgid "Show Power Supply Voltage" +msgstr "Afficher tension alimentation" + +#: prefs.js:64 +msgid "Group Temperature Items" +msgstr "Grupuj temperatury" + +#: prefs.js:65 +msgid "Works if you have more than three temperature sensors" +msgstr "Zadziała, jeśli funkcjonują co najmniej trzy czujniki temperatury" + +#: prefs.js:68 +msgid "Group Voltage Items" +msgstr "Grupuj napięcia" + +#: prefs.js:69 +msgid "Works if you have more than three voltage sensors" +msgstr "Zadziała, jeśli funkcjonują co najmniej trzy czujniki napięcia" + +#: prefs.js:74 +msgid "HDD/SSD Temperature Utility" +msgstr "" +"Narzędzie do pomiaru\n" +"temperatury twardego dysku" + +#: prefs.js:79 +msgid "None" +msgstr "Brak" + +#: prefs.js:80 +msgid "NVIDIA" +msgstr "NVIDIA" + +#: prefs.js:81 +msgid "Catalyst" +msgstr "Catalyst" + +#: prefs.js:84 +msgid "Video Card Temperature Utility" +msgstr "" +"Narzędzie do pomiaru\n" +"temperatury karty graficzenej" From 8386a17e6d6c3380725970129de37df8f9d757d8 Mon Sep 17 00:00:00 2001 From: jakubzet Date: Sat, 11 Mar 2017 14:29:12 +0100 Subject: [PATCH 090/224] Polish translation added --- .../locale/pl/LC_MESSAGES/freon.mo | Bin 0 -> 2501 bytes .../po/pl.po | 138 ++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/locale/pl/LC_MESSAGES/freon.mo create mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/pl.po diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/pl/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/pl/LC_MESSAGES/freon.mo new file mode 100644 index 0000000000000000000000000000000000000000..e9c925a64a1cacb3852881cc5336a9d827a0aedf GIT binary patch literal 2501 zcmbu9O>7%Q6vr1RUxrd>`To*tL`qAt?%FABaGFA!q^+x_HFc6Ags3LF6MMWLv&_!M zU8@qJQq>Dr4rz`YxWI{HBQC^3oGQeD3#xiUf@2Rzs0jXJuagFWdSK-BZ+G^6&3kX( z&7Ipmv#?&yuRGu{uAlG2A69(7WjzRf1U?M5bAAl&#Pe0~5%3!L9QZl73%m}#1l|CR z-f!ST;B9al_y>3a{0kfcFFasb&x4o2r@&S4N$@Ms`1uBW0{kI=z6HL3=i8u(eLIXA zzi)s>?+ExRcosDNBk)ad87zTcg1_R7H$ij0?-87ly8)W>`~(`mxAN!P`STsn*xvzR z2PCinz6;`&^#KTzmJ5CeHo^Vicc96~@1W7&1t%un*T7f6anQuO06q(*;EUj=;0X8y zXyktcp83j72#C43s!U_Fi-qifDPSSF^yGX6}CP5x1qUOr3? zOn%KW{)6mN8pOF!_Y5`{nClMuZ7ElmgNO+V;l@trrCDKiikSBQ( zy{@UrgLstOK)62c5rvkdcr2Bsw$M$=WU46FCYkCu)w>7wRT>Rm*&f&2)x;7~QtF~r zlW<(`d!-rVBcr_uclY5%BD9bZqN5s%cwh~r>Rf9PH4>}dlx>>kt_WE`3oJ-^f9p7l zs2+3f^&hJ)tl*bhF-kSr=8EcR90wWYIqVA~E#!%YK!{5kGG5=jb$0>sK(_47M?zZ* z!sC*rnDYL$1OrFsrScOJOD1X5WXqgFX)@YG+`6gI2B`2xx$~r2_tsj@n_-|)Q?i9* z+f~nA;3`2fD^xhwE1ErYfX{LFF%1-H^?Yw1|4^p{Q z87q%CWygV_eU2{+V{KFJknN1wr7}4ODr4g#P6=|SS=30;n)V!LVTEdEPgm2Qnr z>0+^ywFP(IX@pD!MOTJL3bWPOnawCmMW-+&Bh4di&t)-!(fp#`9|ufC6XZ6TO1Pe! zpF3`kZ^|haB}-h{Gm$GjG)RTU7lkgoXP@Aa`F5m27?OLaZK*h3JX9%I8?JK9>1Di+wsr3#Y@MRD&jnH-y-{_W)6XmYYdZ<9lKJzR2*OqOZSp5E=@ z$phwgui17EmmIouskd)roPE$KL8rWLVk3hU7{w|2q1$zQXfB`Xr=UXp9QNL8SF%j0UQag);FUakrE!=$jb$hopuTr-uLmJ9EKc6x~gl?0RcGoiP%QmF* zp>x#NDGLNF49t)#&D`iquuHaa=$_1K28@MW~Vvgs$cIY>UI4ogJ9+zzwOXWdnVpaa%2b!efu zCgq{vt;A)>8^x-FK^36_Q~kVbsp}~y$VB^W%kI64>*IVGH56MCZU-Mx3k}h44UUrH w%&dEvjUt|26+O6EUx_h5ll3bmp%H6^s4MEII@ut3sP@Ki%l?OzL7tfPH, 2017. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2016-09-26 21:32+0200\n" +"PO-Revision-Date: 2017-03-12 04:38+0100\n" +"Language-Team: POLISH \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 1.8.7.1\n" +"Last-Translator: Jakub Żywiec \n" +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Language: pl\n" +"X-Poedit-SourceCharset: UTF-8\n" + +#: bumblebeeNvidiaUtil.js:75 prefs.js:82 +msgid "Bumblebee + NVIDIA" +msgstr "Bumblebee + NVIDIA" + +#: extension.js:319 +msgid "Average" +msgstr "Średnia" + +#: extension.js:320 +msgid "Maximum" +msgstr "Maksymalna" + +#: extension.js:341 +#, javascript-format +msgid "%drpm" +msgstr "%drpm" + +#: extension.js:350 +#, javascript-format +msgid "%s%.2fV" +msgstr "%s%.2fV" + +#: extension.js:396 +msgid "Please run sensors-detect as root." +msgstr "Uruchom \"sensors-detect\" jako użytkownik root." + +#: extension.js:397 +msgid "" +"Please install lm_sensors.\n" +"If this doesn't help, click here to report with your sensors output!" +msgstr "" +"Zainstaluj \"lm_sensors\"\n" +"Jeśli to nie pomoże, kliknij tutaj, aby zgłosić wyniki czujników!" + +#: extension.js:488 +msgid "Temperature Sensors" +msgstr "Czujnik temperatury" + +#: extension.js:495 +msgid "Voltage" +msgstr "Napięcie" + +#: extension.js:509 +msgid "Sensors Settings" +msgstr "Ustawienia czujnika" + +#: prefs.js:33 +msgid "Poll Sensors Every (sec)" +msgstr "Aktualizuj czujnik co (sek)" + +#: prefs.js:39 +msgid "Show Decimal Value" +msgstr "Pokaż wartość dziesiętną" + +#: prefs.js:40 +msgid "Show one digit after decimal" +msgstr "Wyświetlaj do jednego miejsca po przecinku" + +#: prefs.js:45 +msgid "Temperature Unit" +msgstr "Jednostka temperatury" + +#: prefs.js:51 +msgid "Position in Panel" +msgstr "Pozycja w Panelu" + +#: prefs.js:55 +msgid "Show Icon on Panel" +msgstr "Pokaż ikonę w Panelu" + +#: prefs.js:58 +msgid "Show Fan Speed" +msgstr "Pokaż prędkość wentylatora" + +#: prefs.js:61 +msgid "Show Power Supply Voltage" +msgstr "Pokaż napięcie zasilacza" + +#: prefs.js:64 +msgid "Group Temperature Items" +msgstr "Grupuj temperatury" + +#: prefs.js:65 +msgid "Works if you have more than three temperature sensors" +msgstr "Zadziała, jeśli dostępne są co najmniej trzy czujniki temperatury" + +#: prefs.js:68 +msgid "Group Voltage Items" +msgstr "Grupuj napięcia" + +#: prefs.js:69 +msgid "Works if you have more than three voltage sensors" +msgstr "Zadziała, jeśli dostępne są co najmniej trzy czujniki napięcia" + +#: prefs.js:74 +msgid "HDD/SSD Temperature Utility" +msgstr "" +"Narzędzie do pomiaru\n" +"temperatury twardego dysku" + +#: prefs.js:79 +msgid "None" +msgstr "Brak" + +#: prefs.js:80 +msgid "NVIDIA" +msgstr "NVIDIA" + +#: prefs.js:81 +msgid "Catalyst" +msgstr "Catalyst" + +#: prefs.js:84 +msgid "Video Card Temperature Utility" +msgstr "" +"Narzędzie do pomiaru\n" +"temperatury karty graficzenej" From e57881b09b7a667727e9b110f7fde1ed43877ca6 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 8 Jun 2017 14:48:01 +0300 Subject: [PATCH 091/224] remove copiright notices, fix #43 --- freon@UshakovVasilii_Github.yahoo.com/po/es_AR.po | 5 ----- freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po | 5 ----- freon@UshakovVasilii_Github.yahoo.com/po/fr.po | 5 ----- freon@UshakovVasilii_Github.yahoo.com/po/freon.pot | 6 ------ freon@UshakovVasilii_Github.yahoo.com/po/pl.po | 5 ----- freon@UshakovVasilii_Github.yahoo.com/po/pt_BR.po | 5 ----- freon@UshakovVasilii_Github.yahoo.com/po/ru.po | 5 ----- freon@UshakovVasilii_Github.yahoo.com/po/zh_CN.po | 5 ----- freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po | 5 ----- 9 files changed, 46 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/es_AR.po b/freon@UshakovVasilii_Github.yahoo.com/po/es_AR.po index 2aad4d9..fe7adcc 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/es_AR.po +++ b/freon@UshakovVasilii_Github.yahoo.com/po/es_AR.po @@ -1,8 +1,3 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Martin Benvenuti , 2016. -# msgid "" msgstr "" "Project-Id-Version: \n" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po b/freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po index 517d9e8..02f02ec 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po +++ b/freon@UshakovVasilii_Github.yahoo.com/po/es_ES.po @@ -1,8 +1,3 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Suriem Kumite , 2016. -# msgid "" msgstr "" "Project-Id-Version: \n" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/fr.po b/freon@UshakovVasilii_Github.yahoo.com/po/fr.po index 8ac4b47..1a900cd 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/fr.po +++ b/freon@UshakovVasilii_Github.yahoo.com/po/fr.po @@ -1,8 +1,3 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# mr-intrepide , 2016. -# msgid "" msgstr "" "Project-Id-Version: \n" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/freon.pot b/freon@UshakovVasilii_Github.yahoo.com/po/freon.pot index b6a7cba..a601a56 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/freon.pot +++ b/freon@UshakovVasilii_Github.yahoo.com/po/freon.pot @@ -1,9 +1,3 @@ -# 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" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/pl.po b/freon@UshakovVasilii_Github.yahoo.com/po/pl.po index 5f9ccd1..2e5cd19 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/pl.po +++ b/freon@UshakovVasilii_Github.yahoo.com/po/pl.po @@ -1,8 +1,3 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# mr-intrepide , 2016. -# msgid "" msgstr "" "Project-Id-Version: \n" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/pt_BR.po b/freon@UshakovVasilii_Github.yahoo.com/po/pt_BR.po index 8a29168..94cbf63 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/pt_BR.po +++ b/freon@UshakovVasilii_Github.yahoo.com/po/pt_BR.po @@ -1,8 +1,3 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Fábio Nogueira , 2015. -# msgid "" msgstr "" "Project-Id-Version: \n" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/ru.po b/freon@UshakovVasilii_Github.yahoo.com/po/ru.po index 230b19b..8906a73 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/ru.po +++ b/freon@UshakovVasilii_Github.yahoo.com/po/ru.po @@ -1,8 +1,3 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# msgid "" msgstr "" "Project-Id-Version: \n" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/zh_CN.po b/freon@UshakovVasilii_Github.yahoo.com/po/zh_CN.po index 1bfddd7..a5fd5f0 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/zh_CN.po +++ b/freon@UshakovVasilii_Github.yahoo.com/po/zh_CN.po @@ -1,8 +1,3 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Dingzhong Chen , 2016 -# msgid "" msgstr "" "Project-Id-Version: \n" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po b/freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po index 5333273..18ad27f 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po +++ b/freon@UshakovVasilii_Github.yahoo.com/po/zh_TW.po @@ -1,8 +1,3 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# Dingzhong Chen , 2016 -# msgid "" msgstr "" "Project-Id-Version: \n" From c5fd61fd22a5cc073ac26895a0e7f5b8c9209427 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 8 Jun 2017 15:11:33 +0300 Subject: [PATCH 092/224] use GPU icon for amdgpu, fix #38 --- freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js | 1 + 1 file changed, 1 insertion(+) diff --git a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js index 8cb23e2..c5382ff 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/sensorsUtil.js @@ -54,6 +54,7 @@ const SensorsUtil = new Lang.Class({ for(let i = 0; i < this._output.length; i++){ let isGpuDriver = this._output[i].indexOf("radeon") != -1 + || this._output[i].indexOf("amdgpu") != -1 || this._output[i].indexOf("nouveau") != -1; if (gpuFlag != isGpuDriver) { From 5f5654ab1e00b194ccc5c48a35ac47448beca31c Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 8 Jun 2017 16:19:31 +0300 Subject: [PATCH 093/224] support gnome-shell 3.24 --- freon@UshakovVasilii_Github.yahoo.com/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index 93c99d5..0178a9f 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": ["3.12", "3.14", "3.16", "3.18", "3.20", "3.22"], + "shell-version": ["3.12", "3.14", "3.16", "3.18", "3.20", "3.22", "3.24"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", "description": "Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", From fc145409f73efcb2d32685f3773ea3f9d3ad4e87 Mon Sep 17 00:00:00 2001 From: Jonatan Hatakeyama Zeidler Date: Fri, 9 Jun 2017 17:49:30 +0200 Subject: [PATCH 094/224] Added German translation --- .../locale/de/LC_MESSAGES/freon.mo | Bin 0 -> 2322 bytes .../po/de.po | 127 ++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/locale/de/LC_MESSAGES/freon.mo create mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/de.po diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/de/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/de/LC_MESSAGES/freon.mo new file mode 100644 index 0000000000000000000000000000000000000000..4611aa1685bd33bede3c389e2ca21b1baf1a3136 GIT binary patch literal 2322 zcma)+O>7%Q6vr1RUxxBgz9}D5q==SwT_;s&2yN9SPFh3LT6Jm=moWA|d#B!=S!QOF zIvkL=z=<0|qDK%XIQ2*cha7qXA;GPxxO40cRf7MEcWW0_z{s;d@64O`-n@^!zH7(l z0mci(ya`TWUb_nqjO^|pxEK5YydT^s_z}1Z@1KAVfM0^ofM0=6fZv0=!Jk1s_Xl_% zcmv!4{t2#ue}S)nYxe}fv*5?z?rR{Q zI|jZ4o(0*y24}%_a2os;Y~haALB8J%oMX8;@L}*c$aYsizTf*G>r>#1;HMz_`whtF zegyFguHwP^egZeaU%`FgSqSX`haku463G5u2A>44f-i&DK(=!epTSgQvox4;Q`MPXJ2vAiM$Wzw~>4Y`LSA(X3;nv8iSVBC8 zVy~m_K5RJUmC^7{G^M5_D5YBDz0!Rbv|_U%>eN-KOhj8IIgOTC>p&sy3m4O zp@k1M%?4S~%CjsPiXw(1VT46Qs;}T;&qF2}sShR-P&jhi+Ig*f&{h!{u_$eH#}t%? z-Z6IIgz9n7L@d`yq=q9J!*3s3lmRk)E8Rs{ur58#i<#Q=Y&cyDYp;vx!}GP-uy&|cgJ5`$ z))i|T%N>SLSbKxz4$bbb%|Pz7)cqW#Igb!lRvIfyV;`ogwaTK=p0p2FhZ#gXUGxXD zL@NEJ=*H4I@<-3FE{AhtIV-j6kqwu0*F;GFyqN1K4>Jx*cr%gS*m?1m(P$klPT@JA zp-iQCk5rT(mq#v)_SQB>3&;EE#cD*yZuuInl1vedcf*sUx!qV{(@=zRn5ovP(-kyu zKGDGS+;(Hvjgfr+uU$M*K1zGL^)-67Z&7~=y`+OyCbiB{({!iZqOIXwSrw5&$M}Et z^xHV?f(7_O6TMuv_qL^KWf`50wpQeXR^1q#t&*NU03bpG?r+iuM4k#LBP|xlZcC*I zL4@~F?aSQtWe2aDxj`e5(%zLnG#c5J7RG#E-7OWy>2w$Bx`5S\n" +"Language-Team: \n" +"X-Generator: Poedit 2.0.1\n" + +#: bumblebeeNvidiaUtil.js:75 prefs.js:82 +msgid "Bumblebee + NVIDIA" +msgstr "Bumblebee + NVIDIA" + +#: extension.js:319 +msgid "Average" +msgstr "Durchschnitt" + +#: extension.js:320 +msgid "Maximum" +msgstr "Maximum" + +#: extension.js:341 +#, javascript-format +msgid "%drpm" +msgstr "%dupm" + +#: extension.js:350 +#, javascript-format +msgid "%s%.2fV" +msgstr "%s%.2fV" + +#: extension.js:396 +msgid "Please run sensors-detect as root." +msgstr "Bitte sensors-detect als root ausführen." + +#: extension.js:397 +msgid "" +"Please install lm_sensors.\n" +"If this doesn't help, click here to report with your sensors output!" +msgstr "" +"Bitte lm_sensors installieren.\n" +"Falls dies nicht hilft, hier klicken, um einen Bericht mit den Sensorausgaben zu erstellen!" + +#: extension.js:488 +msgid "Temperature Sensors" +msgstr "Temperatursensoren" + +#: extension.js:495 +msgid "Voltage" +msgstr "Spannung" + +#: extension.js:509 +msgid "Sensors Settings" +msgstr "Sensoreinstellungen" + +#: prefs.js:33 +msgid "Poll Sensors Every (sec)" +msgstr "Sensoren abfragen alle (Sekunden)" + +#: prefs.js:39 +msgid "Show Decimal Value" +msgstr "Dezimalwert anzeigen" + +#: prefs.js:40 +msgid "Show one digit after decimal" +msgstr "Eine Nachkommastelle anzeigen" + +#: prefs.js:45 +msgid "Temperature Unit" +msgstr "Temperatureinheit" + +#: prefs.js:51 +msgid "Position in Panel" +msgstr "Position auf der Leiste" + +#: prefs.js:55 +msgid "Show Icon on Panel" +msgstr "Symbol auf der Leiste anzeigen" + +#: prefs.js:58 +msgid "Show Fan Speed" +msgstr "Lüftergeschwindigkeit anzeigen" + +#: prefs.js:61 +msgid "Show Power Supply Voltage" +msgstr "Versorgungsspannung anzeigen" + +#: prefs.js:64 +msgid "Group Temperature Items" +msgstr "Temperatureinträge gruppieren" + +#: prefs.js:65 +msgid "Works if you have more than three temperature sensors" +msgstr "Funktioniert, wenn es mindestens drei Temperatursensoren gibt" + +#: prefs.js:68 +msgid "Group Voltage Items" +msgstr "Spannungseinträge gruppieren" + +#: prefs.js:69 +msgid "Works if you have more than three voltage sensors" +msgstr "Funktioniert, wenn es mindestens drei Spannungssensoren gibt" + +#: prefs.js:74 +msgid "HDD/SSD Temperature Utility" +msgstr "HDD/SSD-Temperaturdienst" + +#: prefs.js:79 +msgid "None" +msgstr "Keiner" + +#: prefs.js:80 +msgid "NVIDIA" +msgstr "NVIDIA" + +#: prefs.js:81 +msgid "Catalyst" +msgstr "Catalyst" + +#: prefs.js:84 +msgid "Video Card Temperature Utility" +msgstr "Grafikkartendienst" From f9756b2430b3766c3d21d71e9928963032617bf7 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Tue, 13 Jun 2017 09:14:52 +0300 Subject: [PATCH 095/224] fix undefined property warning --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 68b0724..d0725f8 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -430,7 +430,7 @@ const FreonMenuButton = new Lang.Class({ this._sensorMenuItems['temperature-group'] = temperatureGroup; } } else { - let item = new FreonItem.FreonItem(this._sensorIcons[s.type], s.label, s.value, s.displayName); + let item = new FreonItem.FreonItem(this._sensorIcons[s.type], s.label, s.value, s.displayName || undefined); item.connect('activate', Lang.bind(this, function (self) { let l = this._hotLabels[self.label]; let hotSensors = this._settings.get_strv('hot-sensors'); From 96c6ac11e49248af4cdc6e9ddb1bab7260eb5f2b Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Mon, 7 Aug 2017 16:04:49 +0300 Subject: [PATCH 096/224] support multiple NVIDIA gpu, #32 --- .../nvidiaUtil.js | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js index 3eb76bd..abb72ed 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js @@ -12,14 +12,13 @@ const NvidiaUtil = new Lang.Class({ this.parent(); let path = GLib.find_program_in_path('nvidia-settings'); this._argv = path ? [path, '-q', 'gpucoretemp', '-t'] : null; - this._label = 'NVIDIA'; + this._labels = []; if(this._argv){ // [0] ushakov-pc:0[gpu:0] (GeForce GTX 770) for each(let line in GLib.spawn_command_line_sync(path + " -q gpus")){ let match = /.*\[gpu:[\d]\].*\(([\w\d\ ]+)\).*/.exec(line); if(match){ - this._label = match[1]; - break; + this._labels.push(match[1]); } } } @@ -28,13 +27,26 @@ const NvidiaUtil = new Lang.Class({ get temp() { if(!this._output) return []; + let temps = []; for each(let line in this._output) { if(!line) continue; - return [{label: this._label, temp: parseFloat(line)}]; + temps.push(parseFloat(line)); } - return []; + let gpus = []; + for(let i = 0; i< temps.length; i++){ + let label = null; + if(this._labels.length == temps.length) + label = this._lebels[i]; + else if(temps.length > 1) + label = 'NVIDIA-' + (i + 1); + else + label = 'NVIDIA'; + gpus.push({ label: label, temp: temps[i] }) + } + + return gpus; } }); From ba3a394c095bfe084d733aded57568b44c1c2f21 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Mon, 7 Aug 2017 16:43:35 +0300 Subject: [PATCH 097/224] fix logic to skip first line, #32 --- .../nvidiaUtil.js | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js index abb72ed..d6f22b8 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js @@ -35,15 +35,21 @@ const NvidiaUtil = new Lang.Class({ } let gpus = []; - for(let i = 0; i< temps.length; i++){ - let label = null; - if(this._labels.length == temps.length) - label = this._lebels[i]; - else if(temps.length > 1) - label = 'NVIDIA-' + (i + 1); - else - label = 'NVIDIA'; - gpus.push({ label: label, temp: temps[i] }) + + if(this._labels.length > 0 && this._labels.length == temps.length - 1){ + // usually we should skip first line (most popular case) + for(let i = 0; i < this._labels.length; i++){ + gpus.push({ label: this._lebels[i], temp: temps[i + 1] }) + } + } else if(temps.length == 1 || temps.length == 2){ + // cannot parse GPU label, usually temp duplicated + gpus.push({ label: 'NVIDIA', temp: temps[0] }) + } else { + // I think it is not possible + for(let i = 0; i < temps.length; i++){ + let label = 'NVIDIA-' + (i + 1); + gpus.push({ label: label, temp: temps[i] }) + } } return gpus; From d9bf184644f22bec9226f2087d9db69af55c3788 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Mon, 7 Aug 2017 23:15:26 +0300 Subject: [PATCH 098/224] fix typo, #32 --- freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js index d6f22b8..50d9398 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js @@ -39,7 +39,7 @@ const NvidiaUtil = new Lang.Class({ if(this._labels.length > 0 && this._labels.length == temps.length - 1){ // usually we should skip first line (most popular case) for(let i = 0; i < this._labels.length; i++){ - gpus.push({ label: this._lebels[i], temp: temps[i + 1] }) + gpus.push({ label: this._labels[i], temp: temps[i + 1] }) } } else if(temps.length == 1 || temps.length == 2){ // cannot parse GPU label, usually temp duplicated From fd8b74b91092405112d787ab5b7fc62731fc7ded Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sun, 13 Aug 2017 10:24:07 +0300 Subject: [PATCH 099/224] fix NVIDIA GPUs label detection, #58 --- freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js index 50d9398..5facc14 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js @@ -15,7 +15,8 @@ const NvidiaUtil = new Lang.Class({ this._labels = []; if(this._argv){ // [0] ushakov-pc:0[gpu:0] (GeForce GTX 770) - for each(let line in GLib.spawn_command_line_sync(path + " -q gpus")){ + let [res, out] = GLib.spawn_command_line_sync(path + " -q gpus") + for each(let line in out.toString().split('\n')){ let match = /.*\[gpu:[\d]\].*\(([\w\d\ ]+)\).*/.exec(line); if(match){ this._labels.push(match[1]); From e916bedac8cab4675c16fc4d6c86ccb5c73e1999 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sun, 8 Oct 2017 19:42:53 +0300 Subject: [PATCH 100/224] support gnome-shell 3.26 --- freon@UshakovVasilii_Github.yahoo.com/metadata.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/metadata.json b/freon@UshakovVasilii_Github.yahoo.com/metadata.json index 0178a9f..3e94e01 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/metadata.json +++ b/freon@UshakovVasilii_Github.yahoo.com/metadata.json @@ -1,5 +1,5 @@ { - "shell-version": ["3.12", "3.14", "3.16", "3.18", "3.20", "3.22", "3.24"], + "shell-version": ["3.12", "3.14", "3.16", "3.18", "3.20", "3.22", "3.24", "3.26"], "uuid": "freon@UshakovVasilii_Github.yahoo.com", "name": "Freon", "description": "Shows CPU temperature, disk temperature, video card temperature (NVIDIA/Catalyst/Bumblebee&NVIDIA), voltage and fan RPM (forked from xtranophilist/gnome-shell-extension-sensors)", From 0e2b79c735d6ab45927f75ba42a725407855b93f Mon Sep 17 00:00:00 2001 From: "J.Junquera" Date: Sat, 14 Oct 2017 00:04:55 +0200 Subject: [PATCH 101/224] Fixing Nvidia problems when its disabled with `prime-select intel` --- .../nvidiaUtil.js | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js index 5facc14..27bbe02 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js @@ -1,5 +1,6 @@ const Lang = imports.lang; const GLib = imports.gi.GLib; +const Gio = imports.gi.Gio; const Me = imports.misc.extensionUtils.getCurrentExtension(); const CommandLineUtil = Me.imports.commandLineUtil; @@ -15,13 +16,31 @@ const NvidiaUtil = new Lang.Class({ this._labels = []; if(this._argv){ // [0] ushakov-pc:0[gpu:0] (GeForce GTX 770) - let [res, out] = GLib.spawn_command_line_sync(path + " -q gpus") - for each(let line in out.toString().split('\n')){ - let match = /.*\[gpu:[\d]\].*\(([\w\d\ ]+)\).*/.exec(line); + let [exit, pid, stdinFd, stdoutFd, stderrFd] = + GLib.spawn_async_with_pipes(null, /* cwd */ + [path, '-q', 'gpus'], /* args */ + null, /* env */ + GLib.SpawnFlags.DO_NOT_REAP_CHILD, + null /* child_setup */); + + let stdout = new Gio.UnixInputStream({fd: stdoutFd, close_fd: true}); + let outReader = new Gio.DataInputStream({base_stream: stdout}); + + GLib.close(stdinFd); + GLib.close(stderrFd); + let childWatch = GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, Lang.bind(this, function(pid, status, requestObj) { + let output = []; + let [line, size] = [null, 0]; + + while (([line, size] = outReader.read_line(null)) != null && line != null) { + let match = /.*\[gpu:[\d]\].*\(([\w\d\ ]+)\).*/.exec(line.toString()); if(match){ this._labels.push(match[1]); } } + + stdout.close(null); + GLib.source_remove(childWatch); } }, From bd1d31a847baa22ab07b3c5d9113fe7bbea84300 Mon Sep 17 00:00:00 2001 From: "J.Junquera" Date: Sat, 14 Oct 2017 12:16:50 +0200 Subject: [PATCH 102/224] Fixing my last commit syntax errors. --- .../nvidiaUtil.js | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js index 27bbe02..d1227a2 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js +++ b/freon@UshakovVasilii_Github.yahoo.com/nvidiaUtil.js @@ -29,18 +29,19 @@ const NvidiaUtil = new Lang.Class({ GLib.close(stdinFd); GLib.close(stderrFd); let childWatch = GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, Lang.bind(this, function(pid, status, requestObj) { - let output = []; - let [line, size] = [null, 0]; + let output = []; + let [line, size] = [null, 0]; - while (([line, size] = outReader.read_line(null)) != null && line != null) { - let match = /.*\[gpu:[\d]\].*\(([\w\d\ ]+)\).*/.exec(line.toString()); - if(match){ - this._labels.push(match[1]); - } - } + while (([line, size] = outReader.read_line(null)) != null && line != null) { + let match = /.*\[gpu:[\d]\].*\(([\w\d\ ]+)\).*/.exec(line.toString()); + if(match){ + this._labels.push(match[1]); + } + } - stdout.close(null); - GLib.source_remove(childWatch); + stdout.close(null); + GLib.source_remove(childWatch); + })); } }, From b7e1a1ce77df3d0738921386d6f828f110f839f4 Mon Sep 17 00:00:00 2001 From: "J.Junquera" Date: Sun, 22 Oct 2017 10:33:28 +0200 Subject: [PATCH 103/224] Added es_ES `.mo` locales --- .../locale/es_ES/LC_MESSAGES/freon.mo | Bin 0 -> 2362 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/locale/es_ES/LC_MESSAGES/freon.mo diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/es_ES/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/es_ES/LC_MESSAGES/freon.mo new file mode 100644 index 0000000000000000000000000000000000000000..b65723d2f467f464bdd143918092ffc31b8c6a45 GIT binary patch literal 2362 zcmb7^OKclO7{>=F1q|g;pgaX%fkGcy*LHzc4ykD4q*##Fs?(HPG~FHBlg#dH=i$^R zBsg&6)&p>=;DSU?oDdQc3PPNCToJ0cbLO84Py52JZ)dF4n(+Phfo&48HGx(qMN#803zE z&w!`EU_S$20f%56{2W}s8Lxohd@sPcux~#Y&eH&c-PvM&5+tn8g2CPe@Okhe805YL z@vv`-_4lC1`X}%JxQI<59tM0A`~Z9w{Ipnq3li49fKP&df)Th2&b$b=z!2YcFv!0L z&VV0+*vh^G4}(8|hrsRkFcwny2xd9%!=E4<&RdS)Q#pd&5aSSkq-Cr(#2}nEj1b=) znD=6aT)_mZU_O8u22wH3N$_(QCPF*T1wt?$a1F(km^@{B?4D|)x5ADMh2ed{j{EeS z66b`V19Wnw-D)3W^W1SYvW}fF+UK+^(j0r8H-g$uq_%j!qLqV&;@umq*1>MKwPp7i zCzW&~w!|;U)TgY_e^O_Hb(G*%kjyNMDN^aG6`9q>Rx9luxq-BlXkoLL91VoZXDC)O zUdMlU;WQbMYvX7`x&e)}H&jTI_Ad8scd6g_to#%u!im@sw`8<-Ro2lk+?`mZ1;k@S zd##A~;e(Y<>I~jdhi5{ua#vS4C$qj~-GSbqmWXA_6|HdP#pKl@�RVkxZ8D7+UZY zT7pnVZwNzOpXX{sMGPmK5f(~hU&6(n!=7ZKo?V}S!jUcS&ScWD6`2T4^V}piO+jhs ztTyYGWG@7b27D+e)ght-`0WM;Wq=G%(_I9W{kPPxD27s^WAqw=9kr8aMHq`0+Bj=>6yd9koS*Uq!nn;*PkdsEWR(%;hSf~$TYVx(~jT9-p=~L+hy=J{x z_v!2XluK2Ob$YbYQQmMBEozh6CT00}Y3CZVH2FKXH>2HiRNpr{Jz$fBU0vu_ZfIG= zG=(ermOXo{Z+y-T2_;g5LZgkY&nag&-7rqynqcFOO?YyH5SEIH4rfc7m(b39+RX@? z&p4XKP>&C_nJJoDY-#GQ#G%l*nI=B+37W=TY ziT~Hyn=@P-|IYO-Y9P3Reu~F=7={anjqeo{&Z5skjF2cvPNI1%rJI)~#b>Z6LlzEn My$k Date: Wed, 1 Nov 2017 08:14:44 +0300 Subject: [PATCH 104/224] fix ru translations #68 --- .../locale/ru/LC_MESSAGES/freon.mo | Bin 2950 -> 2950 bytes .../po/ru.po | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/ru/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/ru/LC_MESSAGES/freon.mo index d470a82f874ce7fee32a1c4c7464b25af3981016..7bb7a4781cac42a95eeb13856a18149867383fc5 100644 GIT binary patch delta 24 ccmZn@Zxi2ehmCQ^ Date: Sat, 11 Nov 2017 23:52:00 +0200 Subject: [PATCH 105/224] add uk_UA local --- .../locale/uk_UA/LC_MESSAGES/freon.mo | Bin 0 -> 3046 bytes .../po/uk_UA.po | 128 ++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 freon@UshakovVasilii_Github.yahoo.com/locale/uk_UA/LC_MESSAGES/freon.mo create mode 100644 freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/uk_UA/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/uk_UA/LC_MESSAGES/freon.mo new file mode 100644 index 0000000000000000000000000000000000000000..bac151ffdbf70f3a17f465c485384c8cd794ddd4 GIT binary patch literal 3046 zcmb`HTWl0n7{^D&+bUl0g7)bo!e)d%oNM`_5cn zwc;}k*9-CeJ6MDJhr93(SLJR^yBB;PydUg~`2n~J@5jLhz|Xmo8{i7?H?Rx*1AH0mx<}KV0SCdy!E@ka;8!5WSpXjagZTYN@L9ay06F)SaLRFC z1KDmH_!77maufZ(dr@##OE0_ms z;QVRO1+k1T!IsO^26Z{V3d|yNn?}ByUe()s7EqoGpay^WPr*LyWlZ$(lT+iWweX;&%OQ;)b z!20sV`mV&ydU3CiT3G9&AYW)j*b|-u)&$aqyo}@lYmZ;yYdK6oeTa}fnT$A|ss!sBgUKCOk zB$+;Wt}E-cRu_TWqNubJdi2veUleNbgKtU8b&wsknvSrwWLKMz(sFuyt*zwtQL`vm zWz(ik)2@nWX_x6xTSbUs^qMcg3;tp+Y}D%Z36I*Um5SX@v4+uR$U;S{$3lwT5_^h~ zdu?e0;zVv)>u@Zoby`K?Qj_Twmu*23=xx_K=#$mWqEX506;yUv(Gv2OB@bhO4&Q8d zEUNa;R=x2sBo?in`yRyB^F_T=cs|6;Qfgn=G`+>|v5NYRYLBnCyI5}B+pafx!eq(y zW>bnRWsLMjJ#Fa5>y+M}_%1COw_TA7vV{jg9M#4EDWcIz3g4 zrrs{hG6J;ZTXrs{k*+sVO|Bz_BlY(F3ZhAINN%XursZs*Ldo=eA#)w=yY$VA`#jU} zyM?FkbP8?}6Og6N2P~P|ukRKP9}d^cqO+oi=4I-Q`Ud3S!#$hX(XXjiyXu*?zRUH> zewLg{`0D2xwovq#Tj$iIja)8GYu6G#8f$W>>kTpp+ws0Fmq~uwnrr08(8Ac7Ht6u- z$OLTkaZ z>P&DX7*f}8kE_vOP)!r;W^vEqo(~uBk6*8aPO&E#g7azZ-I*oY2?k&}ho{+KnC+8Kk~)tFr_>Bq z)F+5N5eyTG8pVFB)gfXqz!|`10nf+=8L9R z7tR=p!RvhNBNS(_j@VX>QMe!eL)$s*4E2Q`@XT?M*Z|ZV4DFE-vVb$zeLyWhwGlPG z<_;B1g~AST9dT>~nS`rJWIo8&x49ygB>q^c3&;)mEb05w$UFu!VV$Uq)`dUK)N1M? z)@GynQ9bvGMc_JFOAJmhqN(%T5J+<(aUXA88h}fS+@T?AYDpSl83Vy76u}vcv-E!% zj^z!56X76Dp#G6i7W5p}$P%japhdFqOq`BeGKNl!s;f~O7sD(-re*5l;&00q=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Language: uk_UA\n" + +#: bumblebeeNvidiaUtil.js:75 prefs.js:82 +msgid "Bumblebee + NVIDIA" +msgstr "Bumblebee + NVIDIA" + +#: extension.js:319 +msgid "Average" +msgstr "Середня" + +#: extension.js:320 +msgid "Maximum" +msgstr "Максимальна" + +#: extension.js:341 +#, javascript-format +msgid "%drpm" +msgstr "%dоб/хв" + +#: extension.js:350 +#, javascript-format +msgid "%s%.2fV" +msgstr "%s%.2fВ" + +#: extension.js:396 +msgid "Please run sensors-detect as root." +msgstr "Будь ласка, запустіть детектор сенсорів як root." + +#: extension.js:397 +msgid "" +"Please install lm_sensors.\n" +"If this doesn't help, click here to report with your sensors output!" +msgstr "" +"Будь ласка, встановіть lm_sensors.\n" +"Якщо це не допоможе, натисніть тут, щоб повідомити про відсутність сенсорів!" + +#: extension.js:488 +msgid "Temperature Sensors" +msgstr "Сенсори температури" + +#: extension.js:495 +msgid "Voltage" +msgstr "Напруга" + +#: extension.js:509 +msgid "Sensors Settings" +msgstr "Налаштування сенсорів" + +#: prefs.js:33 +msgid "Poll Sensors Every (sec)" +msgstr "Опитувати сенсори кожні (сек)" + +#: prefs.js:39 +msgid "Show Decimal Value" +msgstr "Показувати десяткове значення" + +#: prefs.js:40 +msgid "Show one digit after decimal" +msgstr "Показувати одну цифру після десяткового знаку" + +#: prefs.js:45 +msgid "Temperature Unit" +msgstr "Одиниця вимиру температури" + +#: prefs.js:51 +msgid "Position in Panel" +msgstr "Положення на панелі" + +#: prefs.js:55 +msgid "Show Icon on Panel" +msgstr "Відображати значок на панелі" + +#: prefs.js:58 +msgid "Show Fan Speed" +msgstr "Показувати швидкість вентилятора" + +#: prefs.js:61 +msgid "Show Power Supply Voltage" +msgstr "Показувати напругу живлення" + +#: prefs.js:64 +msgid "Group Temperature Items" +msgstr "Групувати елементи температури" + +#: prefs.js:65 +msgid "Works if you have more than three temperature sensors" +msgstr "Працює, якщо у вас більше трьох сенсорів температури" + +#: prefs.js:68 +msgid "Group Voltage Items" +msgstr "Групувати елементи напруги" + +#: prefs.js:69 +msgid "Works if you have more than three voltage sensors" +msgstr "Працює, якщо у вас більше трьох сенсорів напруги" + +#: prefs.js:74 +msgid "HDD/SSD Temperature Utility" +msgstr "Утіліта для визначення температури HDD/SSD" + +#: prefs.js:79 +msgid "None" +msgstr "Ніяка" + +#: prefs.js:80 +msgid "NVIDIA" +msgstr "NVIDIA" + +#: prefs.js:81 +msgid "Catalyst" +msgstr "Catalyst" + +#: prefs.js:84 +msgid "Video Card Temperature Utility" +msgstr "Утиліта для визначення температури відеокарти" From 0921e4b379897ece100aa89c7ea0c5f8ad560a9d Mon Sep 17 00:00:00 2001 From: Alex Volga Date: Sun, 12 Nov 2017 00:12:40 +0200 Subject: [PATCH 106/224] added translation for the position on the panel --- .../locale/uk_UA/LC_MESSAGES/freon.mo | Bin 3046 -> 3176 bytes .../po/freon.pot | 12 ++++++++++ .../po/uk_UA.po | 21 ++++++++++++++---- .../prefs.js | 2 +- 4 files changed, 30 insertions(+), 5 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/locale/uk_UA/LC_MESSAGES/freon.mo b/freon@UshakovVasilii_Github.yahoo.com/locale/uk_UA/LC_MESSAGES/freon.mo index bac151ffdbf70f3a17f465c485384c8cd794ddd4..35e0e18917747cebc41a9ea3f89a9f31e19ac980 100644 GIT binary patch delta 863 zcmYk)OK8(@9Ki8kvouVLd)Qdugg1dMS z!-gU<^x{F0=}=F;@Sq|{a`2)!1VLpWvXgk3et)sT{_yYT|Np1S?~#1%_}*EYX-$p` zV-0g9b6G;92OAB37*m+S`JMkSZ!EdOE{KgjigPK4KPi@9^sCx&ya4%{>Mbt#jq26~HSL01g z6JMUQ=;PouZo+xIN*8RREoT3QG_}I_sDWls1O2FGBc!3sC3iuW^p`0bM9*0mfKZ`wh3Af=R+<`w)|GzOKvKf!yAYQ|6y^fkt z8`TWqe$<2}v38inJr;*B+bBZeadp~q{U)^KI(UXGXErhQwa}!vjoMnRUR$n1-@Ue7 zE7kX|V--^aQfFKUNE?$+#1WDg;>In3cxbzMy>a{ho$z7)Uj)O(7ITkR_Pt7Q%ji!I zct`zU)_9pZc)WDXpT660JF&gb-e5bnof&XP{N6&vEsvaX{nM3vj+1h!>Xy9Tg69q| z*ynTAlf}VZ!HHBgm}8zXcQ;?jMHj<|;gjfmG#X6=b7pt&(Hw8O9!-P~!l#^Fh{mSN S=^KgcWHcI1EjYBSPsU$m{d?;G delta 745 zcmXxiKS*0q6vy$KL=%nmZ(F0*N)R9TpC}O}gHT*r5DF!h;u0Sy4w|Tm(J@d#mu7kh z(u{(We})VSLO}-|OXrr*7Aj)5x)njczehZ9^SSr(-o59Ylk1kNP_EQev2BR<^0-5b z@x#LpvFtUb5?3&Q>t%D;#Ci*>@H2*R7oXxOzQC`j_x_?EZ?OXZW5Sr6xo6VJM#5)I z3x32#EMNm3pf37?b@;8k{)w%uZ&AtDa;h%wMZGtU9rzZNKnh224To?acRV>`N=$0l zSSLMw$p-48PpFFv<^4m9u|CFO{D*JQ;`C-*Lbl8%1~HFkxPx(==5Qr&gkAUtd$`{O ztBo1MD2`(i_2526@i$Ikh*Q;?Bq{+1-{S=;;g@{H4EEy(%%i&ajPV#xm^^2wr3&5e z_DL$*7&=TXpfhgiR0Wk-p%T|JR57)S+}y9NM+Mz*+oJ!1szPzycBnE6RoGaw>E)!c zGS;AT>g{%Jysw>6-+A%gx915(qkWO#NF+FEr{=Tv{M{t6U4#eDU5?*paFS&0Au diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/freon.pot b/freon@UshakovVasilii_Github.yahoo.com/po/freon.pot index a601a56..253c22a 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/freon.pot +++ b/freon@UshakovVasilii_Github.yahoo.com/po/freon.pot @@ -122,3 +122,15 @@ msgstr "" #: prefs.js:84 msgid "Video Card Temperature Utility" msgstr "" + +#: prefs.js:49 +msgid "Left" +msgstr "" + +#: prefs.js:49 +msgid "Center" +msgstr "" + +#: prefs.js:49 +msgid "Right" +msgstr "" diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po b/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po index 91f17dc..c654673 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po +++ b/freon@UshakovVasilii_Github.yahoo.com/po/uk_UA.po @@ -3,15 +3,16 @@ msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2015-10-06 17:05-0300\n" -"PO-Revision-Date: 2017-11-11 23:50+0200\n" +"PO-Revision-Date: 2017-11-12 00:09+0200\n" +"Last-Translator: \n" "Language-Team: \n" +"Language: uk_UA\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.3\n" -"Last-Translator: \n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"Language: uk_UA\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: bumblebeeNvidiaUtil.js:75 prefs.js:82 msgid "Bumblebee + NVIDIA" @@ -126,3 +127,15 @@ msgstr "Catalyst" #: prefs.js:84 msgid "Video Card Temperature Utility" msgstr "Утиліта для визначення температури відеокарти" + +#: prefs.js:49 +msgid "Left" +msgstr "Ліворуч" + +#: prefs.js:49 +msgid "Center" +msgstr "В центрі" + +#: prefs.js:49 +msgid "Right" +msgstr "Праворуч" diff --git a/freon@UshakovVasilii_Github.yahoo.com/prefs.js b/freon@UshakovVasilii_Github.yahoo.com/prefs.js index 2d515fa..f2df8fb 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/prefs.js +++ b/freon@UshakovVasilii_Github.yahoo.com/prefs.js @@ -46,7 +46,7 @@ const FreonPrefsWidget = new GObject.Class({ }); this._addComboBox({ - items : {left : 'Left', center : 'Center', right : 'Right'}, + items : {left : _('Left'), center : _('Center'), right : _('Right')}, key: 'position-in-panel', y : i, x : 0, label: _('Position in Panel') }); From 9116d624bef746117d43f48fc312104bb992d3e0 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Wed, 22 Nov 2017 16:42:19 +0300 Subject: [PATCH 107/224] destroy label after link cleanup for prevert set_label on not exist actor fix #71 --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index d0725f8..5559607 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -436,8 +436,8 @@ const FreonMenuButton = new Lang.Class({ let hotSensors = this._settings.get_strv('hot-sensors'); if(l){ hotSensors.splice(hotSensors.indexOf(self.label), 1); - l.destroy(); delete this._hotLabels[self.label]; + l.destroy(); // destroy is called after dict cleanup to prevert set_label on not exist actor let i = this._hotIcons[self.label]; if(i){ i.destroy(); @@ -459,8 +459,9 @@ const FreonMenuButton = new Lang.Class({ let k = hotSensors[i]; if(!this._sensorMenuItems[k]){ hotSensors.splice(i, 1); - this._hotLabels[k].destroy(); + let ll = this._hotLabels[k] delete this._hotLabels[k]; + ll.destroy(); // destroy is called after dict cleanup to prevert set_label on not exist actor if(this._hotIcons[k]){ this._hotIcons[k].destroy(); delete this._hotIcons[k]; From 009b877a1868b87246d5e3970aa1de26ca343cd6 Mon Sep 17 00:00:00 2001 From: Stepan Kashuba Date: Thu, 30 Nov 2017 10:54:56 +0500 Subject: [PATCH 108/224] Fixed russian translation --- freon@UshakovVasilii_Github.yahoo.com/po/ru.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/po/ru.po b/freon@UshakovVasilii_Github.yahoo.com/po/ru.po index 9230955..a9dfd23 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/po/ru.po +++ b/freon@UshakovVasilii_Github.yahoo.com/po/ru.po @@ -23,7 +23,7 @@ msgstr "Средняя температура" #: extension.js:320 msgid "Maximum" -msgstr "Максимальня температура" +msgstr "Максимальная температура" #: extension.js:341 #, javascript-format @@ -37,14 +37,14 @@ msgstr "%s%.2f В" #: extension.js:396 msgid "Please run sensors-detect as root." -msgstr "Пожалуйста запустите sensors-detect как суперпользователь" +msgstr "Пожалуйста, запустите sensors-detect как суперпользователь" #: extension.js:397 msgid "" "Please install lm_sensors.\n" "If this doesn't help, click here to report with your sensors output!" msgstr "" -"Пожалуйста установите lm_sensors.\n" +"Пожалуйста, установите lm_sensors.\n" "Если это не поможет, нажмите здесь, чтобы сообщить с выходом датчиков!" #: extension.js:488 From 8d5fca31e11ad54b6aba1d5fbe9c03789e2c8d37 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Sun, 3 Dec 2017 11:54:34 +0300 Subject: [PATCH 109/224] do not update sensors in background #74 --- freon@UshakovVasilii_Github.yahoo.com/extension.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index 5559607..dc7c1c0 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -157,7 +157,7 @@ const FreonMenuButton = new Lang.Class({ break; case 'udisks2': this._utils.disks = new UDisks2.UDisks2(Lang.bind(this, function() { - this._updateDisplay(); + // this._updateDisplay(); we cannot change actor in background thread #74 })); break; } @@ -228,10 +228,11 @@ const FreonMenuButton = new Lang.Class({ for each (let sensor in this._utils) { if (sensor.available) { sensor.execute(Lang.bind(this,function(){ - this._updateDisplay(); + // we cannot change actor in background thread #74 })); } } + this._updateDisplay(); // #74 }, _fixNames: function(sensors){ From 51333f71510fc420106b8351f28464941c91d880 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 7 Dec 2017 08:52:13 +0300 Subject: [PATCH 110/224] use system keys for lcale depend sensors, resolve #77 --- .../extension.js | 39 +++++++++++-------- .../freonItem.js | 8 ++-- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index dc7c1c0..fb37a9c 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -317,8 +317,14 @@ const FreonMenuButton = new Lang.Class({ sensors.push({type : 'separator'}); // Add average and maximum entries - sensors.push({type:'temperature-average', label:_("Average"), value:this._formatTemp(sum/total)}); - sensors.push({type:'temperature-maximum', label:_("Maximum"), value:this._formatTemp(max)}); + sensors.push({type: 'temperature-average', + key: '__average__', + label: _("Average"), + value: this._formatTemp(sum/total)}); + sensors.push({type: 'temperature-maximum', + key: '__max__', + label: _("Maximum"), + value: this._formatTemp(max)}); if(fanInfo.length > 0 || voltageInfo.length > 0) sensors.push({type : 'separator'}); @@ -356,7 +362,7 @@ const FreonMenuButton = new Lang.Class({ for each (let s in sensors) if(s.type != 'separator') { - let l = this._hotLabels[s.label]; + let l = this._hotLabels[s.key || s.label]; if(l) l.set_text(s.value); } @@ -364,7 +370,7 @@ const FreonMenuButton = new Lang.Class({ if(this._lastSensorsCount && this._lastSensorsCount==sensors.length){ for each (let s in sensors) { if(s.type != 'separator') { - let item = this._sensorMenuItems[s.label]; + let item = this._sensorMenuItems[s.key || s.label]; if(item) { if(s.type == 'temperature-group') item.status.text = s.value; @@ -431,28 +437,29 @@ const FreonMenuButton = new Lang.Class({ this._sensorMenuItems['temperature-group'] = temperatureGroup; } } else { - let item = new FreonItem.FreonItem(this._sensorIcons[s.type], s.label, s.value, s.displayName || undefined); + let key = s.key || s.label; + let item = new FreonItem.FreonItem(this._sensorIcons[s.type], key, s.label, s.value, s.displayName || undefined); item.connect('activate', Lang.bind(this, function (self) { - let l = this._hotLabels[self.label]; + let l = this._hotLabels[self.key]; let hotSensors = this._settings.get_strv('hot-sensors'); if(l){ - hotSensors.splice(hotSensors.indexOf(self.label), 1); - delete this._hotLabels[self.label]; + hotSensors.splice(hotSensors.indexOf(self.key), 1); + delete this._hotLabels[self.key]; l.destroy(); // destroy is called after dict cleanup to prevert set_label on not exist actor - let i = this._hotIcons[self.label]; + let i = this._hotIcons[self.key]; if(i){ i.destroy(); - delete this._hotIcons[self.label]; + delete this._hotIcons[self.key]; } self.main = false; } else { - hotSensors.push(self.label); + hotSensors.push(self.key); if(Object.keys(this._hotLabels).length == 0){ this._initialIcon.destroy(); this._initialIcon = null; } let showIcon = this._settings.get_boolean('show-icon-on-panel'); - this._createHotItem(self.label, showIcon, self.gicon); + this._createHotItem(self.key, showIcon, self.gicon); self.main = true; } @@ -478,12 +485,12 @@ const FreonMenuButton = new Lang.Class({ return hotSensors.indexOf(item) == pos; })); })); - if (this._hotLabels[s.label]) { + if (this._hotLabels[key]) { item.main = true; - if(this._hotIcons[s.label]) - this._hotIcons[s.label].gicon = item.gicon; + if(this._hotIcons[key]) + this._hotIcons[key].gicon = item.gicon; } - this._sensorMenuItems[s.label] = item; + this._sensorMenuItems[key] = item; if(needGroupTemperature && s.type == 'temperature') { if(!temperatureGroup) { diff --git a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js index fa070e4..5dc520d 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/freonItem.js +++ b/freon@UshakovVasilii_Github.yahoo.com/freonItem.js @@ -6,10 +6,10 @@ const FreonItem = new Lang.Class({ Name: 'FreonItem', Extends: PopupMenu.PopupBaseMenuItem, - _init: function(gIcon, label, value, displayName) { + _init: function(gIcon, key, label, value, displayName) { this.parent(); this._main = false; - this._label = label; + this._key = key; this._gIcon = gIcon; this._labelActor = new St.Label({text: displayName ? displayName : label}); @@ -31,8 +31,8 @@ const FreonItem = new Lang.Class({ return this._main; }, - get label() { - return this._label; + get key() { + return this._key; }, set display_name(text) { From 68fe27d9f3eee4c85e1f9343c2fe37b9b50684c5 Mon Sep 17 00:00:00 2001 From: UshakovVasilii Date: Thu, 7 Dec 2017 09:18:16 +0300 Subject: [PATCH 111/224] use average and max temperature as default #60 --- .../extension.js | 22 +++++++++--------- .../schemas/gschemas.compiled | Bin 908 -> 932 bytes ...gnome.shell.extensions.sensors.gschema.xml | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/freon@UshakovVasilii_Github.yahoo.com/extension.js b/freon@UshakovVasilii_Github.yahoo.com/extension.js index fb37a9c..98e8521 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/extension.js +++ b/freon@UshakovVasilii_Github.yahoo.com/extension.js @@ -408,6 +408,17 @@ const FreonMenuButton = new Lang.Class({ }); this.menu.addMenuItem(item); } + // separator + this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); + + let item = new PopupMenu.PopupBaseMenuItem(); + item.actor.add(new St.Label({ text: _("Sensors Settings") }), { expand: true, x_fill: false }); + + item.connect('activate', function () { + Util.spawn(["gnome-shell-extension-prefs", Me.metadata.uuid]); + }); + + this.menu.addMenuItem(item); }, _appendMenuItems : function(sensors){ @@ -518,17 +529,6 @@ const FreonMenuButton = new Lang.Class({ } } } - // separator - this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - - let item = new PopupMenu.PopupBaseMenuItem(); - item.actor.add(new St.Label({ text: _("Sensors Settings") }), { expand: true, x_fill: false }); - - item.connect('activate', function () { - Util.spawn(["gnome-shell-extension-prefs", Me.metadata.uuid]); - }); - - this.menu.addMenuItem(item); }, diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled b/freon@UshakovVasilii_Github.yahoo.com/schemas/gschemas.compiled index 391211bc97d1357e27467062a154f4645c4ee2e6..83b7a59319ee3060c56cad969246a4ecb7abd82a 100644 GIT binary patch delta 365 zcmeBSU&21YgLghN0}%KyECA9=CWiLcJ2Npbq!=buvH*oaY;J}!h5#TP0mPG9Qxier zAT~%m14tJFF{>y8!+#(Eu|bBF0O=(_oNU%62vQGX3jx*d0MdJbnB`AJJ4hVF<^hUd z0Mb{1_>J`cdTo#dhy&8_0!Y6F;{@!f93)=EtPF8c15mIPh>uFn zuK`Jb*epN|6M*#m$*fGu8u9UoWvNAp>8bJY4Ds=~i4{PaM}$Emu~@UTASJORRktKF NH%_zwgiHps9TAl(DR$!2YWAoU=&5K#RBAiWfbS^iYCgTz5>9-#OR zAiWoe-$?(j*9J*|I3Nudfb>-$KI`&h4oDot76gjF0Mc)Pc!B(iZjd;L%?lJ~0Q!Ol zh!51(af2KLVzUCpC4jUo5L+j!X@Jy&*dTKPfOHfPyOtg=2Z={9D??nA0Tj#y;-ixD qYd{hpHVaTg1(0r^%*v!Jz@U*>tXW!+l30?eTauZZx;cO;gb@I`06~8M diff --git a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml index 129d221..0092f5b 100644 --- a/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml +++ b/freon@UshakovVasilii_Github.yahoo.com/schemas/org.gnome.shell.extensions.sensors.gschema.xml @@ -22,7 +22,7 @@ - [] + ["__average__", "__max__"]