Как быстро отключить крышку режима ожидания в Ubuntu Unity 16.04?

16

Какой самый быстрый способ быстро отключить функцию ожидания при закрытии крышки? Мне очень нравится это поведение, но особенно при воспроизведении музыки, я хотел бы закрыть крышку, не переводя машину в режим ожидания.

Однако я не хочу постоянно отключать эту функцию, а просто временно отключить ее, например, до тех пор, пока я не закончу слушать музыку.

Может быть, есть индикатор, похожий на кофеин ?

введите описание изображения здесь

orschiro
источник
Ваши настройки похожи для переменного тока и батареи?
Джейкоб Влейм
Таких индикаторов пока нет. Есть способы, но они требуют root-доступа, sudoкак показано в этом посте. askubuntu.com/q/15520/295286 . Я посмотрю, что можно сделать, хотя
Сергей Колодяжный
Могу я спросить, какую версию системы вы используете? 16.04
Сергей Колодяжный
Уважаемые Джейкоб и Серг, спасибо за первые комментарии и решения! Сценарий Джейкоба прекрасно работает. Было бы здорово, если бы это был маленький показатель. Мне просто нравятся визуальные интерфейсы. :-) Настройки одинаковы для переменного тока и батареи. Я отредактировал свой вопрос, чтобы прояснить, что я использую Unity 16.04.
Орширо
Можно / будет сделано. GUI, однако, займет немного больше времени.
Джейкоб Влейм

Ответы:

19

Сценарий ниже переключит действие закрытой крышки между «ничто» и «приостановить»:

#!/usr/bin/env python3
import subprocess

key = ["org.gnome.settings-daemon.plugins.power",
       "lid-close-ac-action", "lid-close-battery-action"]

currstate = subprocess.check_output(["gsettings", "get",
    key[0], key[1]]).decode("utf-8").strip()

if currstate == "'suspend'":
    command = "'nothing'"
    subprocess.Popen(["notify-send", "Lid closes with no action"])
else:
    command = "'suspend'"
    subprocess.Popen(["notify-send", "Suspend will be activated when lid closes"])

for k in [key[1], key[2]]:
    subprocess.Popen(["gsettings", "set", key[0], k, command])

... и оповестить о текущем состоянии:

введите описание изображения здесь

Как пользоваться

Просто:

  • Скопируйте скрипт в пустой файл, сохраните его как toggle_lid.py
  • Добавьте его к клавише быстрого доступа: выберите: «Системные настройки»> «Клавиатура»> «Ярлыки»> «Пользовательские ярлыки». Нажмите «+» и добавьте команду:

    python3 /path/to/toggle_lid.py
    

объяснение

Текущее состояние настройки действия закрытой крышки можно получить с помощью команды

gsettings get org.gnome.settings-daemon.plugins.power lid-close-ac-action

(по мощности) и

gsettings get org.gnome.settings-daemon.plugins.power lid-close-battery-action

(от батареи)

Скрипт читает текущее состояние и устанавливает противоположное («приостановить» / «ничего») с помощью команды:

gsettings get org.gnome.settings-daemon.plugins.power lid-close-ac-action '<action>'

Опционально (дополнительно)

Опционально / дополнительно, вы можете запустить индикатор в качестве детектора, чтобы показать текущее состояние настройки крышки. Это покажет:

введите описание изображения здесь

... на панели, если приостановка будет заблокирована при закрытии крышки, в противном случае она будет отображаться серой.

введите описание изображения здесь

Сценарий

#!/usr/bin/env python3
import subprocess
import os
import time
import signal
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('AppIndicator3', '0.1')
from gi.repository import Gtk, AppIndicator3, GObject
from threading import Thread

key = ["org.gnome.settings-daemon.plugins.power",
       "lid-close-ac-action", "lid-close-battery-action"]

currpath = os.path.dirname(os.path.realpath(__file__))

def runs():
    # The test True/False
    return subprocess.check_output([
        "gsettings", "get", key[0], key[1]
        ]).decode("utf-8").strip() == "'suspend'"

