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


10

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

それはエネルギーの理由のためですか、それとも視覚的な解決策はありますか?
Jacob Vlijm

@Ravexina質問、eDP1のバックライトはどこまで行きますか?明るさを完全にオフにしますか?はいの場合、askubuntu.com / a / 814043/295286にある2つのコマンドをテストしてください 。返信をよろしくお願いします
セルギーコロディアズニー

1
@Ravexinaは完了しましたが、問題なく動作するようですが、1日間実行し続け、今夜遅くに投稿します。画面ごとのアクティビティを記録し続けますが、マウスが現在ある場合は画面を暗くしたりオフにしたりしないでください。
Jacob Vlijm

1
では、週末にウィンドウトラッキングを実装しようと思います。悲しいことに、私は今、これらのことに対処する時間はあまりありません。
Sergiy Kolodyazhnyy

1
@Ravexina、ありがとう。おそらくすぐに別の(vala)バージョンを投稿します。アクティブウィンドウまたは(有効なウ​​ィンドウがない場合は)マウスアクションによってトリガーされます。また、バックライトを使用して何かを実行できるかどうかも確認します。これにより、おそらくエネルギーも節約できます。ボーナス中の時間は短すぎるだけですが、問題はもう少しプレイするのに十分興味をそそられることです。つづく。もう一度ありがとう。
Jacob Vlijm

回答:


5

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

タイトルが示すように、ビルド方法 xsetとX11関数が使用するため、これは不可能です。ソースコードを見て、xset呼び出しDPMSForceLevel(dpy,DPMSModeSuspend)行557)を行うと、表示変数dpyXOpenDisplay()関数(行203)から取得されます。これは定義によります

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

つまり、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の記述がないため、ソフトウェアソリューションのように見えます。


私は他の選択肢が好きです... +1
Fabby

1
@Fabbyありがとう:)これまでのところ、これが利用可能な最良の代替案です
Sergiy Kolodyazhnyy

ウィンドウマネージャーはいくつかのトリックを行っており、いくつかのフックを提供していると思います。「ソフトウェアデザイン」と呼ばれるスタック交換サイトがあり、主要なウィンドウ(WebブラウザなどのConkyやトップバーが時間を表示しないなど)にピクセルの変更がない場合、たとえば10分間以上、モニター全体(1つだけ)は、完全に黒くなるまで30秒以上暗くなります。次に、そのモニター(通常は3つのモニターを使用します)の上にマウスを移動すると、1〜5秒かけて徐々に明るさが回復します。
WinEunuuchs2Unix

@ WinEunuuchs2Unix私にはアイデアがあり、注意すべきことがいくつかありますが、それはトリッキーであり、はい、問題のウィンドウマネージャーに依存します。問題はDPMSです。DPMSでは、すべてが薄暗くなるか、何もなくなる。私たちにできることはxrandr --off今のところ
セルギー・コロディアズニー

私のDPMSの知識は限られています。スタンバイ・スリープ時の節電だと思います。同じ結果をもたらす可能性があるHDMI-CECもありますが、それは私にとってさらに魔法のブラックホールです。xrandr -offモニターの電源を切るかどうかさえわかりません。brightnessゼロに設定するのと同じかもしれませんか?これは、24時間年中無休で実行しているプログラムで、Windowsでも実行できない3つのモニターの輝度とガンマを個別に設定する別の問題です。常夜灯、赤方偏移、またはフラックスがそれをするかどうかわからない。とにかく、それらのプログラムはxrandr offによってめちゃくちゃになるかもしれません。推測で答えをハイジャックして申し訳ありません:)
WinEunuuchs2Unix

4

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

外部モニターで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 enabledStandby、モニターをに設定することをお勧めします。

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


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'

実際、これは素晴らしい解決策です。ハードウェアに加えて、これはスクリプト化できます。ただし、OPはOpenboxを使用しているため、gsettingsが有効にならない可能性があります。良い代替案として、unix.stackexchange.com / a / 52645/85039
Sergiy Kolodyazhnyy

4

一時的なコメント

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

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


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

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

私が見つけたのは、x時間後に、マウスがある場所を除くすべての画面を自動的に暗くする方法です。

さあ行こう

#!/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に更新されます。

とても素敵で、そのようなことも書きたくなってきました。しかし、私はそれはここでは繰り返さテーマだと思うん-これまでのところそこの優れたソフトウェアソリューションを介して他のディスプレイを暗くよりも何も、何もハードウェアっぽい
Sergiy Kolodyazhnyy

@SergiyKolodyazhnyyいや、バックライトだけが何かを追加しますが、それは私が今見ることができる限りです。何かが可能であるべきだと思うが、xrandr --off私が推測するように、おそらくコールドスタートになるだろう。
Jacob Vlijm

@JacobVlijmええ、xrandr --off私はこの場合私が好むものです。特にVGAバックライトはソフトウェアで制御できないためです。
Sergiy Kolodyazhnyy

すべての努力をありがとう、しかし私は奇妙な振る舞いをしています...例:それはモニターを暗くしますが1、いかなる状況でも輝度をリセットしません。キーボードを使用して外部ディスプレイを操作しているときに、マウスがメインディスプレイにあるときに、アイドル時間の後に外部ディスプレイが黒くなる。メインディスプレイとのやり取りはありませんが、マウスはありますが、そこには何も実行されず、マウスを他のディスプレイに移動すると、メインディスプレイがすぐに黒くなります。
Ravexina

@Ravex(1)モニターはミラーリングされていますか?そうでない場合は、セカンドスクリーンを調整してスクリプトを停止した可能性があります。これを修正しました。(2)アクティブ画面が定義されている理由mymouseposは一時コメントの[2]で説明されています(3)(1)の変更で修正する必要もあります(同じ原因)ええと、いいえ、アイドル時間をリセットする必要があります。今日は後で。
Jacob Vlijm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.