web-dev-qa-db-ja.com

特定のモニターでのみウィンドウを最小化するにはどうすればよいですか?

モニターとラップトップの画面があり、「デスクトップの表示」機能に問題があります。

ノートパソコンの画面には、常に表示されるウィジェットが表示されています。メインモニターは通常使用されます。

キーボードショートカット(この場合は、windowsキー+ d)を使用すると、すべてのウィンドウが非表示になりますが、特定のモニターのすべてのウィンドウを非表示にしたいだけです。

これは可能ですか?

https://superuser.com/questions/200945/how-can-i-make-the-show-desktop-function-only-hide-the-windows-on-a-specific-mに類似した質問 、異なるOSについて質問する顕著な違いがあります。

5

1つの画面でウィンドウのみを最小化する

以下のスクリプトは、左画面のウィンドウまたはのみを最小化するために使用できます。

スクリプトは、ウィンドウを最小化する画面に応じて、1または2を引数として実行されます。

スクリプト

#!/usr/bin/env python3
import subprocess
import sys

scr = sys.argv[1]

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8")

# find the right side of the left screen
Edge = [int(s.split("x")[0]) for s in get("xrandr").split() if "+0+" in s][0]
# read the window list
wlist = [w.split() for w in get(["wmctrl", "-lG"]).splitlines()]
for w in wlist:
    # retrieve the window id and -position
    w_id = w[0]; xpos = int(w[2])
    # check the position of the window, decide action depending on arg.
    test = xpos < Edge if scr == "1" else xpos >= Edge
    if test:
        # check if the window is "normal" and / or minimized
        w_data = get(["xprop", "-id", w_id])
        if all([not "_NET_WM_STATE_HIDDEN" in w_data,
                    "_NET_WM_WINDOW_TYPE_NORMAL" in w_data]):
            subprocess.Popen(["xdotool", "windowminimize", w_id])

使い方

  1. スクリプトにはwmctrlxdotoolの両方が必要です

    Sudo apt-get install xdotool wmctrl
    
  2. スクリプトを空のファイルにコピーし、min_screen.pyとして保存します

  3. 実行するには:

    python3 /path/to/min_screen.py 1
    

    左画面のウィンドウを最小化する

    python3 /path/to/min_screen.py 2 
    

    正しい画面でのみウィンドウを最小化する

  4. すべてが正常に機能する場合は、ショートカットキーに追加します

ノート

  • スクリプトはpython3がインストールされていることを前提としていますが、コードはpython3固有ではないと考えています。
  • スクリプトはUnityで作成されましたが、ワークスペース(ビューポート)とは異なり、screensを処理しても違いはありません。
  • スクリプトは、pid 0のウィンドウを最小化notします(たとえば、アイドルまたはその他のtkinterwindows)。それが問題であれば、言及してください。解決できます。

説明

スクリプトは、最初にxrandrの出力で+0+を含む文字列を検索することにより、左画面の右端を検索します。

1680x1050+0+0

最初のセクション1680は、左画面の幅です。その後、ウィンドウリスト(wmctrl -lG)を調べて、どのウィンドウが「下」または「上」にあるかを確認し、1680を確認して、コマンドxdotool windowminimize <window_id>(またはそうでない)。

最後に「テスト」(mmiz):xprop -id <window_id>は、「通常の」ウィンドウを処理しているかどうかを確認します(たとえば、デスクトップもウィンドウとしてリストされます)。ウィンドウはすでに最小化されています。

スクリプト内のコメントも参照してください。

スクリプトをキーボードショートカットにバインドする

1. Lubuntuについて

Lubuntuでグローバルキーボードショートカットを編集するには、 Lubuntuはすべてのデスクトップキーボードショートカットを表示しますか? を参照してください。

この場合:この回答のスクリプトをコンピューター上のファイルに保存し、このファイルを実行可能にし、/.config/openbox/lubuntu-rc.xmlを開いて置き換えます

  <keybind key="W-d">
    <action name="ToggleShowDesktop"/>
  </keybind>

沿って

  <action name="Execute">
   <command>/path/to/show_desktop.py 1</command>
  </action>

ここで、/path/to/show_desktop.pyは(もちろん)スクリプトへのパスであり、1または2はターゲット画面です。 スクリプトを実行可能にします

