편집하다

편집하다

최근에 14.04 Trusty에서 16.04 Xenial로 업그레이드했습니다. 업그레이드하기 전에는 caffeine-plus표시기 아이콘을 사용하여 노트북이 잠자기 상태가 될 수 있는 시간을 알려줬습니다. 제가 일반적으로 사용하는 모드는 카페인을 활성화하여 덮개를 닫을 때만 컴퓨터가 절전/일시 중지되도록 하는 것이었습니다. 그러나 유휴 타이머가 의도한 효과를 발휘하도록 하고 싶은 경우가 있었습니다.

업그레이드 이후 카페인은 더 이상 아무 것도 하지 않는 것 같습니다. 의도적으로 덮개를 열어 둔 채로 오랫동안 실행되는 프로세스를 컴퓨터에 놔뒀다가 다시 돌아와 보니 컴퓨터가 잠자기 상태이고 프로세스가 완료되지 않은 것을 발견할 수 있습니다.

이전 동작을 어떻게 되돌릴 수 있나요? 참고로 내가 찾고 있는 건비녀장, 영구적인 변경이 아닙니다. 토글로서 활성화 여부에 대한 시각적 표시가 있어야 합니다. 표시기 아이콘이 있으면 좋을 것 같습니다.

메모

이 질문을 하기 전에 내가 검색한 결과는 a) Caffeine 사용 방법에 대한 오래된(오래된) 게시물이거나 b) 다양한 하드웨어 버그를 해결하기 위해 잠자기 기능을 영구적으로 비활성화하는 것이었습니다. 제 질문은 단순히 14.04에서 사용했던 기능을 복원하는 것에 관한 것입니다. 이 주제는 제가 해결하지 못한 주제입니다.

답변1

편집하다

약간의 작업 끝에 아래에 있는 것보다 더 완벽하고 사용하기 쉬운 솔루션을 작성했습니다. 당신은 할 수 있습니다프로그램을 다운로드하다GitHub에서. 또한 종속성을 설치해야 합니다.

sudo apt install xdotool xprintidle

원래 답변

Jacob Vlijm이 나에게 다음을 가리킨 후부분적인 해결, 나는 그의 스크립트의 수정된 버전을 Caffeine 및 내 코드 일부와 결합하여 Caffeine을 대체하는 방법을 생각해 냈습니다.

지침

  1. 필요한 패키지가 설치되어 있는지 확인하십시오. 참고: caffeine-plus아이콘에만 사용됩니다. 적절한 아이콘에 관심이 없다면 필요하지 않습니다.

    sudo apt install caffeine-plus xprintidle xdotool
    
  2. 아래 스크립트를 어딘가에 저장하고 실행 가능하게 만듭니다.

    #!/usr/bin/python3
    # coding=utf-8
    #
    # Copyright © 2016 Scott Severance
    # Code mixed in from Caffeine Plus and Jacob Vlijm
    #
    # This program is free software: you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation, either version 3 of the License, or
    # (at your option) any later version.
    #
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
    import argparse
    import os
    import signal
    import time
    from subprocess import Popen, check_output, call
    import gi
    gi.require_version('Gtk', '3.0')
    gi.require_version('AppIndicator3', '0.1')
    from gi.repository import GObject, Gtk, AppIndicator3
    
    class SleepInhibit(GObject.GObject):
    
        def __init__(self):
            GObject.GObject.__init__(self)
            self.inhibited = False
            self._add_indicator()
            self.inhibit_proc = None
    
        def _add_indicator(self):
            self.AppInd = AppIndicator3.Indicator.new("sleep-inhibit-off",
                                                      "sleep-inhibit",
                                                      AppIndicator3.IndicatorCategory.APPLICATION_STATUS)
            self.AppInd.set_status(AppIndicator3.IndicatorStatus.ACTIVE)
            self.AppInd.set_icon ("caffeine-cup-empty")
    
            self._build_indicator_menu(self.AppInd)
    
        def _build_indicator_menu(self, indicator):
            menu = Gtk.Menu()
    
            menu_item = Gtk.MenuItem("Toggle Sleep Inhibition")
            menu.append(menu_item)
            menu_item.connect("activate", self.on_toggle)
            menu_item.show()
    
            menu_item = Gtk.MenuItem("Quit")
            menu.append(menu_item)
            menu_item.connect("activate", self.on_quit)
            menu_item.show()
    
            indicator.set_menu(menu)
    
        def on_toggle(self, menuitem):
            self.inhibited = not self.inhibited
            self.flip_switch()
    
        def on_quit(self, menuitem):
            if self.inhibit_proc:
                self.kill_inhibit_proc()
            exit(0)
    
        def _set_icon_disabled(self):
            self.AppInd.set_icon('caffeine-cup-empty')
    
        def _set_icon_enabled(self):
            self.AppInd.set_icon('caffeine-cup-full')
    
        def flip_switch(self):
            if self.inhibited:
                self._set_icon_enabled()
                self.inhibit_proc = Popen([__file__, "--mode=inhibit-process"])
            else:
                self.kill_inhibit_proc()
                self._set_icon_disabled()
    
        def kill_inhibit_proc(self):
            self.inhibit_proc.terminate()
            self.inhibit_proc.wait()
            self.inhibit_proc = None
    
    def inhibit():
        seconds = 120 # number of seconds to start preventing blank screen / suspend
        while True:
            try:
                curr_idle = check_output(["xprintidle"]).decode("utf-8").strip()
                if int(curr_idle) > seconds*1000:
                    call(["xdotool", "key", "Control_L"])
                time.sleep(10)
            except FileNotFoundError:
                exit('ERROR: This program depends on xprintidle and xdotool being installed.')
            except KeyboardInterrupt:
                exit(0)
    
    def parse_args():
        parser = argparse.ArgumentParser(description='''Indicator to prevent
            computer from sleeping. It depends on the commands xprintidle and
            xdotool being properly installed on your system. If they aren't
            installed already, please install them. Also, the icons are taken from
            caffeine-plus, so if it isn't installed, you will probably see a broken
            icon.''')
        mode = '''The mode can be either indicator (default) or inhibit-process. If
            mode is indicator, then an indicator icon is created. inhibit-process is
            to be called by the indicator. When sleep is inhibited, it runs,
            preventing sleep.'''
        parser.add_argument('--mode', type=str, default='indicator', help=mode)
        return parser.parse_args()
    
    def main():
        args = parse_args()
        if args.mode == 'indicator':
            signal.signal(signal.SIGINT, signal.SIG_DFL)
            GObject.threads_init()
            SleepInhibit()
            Gtk.main()
        elif args.mode == 'inhibit-process':
            inhibit()
        else:
            exit('ERROR: Invalid value for --mode!')
    
    if __name__ == '__main__':
        main()
    
  3. 스크립트를 실행합니다.

관련 정보