├── src ├── images │ └── mcontrolcenter.png ├── helper │ ├── mcontrolcenter.helper.service │ ├── CMakeLists.txt │ ├── service.h │ ├── readwrite.h │ ├── mcontrolcenter-helper.conf │ ├── helper.h │ ├── readwrite.cpp │ ├── helper.cpp │ ├── msi-ec.h │ └── msi-ec.cpp ├── resources.qrc ├── settings.h ├── helper.h ├── main.cpp ├── settings.cpp ├── helper.cpp ├── operate.h ├── msi-ec_helper.h ├── mainwindow.h └── i18n │ ├── MControlCenter_zh_CN.ts │ ├── MControlCenter_nb.ts │ ├── MControlCenter_nl_NL.ts │ ├── MControlCenter_it.ts │ ├── MControlCenter_eu.ts │ ├── MControlCenter_pt_PT.ts │ ├── MControlCenter_pt_BR.ts │ ├── MControlCenter_es.ts │ ├── MControlCenter_fi_FI.ts │ ├── MControlCenter_hu.ts │ └── MControlCenter_en.ts ├── scripts ├── build.sh ├── uninstall.sh ├── create_installer.sh └── install.sh ├── .gitignore ├── resources ├── mcontrolcenter.desktop ├── mcontrolcenter.appdata.xml └── mcontrolcenter.svg ├── CMakeLists.txt ├── CHANGELOG.md ├── README.md └── docs └── tested_devices.md /src/images/mcontrolcenter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dmitry-s93/MControlCenter/HEAD/src/images/mcontrolcenter.png -------------------------------------------------------------------------------- /scripts/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | rm -rf ../build 4 | mkdir ../build 5 | cd ../build 6 | 7 | cmake .. 8 | cmake --build . --parallel 9 | -------------------------------------------------------------------------------- /src/helper/mcontrolcenter.helper.service: -------------------------------------------------------------------------------- 1 | [D-BUS Service] 2 | Name=mcontrolcenter.helper 3 | Exec=/usr/libexec/mcontrolcenter-helper 4 | User=root 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Compiled Object files 5 | *.slo 6 | *.lo 7 | *.o 8 | *.obj 9 | 10 | # Precompiled Headers 11 | *.gch 12 | *.pch 13 | 14 | # Compiled Dynamic libraries 15 | *.so 16 | *.dylib 17 | *.dll 18 | 19 | # Fortran module files 20 | *.mod 21 | *.smod 22 | 23 | # Compiled Static libraries 24 | *.lai 25 | *.la 26 | *.a 27 | *.lib 28 | 29 | # Executables 30 | *.exe 31 | *.out 32 | *.app 33 | 34 | *.user 35 | /build/ 36 | /scripts/*.tar.gz 37 | /scripts/MControlCenter-*-bin/ 38 | -------------------------------------------------------------------------------- /scripts/uninstall.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | SHORTCUT='mcontrolcenter.desktop' 4 | 5 | echo "Start uninstall" 6 | 7 | rm -fv /usr/bin/mcontrolcenter 8 | rm -fv /usr/share/applications/$SHORTCUT 9 | rm -fv /home/$SUDO_USER/.local/share/applications/$SHORTCUT 10 | rm -fv /usr/share/icons/hicolor/scalable/apps/mcontrolcenter.svg 11 | rm -fv /usr/libexec/mcontrolcenter-helper 12 | rm -fv /etc/dbus-1/system.d/mcontrolcenter-helper.conf 13 | rm -fv /usr/share/dbus-1/system.d/mcontrolcenter-helper.conf 14 | rm -fv /usr/share/dbus-1/system-services/mcontrolcenter.helper.service 15 | 16 | echo "Uninstall was successful" 17 | -------------------------------------------------------------------------------- /src/helper/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.25) 2 | 3 | project(MControlCenterHelper LANGUAGES CXX) 4 | 5 | set(CMAKE_INCLUDE_CURRENT_DIR ON) 6 | 7 | set(CMAKE_AUTOUIC ON) 8 | set(CMAKE_AUTOMOC ON) 9 | set(CMAKE_AUTORCC ON) 10 | 11 | set(CMAKE_CXX_STANDARD 20) 12 | set(CMAKE_CXX_STANDARD_REQUIRED ON) 13 | 14 | add_compile_options(-fPIC) 15 | 16 | find_package(Qt6 6.4 REQUIRED COMPONENTS Core DBus) 17 | 18 | add_executable(mcontrolcenter-helper 19 | helper.h 20 | helper.cpp 21 | readwrite.h 22 | readwrite.cpp 23 | msi-ec.h 24 | msi-ec.cpp 25 | ) 26 | target_link_libraries(mcontrolcenter-helper Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::DBus) 27 | 28 | install(TARGETS mcontrolcenter-helper 29 | LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) 30 | -------------------------------------------------------------------------------- /scripts/create_installer.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -xe 2 | echo "Creating the installer" 3 | 4 | VERSION=$(grep -oP "(?<=MControlCenter VERSION )[0-9.]*" ../CMakeLists.txt) 5 | 6 | DIST_DIR="MControlCenter-$VERSION-bin" 7 | APP_DIR="$DIST_DIR/app" 8 | 9 | rm -rf $DIST_DIR 10 | rm -f $DIST_DIR.tar.gz 11 | 12 | mkdir $DIST_DIR 13 | mkdir $APP_DIR 14 | 15 | cp ../build/mcontrolcenter $APP_DIR 16 | cp ../build/helper/mcontrolcenter-helper $APP_DIR 17 | cp ../src/helper/mcontrolcenter-helper.conf ../src/helper/mcontrolcenter.helper.service $APP_DIR 18 | cp ../resources/mcontrolcenter.desktop ../resources/mcontrolcenter.svg $APP_DIR 19 | 20 | cp ./install.sh ./uninstall.sh $DIST_DIR 21 | 22 | tar -czvf $DIST_DIR.tar.gz $DIST_DIR 23 | 24 | rm -r $DIST_DIR 25 | 26 | echo "Installer created successfully" 27 | -------------------------------------------------------------------------------- /src/helper/service.h: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2022 Dmitry Serov 2 | * 3 | * This file is part of MControlCenter. 4 | * 5 | * MControlCenter is free software: you can redistribute it and/or 6 | * modify it under the terms of the GNU General Public License as 7 | * published by the Free Software Foundation, either version 3 of 8 | * the License, or (at your option) any later version. 9 | * 10 | * MControlCenter is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License along 16 | * with MControlCenter. If not, see . 17 | */ 18 | 19 | #define SERVICE_NAME "mcontrolcenter.helper" 20 | #define INTERFACE_NAME "dmitry_s93.MControlCenter" 21 | #define INTERFACE_NAME_MSI_EC "BeardOverflow.msi_ec" 22 | -------------------------------------------------------------------------------- /resources/mcontrolcenter.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Categories=System;Settings;Utility; 3 | Encoding=UTF-8 4 | Name=MControlCenter 5 | GenericName=Change MSI Laptop Settings 6 | GenericName[ru]=Изменение настроек ноутбука MSI 7 | GenericName[pt]=Alterar Definições de Portáteis MSI 8 | GenericName[es]=Modifica los ajustos de portátiles MSI 9 | GenericName[fr]=Modifier les paramètres des ordinateurs portables MSI 10 | GenericName[nb]=Endre innstillinger til MSI-laptop 11 | GenericName[tr]=MSI Laptop Ayarlarını Değiştir 12 | GenericName[pt_br]=Mudar Definições de Portáteis MSI 13 | GenericName[it]=Modifica impostazioni del portatile MSI 14 | GenericName[de_DE]=Ändern der MSI Laptop Einstellungen 15 | GenericName[hu]=Változtasd meg az MSI Laptop beállításait 16 | GenericName[zh_CN]=调整 MSI 笔记本电脑的电源和性能设置 17 | GenericName[nl_NL]=Wijzig de instellingen van de MSI Laptop 18 | GenericName[eu]=Aldatu MSI eramangarrien doikuntzak 19 | GenericName[vi]=Thay đổi cài đặt máy tính xách tay MSI 20 | Type=Application 21 | Exec=mcontrolcenter 22 | Icon=mcontrolcenter 23 | -------------------------------------------------------------------------------- /scripts/install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | BIN_PATH='/usr/bin/' 4 | LIB_EXEC_PATH='/usr/libexec/' 5 | SCALABLE_ICONS_PATH='/usr/share/icons/hicolor/scalable/apps/' 6 | SHORTCUTS_PATH='/usr/share/applications/' 7 | DBUS_SYSTEM_PATH='/usr/share/dbus-1/system.d/' 8 | DBUS_SERVICES_PATH='/usr/share/dbus-1/system-services/' 9 | 10 | APP_DIR='./app/' 11 | 12 | APP_BIN='mcontrolcenter' 13 | SVG_ICON='mcontrolcenter.svg' 14 | SHORTCUT='mcontrolcenter.desktop' 15 | HELPER_BIN='mcontrolcenter-helper' 16 | DBUS_CONF='mcontrolcenter-helper.conf' 17 | DBUS_SERVICE='mcontrolcenter.helper.service' 18 | 19 | echo "Installation start" 20 | 21 | install -vDm755 $APP_DIR$APP_BIN $BIN_PATH$APP_BIN 22 | 23 | rm -fv /home/$SUDO_USER/.local/share/applications/$SHORTCUT 24 | install -vDm644 $APP_DIR$SHORTCUT $SHORTCUTS_PATH$SHORTCUT 25 | 26 | install -vDm644 $APP_DIR$SVG_ICON $SCALABLE_ICONS_PATH$SVG_ICON 27 | 28 | install -vDm755 $APP_DIR$HELPER_BIN $LIB_EXEC_PATH$HELPER_BIN 29 | 30 | install -vDm644 $APP_DIR$DBUS_CONF $DBUS_SYSTEM_PATH$DBUS_CONF 31 | 32 | install -vDm644 $APP_DIR$DBUS_SERVICE $DBUS_SERVICES_PATH$DBUS_SERVICE 33 | 34 | echo "Installation was successful" 35 | 36 | -------------------------------------------------------------------------------- /src/helper/readwrite.h: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2022 Dmitry Serov 2 | * 3 | * This file is part of MControlCenter. 4 | * 5 | * MControlCenter is free software: you can redistribute it and/or 6 | * modify it under the terms of the GNU General Public License as 7 | * published by the Free Software Foundation, either version 3 of 8 | * the License, or (at your option) any later version. 9 | * 10 | * MControlCenter is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License along 16 | * with MControlCenter. If not, see . 17 | */ 18 | 19 | #ifndef READWRITE_H 20 | #define READWRITE_H 21 | 22 | #include 23 | 24 | class ReadWrite { 25 | using BYTE = unsigned char; 26 | public: 27 | ReadWrite(); 28 | QByteArray readFromFile() const; 29 | void writeToFile(int pos, BYTE value) const; 30 | bool isAcpiEc() const; 31 | bool isEcSys() const; 32 | }; 33 | 34 | #endif // READWRITE_H 35 | -------------------------------------------------------------------------------- /src/resources.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | images/mcontrolcenter.png 4 | 5 | 6 | i18n/MControlCenter_de_DE.qm 7 | i18n/MControlCenter_en.qm 8 | i18n/MControlCenter_es.qm 9 | i18n/MControlCenter_eu.qm 10 | i18n/MControlCenter_fr.qm 11 | i18n/MControlCenter_hu.qm 12 | i18n/MControlCenter_it.qm 13 | i18n/MControlCenter_nb.qm 14 | i18n/MControlCenter_nl_NL.qm 15 | i18n/MControlCenter_pt_BR.qm 16 | i18n/MControlCenter_pt_PT.qm 17 | i18n/MControlCenter_ru.qm 18 | i18n/MControlCenter_tr.qm 19 | i18n/MControlCenter_vi.qm 20 | i18n/MControlCenter_zh_CN.qm 21 | 22 | 23 | -------------------------------------------------------------------------------- /resources/mcontrolcenter.appdata.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | mcontrolcenter 4 | CC0 5 | GPL-3.0-or-later 6 | MControlCenter 7 | Application for changing the settings of MSI laptops 8 | 9 | MControlCenter is a Free and Open Source GNU/Linux application 10 | that allows you to change the settings of MSI laptops. 11 | 12 | 13 | mcontrolcenter 14 | 15 | 16 | 17 | https://github.com/dmitry-s93/MControlCenter/raw/main/docs/img/screenshot_info.png 18 | 19 | 20 | https://github.com/dmitry-s93/MControlCenter/raw/main/docs/img/screenshot_battery.png 21 | 22 | 23 | Dmitry Serov 24 | https://github.com/dmitry-s93/MControlCenter 25 | https://github.com/dmitry-s93/MControlCenter/issues 26 | https://github.com/dmitry-s93/MControlCenter/tree/main/src/i18n 27 | 28 | -------------------------------------------------------------------------------- /src/settings.h: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2022 Dmitry Serov 2 | * 3 | * This file is part of MControlCenter. 4 | * 5 | * MControlCenter is free software: you can redistribute it and/or 6 | * modify it under the terms of the GNU General Public License as 7 | * published by the Free Software Foundation, either version 3 of 8 | * the License, or (at your option) any later version. 9 | * 10 | * MControlCenter is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License along 16 | * with MControlCenter. If not, see . 17 | */ 18 | 19 | #ifndef MCONTROLCENTER_SETTINGS_H 20 | #define MCONTROLCENTER_SETTINGS_H 21 | 22 | 23 | #include 24 | 25 | class Settings { 26 | public: 27 | QVariant getValue(const QString &key); 28 | QVector getValueVector(const QString &key); 29 | static void setValue(const QString &key, const QVariant &value); 30 | static void setValue(const QString &key, const QVector &value); 31 | bool isValueExist(const QString &key); 32 | }; 33 | 34 | 35 | #endif //MCONTROLCENTER_SETTINGS_H 36 | -------------------------------------------------------------------------------- /src/helper/mcontrolcenter-helper.conf: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/helper/helper.h: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2022 Dmitry Serov 2 | * 3 | * This file is part of MControlCenter. 4 | * 5 | * MControlCenter is free software: you can redistribute it and/or 6 | * modify it under the terms of the GNU General Public License as 7 | * published by the Free Software Foundation, either version 3 of 8 | * the License, or (at your option) any later version. 9 | * 10 | * MControlCenter is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License along 16 | * with MControlCenter. If not, see . 17 | */ 18 | 19 | #ifndef HELPER_H 20 | #define HELPER_H 21 | 22 | #include "service.h" 23 | 24 | #include 25 | #include 26 | #include 27 | 28 | using BYTE = unsigned char; 29 | 30 | class Helper : public QDBusAbstractAdaptor { 31 | Q_OBJECT 32 | Q_CLASSINFO("D-Bus Interface", INTERFACE_NAME) 33 | public: 34 | explicit Helper(QObject *obj) : QDBusAbstractAdaptor(obj) {} 35 | 36 | signals: 37 | void aboutToQuit(); 38 | 39 | public slots: 40 | Q_NOREPLY void quit() const; 41 | [[nodiscard]] QByteArray getData() const; 42 | Q_NOREPLY void putValue(const int &address, const int &value) const; 43 | [[nodiscard]] bool isEcSysModuleLoaded() const; 44 | [[nodiscard]] bool loadEcSysModule() const; 45 | }; 46 | 47 | #endif // HELPER_H 48 | -------------------------------------------------------------------------------- /src/helper.h: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2022 Dmitry Serov 2 | * 3 | * This file is part of MControlCenter. 4 | * 5 | * MControlCenter is free software: you can redistribute it and/or 6 | * modify it under the terms of the GNU General Public License as 7 | * published by the Free Software Foundation, either version 3 of 8 | * the License, or (at your option) any later version. 9 | * 10 | * MControlCenter is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License along 16 | * with MControlCenter. If not, see . 17 | */ 18 | 19 | #ifndef HELPER_H 20 | #define HELPER_H 21 | 22 | #include 23 | #include 24 | 25 | using BYTE = unsigned char; 26 | 27 | class Helper : public QObject { 28 | Q_OBJECT 29 | public: 30 | Helper(); 31 | 32 | bool isEcSysModuleLoaded(); 33 | bool loadEcSysModule(); 34 | bool updateData(); 35 | void updateDataAsync(); 36 | std::optional getOptionalValue(int address) const; 37 | int getValue(int address) const; 38 | QByteArray getValues(int startAddress, int size) const; 39 | void putValue(int address, int value); 40 | void quit(); 41 | QDBusInterface *iface; 42 | private: 43 | void printError(QDBusError const & error) const; 44 | private slots: 45 | void callFinishedSlot(QDBusPendingCallWatcher *call); 46 | }; 47 | 48 | #endif // HELPER_H 49 | -------------------------------------------------------------------------------- /src/helper/readwrite.cpp: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2022 Dmitry Serov 2 | * 3 | * This file is part of MControlCenter. 4 | * 5 | * MControlCenter is free software: you can redistribute it and/or 6 | * modify it under the terms of the GNU General Public License as 7 | * published by the Free Software Foundation, either version 3 of 8 | * the License, or (at your option) any later version. 9 | * 10 | * MControlCenter is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License along 16 | * with MControlCenter. If not, see . 17 | */ 18 | 19 | #include "readwrite.h" 20 | #include 21 | 22 | #include 23 | 24 | const QString acpi_ec_file = "/dev/ec"; 25 | const QString ec_sys_file = "/sys/kernel/debug/ec/ec0/io"; 26 | QString ioFile = ec_sys_file; 27 | 28 | ReadWrite::ReadWrite() = default; 29 | 30 | QByteArray ReadWrite::readFromFile() const { 31 | if (QFile file(ioFile); file.open(QIODevice::ReadOnly)) 32 | return file.readAll(); 33 | return {}; 34 | } 35 | 36 | void ReadWrite::writeToFile(const int pos, BYTE value) const { 37 | std::ofstream file(ioFile.toStdString(), std::ios::in | std::ios::out | std::ios::binary); 38 | if (file.is_open()) { 39 | file.seekp(pos); 40 | file << value; 41 | } 42 | } 43 | 44 | bool ReadWrite::isAcpiEc() const { 45 | if (QFile::exists(acpi_ec_file)) { 46 | ioFile = acpi_ec_file; 47 | return true; 48 | } 49 | return false; 50 | } 51 | 52 | bool ReadWrite::isEcSys() const { 53 | if (QFile::exists(ec_sys_file)) { 54 | ioFile = ec_sys_file; 55 | return true; 56 | } 57 | return false; 58 | } 59 | -------------------------------------------------------------------------------- /src/main.cpp: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2022 Dmitry Serov 2 | * 3 | * This file is part of MControlCenter. 4 | * 5 | * MControlCenter is free software: you can redistribute it and/or 6 | * modify it under the terms of the GNU General Public License as 7 | * published by the Free Software Foundation, either version 3 of 8 | * the License, or (at your option) any later version. 9 | * 10 | * MControlCenter is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License along 16 | * with MControlCenter. If not, see . 17 | */ 18 | 19 | #include "mainwindow.h" 20 | #include 21 | #include 22 | #include 23 | 24 | int main(int argc, char *argv[]) { 25 | const QString serviceName = "io.github.dmitry_s93.MControlCenter"; 26 | 27 | if (QDBusConnection::sessionBus().interface()->isServiceRegistered(serviceName)) { 28 | fprintf(stderr, "Another instance of the application is already running\n"); 29 | return 0; 30 | } 31 | 32 | if (!QDBusConnection::sessionBus().registerService(serviceName)) { 33 | fprintf(stderr, "Failed to register D-Bus service\n"); 34 | return 1; 35 | } 36 | 37 | QApplication a(argc, argv); 38 | 39 | QTranslator translator; 40 | const QStringList uiLanguages = QLocale::system().uiLanguages(); 41 | for (const QString &locale: uiLanguages) { 42 | const QString baseName = "lang_" + QLocale(locale).name(); 43 | if (translator.load(":/translations/" + baseName)) { 44 | QApplication::installTranslator(&translator); 45 | break; 46 | } 47 | } 48 | 49 | MainWindow w; 50 | 51 | return QApplication::exec(); 52 | } 53 | -------------------------------------------------------------------------------- /src/settings.cpp: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2022 Dmitry Serov 2 | * 3 | * This file is part of MControlCenter. 4 | * 5 | * MControlCenter is free software: you can redistribute it and/or 6 | * modify it under the terms of the GNU General Public License as 7 | * published by the Free Software Foundation, either version 3 of 8 | * the License, or (at your option) any later version. 9 | * 10 | * MControlCenter is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License along 16 | * with MControlCenter. If not, see . 17 | */ 18 | 19 | #include 20 | #include 21 | #include "settings.h" 22 | 23 | QSettings settings("MControlCenter"); 24 | 25 | QVariant Settings::getValue(const QString &key) { 26 | return settings.value(key); 27 | } 28 | 29 | QVector Settings::getValueVector(const QString &key) { 30 | QVector value; 31 | std::stringstream string_stream(settings.value(key).toString().toStdString()); 32 | while (string_stream.good()) { 33 | std::string a; 34 | getline(string_stream, a, '|'); 35 | value.append(std::stoi(a)); 36 | } 37 | return value; 38 | } 39 | 40 | void Settings::setValue(const QString &key, const QVariant &value) { 41 | if (settings.value(key) == value) 42 | return; 43 | settings.setValue(key, value); 44 | settings.sync(); 45 | } 46 | 47 | void Settings::setValue(const QString &key, const QVector &value) { 48 | QString resValue; 49 | for (int i = 0; i < value.size(); i++) { 50 | resValue.append(QString::number(value[i])); 51 | if (i < value.size() - 1) 52 | resValue.append("|"); 53 | } 54 | if (settings.value(key) == resValue) 55 | return; 56 | settings.setValue(key, resValue); 57 | settings.sync(); 58 | } 59 | 60 | bool Settings::isValueExist(const QString &key) { 61 | if (settings.contains(key)) 62 | return true; 63 | return false; 64 | } -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 3.25) 2 | 3 | project(MControlCenter VERSION 0.5.1 LANGUAGES CXX) 4 | 5 | set(CMAKE_INCLUDE_CURRENT_DIR ON) 6 | 7 | set(CMAKE_AUTOUIC ON) 8 | set(CMAKE_AUTOMOC ON) 9 | set(CMAKE_AUTORCC ON) 10 | 11 | set(CMAKE_CXX_STANDARD 20) 12 | set(CMAKE_CXX_STANDARD_REQUIRED ON) 13 | 14 | add_compile_options(-fPIC) 15 | 16 | find_package(Qt6 6.4 REQUIRED COMPONENTS Widgets LinguistTools DBus) 17 | 18 | set(PROJECT_SOURCES 19 | src/main.cpp 20 | src/mainwindow.ui 21 | src/mainwindow.cpp src/mainwindow.h 22 | src/operate.cpp src/operate.h 23 | src/helper.cpp src/helper.h 24 | src/msi-ec_helper.cpp src/msi-ec_helper.h 25 | src/settings.cpp src/settings.h 26 | src/resources.qrc 27 | ) 28 | 29 | set(TS_FILES 30 | MControlCenter_de_DE.ts 31 | MControlCenter_en.ts 32 | MControlCenter_es.ts 33 | MControlCenter_eu.ts 34 | MControlCenter_fi_FI.ts 35 | MControlCenter_fr.ts 36 | MControlCenter_hu.ts 37 | MControlCenter_it.ts 38 | MControlCenter_nb.ts 39 | MControlCenter_nl_NL.ts 40 | MControlCenter_pt_BR.ts 41 | MControlCenter_pt_PT.ts 42 | MControlCenter_ru.ts 43 | MControlCenter_tr.ts 44 | MControlCenter_vi.ts 45 | MControlCenter_zh_CN.ts 46 | ) 47 | 48 | find_program(LUPDATE_EXECUTABLE lupdate lupdate6 lupdate-qt6 PATHS /lib/qt6/bin/ REQUIRED) 49 | find_program(LRELEASE_EXECUTABLE lrelease lrelease6 lrelease-qt6 PATHS /lib/qt6/bin/ REQUIRED) 50 | 51 | foreach(_ts_file ${TS_FILES}) 52 | execute_process(COMMAND 53 | ${LUPDATE_EXECUTABLE} 54 | ${CMAKE_SOURCE_DIR} 55 | -ts ${CMAKE_SOURCE_DIR}/src/i18n/${_ts_file} 56 | -source-language en_US -no-obsolete -locations none 57 | COMMAND_ERROR_IS_FATAL ANY 58 | ) 59 | execute_process(COMMAND 60 | ${LRELEASE_EXECUTABLE} 61 | ${CMAKE_SOURCE_DIR}/src/i18n/${_ts_file} 62 | COMMAND_ERROR_IS_FATAL ANY 63 | ) 64 | endforeach() 65 | if(Qt6_FOUND) 66 | qt_add_executable(mcontrolcenter 67 | MANUAL_FINALIZATION 68 | ${PROJECT_SOURCES} 69 | ) 70 | # Define target properties for Android with Qt 6 as: 71 | # set_property(TARGET mcontrolcenter APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR 72 | # ${CMAKE_CURRENT_SOURCE_DIR}/android) 73 | # For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation 74 | else() 75 | if(ANDROID) 76 | add_library(mcontrolcenter SHARED 77 | ${PROJECT_SOURCES} 78 | ) 79 | # Define properties for Android with Qt 5 after find_package() calls as: 80 | # set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android") 81 | else() 82 | add_executable(mcontrolcenter 83 | ${PROJECT_SOURCES} 84 | ) 85 | endif() 86 | endif() 87 | 88 | target_link_libraries(mcontrolcenter PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::DBus) 89 | 90 | install(TARGETS mcontrolcenter 91 | BUNDLE DESTINATION . 92 | LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) 93 | 94 | add_subdirectory(src/helper ${CMAKE_BINARY_DIR}/helper) 95 | add_definitions(-DMControlCenter_VERSION="${PROJECT_VERSION}") 96 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | ## Unreleased 6 | 7 | ## [0.4.1] 2023-08-09 8 | - Fixed UI lags when resizing the window (issue https://github.com/dmitry-s93/MControlCenter/issues/97) 9 | - Updated Norwegian Bokmål (Thanks [msigurdsen](https://github.com/msigurdsen)) 10 | - Added support for German language (Thanks [EchterAlsFake](https://github.com/EchterAlsFake)) 11 | - Added support for Hungarian language (Thanks [BiRo96](https://github.com/BiRo96)) 12 | 13 | ## [0.4.0] 2023-03-06 14 | - Added fan control support 15 | - Updated Norwegian Bokmål (Thanks [msigurdsen](https://github.com/msigurdsen)) 16 | - Updated Spanish translation (Thanks [rottenpants466](https://www.github.com/rottenpants466)) 17 | - Updated Italian translation (Thanks [rottenpants466](https://www.github.com/rottenpants466)) 18 | - Updated Portuguese translation (Thanks [rottenpants466](https://www.github.com/rottenpants466)) 19 | 20 | ## [0.3.2] 2022-11-28 21 | - Added fan mode display 22 | - Added description on mode tab 23 | - Added "Cooler Boost" item to tray menu 24 | - Added support for [acpi_ec](https://github.com/musikid/acpi_ec) kernel module 25 | - Added support for Italian language (Thanks [marraviglioso](https://github.com/marraviglioso)) 26 | - Added support for Portuguese (Brazilian) language (Thanks [rottenpants466](https://www.github.com/rottenpants466)) 27 | - Updated Spanish translation (Thanks [rottenpants466](https://www.github.com/rottenpants466)) 28 | - Updated Portuguese translation (Thanks [rottenpants466](https://www.github.com/rottenpants466)) 29 | - Fixed display of the window when clicking the tray icon if the application was minimized 30 | 31 | ## [0.3.1] 2022-11-04 32 | - Added support for Norwegian Bokmål (Thanks [msigurdsen](https://github.com/msigurdsen)) 33 | - Added support for Turkish language (Thanks [emrgncr](https://github.com/emrgncr)) 34 | - Corrected display of the current battery level 35 | - Fixed fan 1 speed display for some devices 36 | - Fixed "FN <-> Super" for some devices (Issue https://github.com/dmitry-s93/MControlCenter/issues/53) 37 | 38 | ## [0.3.0] 2022-10-28 39 | - Added support for Spanish language (Thanks [ssergio-ll](https://www.github.com/ssergio-ll)) 40 | - Ability to set the battery charge limit from 30% to 100% in steps of 1 41 | - Prevent launching more than one instance 42 | - Added application icon to system tray 43 | - Added saving and restoring settings 44 | - Some optimizations 45 | - Fixed turning on/off webcam 46 | 47 | ## [0.2.0] 2022-10-16 48 | - Added mode change (High Performance, Balanced, Silent, Super Battery) 49 | - Added support for Portuguese language (Thanks [rottenpants466](https://www.github.com/rottenpants466)) 50 | - Run helper as D-BUS service 51 | - Some optimizations 52 | - Fixed typos 53 | 54 | ## [0.1.2] 2022-10-02 55 | 56 | - GUI improvements 57 | - Some optimizations 58 | - Added link to bug tracker 59 | - Added "Fully charged" battery status 60 | - Added "Fully charged (Discharging)" battery status 61 | 62 | ## [0.1.1] 2022-09-21 63 | 64 | - Added charging status display 65 | - Added localization support 66 | - Added support for Russian language 67 | - Some optimizations 68 | 69 | ## [0.1.0 alpha] 2022-09-12 70 | 71 | - First release 72 | -------------------------------------------------------------------------------- /src/helper/helper.cpp: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2022 Dmitry Serov 2 | * 3 | * This file is part of MControlCenter. 4 | * 5 | * MControlCenter is free software: you can redistribute it and/or 6 | * modify it under the terms of the GNU General Public License as 7 | * published by the Free Software Foundation, either version 3 of 8 | * the License, or (at your option) any later version. 9 | * 10 | * MControlCenter is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License along 16 | * with MControlCenter. If not, see . 17 | */ 18 | 19 | #include "helper.h" 20 | #include "msi-ec.h" 21 | #include "readwrite.h" 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | 28 | ReadWrite rw; 29 | 30 | void Helper::quit() const { 31 | QTimer::singleShot(0, QCoreApplication::instance(), &QCoreApplication::quit); 32 | } 33 | 34 | QByteArray Helper::getData() const { 35 | return rw.readFromFile(); 36 | } 37 | 38 | void Helper::putValue(const int &address, const int &value) const { 39 | if (value >= 0 && value <= 255) 40 | rw.writeToFile(address, value); 41 | else 42 | fprintf(stderr, "tried to input invalid value. Address: %d, value: %d\n", address, value); 43 | } 44 | 45 | bool Helper::isEcSysModuleLoaded() const { 46 | if (rw.isEcSys()) { 47 | return true; 48 | } 49 | if (rw.isAcpiEc()) { 50 | fprintf(stderr, "%s\n", qPrintable("The acpi_ec kernel module is loaded")); 51 | return true; 52 | } 53 | fprintf(stderr, "%s\n", qPrintable("The ec_sys kernel module is not loaded")); 54 | return false; 55 | } 56 | 57 | bool Helper::loadEcSysModule() const { 58 | fprintf(stderr, "%s\n", qPrintable("Trying to load the ec_sys kernel module")); 59 | auto *process = new QProcess(); 60 | process->start("sh", QStringList() << "-c" << "/usr/sbin/modprobe ec_sys write_support=1 2>&1"); 61 | process->waitForFinished(1000); 62 | if (QByteArray output = process->readAllStandardOutput(); output != "") 63 | fprintf(stderr, "%s", qPrintable(output)); 64 | if (isEcSysModuleLoaded()) 65 | return true; 66 | return false; 67 | } 68 | 69 | int main(int argc, char *argv[]) { 70 | QCoreApplication a(argc, argv); 71 | 72 | QObject obj; 73 | auto *helper = new Helper(&obj); 74 | QObject::connect(&a, &QCoreApplication::aboutToQuit, helper, &Helper::aboutToQuit); 75 | helper->setProperty("value", "initial value"); 76 | QDBusConnection::systemBus().registerObject("/", &obj); 77 | 78 | QObject objMsiEc; 79 | auto *helperMsiEc = new MsiEc(&objMsiEc); 80 | QDBusConnection::systemBus().registerObject("/msi_ec", &objMsiEc); 81 | 82 | if (!QDBusConnection::systemBus().registerService(SERVICE_NAME)) { 83 | fprintf(stderr, "%s\n", qPrintable(QDBusConnection::systemBus().lastError().message())); 84 | exit(1); 85 | } 86 | 87 | return QCoreApplication::exec(); 88 | } 89 | -------------------------------------------------------------------------------- /src/helper.cpp: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2022 Dmitry Serov 2 | * 3 | * This file is part of MControlCenter. 4 | * 5 | * MControlCenter is free software: you can redistribute it and/or 6 | * modify it under the terms of the GNU General Public License as 7 | * published by the Free Software Foundation, either version 3 of 8 | * the License, or (at your option) any later version. 9 | * 10 | * MControlCenter is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License along 16 | * with MControlCenter. If not, see . 17 | */ 18 | 19 | #include "helper/service.h" 20 | #include "helper.h" 21 | #include "mainwindow.h" 22 | 23 | #include 24 | #include 25 | 26 | #include 27 | 28 | #define EC_SPACE_SIZE 256 29 | 30 | QByteArray ecData; 31 | 32 | Helper::Helper() { 33 | if (!QDBusConnection::systemBus().isConnected()) { 34 | fprintf(stderr, "Cannot connect to the D-Bus system bus"); 35 | return; 36 | } 37 | iface = new QDBusInterface(SERVICE_NAME, "/", INTERFACE_NAME, QDBusConnection::systemBus()); 38 | } 39 | 40 | bool Helper::isEcSysModuleLoaded() { 41 | if (QDBusReply reply = iface->call("isEcSysModuleLoaded"); reply.isValid()) 42 | return reply.value(); 43 | printError(iface->lastError()); 44 | return false; 45 | } 46 | 47 | bool Helper::loadEcSysModule() { 48 | if (QDBusReply reply = iface->call("loadEcSysModule"); reply.isValid()) 49 | return reply.value(); 50 | printError(iface->lastError()); 51 | return false; 52 | } 53 | 54 | bool Helper::updateData() { 55 | if (QDBusReply reply = iface->call("getData"); reply.isValid() && 56 | reply.value().size() == EC_SPACE_SIZE) { 57 | ecData = reply.value(); 58 | return true; 59 | } 60 | printError(iface->lastError()); 61 | return false; 62 | } 63 | 64 | void Helper::updateDataAsync() { 65 | QDBusPendingCall async = iface->asyncCall("getData"); 66 | QDBusPendingCallWatcher const *watcher = new QDBusPendingCallWatcher(async, this); 67 | 68 | QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)),this, SLOT(callFinishedSlot(QDBusPendingCallWatcher*))); 69 | } 70 | 71 | void Helper::callFinishedSlot(QDBusPendingCallWatcher *call) { 72 | QDBusPendingReply reply = *call; 73 | if (reply.isError()) { 74 | printError(reply.error()); 75 | MainWindow::setUpdateDataError(true); 76 | } else { 77 | ecData = reply.value(); 78 | MainWindow::setUpdateDataError(false); 79 | } 80 | call->deleteLater(); 81 | } 82 | 83 | std::optional Helper::getOptionalValue(int address) const { 84 | if (!ecData.isEmpty()) 85 | return (BYTE) ecData[address]; 86 | return std::nullopt; 87 | } 88 | 89 | int Helper::getValue(int address) const { 90 | return getOptionalValue(address).value_or(-1); 91 | } 92 | 93 | QByteArray Helper::getValues(int startAddress, int size) const { 94 | return ecData.mid(startAddress, size); 95 | } 96 | 97 | void Helper::putValue(int address, int value) { 98 | if (getValue(address) == value) 99 | return; 100 | iface->call("putValue", address, value); 101 | printError(iface->lastError()); 102 | } 103 | 104 | void Helper::quit() { 105 | iface->call("quit"); 106 | printError(iface->lastError()); 107 | } 108 | 109 | void Helper::printError(QDBusError const & error) const { 110 | if (error.isValid()) 111 | fprintf(stderr, "Call failed: %s\n", qPrintable(error.message())); 112 | } 113 | -------------------------------------------------------------------------------- /src/operate.h: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2022 Dmitry Serov 2 | * 3 | * This file is part of MControlCenter. 4 | * 5 | * MControlCenter is free software: you can redistribute it and/or 6 | * modify it under the terms of the GNU General Public License as 7 | * published by the Free Software Foundation, either version 3 of 8 | * the License, or (at your option) any later version. 9 | * 10 | * MControlCenter is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License along 16 | * with MControlCenter. If not, see . 17 | */ 18 | 19 | #ifndef OPERATE_H 20 | #define OPERATE_H 21 | 22 | 23 | #include 24 | #include 25 | 26 | enum class charging_state { 27 | battery_charging, 28 | battery_discharging, 29 | battery_not_charging, 30 | battery_fully_charged, 31 | battery_unknown 32 | }; 33 | 34 | enum class shift_mode { 35 | eco_mode, 36 | comfort_mode, 37 | sport_mode, 38 | turbo_mode, 39 | unknown_mode 40 | }; 41 | 42 | enum class user_mode { 43 | performance_mode, 44 | balanced_mode, 45 | silent_mode, 46 | super_battery_mode, 47 | unknown_mode 48 | }; 49 | 50 | enum class fan_mode { 51 | auto_fan_mode, 52 | silent_fan_mode, 53 | basic_fan_mode, 54 | advanced_fan_mode, 55 | unknown_fan_mode 56 | }; 57 | 58 | class Operate { 59 | public: 60 | Operate(); 61 | void closeHelperApp() const; 62 | [[nodiscard]] bool isEcSysModuleLoaded() const; 63 | [[nodiscard]] bool isMsiEcLoaded() const; 64 | [[nodiscard]] bool loadEcSysModule() const; 65 | [[nodiscard]] bool updateEcData() const; 66 | void updateEcDataAsync() const; 67 | bool doProbe() const; 68 | [[nodiscard]] std::string getEcVersion() const; 69 | [[nodiscard]] std::string getEcBuild() const; 70 | [[nodiscard]] int getBatteryCharge() const; 71 | [[nodiscard]] int getBatteryThreshold() const; 72 | [[nodiscard]] charging_state getChargingStatus() const; 73 | [[nodiscard]] int getCpuTemp() const; 74 | [[nodiscard]] std::optional getGpuTemp() const; 75 | [[nodiscard]] int getFan1Speed() const; 76 | [[nodiscard]] std::optional getFan2Speed() const; 77 | [[nodiscard]] QVector getFan1SpeedSettings() const; 78 | [[nodiscard]] QVector getFan2SpeedSettings() const; 79 | [[nodiscard]] QVector getFan1TempSettings() const; 80 | [[nodiscard]] QVector getFan2TempSettings() const; 81 | 82 | [[nodiscard]] int getKeyboardBacklightMode() const; 83 | [[nodiscard]] int getKeyboardBrightness() const; 84 | [[nodiscard]] bool getUsbPowerShareState() const; 85 | [[nodiscard]] bool getWebCamState() const; 86 | [[nodiscard]] bool getFnSuperSwapState() const; 87 | [[nodiscard]] bool getCoolerBoostState() const; 88 | [[nodiscard]] user_mode getUserMode() const; 89 | [[nodiscard]] fan_mode getFanMode() const; 90 | 91 | void setBatteryThreshold(int value) const; 92 | void setKeyboardBacklightMode(int value) const; 93 | void setKeyboardBrightness(int value) const; 94 | void setUsbPowerShareState(bool enabled) const; 95 | void setWebCamState(bool enabled) const; 96 | void setFnSuperSwapState(bool enabled) const; 97 | void setCoolerBoostState(bool enabled) const; 98 | void setUserMode(user_mode userMode) const; 99 | void setFan1SpeedSettings(QVector value) const; 100 | void setFan2SpeedSettings(QVector value) const; 101 | void setFan1TempSettings(QVector value) const; 102 | void setFan2TempSettings(QVector value) const; 103 | void setFanMode(int value) const; 104 | void setFanModeAdvanced(bool enabled) const; 105 | 106 | [[nodiscard]] int getValue(int address) const; 107 | void setValue(int address, int value) const; 108 | 109 | [[nodiscard]] bool isBatteryThresholdSupport() const; 110 | [[nodiscard]] bool isKeyboardBacklightModeSupport() const; 111 | [[nodiscard]] bool isKeyboardBacklightSupport() const; 112 | [[nodiscard]] bool isUsbPowerShareSupport() const; 113 | [[nodiscard]] bool isWebCamOffSupport() const; 114 | 115 | void loadSettings() const; 116 | void handleWakeEvent() const; 117 | 118 | void putSuperBatteryModeValue(bool enabled) const; 119 | private: 120 | int detectFan1Address() const; 121 | int detectBatteryThresholdAddress() const; 122 | int detectFanModeAddress() const; 123 | int detectKeyboardBacklightAddress() const; 124 | }; 125 | 126 | #endif // OPERATE_H 127 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MControlCenter 2 | 3 | MControlCenter is a Free and Open Source GNU/Linux application that allows you to change the settings of MSI laptops. 4 | 5 |  6 | 7 | 8 | 9 | 10 | ## Features 11 | 12 | - CPU and GPU temperature display 13 | - Fan speed display 14 | - Switch between modes (Since version 0.2): 15 | - High Performance 16 | - Balanced 17 | - Silent 18 | - Super Battery 19 | - Change the maximum battery level limit 20 | - Advanced Fan Speed Control (Since version 0.4) 21 | - Change other settings such as keyboard backlight mode, USB Power Share, etc. 22 | 23 | ## TODO 24 | 25 | - Saving multiple fan speed profiles 26 | - Automatically change performance mode on charger connect/disconnect 27 | 28 | ## Supported devices 29 | 30 | With version 0.5.0 the app uses the msi-ec driver that comes with the linux kernel (you might need to reinstall the driver), so device support depends on whether the kernel driver supports your device or not. 31 | 32 | [**List of tested devices by msi-ec**](https://github.com/BeardOverflow/msi-ec/discussions/277) 33 | 34 | If your device is not on the list, follow the steps on the `msi-ec` github page and open an issue there to add support for your device. 35 | 36 | ## Installation 37 | 38 | ### Pre-Installation 39 | 40 | - Check the output of ```cat /sys/devices/platform/msi-ec/shift_mode``` in your terminal, if it says ```No such file or directory``` it means that you need to install or reinstall (uninstall first then install) the [msi-ec driver](https://github.com/BeardOverflow/msi-ec?tab=readme-ov-file#installation). or the application will open **but will have limited functionality!** 41 | 42 | - If you're not installing from the packages, You'll need to install `libqt6widgets6` or its equivalent on your distribution (```qt6-base``` for example). **the application will fail to open without it!** 43 | 44 | 45 | 46 | - to get temperature and fan curve support, you'll need to install `ec_sys`, which comes installed on most distributions, or `acpi_sys` (fedora) with `write_support=1`. the app can still work with only `msi-ec` installed. 47 | 48 | ### Installation from packages 49 | 50 | 1. Download the correct package for your distribution from the [releases page](https://github.com/dmitry-s93/MControlCenter/releases/) 51 | 2. Double click to open it in the software manager (ex. Discover or GNOME software) 52 | 3. Install 53 | 54 | ### If your distribution is not listed, use the generic installer: 55 | 56 | 1. Download MControlCenter-x.x.x.tar.gz from the [releases page](https://github.com/dmitry-s93/MControlCenter/releases/) 57 | 2. Unpack the archive with the program 58 | 3. Open a terminal in the unpacked directory 59 | 4. Run the script `sudo ./install` 60 | 5. (Optional) `sudo ./uninstall` to uninstall 61 | 62 | **Note:** Below are the steps for compiling, usually needed if your distrobution ships old versions of Qt6 63 | 64 | ## Building from source 65 | After installing the main package (```qt6-base``` or ```libqt6widgets6```), you'll need to install other packages to build the app. 66 | 67 | For ubuntru/Linux mint: 68 | ```qt6-base-dev``` and/or ```qt6-tools-dev``` also ```build-essential``` 69 | 70 | For Arch ```qt6-tools``` And for fedora ```qt6-qttools``` 71 | 72 | After you install the packages: 73 | 74 | Make sure the app is completely closed if it was installed before (check if there is a system tray icon and close it). 75 | 76 | Download the source code and extract the zip file. 77 | 78 | Open the ```scripts``` folder. 79 | 80 | Open a terminal inside the folder, then run these scripts in order: 81 | 82 | 1. ```build``` 83 | 2. ```create installer``` 84 | 85 | If things went well, you should see a compressed file, 86 | 87 | 4. Extract it. 88 | 5. Open a terminal inside the new folder 89 | 6. Run the **UNINSTALL** script as *sudo*, it might fail if you don't have MCC installed. thats fine. 90 | 7. Run the **INSTALL** script as *sudo*, the last line should be a confirmation that the install was successful. 91 | 8. Check your apps, McontrolCenter should be there. 92 | 93 | If the installation was successful but the app fails to run, open a terminal and type ```mcontrolcenter```, copy the output and open an issue (**IF** there isn't one already). 94 | 95 | ## Launch MControlCenter on session startup 96 | 97 | To restore settings after a reboot, add MControlCenter to startup. 98 | 99 | Execute this command on a terminal: 100 | 101 | `cp /usr/share/applications/mcontrolcenter.desktop ~/.config/autostart/mcontrolcenter.desktop` 102 | 103 | ## Localization 104 | 105 | You can help translate the MControlCenter app into your native language 106 | 107 | 1. Copy `/src/i18n/MControlCenter_en.ts` to `src/i18n/MControlCenter_xx.ts` where xx is language code into which the translation is being made. 108 | 2. Open `MControlCenter_xx.ts` in text editor and change `language="en_US"` to your language code. 109 | 3. Translate strings into your language directly in a text editor or use the QT Linguist app or Lokalize. 110 | 4. Translate `GenericName` in app shortcut `resources/mcontrolcenter.desktop`. To do this, add the line `GenericName[xx]=translated generic name`. 111 | 5. Open a pull request on github. 112 | -------------------------------------------------------------------------------- /src/msi-ec_helper.h: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2022 Jérôme Lécuyer, Dmitry Serov 2 | * 3 | * This file is part of MControlCenter. 4 | * 5 | * MControlCenter is free software: you can redistribute it and/or 6 | * modify it under the terms of the GNU General Public License as 7 | * published by the Free Software Foundation, either version 3 of 8 | * the License, or (at your option) any later version. 9 | * 10 | * MControlCenter is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License along 16 | * with MControlCenter. If not, see . 17 | */ 18 | 19 | #ifndef MSI_EC_HELPER_H 20 | #define MSI_EC_HELPER_H 21 | 22 | #include "operate.h" 23 | #include 24 | #include 25 | 26 | class MsiEcHelper : public QObject { 27 | Q_OBJECT 28 | public: 29 | MsiEcHelper(); 30 | 31 | [[nodiscard]] bool isMsiEcModuleLoaded(); 32 | 33 | // webcam on/off 34 | [[nodiscard]] bool hasWebcam() const; 35 | [[nodiscard]] bool getWebcam() const; 36 | Q_NOREPLY void setWebcam(bool enable) const; 37 | 38 | // webcam_block on/off 39 | [[nodiscard]] bool hasWebcamBlock() const; 40 | [[nodiscard]] bool getWebcamBlock() const; 41 | Q_NOREPLY void setWebcamBlock(bool enable) const; 42 | 43 | // fn_win_swap swap/no swap 44 | [[nodiscard]] bool hasFnWinSwap() const; 45 | [[nodiscard]] bool getFnWinSwap() const; 46 | Q_NOREPLY void setFnWinSwap(bool swap) const; 47 | 48 | // cooler_boost 49 | [[nodiscard]] bool hasCoolerBoost() const; 50 | [[nodiscard]] bool getCoolerBoost() const; 51 | Q_NOREPLY void setCoolerBoost(bool enable) const; 52 | 53 | // shift_mode & available_shift_modes 54 | [[nodiscard]] bool hasShiftMode() const; 55 | [[nodiscard]] QList getAvailableShiftModes() const; 56 | [[nodiscard]] shift_mode getShiftMode() const; 57 | Q_NOREPLY void setShiftMode(shift_mode mode) const; 58 | 59 | // super_battery 60 | [[nodiscard]] bool hasSuperBattery() const; 61 | [[nodiscard]] bool getSuperBattery() const; 62 | Q_NOREPLY void setSuperBattery(bool enable) const; 63 | 64 | // fan_mode & available_fan_modes 65 | [[nodiscard]] bool hasFanMode() const; 66 | [[nodiscard]] QList getAvailableFanModes() const; 67 | [[nodiscard]] fan_mode getFanMode() const; 68 | Q_NOREPLY void setFanMode(fan_mode mode) const; 69 | 70 | // fw_version 71 | [[nodiscard]] QString getFWVersion() const; 72 | // fw_release_date 73 | [[nodiscard]] QString getFWReleaseDate() const; 74 | 75 | // cpu/realtime_temperature 0-100 (celsius scale) 76 | [[nodiscard]] bool hasCPURealtimeTemperature() const; 77 | [[nodiscard]] int getCPURealtimeTemperature() const; 78 | // cpu/realtime_fan_speed 0-100 (percent) 79 | [[nodiscard]] bool hasCPURealtimeFanSpeed() const; 80 | [[nodiscard]] int getCPURealtimeFanSpeed() const; 81 | // cpu/basic_fan_speed 0-100 (percent) 82 | [[nodiscard]] bool hasCPUBasicFanSpeed() const; 83 | [[nodiscard]] int getCPUBasicFanSpeed() const; 84 | Q_NOREPLY void setCPUBasicFanSpeed(int value) const; 85 | 86 | // gpu/realtime_temperature 0-100 (celsius scale) 87 | [[nodiscard]] bool hasGPURealtimeTemperature() const; 88 | [[nodiscard]] std::optional getGPURealtimeTemperature() const; 89 | // gpu/realtime_fan_speed 0-100 (percent) 90 | [[nodiscard]] bool hasGPURealtimeFanSpeed() const; 91 | [[nodiscard]] std::optional getGPURealtimeFanSpeed() const; 92 | 93 | // BAT1/charge_control_start_threshold 0-100 (percent) 94 | [[nodiscard]] bool hasBatteryStartThreshold() const; 95 | [[nodiscard]] int getBatteryStartThreshold() const; 96 | Q_NOREPLY void setBatteryStartThreshold(int value) const; 97 | 98 | // BAT1/charge_control_end_threshold 0-100 (percent) 99 | [[nodiscard]] bool hasBatteryEndThreshold() const; 100 | [[nodiscard]] int getBatteryEndThreshold() const; 101 | Q_NOREPLY void setBatteryEndThreshold(int value) const; 102 | 103 | // BAT1/capacity 0-100 (percent) 104 | [[nodiscard]] bool hasBatteryCapacity() const; 105 | [[nodiscard]] int getBatteryCapacity() const; 106 | 107 | // BAT1/status 108 | [[nodiscard]] bool hasBatteryStatus() const; 109 | [[nodiscard]] QString getBatteryStatus() const; 110 | 111 | // kbd_backlight/brightness 0-3 112 | [[nodiscard]] bool hasKeyboardBacklightBrightness() const; 113 | [[nodiscard]] int getKeyboardBacklightBrightness() const; 114 | Q_NOREPLY void setKeyboardBacklightBrightness(int value) const; 115 | 116 | private: 117 | QDBusInterface *iface; 118 | void printError(QDBusError const &error) const; 119 | 120 | template 121 | [[nodiscard]] std::optional getOptionalValue(QString method) const; 122 | template 123 | [[nodiscard]] T getValue(QString method, T defaultValue) const; 124 | template 125 | Q_NOREPLY void setValue(QString method, T value) const; 126 | }; 127 | 128 | #endif // MSI_EC_HELPER_H 129 | -------------------------------------------------------------------------------- /src/mainwindow.h: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2022 Dmitry Serov 2 | * 3 | * This file is part of MControlCenter. 4 | * 5 | * MControlCenter is free software: you can redistribute it and/or 6 | * modify it under the terms of the GNU General Public License as 7 | * published by the Free Software Foundation, either version 3 of 8 | * the License, or (at your option) any later version. 9 | * 10 | * MControlCenter is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License along 16 | * with MControlCenter. If not, see . 17 | */ 18 | 19 | #ifndef MAINWINDOW_H 20 | #define MAINWINDOW_H 21 | 22 | #include 23 | #include 24 | #include 25 | #include 26 | #include 27 | 28 | QT_BEGIN_NAMESPACE 29 | namespace Ui { class MainWindow; } 30 | QT_END_NAMESPACE 31 | 32 | class MainWindow : public QMainWindow { 33 | Q_OBJECT 34 | 35 | public: 36 | explicit MainWindow(QWidget *parent = nullptr); 37 | ~MainWindow(); 38 | void updateData(); 39 | static void setUpdateDataError(bool error); 40 | 41 | private: 42 | Ui::MainWindow *ui; 43 | 44 | void setTabsEnabled(bool enabled); 45 | void startRealtimeUpdate() const; 46 | void stopRealtimeUpdate() const; 47 | void setUpdateInterval(int msec) const; 48 | void realtimeUpdate(); 49 | void loadConfigs(); 50 | 51 | [[nodiscard]] QString intToQString(int value) const; 52 | void updateBatteryCharge(); 53 | void updateBatteryThreshold(); 54 | void updateChargingStatus(); 55 | void updateCpuTemp(); 56 | void updateGpuTemp(); 57 | void updateFan1Speed(); 58 | void updateFan2Speed(); 59 | void updateKeyboardBacklightMode(); 60 | void updateKeyboardBrightness() const; 61 | void updateUsbPowerShareState(); 62 | void updateWebCamState() const; 63 | void updateFnSuperSwapState(); 64 | void updateCoolerBoostState() const; 65 | void updateUserMode(); 66 | void updateFanMode(); 67 | void updateFanSpeedSettings(); 68 | 69 | void setBestMobility(); 70 | void setBalancedBattery(); 71 | void setBestBattery(); 72 | 73 | void setHighPerformanceMode(); 74 | void setBalancedMode(); 75 | void setSilentMode(); 76 | void setSuperBatteryMode(); 77 | 78 | void setCoolerBoostState(bool enabled) const; 79 | 80 | QVector getFan1SpeedValues() const; 81 | QVector getFan2SpeedValues() const; 82 | QVector getFan1TempValues() const; 83 | QVector getFan2TempValues() const; 84 | void setFanSpeedSettings(); 85 | void setFanModeAdvanced(bool enabled) const; 86 | void checkFanSettingsChanged() const; 87 | 88 | void showEvent(QShowEvent *event); 89 | void closeEvent(QCloseEvent *event); 90 | void quitApp() const; 91 | 92 | QTimer timerSleepWatcher; 93 | qint64 timeLastWatcherInterval = 0; 94 | void timerSleepTimeout(); 95 | 96 | void createTrayIcon(); 97 | void createActions(); 98 | void iconActivated(QSystemTrayIcon::ActivationReason reason); 99 | void saveStateRequest(QSessionManager &sessionManager); 100 | 101 | QSystemTrayIcon *trayIcon = nullptr;; 102 | QMenu *trayIconMenu = nullptr; 103 | QMenu *modeTrayMenu = nullptr; 104 | QMenu *fanTrayMenu = nullptr; 105 | QMenu *batteryTrayMenu = nullptr; 106 | 107 | QAction *coolerBoostAction = nullptr; 108 | 109 | QAction *highPerformanceMode = nullptr; 110 | QAction *balancedMode = nullptr; 111 | QAction *silentMode = nullptr; 112 | QAction *superBatteryMode = nullptr; 113 | 114 | QAction *bestMobilityAction = nullptr; 115 | QAction *balancedBatteryAction = nullptr; 116 | QAction *bestBatteryAction = nullptr; 117 | 118 | QAction *restoreAction = nullptr; 119 | QAction *quitAction = nullptr; 120 | 121 | private slots: 122 | void on_bestMobilityRadioButton_toggled(bool checked); 123 | void on_balancedBatteryRadioButton_toggled(bool checked); 124 | void on_bestBatteryRadioButton_toggled(bool checked); 125 | void on_customBatteryThresholdRadioButton_toggled(bool checked); 126 | void on_customBatteryThresholdSpinBox_valueChanged(int arg1); 127 | void on_customBatteryApplyButton_clicked(); 128 | void on_ReadValueButton_clicked(); 129 | 130 | void on_WriteValueButton_clicked() const; 131 | 132 | void on_usbPowerShareCheckBox_clicked(bool checked) const; 133 | void on_webCamCheckBox_clicked(bool checked) const; 134 | 135 | void on_fnSuperSwapCheckBox_clicked(bool checked) const; 136 | 137 | void on_coolerBoostCheckBox_clicked(bool checked) const; 138 | 139 | void on_keyboardBrightnessSlider_valueChanged(int value) const; 140 | 141 | void on_keyboardBacklightModeComboBox_currentIndexChanged(int index) const; 142 | 143 | void on_highPerformanceModeRadioButton_toggled(bool checked); 144 | void on_balancedModeRadioButton_toggled(bool checked); 145 | void on_silentModeRadioButton_toggled(bool checked); 146 | void on_superBatteryModeRadioButton_toggled(bool checked); 147 | }; 148 | #endif // MAINWINDOW_H 149 | -------------------------------------------------------------------------------- /resources/mcontrolcenter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 77 | -------------------------------------------------------------------------------- /src/helper/msi-ec.h: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2022 Jérôme Lécuyer, Dmitry Serov 2 | * 3 | * This file is part of MControlCenter. 4 | * 5 | * MControlCenter is free software: you can redistribute it and/or 6 | * modify it under the terms of the GNU General Public License as 7 | * published by the Free Software Foundation, either version 3 of 8 | * the License, or (at your option) any later version. 9 | * 10 | * MControlCenter is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License along 16 | * with MControlCenter. If not, see . 17 | */ 18 | 19 | #ifndef MSI_EC_H 20 | #define MSI_EC_H 21 | 22 | #include "service.h" 23 | 24 | #include 25 | #include 26 | #include 27 | 28 | /** 29 | * Interface for [msi-ec by BeardOverflow](https://github.com/BeardOverflow/msi-ec/) 30 | */ 31 | class MsiEc : public QDBusAbstractAdaptor { 32 | Q_OBJECT 33 | Q_CLASSINFO("D-Bus Interface", INTERFACE_NAME_MSI_EC) 34 | public: 35 | explicit MsiEc(QObject *parent) : QDBusAbstractAdaptor(parent) {} 36 | 37 | private: 38 | QString readFile(QString path) const; 39 | bool readFileOnOff(QString path) const; 40 | void writeFile(QString path, QString value) const; 41 | void writeFileOnOff(QString path, bool on) const; 42 | 43 | public slots: 44 | [[nodiscard]] bool isMsiEcModuleLoaded() const; 45 | 46 | // webcam on/off 47 | [[nodiscard]] bool hasWebcam() const; 48 | [[nodiscard]] bool getWebcam() const; 49 | Q_NOREPLY void setWebcam(bool enable) const; 50 | 51 | // webcam_block on/off 52 | [[nodiscard]] bool hasWebcamBlock() const; 53 | [[nodiscard]] bool getWebcamBlock() const; 54 | Q_NOREPLY void setWebcamBlock(bool enable) const; 55 | 56 | // fn_key left/right 57 | [[nodiscard]] bool hasFnKey() const; 58 | [[nodiscard]] QString getFnKey() const; 59 | Q_NOREPLY void setFnKey(QString side) const; 60 | // win_key left/right 61 | [[nodiscard]] bool hasWinKey() const; 62 | [[nodiscard]] QString getWinKey() const; 63 | Q_NOREPLY void setWinKey(QString side) const; 64 | // fn_win_swap swap/no swap 65 | [[nodiscard]] bool hasFnWinSwap() const; 66 | [[nodiscard]] bool getFnWinSwap() const; 67 | Q_NOREPLY void setFnWinSwap(bool swap) const; 68 | 69 | // cooler_boost 70 | [[nodiscard]] bool hasCoolerBoost() const; 71 | [[nodiscard]] bool getCoolerBoost() const; 72 | Q_NOREPLY void setCoolerBoost(bool enable) const; 73 | 74 | // shift_mode & available_shift_modes 75 | [[nodiscard]] bool hasShiftMode() const; 76 | [[nodiscard]] QString getAvailableShiftModes() const; 77 | [[nodiscard]] QString getShiftMode() const; 78 | Q_NOREPLY void setShiftMode(QString mode) const; 79 | 80 | // super_battery 81 | [[nodiscard]] bool hasSuperBattery() const; 82 | [[nodiscard]] bool getSuperBattery() const; 83 | Q_NOREPLY void setSuperBattery(bool enable) const; 84 | 85 | // fan_mode & available_fan_modes 86 | [[nodiscard]] bool hasFanMode() const; 87 | [[nodiscard]] QString getAvailableFanModes() const; 88 | [[nodiscard]] QString getFanMode() const; 89 | Q_NOREPLY void setFanMode(QString mode) const; 90 | 91 | // fw_version 92 | [[nodiscard]] QString getFWVersion() const; 93 | // fw_release_date 94 | [[nodiscard]] QString getFWReleaseDate() const; 95 | 96 | // cpu/realtime_temperature 0-100 (celsius scale) 97 | [[nodiscard]] bool hasCPURealtimeTemperature() const; 98 | [[nodiscard]] int getCPURealtimeTemperature() const; 99 | // cpu/realtime_fan_speed 0-100 (percent) 100 | [[nodiscard]] bool hasCPURealtimeFanSpeed() const; 101 | [[nodiscard]] int getCPURealtimeFanSpeed() const; 102 | // cpu/basic_fan_speed 0-100 (percent) 103 | [[nodiscard]] bool hasCPUBasicFanSpeed() const; 104 | [[nodiscard]] int getCPUBasicFanSpeed() const; 105 | Q_NOREPLY void setCPUBasicFanSpeed(int value) const; 106 | 107 | // gpu/realtime_temperature 0-100 (celsius scale) 108 | [[nodiscard]] bool hasGPURealtimeTemperature() const; 109 | [[nodiscard]] int getGPURealtimeTemperature() const; 110 | // gpu/realtime_fan_speed 0-100 (percent) 111 | [[nodiscard]] bool hasGPURealtimeFanSpeed() const; 112 | [[nodiscard]] int getGPURealtimeFanSpeed() const; 113 | 114 | // BAT1/charge_control_start_threshold 0-100 (percent) 115 | [[nodiscard]] bool hasBatteryStartThreshold() const; 116 | [[nodiscard]] int getBatteryStartThreshold() const; 117 | Q_NOREPLY void setBatteryStartThreshold(int value) const; 118 | 119 | // BAT1/charge_control_end_threshold 0-100 (percent) 120 | [[nodiscard]] bool hasBatteryEndThreshold() const; 121 | [[nodiscard]] int getBatteryEndThreshold() const; 122 | Q_NOREPLY void setBatteryEndThreshold(int value) const; 123 | 124 | // BAT1/capacity 0-100 (percent) 125 | [[nodiscard]] bool hasBatteryCapacity() const; 126 | [[nodiscard]] int getBatteryCapacity() const; 127 | 128 | // BAT1/status 129 | [[nodiscard]] bool hasBatteryStatus() const; 130 | [[nodiscard]] QString getBatteryStatus() const; 131 | 132 | // kbd_backlight/brightness 0-3 133 | [[nodiscard]] bool hasKeyboardBacklightBrightness() const; 134 | [[nodiscard]] int getKeyboardBacklightBrightness() const; 135 | Q_NOREPLY void setKeyboardBacklightBrightness(int value) const; 136 | }; 137 | 138 | #endif // MSI_EC_H 139 | -------------------------------------------------------------------------------- /docs/tested_devices.md: -------------------------------------------------------------------------------- 1 | # List of tested devices 2 | 3 | | Device | EC Version | Functions | Settings | 4 | |-------------------------------|-------------------------|------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------| 5 | | MSI Crosshair 17 B12UGZ | 17L3EMS1.106 01/01/2022 | ✔ Mode ✔ Battery Limit ✔ Cooler Boost ✔ Fan Control | ✔ Keyboard Backlit ✔ FN -> Super ✔ Webcam ❌ USB Power Share | 6 | | MSI Summit E16 Flip Evo A13VET| 1594EMS1.108 03/22/2023 | ✔ Mode ✔ Battery Limit ✔ Cooler Boost ✔ Fan Control | ✔ Keyboard Backlit ✔ FN -> Super ✔ Webcam ✔ USB Power Share | 7 | | MSI Summit E16 Flip Evo A12MT | 1592EMS1.111 06/29/2022 | ✔ Mode ✔ Battery Limit ✔ Cooler Boost ✔ Fan Control | ✔ Keyboard Backlit ✔ FN -> Super ✔ Webcam ✔ USB Power Share | 8 | | MSI Summit E16 Flip A12UCT | E1592IMS.10C 08/19/2022 | ✔ Mode ✔ Battery Limit ✔ Cooler Boost ❓ Fan Control | ✔ Keyboard Backlit ✔ FN -> Super ✔ Webcam ✔ USB Power Share | 9 | | MSI GS75 Stealth 8SE | 17G1EMS1.107 07/12/2019 | ❌ Mode ✔ Battery Limit ✔ Cooler Boost ❓ Fan Control | ❌ Keyboard Backlit ❌ FN -> Super ❌ Webcam ❌ USB Power Share | 10 | | MSI Stealth 14 Studio A13VF | 14K1EMS1.108 04/23/2024 | ✔ Mode ✔ Battery Limit ✔ Cooler Boost ✔ Fan Control | ❌ Keyboard Backlit ✔ FN -> Super ✔ Webcam ❌ USB Power Share | 11 | | MSI Stealth 15M A11SEK | 1562EMS1.115 06/25/2021 | ❓ Mode ✔ Battery Limit ✔ Cooler Boost ❓ Fan Control | ❌ Keyboard Backlit ✔ FN -> Super ❓ Webcam ❓ USB Power Share | 12 | | MSI Stealth 16 Studio A13V | E15F2IMS.10D 08/27/2023 | ✔ Mode ✔ Battery Limit ✔ Cooler Boost ✔ Fan Control | ❌ Keyboard Backlit ✔ FN -> Super ✔ Webcam ❌ USB Power Share | 13 | | MSI Modern 15 A11M | 1552EMS1.118 07/21/2021 | ✔ Mode ✔ Battery Limit ✔ Cooler Boost ❓ Fan Control | ✔ Keyboard Backlit (auto turn off not working) ✔ FN -> Super ✔ Webcam ❌ USB Power Share | 14 | | MSI Modern 15 A11SB | 1552EMS1.120 01/11/2022 | ✔ Mode ✔ Battery Limit ✔ Cooler Boost ✔ Fan Control | ✔ Keyboard Backlit (auto turn off not working) ✔ FN -> Super ✔ Webcam ❌ USB Power Share (greyed out) | 15 | | MSI Prestige 14 Evo | 14C4EMS1.120 04/25/2022 | ✔ Mode ✔ Battery Limit ✔ Cooler Boost ❓ Fan Control | ✔ Keyboard Backlit (auto turn off not working) ✔ FN -> Super ❌ Webcam (greyed out) ❌ USB Power Share (greyed out) | 16 | | MSI Summit E13 Flip Evo A11MT | 13P2EMS1.110 09/08/2021 | ✔ Mode ✔ Battery Limit ✔ Cooler Boost ❓ Fan Control | ✔ Keyboard Backlit ✔ FN -> Super ✔ Webcam ❌ USB Power Share (greyed out) | 17 | | MSI GF63 Thin 11UC-866IN | 16R6EMS1.104 11/14/2021 | ✔ Mode ✔ Battery Limit ✔ Cooler Boost ❓ Fan Control | ✔ Keyboard Backlit (auto turn off not working) ✔ FN -> Super ✔ Webcam ❌ USB Power Share (greyed out) | 18 | | MSI PS63 Modern 8RC | E16S1IMS.106 12/24/2018 | ❌ Mode (greyed out) ✔ Battery Limit ✔ Cooler Boost ❓ Fan Control | ❌ Keyboard Backlit (greyed out) ✔ FN -> Super ✔ Webcam ❌ USB Power Share (greyed out) | 19 | | MSI Vector GP66 12UGSO | 1544EMS1.112 | ✔ Mode ✔ Battery Limit ✔ Cooler Boost ✔ Fan Control | ❌ Keyboard Backlit ✔ FN -> Super ✔ Webcam ❌ USB Power Share (greyed out) 20 | | MSI GF65 Thin 9SD-890IN | E16W1IMS.10C 22/04/2024 | ❌ Mode (greyed out) ✔ Battery Limit ✔ Cooler Boost ❓ Fan Control (need more testing) | ❌ Keyboard Backlit (greyed out) ✔ FN -> Super ✔ Webcam ❌ USB Power Share (greyed out) 21 | | MSI GF65 Thin 10UE | 16W2EMS1.101 12/15/2020 | ❌ Mode (everything's greyed out) ✔ Battery Limit ✔ Cooler Boost ❓ Fan Control | ❌ Keyboard Backlit (greyed out) ❓ FN -> Super (Not greyed out, but doesn't affect anything when ticked) ✔ Webcam ❓ USB Power Share (Not greyed out, but doesn't affect anything when ticked) | 22 | | MSI GF65 Thin 10SDR | E16W1IMS.50C 11/19/2020 | ❌ Mode (everything's greyed out) ✔ Battery Limit ✔ Cooler Boost ✔ Fan Control | ❌ Keyboard Backlit (greyed out) ❓ FN -> Super (Not greyed out, but doesn't affect anything when ticked) ✔ Webcam ❌ USB Power Share (greyed out) | 23 | | MSI Modern 15 B5M | 15HKEMS1.103 06/29/2022 | ❌ Mode (everything's greyed out) ❓ Battery Limit ✔ Cooler Boost ❓ Fan Control | ❌ Keyboard Backlit (greyed out) ❓ FN -> Super (Not greyed out, but doesn't affect anything when ticked) ✔ Webcam ❓ USB Power Share | 24 | | MSI Katana GF66 12UD | 1584EMS1.110 06/21/2022 | ✔ Mode ✔ Battery Limit ✔ Cooler Boost ✔ Fan Control | ✔ Keyboard Backlit ✔ FN -> Super ✔ Webcam ✔ USB Power Share | 25 | | MSI Summit E14Evo A12M | 1594EMS1.118 03/22/2023 | ✔ Mode ✔ Battery Limit ✔ Cooler Boost ✔ Fan Control | ✔ Keyboard Backlit ✔ FN -> Super ✔ Webcam ✔ USB Power Share | 26 | | MSI Summit E14 Flip Evo A12MT | 14F1EMS1.115 09/13/2022 | ✔ Mode ✔ Battery Limit ✔ Cooler Boost ❌ Fan Control | ✔ Keyboard Backlit ✔ FN -> Super ✔ Webcam ✔ USB Power Share | 27 | | MSI Delta 15 A5EFK | 15CKEMS1.108 02/09/2021 | ❌ Mode (everything's greyed out) ✔ Battery Limit ✔ Cooler Boost ✔ Fan Control | ❌ Keyboard Backlit ❓ FN -> Super (Not greyed out, but doesn't affect anything when ticked) ✔ Webcam ❌ USB Power Share (greyed out)| 28 | | MSI Summit E13 Flip Evo A13MT | 13P3EMS1.50B 01/17/2023 | ✔ Mode ✔ Battery Limit ✔ Cooler Boost ❓ Fan Control | ✔ Keyboard Backlit ✔ FN -> Super ✔ Webcam ✔ USB Power Share 29 | | MSI Alpha B5EEK | 158LEMS1.106 08/17/2021 | ❌ Mode ✔ Battery Limit ✔ Cooler Boost ✔/❌ Fan Control: Fan 1 (CPU) = NO, Fan 2 (GPU) = YES | ❌ Keyboard Backlit (greyed out) ❌ FN -> Super (nothing changes) ✔ Webcam ❌ USB Power Share (greyed out) 30 | | MSI Bravo 15 A4DDR | 16WKEMS1.105 09/16/2020 | ❌ Mode ✔ Battery Limit ✔ Cooler Boost ✔ Fan Control | ❌ Keyboard Backlit (greyed out, uses address 0xF3) ❌ FN -> Super (nothing changes, uses address 0xBF) ✔ Webcam ❌ USB Power Share | 31 | | MSI Bravo B5DD | 158KEMS1.104 05/19/2021 | ❌ Mode ✔ Battery Limit ✔ Cooler Boost ✔ Fan Control | ❌ Keyboard Backlit ❌ FN -> Super ✔ Webcam ❌ USB Power Share 32 | | MSI GS66 12-UGS | E16V5IMS.10F 06/14/2023 | ❓ Mode ✔ Battery Limit ✔ Cooler Boost ✔/❌ Fan Control(cpu-ok, gpu-not) | ❌ Keyboard Backlit ✔ FN -> Super ✔ Webcam ❓ USB Power Share 33 | | MSI GS66 Stealth 10SE-044 | 16V1EMS1.118 02/04/2021 | ❌ Mode ✔ Battery Limit ✔ Cooler Boost ✔ Fan Control | ❌ Keyboard Backlit ❌ FN -> Super ✔ Webcam ❌ USB Power Share 34 | | MSI GL65 Leopard 10SCXR | 16U8EMS1.100 12/20/2019 | ❌ Mode (everything's greyed out) ✔ Battery Limit ✔ Cooler Boost ✔ Fan Control | ❌ Keyboard Backlit (greyed out) ❓ FN -> Super (Not greyed out, but doesn't affect anything when ticked) ✔ Webcam ❌ USB Power Share (greyed out) 35 | | MSI GF75 Thin 10SC | 17F6EMS1.103 03/22/2021 | ❌ Mode (everything's greyed out) ✔ Battery Limit ✔ Cooler Boost ❓ Fan Control | ❌ Keyboard Backlit (greyed out) ❓ FN -> Super (Not greyed out, but doesn't affect anything when ticked) ✔ Webcam ✔ USB Power Share 36 | | MSI Prestige 15 A10SC | E16S3IMS.108 | ❌ Mode ✔ Battery Limit ✔ Cooler Boost ✔/❌ Fan Control: Fan 1 = YES, Fan 2 = NO | ❌ Keyboard Backlit (greyed out) ❌ FN -> Super (nothing changes) ✔ Webcam ❌ USB Power Share (greyed out) 37 | | MSI GF75 Thin 10SCXR | 17F4EMS1.101 09/14/2020 | ❌ Mode (everything's greyed out) ✔ Battery Limit ✔ Cooler Boost ✔ Fan Control | ❌ Keyboard Backlit (greyed out) ❓ FN -> Super (Not greyed out, but doesn't affect anything when ticked) ✔ Webcam ❌ USB Power Share 38 | | MSI Cyborg 15 A12VE | 15K1IMS1.104 12/26/2022 | ✔ Mode ✔ Battery Limit ✔ Cooler Boost ✔ Fan Control | ✔ Keyboard Backlit ✔ FN -> Super ✔ Webcam ❓ USB Power Share 39 | | MSI GE66 RAIDER 10SFS | 1541EMS1.111 08/20/2020 | ❌ Mode ✔ Battery Limit ✔ Cooler Boost ✔ Fan Control | ❌ Keyboard Backlit ✔ FN -> Super ✔ Webcam ❓ USB Power Share 40 | 41 | If the table does not contain the device you are using, then you can add it. 42 | -------------------------------------------------------------------------------- /src/helper/msi-ec.cpp: -------------------------------------------------------------------------------- 1 | /* Copyright (C) 2022 Jérôme Lécuyer, Dmitry Serov 2 | * 3 | * This file is part of MControlCenter. 4 | * 5 | * MControlCenter is free software: you can redistribute it and/or 6 | * modify it under the terms of the GNU General Public License as 7 | * published by the Free Software Foundation, either version 3 of 8 | * the License, or (at your option) any later version. 9 | * 10 | * MControlCenter is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License along 16 | * with MControlCenter. If not, see . 17 | */ 18 | 19 | #include "msi-ec.h" 20 | #include 21 | 22 | // Available entries: https://github.com/BeardOverflow/msi-ec?tab=readme-ov-file#usage 23 | const QString msi_ec_path = "/sys/devices/platform/msi-ec"; 24 | const QString msi_ec_webcam = msi_ec_path + "/webcam"; 25 | const QString msi_ec_webcam_block = msi_ec_path + "/webcam_block"; 26 | const QString msi_ec_fn_key = msi_ec_path + "/fn_key"; 27 | const QString msi_ec_win_key = msi_ec_path + "/win_key"; 28 | const QString msi_ec_cooler_boost = msi_ec_path + "/cooler_boost"; 29 | const QString msi_ec_available_shift_modes = msi_ec_path + "/available_shift_modes"; 30 | const QString msi_ec_shift_mode = msi_ec_path + "/shift_mode"; 31 | const QString msi_ec_super_battery = msi_ec_path + "/super_battery"; 32 | const QString msi_ec_available_fan_modes = msi_ec_path + "/available_fan_modes"; 33 | const QString msi_ec_fan_mode = msi_ec_path + "/fan_mode"; 34 | const QString msi_ec_fw_version = msi_ec_path + "/fw_version"; 35 | const QString msi_ec_fw_release_date = msi_ec_path + "/fw_release_date"; 36 | const QString msi_ec_cpu_realtime_temperature = msi_ec_path + "/cpu/realtime_temperature"; 37 | const QString msi_ec_cpu_realtime_fan_speed = msi_ec_path + "/cpu/realtime_fan_speed"; 38 | const QString msi_ec_cpu_basic_fan_speed = msi_ec_path + "/cpu/basic_fan_speed"; 39 | const QString msi_ec_gpu_realtime_temperature = msi_ec_path + "/gpu/realtime_temperature"; 40 | const QString msi_ec_gpu_realtime_fan_speed = msi_ec_path + "/gpu/realtime_fan_speed"; 41 | const QString msi_ec_bat1 = "/sys/class/power_supply/BAT1"; 42 | const QString msi_ec_bat1_start_threshold = msi_ec_bat1 + "/charge_control_start_threshold"; 43 | const QString msi_ec_bat1_end_threshold = msi_ec_bat1 + "/charge_control_end_threshold"; 44 | const QString msi_ec_bat1_capacity = msi_ec_bat1 + "/capacity"; 45 | const QString msi_ec_bat1_status = msi_ec_bat1 + "/status"; 46 | // /sys/class/leds/platform::/brightness 47 | const QString msi_ec_kbd_backlight_brightness = "/sys/class/leds/msiacpi::kbd_backlight/brightness"; 48 | 49 | QString MsiEc::readFile(QString path) const { 50 | if (QFile file(path); file.exists() && file.open(QIODevice::ReadOnly)) { 51 | // Remove only the last '\n' 52 | return file.readAll().chopped(1); 53 | } 54 | return ""; 55 | } 56 | 57 | bool MsiEc::readFileOnOff(QString path) const { 58 | return readFile(path) == "on"; 59 | } 60 | 61 | void MsiEc::writeFile(QString path, QString value) const { 62 | if (QFile file(path); file.exists() && file.open(QIODevice::WriteOnly)) { 63 | file.write(value.toUtf8()); 64 | } 65 | } 66 | 67 | void MsiEc::writeFileOnOff(QString path, bool on) const { 68 | writeFile(path, on ? "on" : "off"); 69 | } 70 | 71 | bool MsiEc::isMsiEcModuleLoaded() const { 72 | if (QFile::exists(msi_ec_fw_version)) { 73 | return true; 74 | } 75 | fprintf(stderr, "%s\n", qPrintable("The msi_ec kernel module is not loaded")); 76 | return false; 77 | } 78 | 79 | //////////////// webcam //////////////// 80 | 81 | bool MsiEc::hasWebcam() const { 82 | return QFile::exists(msi_ec_webcam); 83 | } 84 | bool MsiEc::getWebcam() const { 85 | return readFileOnOff(msi_ec_webcam); 86 | } 87 | void MsiEc::setWebcam(bool enable) const { 88 | writeFileOnOff(msi_ec_webcam, enable); 89 | } 90 | 91 | //////////////// webcam_block //////////////// 92 | 93 | bool MsiEc::hasWebcamBlock() const { 94 | return QFile::exists(msi_ec_webcam_block); 95 | } 96 | bool MsiEc::getWebcamBlock() const { 97 | return readFileOnOff(msi_ec_webcam_block); 98 | } 99 | void MsiEc::setWebcamBlock(bool enable) const { 100 | writeFileOnOff(msi_ec_webcam_block, enable); 101 | } 102 | 103 | //////////////// fn_key //////////////// 104 | 105 | bool MsiEc::hasFnKey() const { 106 | return QFile::exists(msi_ec_fn_key); 107 | } 108 | QString MsiEc::getFnKey() const { 109 | return readFile(msi_ec_fn_key); 110 | } 111 | void MsiEc::setFnKey(QString side) const { 112 | writeFile(msi_ec_fn_key, side); 113 | } 114 | 115 | //////////////// win_key //////////////// 116 | 117 | bool MsiEc::hasWinKey() const { 118 | return QFile::exists(msi_ec_win_key); 119 | } 120 | QString MsiEc::getWinKey() const { 121 | return readFile(msi_ec_win_key); 122 | } 123 | void MsiEc::setWinKey(QString side) const { 124 | writeFile(msi_ec_win_key, side); 125 | } 126 | 127 | //////////////// fn_win_swap //////////////// 128 | 129 | bool MsiEc::hasFnWinSwap() const { 130 | return hasFnKey(); 131 | } 132 | bool MsiEc::getFnWinSwap() const { 133 | // here we only want to know if the keys are swapped or not 134 | // we don't care if it is left or right 135 | // swap may be inverted on some devices 136 | // it would be better to get the value directly 137 | // (e.g. with a file fn_win_swap) 138 | return getFnKey() == "left"; 139 | } 140 | void MsiEc::setFnWinSwap(bool swap) const { 141 | setFnKey(swap ? "left" : "right"); 142 | } 143 | 144 | //////////////// cooler_boost //////////////// 145 | 146 | bool MsiEc::hasCoolerBoost() const { 147 | return QFile::exists(msi_ec_cooler_boost); 148 | } 149 | bool MsiEc::getCoolerBoost() const { 150 | return readFileOnOff(msi_ec_cooler_boost); 151 | } 152 | void MsiEc::setCoolerBoost(bool enable) const { 153 | writeFileOnOff(msi_ec_cooler_boost, enable); 154 | } 155 | 156 | //////////////// shift_mode //////////////// 157 | 158 | bool MsiEc::hasShiftMode() const { 159 | return QFile::exists(msi_ec_shift_mode); 160 | } 161 | QString MsiEc::getAvailableShiftModes() const { 162 | return readFile(msi_ec_available_shift_modes); 163 | } 164 | QString MsiEc::getShiftMode() const { 165 | return readFile(msi_ec_shift_mode); 166 | } 167 | void MsiEc::setShiftMode(QString mode) const { 168 | writeFile(msi_ec_shift_mode, mode); 169 | } 170 | 171 | //////////////// super_battery //////////////// 172 | 173 | bool MsiEc::hasSuperBattery() const { 174 | return QFile::exists(msi_ec_super_battery); 175 | } 176 | bool MsiEc::getSuperBattery() const { 177 | return readFileOnOff(msi_ec_super_battery); 178 | } 179 | void MsiEc::setSuperBattery(bool enable) const { 180 | writeFileOnOff(msi_ec_super_battery, enable); 181 | } 182 | 183 | //////////////// fan_mode //////////////// 184 | 185 | bool MsiEc::hasFanMode() const { 186 | return QFile::exists(msi_ec_fan_mode); 187 | } 188 | QString MsiEc::getAvailableFanModes() const { 189 | return readFile(msi_ec_available_fan_modes); 190 | } 191 | QString MsiEc::getFanMode() const { 192 | return readFile(msi_ec_fan_mode); 193 | } 194 | void MsiEc::setFanMode(QString mode) const { 195 | writeFile(msi_ec_fan_mode, mode); 196 | } 197 | 198 | //////////////// fw_version //////////////// 199 | 200 | QString MsiEc::getFWVersion() const { 201 | return readFile(msi_ec_fw_version); 202 | } 203 | 204 | //////////////// fw_release_date //////////////// 205 | 206 | QString MsiEc::getFWReleaseDate() const { 207 | return readFile(msi_ec_fw_release_date); 208 | } 209 | 210 | //////////////// CPU //////////////// 211 | 212 | // cpu/realtime_temperature 0-100 (celsius scale) 213 | bool MsiEc::hasCPURealtimeTemperature() const { 214 | return QFile::exists(msi_ec_cpu_realtime_temperature); 215 | } 216 | int MsiEc::getCPURealtimeTemperature() const { 217 | return readFile(msi_ec_cpu_realtime_temperature).toInt(); 218 | } 219 | 220 | // cpu/realtime_fan_speed 0-100 (percent) 221 | bool MsiEc::hasCPURealtimeFanSpeed() const { 222 | return QFile::exists(msi_ec_cpu_realtime_fan_speed); 223 | } 224 | int MsiEc::getCPURealtimeFanSpeed() const { 225 | return readFile(msi_ec_cpu_realtime_fan_speed).toInt(); 226 | } 227 | 228 | // cpu/basic_fan_speed 0-100 (percent) 229 | bool MsiEc::hasCPUBasicFanSpeed() const { 230 | return QFile::exists(msi_ec_cpu_basic_fan_speed); 231 | } 232 | int MsiEc::getCPUBasicFanSpeed() const { 233 | return readFile(msi_ec_cpu_basic_fan_speed).toInt(); 234 | } 235 | void MsiEc::setCPUBasicFanSpeed(int value) const { 236 | writeFile(msi_ec_cpu_basic_fan_speed, QString::number(value)); 237 | } 238 | 239 | //////////////// GPU //////////////// 240 | 241 | // gpu/realtime_temperature 0-100 (celsius scale) 242 | bool MsiEc::hasGPURealtimeTemperature() const { 243 | return QFile::exists(msi_ec_gpu_realtime_temperature); 244 | } 245 | int MsiEc::getGPURealtimeTemperature() const { 246 | return readFile(msi_ec_gpu_realtime_temperature).toInt(); 247 | } 248 | 249 | // gpu/realtime_fan_speed 0-100 (percent) 250 | bool MsiEc::hasGPURealtimeFanSpeed() const { 251 | return QFile::exists(msi_ec_gpu_realtime_fan_speed); 252 | } 253 | int MsiEc::getGPURealtimeFanSpeed() const { 254 | return readFile(msi_ec_gpu_realtime_fan_speed).toInt(); 255 | } 256 | 257 | //////////////// Charge control //////////////// 258 | 259 | // BAT1/charge_control_start_threshold 0-100 (percent) 260 | bool MsiEc::hasBatteryStartThreshold() const { 261 | return QFile::exists(msi_ec_bat1_start_threshold); 262 | } 263 | int MsiEc::getBatteryStartThreshold() const { 264 | return readFile(msi_ec_bat1_start_threshold).toInt(); 265 | } 266 | void MsiEc::setBatteryStartThreshold(int value) const { 267 | writeFile(msi_ec_bat1_start_threshold, QString::number(value)); 268 | } 269 | 270 | // BAT1/charge_control_end_threshold 0-100 (percent) 271 | bool MsiEc::hasBatteryEndThreshold() const { 272 | return QFile::exists(msi_ec_bat1_end_threshold); 273 | } 274 | int MsiEc::getBatteryEndThreshold() const { 275 | return readFile(msi_ec_bat1_end_threshold).toInt(); 276 | } 277 | void MsiEc::setBatteryEndThreshold(int value) const { 278 | writeFile(msi_ec_bat1_end_threshold, QString::number(value)); 279 | } 280 | 281 | // BAT1/capacity 0-100 (percent) 282 | bool MsiEc::hasBatteryCapacity() const { 283 | return QFile::exists(msi_ec_bat1_capacity); 284 | } 285 | 286 | int MsiEc::getBatteryCapacity() const { 287 | return readFile(msi_ec_bat1_capacity).toInt(); 288 | } 289 | 290 | // BAT1/status 0-100 (percent) 291 | bool MsiEc::hasBatteryStatus() const { 292 | return QFile::exists(msi_ec_bat1_status); 293 | } 294 | 295 | QString MsiEc::getBatteryStatus() const { 296 | return readFile(msi_ec_bat1_status); 297 | } 298 | 299 | //////////////// Keyboard Backlight //////////////// 300 | 301 | // kbd_backlight/brightness 0-3 302 | bool MsiEc::hasKeyboardBacklightBrightness() const { 303 | return QFile::exists(msi_ec_kbd_backlight_brightness); 304 | } 305 | int MsiEc::getKeyboardBacklightBrightness() const { 306 | return readFile(msi_ec_kbd_backlight_brightness).toInt(); 307 | } 308 | void MsiEc::setKeyboardBacklightBrightness(int value) const { 309 | writeFile(msi_ec_kbd_backlight_brightness, QString::number(value)); 310 | } 311 | -------------------------------------------------------------------------------- /src/i18n/MControlCenter_zh_CN.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | MainWindow 6 | 7 | EC Version: 8 | EC 版本: 9 | 10 | 11 | EC Build: 12 | EC 内部版本号: 13 | 14 | 15 | Battery charge: 16 | 电池电量: 17 | 18 | 19 | Battery threshold: 20 | 充电上限: 21 | 22 | 23 | CPU temp: 24 | CPU 温度: 25 | 26 | 27 | GPU temp: 28 | GPU 温度: 29 | 30 | 31 | Cooler Boost 32 | 启用 Cooler Boost 33 | 34 | 35 | Battery 36 | 电池 37 | 38 | 39 | Best for Mobility 40 | 最长续航 41 | 42 | 43 | Balanced 44 | 平衡保养 45 | 46 | 47 | Charge the battery when under 70%, stop at 80% 48 | 电量低于 70% 开始充电,充至 80% 停止 49 | 50 | 51 | Best for battery 52 | 最佳保养 53 | 54 | 55 | Charge the battery when under 50%, stop at 60% 56 | 电量低于 50% 开始充电,充至 60% 停止 57 | 58 | 59 | Custom 60 | 自定义上限 61 | 62 | 63 | Always on 64 | 始终开启 65 | 66 | 67 | Auto turn off in 10 sec 68 | 10 秒后熄灭 69 | 70 | 71 | WebCam 72 | 启用内置摄像头 73 | 74 | 75 | Debug 76 | 调试 77 | 78 | 79 | About 80 | 关于 81 | 82 | 83 | Version: 84 | 版本: 85 | 86 | 87 | Charging status: 88 | 充电状态: 89 | 90 | 91 | Charging 92 | 正在充电 93 | 94 | 95 | Discharging 96 | 正在放电 97 | 98 | 99 | Not charging 100 | 未充电 101 | 102 | 103 | Unknown 104 | 未知 105 | 106 | 107 | Swap FN and Super buttons 108 | 交换 FN 与 Super 键(Windows 徽标键)功能 109 | 110 | 111 | Fully charged 112 | 电池已充满 113 | 114 | 115 | rpm 116 | rpm 117 | 118 | 119 | Mode 120 | 工作模式 121 | 122 | 123 | Silent 124 | 安静模式 125 | 126 | 127 | Super Battery 128 | 节能模式 129 | 130 | 131 | Apply 132 | 应用 133 | 134 | 135 | Show 136 | 显示面板 137 | 138 | 139 | Quit 140 | 退出 141 | 142 | 143 | Charge limit 144 | 充电上限 145 | 146 | 147 | Auto 148 | 自动 149 | 150 | 151 | Basic 152 | 基础 153 | 154 | 155 | Advanced 156 | 高级(手动) 157 | 158 | 159 | Cooling 160 | 冷却选项 161 | 162 | 163 | Fan 1 speed 164 | 风扇 1 转速 165 | 166 | 167 | Fan 2 speed 168 | 风扇 2 转速 169 | 170 | 171 | Reset 172 | 复位 173 | 174 | 175 | Fan control 176 | 风扇控制 177 | 178 | 179 | Enable advanced fan control 180 | 启用高级风扇控制 181 | 182 | 183 | Overview 184 | 185 | 186 | 187 | The middle spot between fan noise and power usage 188 | 189 | 190 | 191 | Low fan noise and moderate power usage 192 | 193 | 194 | 195 | Limits performance and turns off fans at lower temperatures 196 | 197 | 198 | 199 | GPU Fan: 200 | 201 | 202 | 203 | CPU Fan: 204 | 205 | 206 | 207 | USB Power 208 | 209 | 210 | 211 | FN ⇄ Meta 212 | 213 | 214 | 215 | Current fan Mode: 216 | 217 | 218 | 219 | Keyboard 220 | 221 | 222 | 223 | <html><head/><body><p><span style=" font-weight:700;">MC</span>ontrol<span style=" font-weight:700;">C</span>enter (MCC) is an application that allows you to change the settings of MSI laptops running Linux.</p><p>MCC acts as a graphical interface for the <span style=" font-weight:700;">MSI-EC </span>driver that already exist in the Linux kernel, if your device is not supported (grey buttons/limited in-app functionality), please visit the msi-ec github page to get help.</p></body></html> 224 | 225 | 226 | 227 | MCC GitHub: 228 | 229 | 230 | 231 | MSI-EC GitHub: 232 | 233 | 234 | 235 | This mode unlocks Advanced fan mode 236 | 237 | 238 | 239 | High Performance 240 | 241 | 242 | 243 | Maximum performance at the cost of heat and increased power consumption 244 | 245 | 246 | 247 | If you mainly use your laptop with the charger plugged most of the time, it is recommended to set the charge capacity at a lower percentage (60% or 80%) to prolong your battery lifecycle. 248 | 249 | 250 | 251 | Charge the battery when under 90%, stop at 100% 252 | 253 | 254 | 255 | Keyboard Backlight 256 | 257 | 258 | 259 | - 260 | 261 | 262 | 263 | MCC Bug Tracker: 264 | 265 | 266 | 267 | Qt version: 268 | 269 | 270 | 271 | MSI-EC Status: 272 | 273 | 274 | 275 | <html><head/><body><p align="center"><span style=" font-weight:700;">Warning</span>: Writing the wrong values to the wrong addresses <span style=" font-weight:700;">WILL BRICK YOUR DEVICE!</span></p><p align="center"><span style=" font-weight:700;">Never</span> write to EC memory without knowing how to do a proper <span style=" font-weight:700;">BIOS/EC</span> reset, keep in mind that a reset <span style=" font-weight:700;">might not</span> fix the device if the device got bricked/broken. </p></body></html> 276 | 277 | 278 | 279 | The msi-ec module is not loaded/installed. 280 | Check the <About> page for more info. 281 | 282 | 283 | 284 | The ec_sys module couldn't be detected, it might be required to control the fans. 285 | 286 | 287 | 288 | Loaded 289 | 290 | 291 | 292 | Fallback: Only ec_sys is loaded 293 | 294 | 295 | 296 | Failed to load both msi-ec/ec_sys 297 | 298 | 299 | 300 | OFF 301 | 302 | 303 | 304 | 305 | -------------------------------------------------------------------------------- /src/i18n/MControlCenter_nb.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | MainWindow 6 | 7 | EC Version: 8 | EC-versjon: 9 | 10 | 11 | EC Build: 12 | EC-build: 13 | 14 | 15 | Battery charge: 16 | Batterinivå: 17 | 18 | 19 | Battery threshold: 20 | Batterigrense: 21 | 22 | 23 | CPU temp: 24 | CPU-temperatur: 25 | 26 | 27 | GPU temp: 28 | GPU-temperatur: 29 | 30 | 31 | Cooler Boost 32 | Cooler Boost 33 | 34 | 35 | Battery 36 | Batteri 37 | 38 | 39 | Best for Mobility 40 | Best for mobilitet 41 | 42 | 43 | Balanced 44 | Balansert 45 | 46 | 47 | Charge the battery when under 70%, stop at 80% 48 | Lad batteriet når under 70%, stopp ved 80% 49 | 50 | 51 | Best for battery 52 | Best for batteri 53 | 54 | 55 | Charge the battery when under 50%, stop at 60% 56 | Lad batteriet når under 50%, stopp ved 60% 57 | 58 | 59 | Custom 60 | Egendefinert 61 | 62 | 63 | Always on 64 | Alltid på 65 | 66 | 67 | Auto turn off in 10 sec 68 | Slå av automatisk om 10 sek 69 | 70 | 71 | WebCam 72 | Webkamera 73 | 74 | 75 | Debug 76 | Feilsøking 77 | 78 | 79 | About 80 | Om 81 | 82 | 83 | Version: 84 | Versjon: 85 | 86 | 87 | Charging status: 88 | Ladestatus: 89 | 90 | 91 | Charging 92 | Lader 93 | 94 | 95 | Discharging 96 | Utlader 97 | 98 | 99 | Not charging 100 | Lader ikke 101 | 102 | 103 | Unknown 104 | Ukjent 105 | 106 | 107 | Swap FN and Super buttons 108 | Bytt om FN- og Super-knapper 109 | 110 | 111 | Fully charged 112 | Fulladet 113 | 114 | 115 | rpm 116 | o/min 117 | 118 | 119 | Mode 120 | Modus 121 | 122 | 123 | Silent 124 | Stille 125 | 126 | 127 | Super Battery 128 | Superbatteri 129 | 130 | 131 | Apply 132 | Bruk 133 | 134 | 135 | Show 136 | Vis 137 | 138 | 139 | Quit 140 | Avslutt 141 | 142 | 143 | Charge limit 144 | Ladegrense 145 | 146 | 147 | Auto 148 | Automatisk 149 | 150 | 151 | Basic 152 | Grunnleggende 153 | 154 | 155 | Advanced 156 | Avansert 157 | 158 | 159 | Cooling 160 | Kjøling 161 | 162 | 163 | Fan 1 speed 164 | Vifte 1 hastighet 165 | 166 | 167 | Fan 2 speed 168 | Vifte 2 hastighet 169 | 170 | 171 | Reset 172 | Nullstill 173 | 174 | 175 | Fan control 176 | Viftekontroll 177 | 178 | 179 | Enable advanced fan control 180 | Aktiver avansert viftekontroll 181 | 182 | 183 | Overview 184 | 185 | 186 | 187 | The middle spot between fan noise and power usage 188 | 189 | 190 | 191 | Low fan noise and moderate power usage 192 | 193 | 194 | 195 | Limits performance and turns off fans at lower temperatures 196 | 197 | 198 | 199 | GPU Fan: 200 | 201 | 202 | 203 | CPU Fan: 204 | 205 | 206 | 207 | USB Power 208 | 209 | 210 | 211 | FN ⇄ Meta 212 | 213 | 214 | 215 | Current fan Mode: 216 | 217 | 218 | 219 | Keyboard 220 | 221 | 222 | 223 | <html><head/><body><p><span style=" font-weight:700;">MC</span>ontrol<span style=" font-weight:700;">C</span>enter (MCC) is an application that allows you to change the settings of MSI laptops running Linux.</p><p>MCC acts as a graphical interface for the <span style=" font-weight:700;">MSI-EC </span>driver that already exist in the Linux kernel, if your device is not supported (grey buttons/limited in-app functionality), please visit the msi-ec github page to get help.</p></body></html> 224 | 225 | 226 | 227 | MCC GitHub: 228 | 229 | 230 | 231 | MSI-EC GitHub: 232 | 233 | 234 | 235 | This mode unlocks Advanced fan mode 236 | 237 | 238 | 239 | High Performance 240 | 241 | 242 | 243 | Maximum performance at the cost of heat and increased power consumption 244 | 245 | 246 | 247 | If you mainly use your laptop with the charger plugged most of the time, it is recommended to set the charge capacity at a lower percentage (60% or 80%) to prolong your battery lifecycle. 248 | 249 | 250 | 251 | Charge the battery when under 90%, stop at 100% 252 | 253 | 254 | 255 | Keyboard Backlight 256 | 257 | 258 | 259 | - 260 | 261 | 262 | 263 | MCC Bug Tracker: 264 | 265 | 266 | 267 | Qt version: 268 | 269 | 270 | 271 | MSI-EC Status: 272 | 273 | 274 | 275 | <html><head/><body><p align="center"><span style=" font-weight:700;">Warning</span>: Writing the wrong values to the wrong addresses <span style=" font-weight:700;">WILL BRICK YOUR DEVICE!</span></p><p align="center"><span style=" font-weight:700;">Never</span> write to EC memory without knowing how to do a proper <span style=" font-weight:700;">BIOS/EC</span> reset, keep in mind that a reset <span style=" font-weight:700;">might not</span> fix the device if the device got bricked/broken. </p></body></html> 276 | 277 | 278 | 279 | The msi-ec module is not loaded/installed. 280 | Check the <About> page for more info. 281 | 282 | 283 | 284 | The ec_sys module couldn't be detected, it might be required to control the fans. 285 | 286 | 287 | 288 | Loaded 289 | 290 | 291 | 292 | Fallback: Only ec_sys is loaded 293 | 294 | 295 | 296 | Failed to load both msi-ec/ec_sys 297 | 298 | 299 | 300 | OFF 301 | 302 | 303 | 304 | 305 | -------------------------------------------------------------------------------- /src/i18n/MControlCenter_nl_NL.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | MainWindow 6 | 7 | EC Version: 8 | EC Versie: 9 | 10 | 11 | EC Build: 12 | EC Build: 13 | 14 | 15 | Battery charge: 16 | Acculading: 17 | 18 | 19 | Battery threshold: 20 | Drempel Accu: 21 | 22 | 23 | CPU temp: 24 | CPU temperatuur: 25 | 26 | 27 | GPU temp: 28 | GPU temperatuur: 29 | 30 | 31 | Cooler Boost 32 | Cooler Boost 33 | 34 | 35 | Battery 36 | Accu 37 | 38 | 39 | Best for Mobility 40 | Beste voor mobiliteit 41 | 42 | 43 | Balanced 44 | Gebalanceerd 45 | 46 | 47 | Charge the battery when under 70%, stop at 80% 48 | Laad de accu als deze onder 70% is, stop bij 80% 49 | 50 | 51 | Best for battery 52 | Beste voor de accu 53 | 54 | 55 | Charge the battery when under 50%, stop at 60% 56 | Laad de accu wanneer deze onder de 50% is, stop bij 60% 57 | 58 | 59 | Custom 60 | Aangepast 61 | 62 | 63 | Always on 64 | Altijd aan 65 | 66 | 67 | Auto turn off in 10 sec 68 | Automatisch in 10 seconden uit 69 | 70 | 71 | WebCam 72 | Camera 73 | 74 | 75 | Debug 76 | Debug 77 | 78 | 79 | About 80 | Over applicatie 81 | 82 | 83 | Version: 84 | Versie: 85 | 86 | 87 | Charging status: 88 | Oplaad Status: 89 | 90 | 91 | Charging 92 | Opladen 93 | 94 | 95 | Discharging 96 | Ontladen 97 | 98 | 99 | Not charging 100 | Laad niet op 101 | 102 | 103 | Unknown 104 | Onbekend 105 | 106 | 107 | Swap FN and Super buttons 108 | Verwissel de FN en Super knoppen 109 | 110 | 111 | Fully charged 112 | Volledig geladen 113 | 114 | 115 | rpm 116 | rpm 117 | 118 | 119 | Mode 120 | Mode 121 | 122 | 123 | Silent 124 | Stil 125 | 126 | 127 | Super Battery 128 | Extreme accu modus 129 | 130 | 131 | Apply 132 | Toepassen 133 | 134 | 135 | Show 136 | Toon 137 | 138 | 139 | Quit 140 | Afsluiten 141 | 142 | 143 | Charge limit 144 | Oplaadlimiet 145 | 146 | 147 | Auto 148 | Automatisch 149 | 150 | 151 | Basic 152 | Basis 153 | 154 | 155 | Advanced 156 | Geavanceerd 157 | 158 | 159 | Cooling 160 | Koelen 161 | 162 | 163 | Fan 1 speed 164 | Snelheid ventilator 1 165 | 166 | 167 | Fan 2 speed 168 | Snelheid ventilator 2 169 | 170 | 171 | Reset 172 | Reset 173 | 174 | 175 | Fan control 176 | Ventilator instellingen 177 | 178 | 179 | Enable advanced fan control 180 | Activeer geavanceerde ventilatorinstellingen 181 | 182 | 183 | Overview 184 | 185 | 186 | 187 | The middle spot between fan noise and power usage 188 | 189 | 190 | 191 | Low fan noise and moderate power usage 192 | 193 | 194 | 195 | Limits performance and turns off fans at lower temperatures 196 | 197 | 198 | 199 | GPU Fan: 200 | 201 | 202 | 203 | CPU Fan: 204 | 205 | 206 | 207 | USB Power 208 | 209 | 210 | 211 | FN ⇄ Meta 212 | 213 | 214 | 215 | Current fan Mode: 216 | 217 | 218 | 219 | Keyboard 220 | 221 | 222 | 223 | <html><head/><body><p><span style=" font-weight:700;">MC</span>ontrol<span style=" font-weight:700;">C</span>enter (MCC) is an application that allows you to change the settings of MSI laptops running Linux.</p><p>MCC acts as a graphical interface for the <span style=" font-weight:700;">MSI-EC </span>driver that already exist in the Linux kernel, if your device is not supported (grey buttons/limited in-app functionality), please visit the msi-ec github page to get help.</p></body></html> 224 | 225 | 226 | 227 | MCC GitHub: 228 | 229 | 230 | 231 | MSI-EC GitHub: 232 | 233 | 234 | 235 | This mode unlocks Advanced fan mode 236 | 237 | 238 | 239 | High Performance 240 | 241 | 242 | 243 | Maximum performance at the cost of heat and increased power consumption 244 | 245 | 246 | 247 | If you mainly use your laptop with the charger plugged most of the time, it is recommended to set the charge capacity at a lower percentage (60% or 80%) to prolong your battery lifecycle. 248 | 249 | 250 | 251 | Charge the battery when under 90%, stop at 100% 252 | 253 | 254 | 255 | Keyboard Backlight 256 | 257 | 258 | 259 | - 260 | 261 | 262 | 263 | MCC Bug Tracker: 264 | 265 | 266 | 267 | Qt version: 268 | 269 | 270 | 271 | MSI-EC Status: 272 | 273 | 274 | 275 | <html><head/><body><p align="center"><span style=" font-weight:700;">Warning</span>: Writing the wrong values to the wrong addresses <span style=" font-weight:700;">WILL BRICK YOUR DEVICE!</span></p><p align="center"><span style=" font-weight:700;">Never</span> write to EC memory without knowing how to do a proper <span style=" font-weight:700;">BIOS/EC</span> reset, keep in mind that a reset <span style=" font-weight:700;">might not</span> fix the device if the device got bricked/broken. </p></body></html> 276 | 277 | 278 | 279 | The msi-ec module is not loaded/installed. 280 | Check the <About> page for more info. 281 | 282 | 283 | 284 | The ec_sys module couldn't be detected, it might be required to control the fans. 285 | 286 | 287 | 288 | Loaded 289 | 290 | 291 | 292 | Fallback: Only ec_sys is loaded 293 | 294 | 295 | 296 | Failed to load both msi-ec/ec_sys 297 | 298 | 299 | 300 | OFF 301 | 302 | 303 | 304 | 305 | -------------------------------------------------------------------------------- /src/i18n/MControlCenter_it.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | MainWindow 6 | 7 | EC Version: 8 | EC Version: 9 | 10 | 11 | EC Build: 12 | EC Build: 13 | 14 | 15 | Battery charge: 16 | Carica batteria: 17 | 18 | 19 | Battery threshold: 20 | Limite di carica batteria: 21 | 22 | 23 | CPU temp: 24 | Temperatura CPU: 25 | 26 | 27 | GPU temp: 28 | Temperatura GPU: 29 | 30 | 31 | Cooler Boost 32 | Cooler Boost 33 | 34 | 35 | Battery 36 | Batteria 37 | 38 | 39 | Best for Mobility 40 | Migliore per mobilità 41 | 42 | 43 | Balanced 44 | Bilanciato 45 | 46 | 47 | Charge the battery when under 70%, stop at 80% 48 | Carica la batteria quando sotto 70%, ferma all'80% 49 | 50 | 51 | Best for battery 52 | Migliore per batteria 53 | 54 | 55 | Charge the battery when under 50%, stop at 60% 56 | Carica la batteria quando sotto 50%, ferma al 60% 57 | 58 | 59 | Custom 60 | Personalizzato 61 | 62 | 63 | Always on 64 | Sempre attivo 65 | 66 | 67 | Auto turn off in 10 sec 68 | Spegni dopo 10 secondi 69 | 70 | 71 | WebCam 72 | WebCam 73 | 74 | 75 | Debug 76 | Debug 77 | 78 | 79 | About 80 | About 81 | 82 | 83 | Version: 84 | Versione: 85 | 86 | 87 | Charging status: 88 | Stato della carica 89 | 90 | 91 | Charging 92 | Caricando 93 | 94 | 95 | Discharging 96 | Scaricando 97 | 98 | 99 | Not charging 100 | Non in carica 101 | 102 | 103 | Unknown 104 | Sconosciuto 105 | 106 | 107 | Swap FN and Super buttons 108 | Scambia tasti FN e Super 109 | 110 | 111 | Fully charged 112 | Completamente carico 113 | 114 | 115 | rpm 116 | rpm 117 | 118 | 119 | Mode 120 | Modalità 121 | 122 | 123 | Silent 124 | Silenzioso 125 | 126 | 127 | Super Battery 128 | Super Batteria 129 | 130 | 131 | Apply 132 | Applica 133 | 134 | 135 | Show 136 | Mostra 137 | 138 | 139 | Quit 140 | Esci 141 | 142 | 143 | Charge limit 144 | Carica limite 145 | 146 | 147 | Auto 148 | Auto 149 | 150 | 151 | Basic 152 | Base 153 | 154 | 155 | Advanced 156 | Avanzato 157 | 158 | 159 | Cooling 160 | Raffreddamento 161 | 162 | 163 | Fan 1 speed 164 | Velocità della ventola 1 165 | 166 | 167 | Fan 2 speed 168 | velocità della ventola 2 169 | 170 | 171 | Reset 172 | Ripristinare 173 | 174 | 175 | Fan control 176 | Controllo della ventola 177 | 178 | 179 | Enable advanced fan control 180 | Abilita il controllo avanzato della ventola 181 | 182 | 183 | Overview 184 | 185 | 186 | 187 | The middle spot between fan noise and power usage 188 | 189 | 190 | 191 | Low fan noise and moderate power usage 192 | 193 | 194 | 195 | Limits performance and turns off fans at lower temperatures 196 | 197 | 198 | 199 | GPU Fan: 200 | 201 | 202 | 203 | CPU Fan: 204 | 205 | 206 | 207 | USB Power 208 | 209 | 210 | 211 | FN ⇄ Meta 212 | 213 | 214 | 215 | Current fan Mode: 216 | 217 | 218 | 219 | Keyboard 220 | 221 | 222 | 223 | <html><head/><body><p><span style=" font-weight:700;">MC</span>ontrol<span style=" font-weight:700;">C</span>enter (MCC) is an application that allows you to change the settings of MSI laptops running Linux.</p><p>MCC acts as a graphical interface for the <span style=" font-weight:700;">MSI-EC </span>driver that already exist in the Linux kernel, if your device is not supported (grey buttons/limited in-app functionality), please visit the msi-ec github page to get help.</p></body></html> 224 | 225 | 226 | 227 | MCC GitHub: 228 | 229 | 230 | 231 | MSI-EC GitHub: 232 | 233 | 234 | 235 | This mode unlocks Advanced fan mode 236 | 237 | 238 | 239 | High Performance 240 | 241 | 242 | 243 | Maximum performance at the cost of heat and increased power consumption 244 | 245 | 246 | 247 | If you mainly use your laptop with the charger plugged most of the time, it is recommended to set the charge capacity at a lower percentage (60% or 80%) to prolong your battery lifecycle. 248 | 249 | 250 | 251 | Charge the battery when under 90%, stop at 100% 252 | 253 | 254 | 255 | Keyboard Backlight 256 | 257 | 258 | 259 | - 260 | 261 | 262 | 263 | MCC Bug Tracker: 264 | 265 | 266 | 267 | Qt version: 268 | 269 | 270 | 271 | MSI-EC Status: 272 | 273 | 274 | 275 | <html><head/><body><p align="center"><span style=" font-weight:700;">Warning</span>: Writing the wrong values to the wrong addresses <span style=" font-weight:700;">WILL BRICK YOUR DEVICE!</span></p><p align="center"><span style=" font-weight:700;">Never</span> write to EC memory without knowing how to do a proper <span style=" font-weight:700;">BIOS/EC</span> reset, keep in mind that a reset <span style=" font-weight:700;">might not</span> fix the device if the device got bricked/broken. </p></body></html> 276 | 277 | 278 | 279 | The msi-ec module is not loaded/installed. 280 | Check the <About> page for more info. 281 | 282 | 283 | 284 | The ec_sys module couldn't be detected, it might be required to control the fans. 285 | 286 | 287 | 288 | Loaded 289 | 290 | 291 | 292 | Fallback: Only ec_sys is loaded 293 | 294 | 295 | 296 | Failed to load both msi-ec/ec_sys 297 | 298 | 299 | 300 | OFF 301 | 302 | 303 | 304 | 305 | -------------------------------------------------------------------------------- /src/i18n/MControlCenter_eu.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | MainWindow 6 | 7 | EC Version: 8 | EC Bertsioa: 9 | 10 | 11 | EC Build: 12 | EC Eraikuntza: 13 | 14 | 15 | Battery charge: 16 | Bateria karga: 17 | 18 | 19 | Battery threshold: 20 | Bateria muga: 21 | 22 | 23 | CPU temp: 24 | CPU tenp: 25 | 26 | 27 | GPU temp: 28 | GPU tenp: 29 | 30 | 31 | Cooler Boost 32 | Cooler Boost 33 | 34 | 35 | Battery 36 | Bateria 37 | 38 | 39 | Best for Mobility 40 | Mugikortasunerako onena 41 | 42 | 43 | Balanced 44 | Orekatua 45 | 46 | 47 | Charge the battery when under 70%, stop at 80% 48 | Kargatu bateria %70-tik behera dagoenean, %80-ra iristean gelditu 49 | 50 | 51 | Best for battery 52 | Bateriarako onena 53 | 54 | 55 | Charge the battery when under 50%, stop at 60% 56 | Kargatu bateria %50-tik behera dagoenean, %60-ra iristean gelditu 57 | 58 | 59 | Custom 60 | Pertsonalizatua 61 | 62 | 63 | Always on 64 | Beti piztuta 65 | 66 | 67 | Auto turn off in 10 sec 68 | Automatikoki itzali 10 segundotan 69 | 70 | 71 | WebCam 72 | Web Kamera 73 | 74 | 75 | Debug 76 | Akatsak bilatu 77 | 78 | 79 | About 80 | Ezaugarriak 81 | 82 | 83 | Version: 84 | Bertsioa: 85 | 86 | 87 | Charging status: 88 | Karga egoera: 89 | 90 | 91 | Charging 92 | Kargatzen 93 | 94 | 95 | Discharging 96 | Deskargatzen 97 | 98 | 99 | Not charging 100 | Ez dago kargatzen 101 | 102 | 103 | Unknown 104 | Ezezaguna 105 | 106 | 107 | Swap FN and Super buttons 108 | FN eta Super botoiak trukatu 109 | 110 | 111 | Fully charged 112 | Karga beteta 113 | 114 | 115 | rpm 116 | rpm 117 | 118 | 119 | Mode 120 | Modua 121 | 122 | 123 | Silent 124 | Isila 125 | 126 | 127 | Super Battery 128 | Super Bateria 129 | 130 | 131 | Apply 132 | Aplikatu 133 | 134 | 135 | Show 136 | Erakutsi 137 | 138 | 139 | Quit 140 | Irten 141 | 142 | 143 | Charge limit 144 | Karga muga 145 | 146 | 147 | Auto 148 | Automatikoa 149 | 150 | 151 | Basic 152 | Oinarrizkoa 153 | 154 | 155 | Advanced 156 | Aurreratua 157 | 158 | 159 | Cooling 160 | Hoztu 161 | 162 | 163 | Fan 1 speed 164 | Haizagailuaren 1. abiadura 165 | 166 | 167 | Fan 2 speed 168 | Haizagailuaren 2. abiadura 169 | 170 | 171 | Reset 172 | Berrezarri 173 | 174 | 175 | Fan control 176 | Haizagailuaren kontrola 177 | 178 | 179 | Enable advanced fan control 180 | Gaitu aurreratuko haizagailuaren kontrola 181 | 182 | 183 | Overview 184 | 185 | 186 | 187 | The middle spot between fan noise and power usage 188 | 189 | 190 | 191 | Low fan noise and moderate power usage 192 | 193 | 194 | 195 | Limits performance and turns off fans at lower temperatures 196 | 197 | 198 | 199 | GPU Fan: 200 | 201 | 202 | 203 | CPU Fan: 204 | 205 | 206 | 207 | USB Power 208 | 209 | 210 | 211 | FN ⇄ Meta 212 | 213 | 214 | 215 | Current fan Mode: 216 | 217 | 218 | 219 | Keyboard 220 | 221 | 222 | 223 | <html><head/><body><p><span style=" font-weight:700;">MC</span>ontrol<span style=" font-weight:700;">C</span>enter (MCC) is an application that allows you to change the settings of MSI laptops running Linux.</p><p>MCC acts as a graphical interface for the <span style=" font-weight:700;">MSI-EC </span>driver that already exist in the Linux kernel, if your device is not supported (grey buttons/limited in-app functionality), please visit the msi-ec github page to get help.</p></body></html> 224 | 225 | 226 | 227 | MCC GitHub: 228 | 229 | 230 | 231 | MSI-EC GitHub: 232 | 233 | 234 | 235 | This mode unlocks Advanced fan mode 236 | 237 | 238 | 239 | High Performance 240 | 241 | 242 | 243 | Maximum performance at the cost of heat and increased power consumption 244 | 245 | 246 | 247 | If you mainly use your laptop with the charger plugged most of the time, it is recommended to set the charge capacity at a lower percentage (60% or 80%) to prolong your battery lifecycle. 248 | 249 | 250 | 251 | Charge the battery when under 90%, stop at 100% 252 | 253 | 254 | 255 | Keyboard Backlight 256 | 257 | 258 | 259 | - 260 | 261 | 262 | 263 | MCC Bug Tracker: 264 | 265 | 266 | 267 | Qt version: 268 | 269 | 270 | 271 | MSI-EC Status: 272 | 273 | 274 | 275 | <html><head/><body><p align="center"><span style=" font-weight:700;">Warning</span>: Writing the wrong values to the wrong addresses <span style=" font-weight:700;">WILL BRICK YOUR DEVICE!</span></p><p align="center"><span style=" font-weight:700;">Never</span> write to EC memory without knowing how to do a proper <span style=" font-weight:700;">BIOS/EC</span> reset, keep in mind that a reset <span style=" font-weight:700;">might not</span> fix the device if the device got bricked/broken. </p></body></html> 276 | 277 | 278 | 279 | The msi-ec module is not loaded/installed. 280 | Check the <About> page for more info. 281 | 282 | 283 | 284 | The ec_sys module couldn't be detected, it might be required to control the fans. 285 | 286 | 287 | 288 | Loaded 289 | 290 | 291 | 292 | Fallback: Only ec_sys is loaded 293 | 294 | 295 | 296 | Failed to load both msi-ec/ec_sys 297 | 298 | 299 | 300 | OFF 301 | 302 | 303 | 304 | 305 | -------------------------------------------------------------------------------- /src/i18n/MControlCenter_pt_PT.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | MainWindow 6 | 7 | EC Version: 8 | Versão do EC: 9 | 10 | 11 | EC Build: 12 | Compilação do EC: 13 | 14 | 15 | Battery charge: 16 | Carga da bateria: 17 | 18 | 19 | Battery threshold: 20 | Limite da bateria: 21 | 22 | 23 | CPU temp: 24 | Temperatura da CPU: 25 | 26 | 27 | GPU temp: 28 | Temperatura da GPU: 29 | 30 | 31 | Cooler Boost 32 | Impulsionar Ventoinha 33 | 34 | 35 | Battery 36 | Bateria 37 | 38 | 39 | Best for Mobility 40 | Melhor para Mobilidade 41 | 42 | 43 | Balanced 44 | Equilibrado 45 | 46 | 47 | Charge the battery when under 70%, stop at 80% 48 | Carregar a bateria quando estiver abaixo de 70%, parar a 80% 49 | 50 | 51 | Best for battery 52 | Melhor para a bateria 53 | 54 | 55 | Charge the battery when under 50%, stop at 60% 56 | Carregar a bateria quando estiver abaixo de 50%, parar a 60% 57 | 58 | 59 | Custom 60 | Personalizado 61 | 62 | 63 | Always on 64 | Sempre ligado 65 | 66 | 67 | Auto turn off in 10 sec 68 | Desligar automáticamente em 10 segundos 69 | 70 | 71 | WebCam 72 | Câmara de Web 73 | 74 | 75 | Debug 76 | Depurar 77 | 78 | 79 | About 80 | Sobre 81 | 82 | 83 | Version: 84 | Versão: 85 | 86 | 87 | Charging status: 88 | Estado do carregamento: 89 | 90 | 91 | Charging 92 | A carregar 93 | 94 | 95 | Discharging 96 | A descarregar 97 | 98 | 99 | Not charging 100 | Não está a carregar 101 | 102 | 103 | Unknown 104 | Desconhecido 105 | 106 | 107 | Swap FN and Super buttons 108 | Trocar as teclas FN e Super 109 | 110 | 111 | Fully charged 112 | Totalmente carregada 113 | 114 | 115 | rpm 116 | rpm 117 | 118 | 119 | Mode 120 | Modo 121 | 122 | 123 | Silent 124 | Silencioso 125 | 126 | 127 | Super Battery 128 | Super Bateria 129 | 130 | 131 | Apply 132 | Aplicar 133 | 134 | 135 | Show 136 | Mostrar 137 | 138 | 139 | Quit 140 | Sair 141 | 142 | 143 | Charge limit 144 | Limite de carga 145 | 146 | 147 | Auto 148 | Automático 149 | 150 | 151 | Basic 152 | Básico 153 | 154 | 155 | Advanced 156 | Avançado 157 | 158 | 159 | Cooling 160 | Arrefecimento 161 | 162 | 163 | Fan 1 speed 164 | Velocidade da ventoinha 1 165 | 166 | 167 | Fan 2 speed 168 | Velocidade da ventoinha 2 169 | 170 | 171 | Reset 172 | Repor 173 | 174 | 175 | Fan control 176 | Controlo de ventoinha 177 | 178 | 179 | Enable advanced fan control 180 | Activar controlo avançado da ventoinha 181 | 182 | 183 | Overview 184 | 185 | 186 | 187 | The middle spot between fan noise and power usage 188 | 189 | 190 | 191 | Low fan noise and moderate power usage 192 | 193 | 194 | 195 | Limits performance and turns off fans at lower temperatures 196 | 197 | 198 | 199 | GPU Fan: 200 | 201 | 202 | 203 | CPU Fan: 204 | 205 | 206 | 207 | USB Power 208 | 209 | 210 | 211 | FN ⇄ Meta 212 | 213 | 214 | 215 | Current fan Mode: 216 | 217 | 218 | 219 | Keyboard 220 | 221 | 222 | 223 | <html><head/><body><p><span style=" font-weight:700;">MC</span>ontrol<span style=" font-weight:700;">C</span>enter (MCC) is an application that allows you to change the settings of MSI laptops running Linux.</p><p>MCC acts as a graphical interface for the <span style=" font-weight:700;">MSI-EC </span>driver that already exist in the Linux kernel, if your device is not supported (grey buttons/limited in-app functionality), please visit the msi-ec github page to get help.</p></body></html> 224 | 225 | 226 | 227 | MCC GitHub: 228 | 229 | 230 | 231 | MSI-EC GitHub: 232 | 233 | 234 | 235 | This mode unlocks Advanced fan mode 236 | 237 | 238 | 239 | High Performance 240 | 241 | 242 | 243 | Maximum performance at the cost of heat and increased power consumption 244 | 245 | 246 | 247 | If you mainly use your laptop with the charger plugged most of the time, it is recommended to set the charge capacity at a lower percentage (60% or 80%) to prolong your battery lifecycle. 248 | 249 | 250 | 251 | Charge the battery when under 90%, stop at 100% 252 | 253 | 254 | 255 | Keyboard Backlight 256 | 257 | 258 | 259 | - 260 | 261 | 262 | 263 | MCC Bug Tracker: 264 | 265 | 266 | 267 | Qt version: 268 | 269 | 270 | 271 | MSI-EC Status: 272 | 273 | 274 | 275 | <html><head/><body><p align="center"><span style=" font-weight:700;">Warning</span>: Writing the wrong values to the wrong addresses <span style=" font-weight:700;">WILL BRICK YOUR DEVICE!</span></p><p align="center"><span style=" font-weight:700;">Never</span> write to EC memory without knowing how to do a proper <span style=" font-weight:700;">BIOS/EC</span> reset, keep in mind that a reset <span style=" font-weight:700;">might not</span> fix the device if the device got bricked/broken. </p></body></html> 276 | 277 | 278 | 279 | The msi-ec module is not loaded/installed. 280 | Check the <About> page for more info. 281 | 282 | 283 | 284 | The ec_sys module couldn't be detected, it might be required to control the fans. 285 | 286 | 287 | 288 | Loaded 289 | 290 | 291 | 292 | Fallback: Only ec_sys is loaded 293 | 294 | 295 | 296 | Failed to load both msi-ec/ec_sys 297 | 298 | 299 | 300 | OFF 301 | 302 | 303 | 304 | 305 | -------------------------------------------------------------------------------- /src/i18n/MControlCenter_pt_BR.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | MainWindow 6 | 7 | EC Version: 8 | Versão do EC: 9 | 10 | 11 | EC Build: 12 | Compilação do EC: 13 | 14 | 15 | Battery charge: 16 | Carga da bateria: 17 | 18 | 19 | Battery threshold: 20 | Limite da bateria: 21 | 22 | 23 | CPU temp: 24 | Temperatura da CPU: 25 | 26 | 27 | GPU temp: 28 | Temperatura da GPU: 29 | 30 | 31 | Cooler Boost 32 | Impulsionar Ventoinha 33 | 34 | 35 | Battery 36 | Bateria 37 | 38 | 39 | Best for Mobility 40 | Melhor para Mobilidade 41 | 42 | 43 | Balanced 44 | Equilibrado 45 | 46 | 47 | Charge the battery when under 70%, stop at 80% 48 | Carregar a bateria quando estiver abaixo de 70%, parar a 80% 49 | 50 | 51 | Best for battery 52 | Melhor para a bateria 53 | 54 | 55 | Charge the battery when under 50%, stop at 60% 56 | Carregar a bateria quando estiver abaixo de 50%, parar a 60% 57 | 58 | 59 | Custom 60 | Personalizado 61 | 62 | 63 | Always on 64 | Sempre ligado 65 | 66 | 67 | Auto turn off in 10 sec 68 | Desligar automáticamente em 10 segundos 69 | 70 | 71 | WebCam 72 | Câmara de Web 73 | 74 | 75 | Debug 76 | Depurar 77 | 78 | 79 | About 80 | Sobre 81 | 82 | 83 | Version: 84 | Versão: 85 | 86 | 87 | Charging status: 88 | Estado do carregamento: 89 | 90 | 91 | Charging 92 | A carregar 93 | 94 | 95 | Discharging 96 | A descarregar 97 | 98 | 99 | Not charging 100 | Não está a carregar 101 | 102 | 103 | Unknown 104 | Desconhecido 105 | 106 | 107 | Swap FN and Super buttons 108 | Trocar as teclas FN e Super 109 | 110 | 111 | Fully charged 112 | Totalmente carregada 113 | 114 | 115 | rpm 116 | rpm 117 | 118 | 119 | Mode 120 | Modo 121 | 122 | 123 | Silent 124 | Silencioso 125 | 126 | 127 | Super Battery 128 | Super Bateria 129 | 130 | 131 | Apply 132 | Aplicar 133 | 134 | 135 | Show 136 | Mostrar 137 | 138 | 139 | Quit 140 | Sair 141 | 142 | 143 | Charge limit 144 | Limite de carga 145 | 146 | 147 | Auto 148 | Automático 149 | 150 | 151 | Basic 152 | Básico 153 | 154 | 155 | Advanced 156 | Avançado 157 | 158 | 159 | Cooling 160 | Arrefecimento 161 | 162 | 163 | Fan 1 speed 164 | Velocidade da ventoinha 1 165 | 166 | 167 | Fan 2 speed 168 | Velocidade da ventoinha 2 169 | 170 | 171 | Reset 172 | Repor 173 | 174 | 175 | Fan control 176 | Controlo da ventoinha 177 | 178 | 179 | Enable advanced fan control 180 | Habilitar controlo avançado da ventoinha 181 | 182 | 183 | Overview 184 | 185 | 186 | 187 | The middle spot between fan noise and power usage 188 | 189 | 190 | 191 | Low fan noise and moderate power usage 192 | 193 | 194 | 195 | Limits performance and turns off fans at lower temperatures 196 | 197 | 198 | 199 | GPU Fan: 200 | 201 | 202 | 203 | CPU Fan: 204 | 205 | 206 | 207 | USB Power 208 | 209 | 210 | 211 | FN ⇄ Meta 212 | 213 | 214 | 215 | Current fan Mode: 216 | 217 | 218 | 219 | Keyboard 220 | 221 | 222 | 223 | <html><head/><body><p><span style=" font-weight:700;">MC</span>ontrol<span style=" font-weight:700;">C</span>enter (MCC) is an application that allows you to change the settings of MSI laptops running Linux.</p><p>MCC acts as a graphical interface for the <span style=" font-weight:700;">MSI-EC </span>driver that already exist in the Linux kernel, if your device is not supported (grey buttons/limited in-app functionality), please visit the msi-ec github page to get help.</p></body></html> 224 | 225 | 226 | 227 | MCC GitHub: 228 | 229 | 230 | 231 | MSI-EC GitHub: 232 | 233 | 234 | 235 | This mode unlocks Advanced fan mode 236 | 237 | 238 | 239 | High Performance 240 | 241 | 242 | 243 | Maximum performance at the cost of heat and increased power consumption 244 | 245 | 246 | 247 | If you mainly use your laptop with the charger plugged most of the time, it is recommended to set the charge capacity at a lower percentage (60% or 80%) to prolong your battery lifecycle. 248 | 249 | 250 | 251 | Charge the battery when under 90%, stop at 100% 252 | 253 | 254 | 255 | Keyboard Backlight 256 | 257 | 258 | 259 | - 260 | 261 | 262 | 263 | MCC Bug Tracker: 264 | 265 | 266 | 267 | Qt version: 268 | 269 | 270 | 271 | MSI-EC Status: 272 | 273 | 274 | 275 | <html><head/><body><p align="center"><span style=" font-weight:700;">Warning</span>: Writing the wrong values to the wrong addresses <span style=" font-weight:700;">WILL BRICK YOUR DEVICE!</span></p><p align="center"><span style=" font-weight:700;">Never</span> write to EC memory without knowing how to do a proper <span style=" font-weight:700;">BIOS/EC</span> reset, keep in mind that a reset <span style=" font-weight:700;">might not</span> fix the device if the device got bricked/broken. </p></body></html> 276 | 277 | 278 | 279 | The msi-ec module is not loaded/installed. 280 | Check the <About> page for more info. 281 | 282 | 283 | 284 | The ec_sys module couldn't be detected, it might be required to control the fans. 285 | 286 | 287 | 288 | Loaded 289 | 290 | 291 | 292 | Fallback: Only ec_sys is loaded 293 | 294 | 295 | 296 | Failed to load both msi-ec/ec_sys 297 | 298 | 299 | 300 | OFF 301 | 302 | 303 | 304 | 305 | -------------------------------------------------------------------------------- /src/i18n/MControlCenter_es.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | MainWindow 6 | 7 | EC Version: 8 | Versión del EC: 9 | 10 | 11 | EC Build: 12 | Compilación del EC: 13 | 14 | 15 | Battery charge: 16 | Carga de la batería: 17 | 18 | 19 | Battery threshold: 20 | Límite de carga de batería: 21 | 22 | 23 | CPU temp: 24 | Temperatura CPU: 25 | 26 | 27 | GPU temp: 28 | Temperatura GPU: 29 | 30 | 31 | Cooler Boost 32 | Cooler Boost 33 | 34 | 35 | Battery 36 | Batería 37 | 38 | 39 | Best for Mobility 40 | Mejor para la mobilidad 41 | 42 | 43 | Balanced 44 | Balanceado 45 | 46 | 47 | Charge the battery when under 70%, stop at 80% 48 | Carga la batería cuando esta por debajo del 70% hasta llegar al 80% 49 | 50 | 51 | Best for battery 52 | Lo mejor para la batería 53 | 54 | 55 | Charge the battery when under 50%, stop at 60% 56 | Carga la batería cuando esta por debajo del 50% hasta llegar al 60% 57 | 58 | 59 | Custom 60 | Personalizado 61 | 62 | 63 | Always on 64 | Siempre encendido 65 | 66 | 67 | Auto turn off in 10 sec 68 | Apagar automáticamente en 10 sec 69 | 70 | 71 | WebCam 72 | Cámara Web 73 | 74 | 75 | Debug 76 | Depurar 77 | 78 | 79 | About 80 | Acerca de 81 | 82 | 83 | Version: 84 | Versión: 85 | 86 | 87 | Charging status: 88 | Estado de la carga: 89 | 90 | 91 | Charging 92 | Cargando 93 | 94 | 95 | Discharging 96 | Descargando 97 | 98 | 99 | Not charging 100 | No carga 101 | 102 | 103 | Unknown 104 | Desconocido 105 | 106 | 107 | Swap FN and Super buttons 108 | Intercambiar botones FN y Super 109 | 110 | 111 | Fully charged 112 | Totalmente cargada 113 | 114 | 115 | rpm 116 | rpm 117 | 118 | 119 | Mode 120 | Modo 121 | 122 | 123 | Silent 124 | Silencioso 125 | 126 | 127 | Super Battery 128 | Super Batería 129 | 130 | 131 | Apply 132 | Aplicar 133 | 134 | 135 | Show 136 | Mostrar 137 | 138 | 139 | Quit 140 | Salir 141 | 142 | 143 | Charge limit 144 | Límite de carga 145 | 146 | 147 | Auto 148 | Automático 149 | 150 | 151 | Basic 152 | Básico 153 | 154 | 155 | Advanced 156 | Avanzado 157 | 158 | 159 | Cooling 160 | Enfriamiento 161 | 162 | 163 | Fan 1 speed 164 | Velocidad del ventilador 1 165 | 166 | 167 | Fan 2 speed 168 | Velocidad del ventilador 2 169 | 170 | 171 | Reset 172 | Reconfigurar 173 | 174 | 175 | Fan control 176 | Control del ventilador 177 | 178 | 179 | Enable advanced fan control 180 | Habilitar el control avanzado del ventilador 181 | 182 | 183 | Overview 184 | 185 | 186 | 187 | The middle spot between fan noise and power usage 188 | 189 | 190 | 191 | Low fan noise and moderate power usage 192 | 193 | 194 | 195 | Limits performance and turns off fans at lower temperatures 196 | 197 | 198 | 199 | GPU Fan: 200 | 201 | 202 | 203 | CPU Fan: 204 | 205 | 206 | 207 | USB Power 208 | 209 | 210 | 211 | FN ⇄ Meta 212 | 213 | 214 | 215 | Current fan Mode: 216 | 217 | 218 | 219 | Keyboard 220 | 221 | 222 | 223 | <html><head/><body><p><span style=" font-weight:700;">MC</span>ontrol<span style=" font-weight:700;">C</span>enter (MCC) is an application that allows you to change the settings of MSI laptops running Linux.</p><p>MCC acts as a graphical interface for the <span style=" font-weight:700;">MSI-EC </span>driver that already exist in the Linux kernel, if your device is not supported (grey buttons/limited in-app functionality), please visit the msi-ec github page to get help.</p></body></html> 224 | 225 | 226 | 227 | MCC GitHub: 228 | 229 | 230 | 231 | MSI-EC GitHub: 232 | 233 | 234 | 235 | This mode unlocks Advanced fan mode 236 | 237 | 238 | 239 | High Performance 240 | 241 | 242 | 243 | Maximum performance at the cost of heat and increased power consumption 244 | 245 | 246 | 247 | If you mainly use your laptop with the charger plugged most of the time, it is recommended to set the charge capacity at a lower percentage (60% or 80%) to prolong your battery lifecycle. 248 | 249 | 250 | 251 | Charge the battery when under 90%, stop at 100% 252 | 253 | 254 | 255 | Keyboard Backlight 256 | 257 | 258 | 259 | - 260 | 261 | 262 | 263 | MCC Bug Tracker: 264 | 265 | 266 | 267 | Qt version: 268 | 269 | 270 | 271 | MSI-EC Status: 272 | 273 | 274 | 275 | <html><head/><body><p align="center"><span style=" font-weight:700;">Warning</span>: Writing the wrong values to the wrong addresses <span style=" font-weight:700;">WILL BRICK YOUR DEVICE!</span></p><p align="center"><span style=" font-weight:700;">Never</span> write to EC memory without knowing how to do a proper <span style=" font-weight:700;">BIOS/EC</span> reset, keep in mind that a reset <span style=" font-weight:700;">might not</span> fix the device if the device got bricked/broken. </p></body></html> 276 | 277 | 278 | 279 | The msi-ec module is not loaded/installed. 280 | Check the <About> page for more info. 281 | 282 | 283 | 284 | The ec_sys module couldn't be detected, it might be required to control the fans. 285 | 286 | 287 | 288 | Loaded 289 | 290 | 291 | 292 | Fallback: Only ec_sys is loaded 293 | 294 | 295 | 296 | Failed to load both msi-ec/ec_sys 297 | 298 | 299 | 300 | OFF 301 | 302 | 303 | 304 | 305 | -------------------------------------------------------------------------------- /src/i18n/MControlCenter_fi_FI.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | MainWindow 6 | 7 | EC Version: 8 | EC Versio: 9 | 10 | 11 | EC Build: 12 | EC Käännös: 13 | 14 | 15 | Battery charge: 16 | Akun taso: 17 | 18 | 19 | Battery threshold: 20 | Akun Latausraja: 21 | 22 | 23 | CPU temp: 24 | Prosessorin lämpötila: 25 | 26 | 27 | GPU temp: 28 | Näytönohjaimen lämpötila: 29 | 30 | 31 | Cooler Boost 32 | Jäähdyttimen tehotila 33 | 34 | 35 | Battery 36 | Akku 37 | 38 | 39 | Best for Mobility 40 | Paras kannettavuuteen 41 | 42 | 43 | Balanced 44 | Tasapainotettu 45 | 46 | 47 | Charge the battery when under 70%, stop at 80% 48 | Lataa akkua kun varaustaso on alle 70% lopeta lataaminen 80% 49 | 50 | 51 | Best for battery 52 | Paras akulle 53 | 54 | 55 | Charge the battery when under 50%, stop at 60% 56 | Lataa akkua kun varaustaso on alle 50, lopeta lataaminen 60% 57 | 58 | 59 | Custom 60 | Muokattu 61 | 62 | 63 | Always on 64 | Aina päällä 65 | 66 | 67 | Auto turn off in 10 sec 68 | Sammuta automaattisesti 10 sekunnissa 69 | 70 | 71 | WebCam 72 | Webkamera 73 | 74 | 75 | Debug 76 | Debuggaus 77 | 78 | 79 | About 80 | Tietoa 81 | 82 | 83 | Version: 84 | Versio: 85 | 86 | 87 | Charging status: 88 | Lataustila: 89 | 90 | 91 | Charging 92 | Lataa 93 | 94 | 95 | Discharging 96 | Tyhjenee 97 | 98 | 99 | Not charging 100 | Ei lataa 101 | 102 | 103 | Unknown 104 | Tuntematon 105 | 106 | 107 | Swap FN and Super buttons 108 | Vaihda FN ja super painikkeet 109 | 110 | 111 | Fully charged 112 | Täyteen ladattu 113 | 114 | 115 | rpm 116 | rpm 117 | 118 | 119 | Mode 120 | Tila 121 | 122 | 123 | Silent 124 | Hiljainen 125 | 126 | 127 | Super Battery 128 | Super-akku 129 | 130 | 131 | Apply 132 | Käytä 133 | 134 | 135 | Show 136 | Näytä 137 | 138 | 139 | Quit 140 | Poistu 141 | 142 | 143 | Charge limit 144 | Latausraja 145 | 146 | 147 | Auto 148 | Automaattinen 149 | 150 | 151 | Basic 152 | Perus 153 | 154 | 155 | Advanced 156 | Edistynyt 157 | 158 | 159 | Cooling 160 | Jäähdytys 161 | 162 | 163 | Fan 1 speed 164 | Tuulettimen 1 nopeus 165 | 166 | 167 | Fan 2 speed 168 | Tuulettimen 2 nopeus 169 | 170 | 171 | Reset 172 | Nollaa 173 | 174 | 175 | Fan control 176 | Tuulettimen ohjaus 177 | 178 | 179 | Enable advanced fan control 180 | Aktivoi edistynyt tuulettimen ohjaus 181 | 182 | 183 | Overview 184 | Yleisnäkymä 185 | 186 | 187 | The middle spot between fan noise and power usage 188 | Keskikohta tuulettimen äänessä ja sähkön kulutuksessa 189 | 190 | 191 | Low fan noise and moderate power usage 192 | Matala tuulettimen ääni ja keskitasoinen sähkön käyttö 193 | 194 | 195 | Limits performance and turns off fans at lower temperatures 196 | Rajoittaa tehon ja laittaa tuulettimet pois matalilla lämpötiloilla 197 | 198 | 199 | GPU Fan: 200 | Näytönohjaimen tuuletin: 201 | 202 | 203 | CPU Fan: 204 | Prosessorin tuuletin: 205 | 206 | 207 | USB Power 208 | USB virta 209 | 210 | 211 | FN ⇄ Meta 212 | FN ⇄ Meta 213 | 214 | 215 | Current fan Mode: 216 | Aktiivinen tuulettimen tila: 217 | 218 | 219 | Keyboard 220 | Näppäimmistö 221 | 222 | 223 | <html><head/><body><p><span style=" font-weight:700;">MC</span>ontrol<span style=" font-weight:700;">C</span>enter (MCC) is an application that allows you to change the settings of MSI laptops running Linux.</p><p>MCC acts as a graphical interface for the <span style=" font-weight:700;">MSI-EC </span>driver that already exist in the Linux kernel, if your device is not supported (grey buttons/limited in-app functionality), please visit the msi-ec github page to get help.</p></body></html> 224 | 225 | 226 | 227 | MCC GitHub: 228 | 229 | 230 | 231 | MSI-EC GitHub: 232 | 233 | 234 | 235 | This mode unlocks Advanced fan mode 236 | 237 | 238 | 239 | High Performance 240 | 241 | 242 | 243 | Maximum performance at the cost of heat and increased power consumption 244 | 245 | 246 | 247 | If you mainly use your laptop with the charger plugged most of the time, it is recommended to set the charge capacity at a lower percentage (60% or 80%) to prolong your battery lifecycle. 248 | 249 | 250 | 251 | Charge the battery when under 90%, stop at 100% 252 | 253 | 254 | 255 | Keyboard Backlight 256 | 257 | 258 | 259 | - 260 | 261 | 262 | 263 | MCC Bug Tracker: 264 | 265 | 266 | 267 | Qt version: 268 | 269 | 270 | 271 | MSI-EC Status: 272 | 273 | 274 | 275 | <html><head/><body><p align="center"><span style=" font-weight:700;">Warning</span>: Writing the wrong values to the wrong addresses <span style=" font-weight:700;">WILL BRICK YOUR DEVICE!</span></p><p align="center"><span style=" font-weight:700;">Never</span> write to EC memory without knowing how to do a proper <span style=" font-weight:700;">BIOS/EC</span> reset, keep in mind that a reset <span style=" font-weight:700;">might not</span> fix the device if the device got bricked/broken. </p></body></html> 276 | 277 | 278 | 279 | The msi-ec module is not loaded/installed. 280 | Check the <About> page for more info. 281 | 282 | 283 | 284 | The ec_sys module couldn't be detected, it might be required to control the fans. 285 | 286 | 287 | 288 | Loaded 289 | 290 | 291 | 292 | Fallback: Only ec_sys is loaded 293 | 294 | 295 | 296 | Failed to load both msi-ec/ec_sys 297 | 298 | 299 | 300 | OFF 301 | 302 | 303 | 304 | 305 | -------------------------------------------------------------------------------- /src/i18n/MControlCenter_hu.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | MainWindow 6 | 7 | EC Version: 8 | EC Verzió: 9 | 10 | 11 | EC Build: 12 | EC Build: 13 | 14 | 15 | Battery charge: 16 | Akumulátor töltöttség: 17 | 18 | 19 | Battery threshold: 20 | Akumulátor korlátozás: 21 | 22 | 23 | CPU temp: 24 | CPU hőmérséklet: 25 | 26 | 27 | GPU temp: 28 | GPU hőmérséklet: 29 | 30 | 31 | Cooler Boost 32 | Cooler Boost (Hűtés erő növelése) 33 | 34 | 35 | Battery 36 | Akumulátor 37 | 38 | 39 | Best for Mobility 40 | Mobilitás szempontjából a legjobb 41 | 42 | 43 | Balanced 44 | Kiegyensúlyozott 45 | 46 | 47 | Charge the battery when under 70%, stop at 80% 48 | Töltse fel az akkumulátort ha 70% alatt van és állítsa le a töltést 80%-on 49 | 50 | 51 | Best for battery 52 | Akumulátor szempontjából a legjobb 53 | 54 | 55 | Charge the battery when under 50%, stop at 60% 56 | Töltse fel az akkumulátort ha 50% alatt van és állítsa le a töltést 60%-on 57 | 58 | 59 | Custom 60 | Egyéni 61 | 62 | 63 | Always on 64 | Mindig bekapcsolva 65 | 66 | 67 | Auto turn off in 10 sec 68 | Automatikus kikapcsolás 10 mp után 69 | 70 | 71 | WebCam 72 | Webkamera 73 | 74 | 75 | Debug 76 | Debug 77 | 78 | 79 | About 80 | Névjegy 81 | 82 | 83 | Version: 84 | Verzió: 85 | 86 | 87 | Charging status: 88 | Töltés állapota: 89 | 90 | 91 | Charging 92 | Töltés 93 | 94 | 95 | Discharging 96 | Merítés 97 | 98 | 99 | Not charging 100 | Nem tölt 101 | 102 | 103 | Unknown 104 | Ismeretlen 105 | 106 | 107 | Swap FN and Super buttons 108 | Az FN és a Super gombok fölcserélése 109 | 110 | 111 | Fully charged 112 | Teljesen feltöltve 113 | 114 | 115 | rpm 116 | rpm 117 | 118 | 119 | Mode 120 | Mód 121 | 122 | 123 | Silent 124 | Csendes 125 | 126 | 127 | Super Battery 128 | Super Akumulátor 129 | 130 | 131 | Apply 132 | Alkalmaz 133 | 134 | 135 | Show 136 | Mutasd 137 | 138 | 139 | Quit 140 | Kilépés 141 | 142 | 143 | Charge limit 144 | Töltési korlát 145 | 146 | 147 | Auto 148 | Automatikus 149 | 150 | 151 | Basic 152 | Alap 153 | 154 | 155 | Advanced 156 | Haladó 157 | 158 | 159 | Cooling 160 | Hűtés 161 | 162 | 163 | Fan 1 speed 164 | Ventilátor 1 sebessége 165 | 166 | 167 | Fan 2 speed 168 | Ventilátor 2 sebessége 169 | 170 | 171 | Reset 172 | Visszaállítás 173 | 174 | 175 | Fan control 176 | Ventilátor vezérlés 177 | 178 | 179 | Enable advanced fan control 180 | Haladó ventilátorvezérlés engedélyezése 181 | 182 | 183 | Overview 184 | 185 | 186 | 187 | The middle spot between fan noise and power usage 188 | 189 | 190 | 191 | Low fan noise and moderate power usage 192 | 193 | 194 | 195 | Limits performance and turns off fans at lower temperatures 196 | 197 | 198 | 199 | GPU Fan: 200 | 201 | 202 | 203 | CPU Fan: 204 | 205 | 206 | 207 | USB Power 208 | 209 | 210 | 211 | FN ⇄ Meta 212 | 213 | 214 | 215 | Current fan Mode: 216 | 217 | 218 | 219 | Keyboard 220 | 221 | 222 | 223 | <html><head/><body><p><span style=" font-weight:700;">MC</span>ontrol<span style=" font-weight:700;">C</span>enter (MCC) is an application that allows you to change the settings of MSI laptops running Linux.</p><p>MCC acts as a graphical interface for the <span style=" font-weight:700;">MSI-EC </span>driver that already exist in the Linux kernel, if your device is not supported (grey buttons/limited in-app functionality), please visit the msi-ec github page to get help.</p></body></html> 224 | 225 | 226 | 227 | MCC GitHub: 228 | 229 | 230 | 231 | MSI-EC GitHub: 232 | 233 | 234 | 235 | This mode unlocks Advanced fan mode 236 | 237 | 238 | 239 | High Performance 240 | 241 | 242 | 243 | Maximum performance at the cost of heat and increased power consumption 244 | 245 | 246 | 247 | If you mainly use your laptop with the charger plugged most of the time, it is recommended to set the charge capacity at a lower percentage (60% or 80%) to prolong your battery lifecycle. 248 | 249 | 250 | 251 | Charge the battery when under 90%, stop at 100% 252 | 253 | 254 | 255 | Keyboard Backlight 256 | 257 | 258 | 259 | - 260 | 261 | 262 | 263 | MCC Bug Tracker: 264 | 265 | 266 | 267 | Qt version: 268 | 269 | 270 | 271 | MSI-EC Status: 272 | 273 | 274 | 275 | <html><head/><body><p align="center"><span style=" font-weight:700;">Warning</span>: Writing the wrong values to the wrong addresses <span style=" font-weight:700;">WILL BRICK YOUR DEVICE!</span></p><p align="center"><span style=" font-weight:700;">Never</span> write to EC memory without knowing how to do a proper <span style=" font-weight:700;">BIOS/EC</span> reset, keep in mind that a reset <span style=" font-weight:700;">might not</span> fix the device if the device got bricked/broken. </p></body></html> 276 | 277 | 278 | 279 | The msi-ec module is not loaded/installed. 280 | Check the <About> page for more info. 281 | 282 | 283 | 284 | The ec_sys module couldn't be detected, it might be required to control the fans. 285 | 286 | 287 | 288 | Loaded 289 | 290 | 291 | 292 | Fallback: Only ec_sys is loaded 293 | 294 | 295 | 296 | Failed to load both msi-ec/ec_sys 297 | 298 | 299 | 300 | OFF 301 | 302 | 303 | 304 | 305 | -------------------------------------------------------------------------------- /src/i18n/MControlCenter_en.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | MainWindow 6 | 7 | EC Version: 8 | 9 | 10 | 11 | EC Build: 12 | 13 | 14 | 15 | Battery charge: 16 | 17 | 18 | 19 | Battery threshold: 20 | 21 | 22 | 23 | CPU temp: 24 | 25 | 26 | 27 | GPU temp: 28 | 29 | 30 | 31 | Cooler Boost 32 | 33 | 34 | 35 | Battery 36 | 37 | 38 | 39 | Best for Mobility 40 | 41 | 42 | 43 | Balanced 44 | 45 | 46 | 47 | Charge the battery when under 70%, stop at 80% 48 | 49 | 50 | 51 | Best for battery 52 | 53 | 54 | 55 | Charge the battery when under 50%, stop at 60% 56 | 57 | 58 | 59 | Custom 60 | 61 | 62 | 63 | Always on 64 | 65 | 66 | 67 | Auto turn off in 10 sec 68 | 69 | 70 | 71 | WebCam 72 | 73 | 74 | 75 | Debug 76 | 77 | 78 | 79 | About 80 | 81 | 82 | 83 | Version: 84 | 85 | 86 | 87 | Charging status: 88 | 89 | 90 | 91 | Charging 92 | 93 | 94 | 95 | Discharging 96 | 97 | 98 | 99 | Not charging 100 | 101 | 102 | 103 | Unknown 104 | 105 | 106 | 107 | Swap FN and Super buttons 108 | 109 | 110 | 111 | Fully charged 112 | 113 | 114 | 115 | rpm 116 | 117 | 118 | 119 | Mode 120 | 121 | 122 | 123 | Silent 124 | 125 | 126 | 127 | Super Battery 128 | 129 | 130 | 131 | Apply 132 | 133 | 134 | 135 | Show 136 | 137 | 138 | 139 | Quit 140 | 141 | 142 | 143 | Charge limit 144 | 145 | 146 | 147 | Auto 148 | 149 | 150 | 151 | Basic 152 | 153 | 154 | 155 | Advanced 156 | 157 | 158 | 159 | Cooling 160 | 161 | 162 | 163 | Fan 1 speed 164 | 165 | 166 | 167 | Fan 2 speed 168 | 169 | 170 | 171 | Reset 172 | 173 | 174 | 175 | Fan control 176 | 177 | 178 | 179 | Enable advanced fan control 180 | 181 | 182 | 183 | Overview 184 | 185 | 186 | 187 | The middle spot between fan noise and power usage 188 | 189 | 190 | 191 | Low fan noise and moderate power usage 192 | 193 | 194 | 195 | Limits performance and turns off fans at lower temperatures 196 | 197 | 198 | 199 | GPU Fan: 200 | 201 | 202 | 203 | CPU Fan: 204 | 205 | 206 | 207 | USB Power 208 | 209 | 210 | 211 | FN ⇄ Meta 212 | 213 | 214 | 215 | Current fan Mode: 216 | 217 | 218 | 219 | Keyboard 220 | 221 | 222 | 223 | <html><head/><body><p><span style=" font-weight:700;">MC</span>ontrol<span style=" font-weight:700;">C</span>enter (MCC) is an application that allows you to change the settings of MSI laptops running Linux.</p><p>MCC acts as a graphical interface for the <span style=" font-weight:700;">MSI-EC </span>driver that already exist in the Linux kernel, if your device is not supported (grey buttons/limited in-app functionality), please visit the msi-ec github page to get help.</p></body></html> 224 | 225 | 226 | 227 | MCC GitHub: 228 | 229 | 230 | 231 | MSI-EC GitHub: 232 | 233 | 234 | 235 | This mode unlocks Advanced fan mode 236 | 237 | 238 | 239 | High Performance 240 | 241 | 242 | 243 | Maximum performance at the cost of heat and increased power consumption 244 | 245 | 246 | 247 | If you mainly use your laptop with the charger plugged most of the time, it is recommended to set the charge capacity at a lower percentage (60% or 80%) to prolong your battery lifecycle. 248 | 249 | 250 | 251 | Charge the battery when under 90%, stop at 100% 252 | 253 | 254 | 255 | Keyboard Backlight 256 | 257 | 258 | 259 | - 260 | 261 | 262 | 263 | MCC Bug Tracker: 264 | 265 | 266 | 267 | Qt version: 268 | 269 | 270 | 271 | MSI-EC Status: 272 | 273 | 274 | 275 | <html><head/><body><p align="center"><span style=" font-weight:700;">Warning</span>: Writing the wrong values to the wrong addresses <span style=" font-weight:700;">WILL BRICK YOUR DEVICE!</span></p><p align="center"><span style=" font-weight:700;">Never</span> write to EC memory without knowing how to do a proper <span style=" font-weight:700;">BIOS/EC</span> reset, keep in mind that a reset <span style=" font-weight:700;">might not</span> fix the device if the device got bricked/broken. </p></body></html> 276 | 277 | 278 | 279 | The msi-ec module is not loaded/installed. 280 | Check the <About> page for more info. 281 | 282 | 283 | 284 | The ec_sys module couldn't be detected, it might be required to control the fans. 285 | 286 | 287 | 288 | Loaded 289 | 290 | 291 | 292 | Fallback: Only ec_sys is loaded 293 | 294 | 295 | 296 | Failed to load both msi-ec/ec_sys 297 | 298 | 299 | 300 | OFF 301 | 302 | 303 | 304 | 305 | --------------------------------------------------------------------------------
MControlCenter is a Free and Open Source GNU/Linux application 10 | that allows you to change the settings of MSI laptops.