コンピューターを再起動して構成を再読み込みします。

2. Unity/Gnome

スクリプトを実行可能にします、システム設定>「キーボード」>「ショートカット」>「カスタムショートカット」。 「+」をクリックして、コマンドを追加します。

/path/to/show_desktop.py 1

...お好みのショートカットへ

3
Jacob Vlijm

前書き

以下のスクリプトにより、ユーザーは必要なディスプレイをクリックすることができ、そのディスプレイ上のすべてのウィンドウが最小化されます。このスクリプトはキーボードショートカットにバインドされることを意図していますが、必要に応じて手動で実行できます。

使い方は簡単です:

  1. スクリプトをアクティブにすると、マウスカーソルが十字形に変わります
  2. 最小化するディスプレイ上の任意のプログラムウィンドウ(デスクトップではない)をクリックします。
  3. スクリプトは、そのディスプレイ上のすべてのウィンドウを決定し、それらを最小化(アイコン化)します。

このプログラムでは、追加のパッケージをインストールする必要はありません。このスクリプトは、通常のUbuntu 16.04 LTSおよびLubuntu 16.04 LTSでテストされています。 KDEを使用してFedora 24でもテストしてくれた@JourneymanGeekに感謝します!

スクリプトのソースコードの取得

スクリプトのソースコードは、ここに手動でコピーするか、または github リポジトリから取得することで取得できます。 gitから取得するには、次の手順を実行します。

  1. Sudo apt-get install git
  2. cd /opt ; Sudo git clone https://github.com/SergKolo/sergrep.git
  3. Sudo chmod -R +x sergrep

ファイルは minimize_display_windows.py と呼ばれます。それをキーボードショートカットにバインドして、スクリプトへのフルパスを提供するようにしてください。たとえば、次のように:

 python /opt/sergrep/minimize_display_windows.py

ソースコード

このコードを保存するファイルに実行許可があることを確認してください。

#!/usr/bin/env python
#
###########################################################
# Author: Serg Kolo , contact: [email protected] 
# Date: July 3, 2016
# Purpose:  Minimize windows on a display which user clicks
# Written for: http://askubuntu.com/q/793195/295286  
# Tested on: Ubuntu 16.04 LTS,Lubuntu 16.04 Virtual Machine
###########################################################
# Copyright: Serg Kolo , 2016
#    
#     Permission to use,copy,modify,and distribute this software is hereby granted
#     without fee, provided that  the copyright notice above and this permission statement
#     appear in all copies.
#
#     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
#     THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
#     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
#     DEALINGS IN THE SOFTWARE.
#
#     https://opensource.org/licenses/MIT

from gi.repository import GdkX11,Gdk
import subprocess

def run_sh(cmd):
    # reusable function to 
    # run Shell commands
    # Returns stdout of the
    # process
    proc = subprocess.Popen(cmd, Shell=True,stdout=subprocess.PIPE)
    out = proc.stdout.read().strip()
    return out 

# First,let the user click on any window
# on the monitor which they want to minimize.
# For that we need to extract integer XID of
# the window from xwininfo output.
# Basically,same as xwininfo -int | awk '/Window id/{print $4}'

user_selected = ""
for item in run_sh("xwininfo -int").split("\n"):
    if "Window id" in item:
       user_selected = item.split()[3]

# Here we basically get all the windows on the screen,
# and check if their XID matches the one user selected
# Once we find that window, we need to know to what display
# that window belongs. 
screen =  Gdk.Screen.get_default()
for window in screen.get_window_stack():
    if str(window.get_xid()) == user_selected:
       close_screen = int(screen.get_monitor_at_window(window))

# We know which display to close now. Loop over all
# windows again, and if they're on the same display
# the one that user chose - iconify it ( in X11 terminology
# that means minimize the window  )
for window in screen.get_window_stack():
    if screen.get_monitor_at_window(window) == close_screen :
       window.iconify()

デモ

動作中のスクリプトの短い記録は、 youtubeチャンネル にあります。

サイドノート

元々、別のスクリプトを作成しましたが、Unityでのみ使用でき、xdotoolが必要です。興味のある方は Gist

2