web-dev-qa-db-ja.com

マルチモニター設定でxsetを使用してモニターをスタンバイする方法は?

2つ以上のモニターが一緒に動作しているときに、次のようなコマンドを発行して、それらの1つをスタンバイ/サスペンドにする方法はありますか?xset dpms force suspend?または、次のような目的のために時間を設定しています:xset dpms 100 0 0これらはこれらのモニターで個別に機能しますか?

EDP1(マイラップトップ)とVGA1(外部モニター)の2つのモニターが連動しています。

VGA1で映画を見ていて、1時間半eDP1が何もしていなかった場合、それらと直接対話していない場合は、それぞれを個別にサスペンド/スタンバイモードにしたいと思います。

xrandor --off --output eDP1を使用するのに十分な速度がないため、使用に興味がありません。

簡単なマウスの動きでモニターを動作させる準備ができているので、モニターをすばやく切り替えることができます。

  • 実行中:Ubuntu 18.04
  • ウィンドウマネージャー:OpenBox
10
Ravexina

個々のモニターの制御はxsetでは不可能です(実際にはX11)

タイトルが示すように、howxsetが構築され、X11関数が使用するため、これは不可能です。ソースコードを見ると、xsetDPMSForceLevel(dpy,DPMSModeSuspend)行557 )を呼び出し、表示変数dpyXOpenDisplay() function( line 2 )、それは definition によるものです。

サーバーは、その画面および入力デバイスとともに、ディスプレイと呼ばれます。

つまり、xsetは、個々の画面ではなく、ディスプレイ全体に設定をグローバルに適用します。これを機能させるには、xsetソースコードを変更する必要があります。 DPMS拡張自体は、ほとんどの場合、個々の画面ではなく、ディスプレイ全体を呼び出すように見えるため、X11ライブラリを使用してカスタムコードを作成することもできません。

_/sys_サブシステムを介してその設定を手動で制御することも機能していないようです

_$ Sudo bash -c 'echo Off > /sys/class/drm/card0-VGA-1/dpms'
[Sudo] password for admin: 
bash: /sys/class/drm/card0-VGA-1/dpms: Permission denied
_

キーまたはマウスのイベントが発生すると、画面もDPMSモードから外れるため、マウスを移動したりキーボードを使用したりすることを検討すると、これらのアクションのいずれかによってモニターがDPMSモードを終了します。

代替の回避策

最良の代替手段(そして実際に物理的に機能するソリューション)はxrandrです-個々の「出力」を制御するために使用できます。特に、

_xrandr --output VGA-1 -off
_

その出力をオフに設定します。はい、あなたはそれが十分に速くないのであなたがこの解決策を使いたくないと述べました、しかし今のところそれは利用可能な最高のものです。これにはいくつかの利点があります。

  • キーおよびマウスイベントの影響を受けない
  • xsetとは異なり、独立してアウトパスを制御します

_xrandr --output VGA-1 --brightness 0.1_はソフトウェアソリューションであるにもかかわらず、_--brightness_は画面を色付けしてオフにします。そのため、ハードウェアレベルでディスプレイが実際に暗くなったり、ハードウェアレベルでオフになったりすることはありません。ただし、画面を非表示にする機能があり、キー/マウスイベントにも耐性があります。

どちらもGNOMEスクリーンセーバーのフォークであるMateおよびBudgieスクリーンセーバーのソースコードを調べましたが、どちらの場合も、ソースコードにDPMSの記述がないため、ソフトウェアソリューションのように見えます。

5

何年もの間、蓋を閉じるとラップトップが一時停止し、外部モニターが空白になるようにラップトップをセットアップしていました。

外部モニターで90分間ビデオを視聴し、ノートパソコンの画面を空白にしたいという理由から、蓋を閉じるオプションを「何もしない」に変更しました。

  • 利点:ラップトップの蓋を閉じると、すべてのラップトップウィンドウがフルスクリーンビデオの下に表示されます。
  • 利点:ラップトップの蓋を開くと、ウィンドウが復元され、フルスクリーンビデオの下に表示されなくなります。
  • デメリット:ギアメニューからサスペンドを選択するには、トップバーメニューにアクセスするためにビデオを全画面表示にしないといけません。
  • 利点:システムが外部モニターのメニューによって一時停止されている場合でも、ラップトップの蓋を開くと、システムが再開されます。

