web-dev-qa-db-ja.com

wmctrlに現在以外のワークスペースのウィンドウを無視させる

基本的にalt-tabを何度も入力しないようにするために、ウィンドウを切り替えるのにwmctrlに大きく依存しています。常に1つのワークスペースを使用していましたが、複数のワークスペースを使い始めたいと思います。

wmctrl -lと入力すると、すべてのワークスペースのすべてのウィンドウではなく、現在のワークスペースのウィンドウのみが表示されるようにwmctrlのコンテキストを変更できるかどうか疑問に思っていました。

たとえば、ワークスペース1でFirefoxウィンドウを開いていると仮定すると、ctrl+alt+fにキーボードショートカットがあり、wmctrl -a firefoxが実行され、Firefoxに切り替わります。ワークスペース2で新しいFirefoxウィンドウを開いてctrl+alt+fと入力すると、ワークスペース1のウィンドウに切り替わりますが、これは望んでいないものです。

これを解決する方法に関する提案/アイデアはありますか?

[〜#〜] edit [〜#〜]:compizを使用しています(Unity)

5
ivotron

Compizを使用している場合(不明な場合はwmctrl -mを実行)、wmctrlは1つのデスクトップ(wmctrl -lの2番目のフィールド、つまり0)のみを表示しますが、ジオメトリ(-G)オプションを使用してどのウィンドウかを知ることができますどの仮想デスクトップ上で。現在のデスクトップのすべてのウィンドウには、0から画面の幅までのx位置があります。 0から画面の高さまでのy位置についても同じです。だからあなたはそのようなものを使うことができます

#!/bin/bash

SCREEN_W=$(xwininfo -root | sed -n 's/^  Width: \(.*\)$/\1/p')
SCREEN_H=$(xwininfo -root | sed -n 's/^  Height: \(.*\)$/\1/p')

NAME='Navigator.Firefox'

wmctrl -xlG | awk -v W="$SCREEN_W" -v H="$SCREEN_H" -v NAME="$NAME" '$7==NAME && $3>=0 && $3<W && $4>=0 && $4<H {print $1}' | while read WINS; do wmctrl -ia "$WINS"; done

exit 0

必要に応じて、画面の幅と高さをハードコードでき、1行にしたい場合はNAMEできます。 NAMEに一致する複数のウィンドウをどのように処理するかわからない。それはそれらすべてに焦点を合わせます。

Metacityの場合、デスクトップのウィンドウ数は、wmctrl -lを使用して2番目のフィールドをgreppingすることで確認できます。

5
user55822