class Indicator():
    def __init__(self):
        self.app = 'show_proc'
        iconpath = currpath+"/nocolor.png"
        self.indicator = AppIndicator3.Indicator.new(
            self.app, iconpath,
            AppIndicator3.IndicatorCategory.OTHER)
        self.indicator.set_status(AppIndicator3.IndicatorStatus.ACTIVE)       
        self.indicator.set_menu(self.create_menu())
        self.update = Thread(target=self.check_runs)
        # daemonize the thread to make the indicator stopable
        self.update.setDaemon(True)
        self.update.start()     

    def check_runs(self):
        # the function (thread), checking for the process to run
        runs1 = None
        while True:
            time.sleep(1)
            runs2 = runs()
            # if there is a change in state, update the icon
            if runs1 != runs2:
                if runs2:
                    # set the icon to show
                    GObject.idle_add(
                        self.indicator.set_icon,
                        currpath+"/nocolor.png",
                        priority=GObject.PRIORITY_DEFAULT
                        )
                else:
                    # set the icon to hide
                    GObject.idle_add(
                        self.indicator.set_icon,
                        currpath+"/green.png",
                        priority=GObject.PRIORITY_DEFAULT
                        )
            runs1 = runs2

    def create_menu(self):
        menu = Gtk.Menu()
        # quit
        item_quit = Gtk.MenuItem('Quit')
        item_quit.connect('activate', self.stop)
        menu.append(item_quit)
        menu.show_all()
        return menu

    def stop(self, source):
        Gtk.main_quit()

Indicator()
GObject.threads_init()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()

Как пользоваться

  1. Скопируйте приведенный выше скрипт в пустой файл, сохраните его как show_state.py
  2. Скопируйте оба значка ниже (щелкните правой кнопкой мыши -> сохранить как) и сохраните их в одном каталоге с show_proc.pyточным именем, как указано ниже.

    green.png

    введите описание изображения здесь

    nocolor.png

    введите описание изображения здесь

  3. Теперь выполните тест show_state.pyпо команде:

    python3 /path/to/show_state.py
    

    и измените текущее состояние, нажав на ярлык, который вы задали в первом разделе этого ответа.

  4. Если все работает нормально, добавьте следующее в автозагрузку приложений:

    /bin/bash -c "sleep 15 && python3 /path/to/show_state.py"
    

Заметка

Детектор-индикатор выше является отредактированной версией этого ответа . Просто изменив тест в функции runs()(и, возможно, соответствующие значки на панели), вы можете использовать его, чтобы показать состояние всего, что есть Trueили False.

Якоб Влейм
источник
Отличное решение с индикатором! Один вопрос: почему вы выбрали прозрачную иконку ?
Орширо
@orschiro Я считаю (ed) ste, где закрытие крышки будет приостановлено как ситуация по умолчанию . Зеленый в качестве указания, вы можете закрыть крышку без действий. Однако это может быть любая иконка. Предложения?
Джейкоб Влейм
Может быть, как зеленый, но в серо-блеклом? Немного раздражает видеть пустое место на индикаторной панели из-за прозрачности иконки.
Орширо
@orschiro хаха, теперь я понимаю, что ты имеешь в виду :). изм.
Джейкоб Влейм
5

В настройках Ubuntu другой вариант будет изменен с «Приостановить» на «Ничего не делать» - Мощность:

Настройки Ubuntu - Мощность

PS: Это не обеспечивает индикатор в области уведомлений, но проще, чем создание сценария для новых пользователей.

PPS: на этом снимке экрана ИБП предназначен для кабельного модема + телевизора Sony Android, а не для ноутбука с батареей ... ХАХА.

WinEunuuchs2Unix
источник
Хорошо Ручной способ, занимает несколько кликов здесь и там. Но довольно приличный.
Сергей Колодяжный
@ Сергей, мне действительно нравится сценарий, написанный Джейкобом. Вероятно, поиграю с ним через день после того, как я сделаю Ubuntu 16.04 / Kernel 4.7.2 более стабильным в моей системе. Действительно, мой режим приостановки при закрытии крышки даже не работал из коробки обновления с 14.04 до 16.04 ... мне пришлось настроить параметр в systemd, который предполагает, что при закрытой крышке вы хотите, чтобы телевизор оставался активным, и просто хотите затемнить экран ноутбука. Задним числом я должен был опубликовать инструкции для этого тоже!
WinEunuuchs2Unix
Да, до 16.04 эти варианты действительно не работали для меня. Я лично хотел опубликовать редактирование файла как ответ, но Джейкоб опередил меня :)
Сергей Колодяжный