外部モニターにDPMSを使用していませんが、xset qコマンドで設定を確認できます。

$ xset q
Keyboard Control:
  auto repeat:  on    key click percent:  0    LED mask:  00000002
  XKB indicators:
    00: Caps Lock:   off    01: Num Lock:    on     02: Scroll Lock: off
    03: Compose:     off    04: Kana:        off    05: Sleep:       off
    06: Suspend:     off    07: Mute:        off    08: Misc:        off
    09: Mail:        off    10: Charging:    off    11: Shift Lock:  off
    12: Group 2:     off    13: Mouse Keys:  off
  auto repeat delay:  500    repeat rate:  33
  auto repeating keys:  00ffffffdffffbbf
                        fadfffefffedffff
                        9fffffffffffffff
                        fff7ffffffffffff
  bell percent:  50    bell pitch:  400    bell duration:  100
Pointer Control:
  acceleration:  5/1    threshold:  5
Screen Saver:
  prefer blanking:  yes    allow exposures:  yes
  timeout:  0    cycle:  0
Colors:
  default colormap:  0xb3    BlackPixel:  0x0    WhitePixel:  0xffffff
Font Path:
  /usr/share/fonts/X11/misc,/usr/share/fonts/X11/Type1,built-ins
DPMS (Energy Star):
  Standby: 0    Suspend: 0    Off: 0
  DPMS is Disabled

次の行に注意してください。

Screen Saver:
  prefer blanking:  yes
  • おそらくprefer blanking: no

次の行にも注意してください。

DPMS (Energy Star):
  Standby: 0    Suspend: 0    Off: 0
  DPMS is Disabled
  • 必要に応じて、DPMS is enabledでモニターをStandbyに設定することをお勧めします。

うまくいけば、他のユーザーがこれらのオプションを使用し、詳細な回答を投稿してくれました。

4

単にラップトップを閉じるのはどうですか?

なぜ?

これらの2つのモニターは1つの表示領域であるため、1つをオフにすると、画面の再描画、アプリケーションがメインモニターに移動するなどの多くの問題が発生します...

(私は数年前にその道を進みました、そしてあなたがやりたいことをするために私が見つけた唯一の信頼できる方法は、外部モニターのボタンを押すか、ラップトップを閉じることです)

gsettings setでこれらの電源設定を必ず行ってください。

org.gnome.settings-daemon.plugins.power lid-close-suspend-with-external-monitor false
org.gnome.settings-daemon.plugins.power lid-close-ac-action 'nothing'
org.gnome.settings-daemon.plugins.power lid-close-battery-action 'nothing'
4
Fabby

一時的なコメント

  1. OPのリクエストに応じて、xrandrを使用して以下のスクリプト画面をオフにするを作成しました。より長いテストでは、これはかなりひどくうまくいきました。スイッチオフに失敗することはそれほどありませんでしたが、画面を再アクティブ化すると、画面レイアウトが完全にめちゃくちゃになりました。私はそれがあなたのケースで動作するかどうかを確認するために投稿したいと思いますが、私のアドバイスはそれを使用しないことです。
    スクリプトでは、代わりに明るさをゼロに設定することに戻りました。
  2. アクティブモニターマウスの位置、またはアクティブウィンドウの位置を定義する必要があるかどうかについて、いくつかの議論がありました。ウィンドウが存在しない場合、後者は機能しません。 (デスクトップ自体は別として)ウィンドウがまったくない場合があります。その場合、ブラックアウトするウィンドウの選択はランダムになります(または例外を含めない場合は中断します)。 IMOが意味をなす唯一のオプション-すべてのケースで予測可能な方法で機能する-は、マウスの位置によってアクティブな画面を定義することです。さらに、それは、ウィンドウマネージャーが新しいウィンドウを表示する場所を決定する方法でもあります。

その後、このバージョンで何を変更しましたか?
アイドル時間は、デフォルトでキーボードとマウスの両方のアクティビティによって定義されるようになりました。目覚めもどちらかで行われます。


非アクティブな画面を自動的に暗くする

他の回答者が言ったように、画面をcliから個別にオフにすることはせいぜい難題であり、私も選択肢を見つけられませんでした。

私が見つけたのは、x時間後に自動的にdimすべての画面、-exceptマウスが置かれている画面を表示する方法です。

ここに行きます

#!/usr/bin/env python3
import subprocess
import gi
gi.require_version("Gdk", "3.0")
from gi.repository import Gdk
import time
import sys


def get_idle():
    try:
        return int(subprocess.check_output("xprintidle")) / 1000
    except subprocess.CalledProcessError:
        return 0


def get_monitors():
    screen = Gdk.Screen.get_default()
    n_mons = display.get_n_monitors()
    mons = [screen.get_monitor_plug_name(i) for i in range(n_mons)]
    return mons


def set_mon_dimmed(mon, dim):
    print(mon, dim)
    val = "0.0" if dim else "1"
    try:
        subprocess.Popen(["xrandr", "--output", mon, "--brightness", val])
    except subprocess.CalledProcessError:
        print("oops")


def mousepos():
    # find out mouse location
    return Gdk.get_default_root_window().get_pointer()[1:3]


def get_currmonitor_atpos(x, y, display=None):
    """
    fetch the current monitor (obj) at position. display is optional to save
    fuel if it is already fetched elsewhere
    """
    if not display:
        display = Gdk.Display.get_default()
    return display.get_monitor_at_point(x, y)


display = Gdk.Display.get_default()
wait = int(sys.argv[1])
elapsed = 0
# set intervals to check
res = 2
monitors = [m for m in get_monitors()]
for m in monitors:
    set_mon_dimmed(m, False)

monrecord = {}
for m in monitors:
    monrecord[m] = {"idle": 0, "dimmed": False}

display = Gdk.Display.get_default()
idle1 = 0


while True:
    time.sleep(res)
    curr_mousepos = mousepos()
    activemon = get_currmonitor_atpos(
        curr_mousepos[0], curr_mousepos[1]
    ).get_model()
    idle2 = get_idle()
    if idle2 < idle1:
        monrecord[activemon]["idle"] = 0
        if monrecord[activemon]["dimmed"]:
            set_mon_dimmed(activemon, False)
            monrecord[activemon]["dimmed"] = False

    for m in monrecord.keys():
        curr_idle = monrecord[m]["idle"]
        print(m, curr_idle)
        if all([
            curr_idle > wait,
            monrecord[m]["dimmed"] is not True,
            m != activemon
        ]):
            set_mon_dimmed(m, True)
            monrecord[m]["dimmed"] = True         
        else:
            if m != activemon:
                monrecord[m]["idle"] = curr_idle + res

    idle1 = idle2

設定方法

設定は簡単です:

  1. python3-gixprintidleの両方がインストールされていることを確認してください

    Sudo apt install python3-gi xprintidle
    
  2. 上記のスクリプトを空のファイルにコピーし、dim_inactiveという名前で保存します実行可能にする

  3. 次のコマンドで実行します。

    /path/to/dim_inactive <idle_time_in_seconds>
    

    例:

    /path/to/dim_inactive 120
    

    すべての画面を暗くしますマウスがない場所 2分後に

追加情報/説明

  • スクリプトは起動時にすべての画面を一覧表示します
  • アイドル時間モニターごとの場合は記録を保持します(= 2以上)。モニターがx秒間アクセスされない場合、モニターはブラックアウトされますマウスが置かれているモニターを除いて
  • 良い(しかし悪い)伝統によれば、Gnomeは物事を壊し続け、APIを変え続けています。その結果、19.04以降でこのスクリプトを実行すると、いくつかの非推奨の警告が表示されます。同時に、それはPEP8で壊れません。それにもかかわらず、最新のAPIに更新されます。
4
Jacob Vlijm