首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何识别不同的Chrome窗口时,使用“继续您停止”的-option (在wmctrl中使用)?

如何识别不同的Chrome窗口时,使用“继续您停止”的-option (在wmctrl中使用)?
EN

Ask Ubuntu用户
提问于 2015-09-14 20:21:57
回答 2查看 2.1K关注 0票数 3

我正在使用多个Chrome窗口(3-5),每个窗口都有许多打开的选项卡,我使用的是“启动时”>“继续关闭”设置。问题是,当我启动chrome时,所有的窗口都是在当前工作区上打开的(我使用的是4个工作区)。我需要做的是将每个窗口移动到特定的工作区。我需要选择窗口的ID,因为窗口的标题可能总是不同的(取决于哪个选项卡在焦点上)。一直手动将窗口移动到正确的工作场所是有点烦人的。

这是我的wmctrl -l命令的输出:

代码语言:javascript
复制
wmctrl -l
0x01e00002  0 posuk13-PCSPEC XdndCollectionWindowImp
0x01e00005  0 posuk13-PCSPEC unity-launcher
0x01e00008  0 posuk13-PCSPEC unity-panel
0x01e0000b  0 posuk13-PCSPEC unity-dash
0x01e0000c  0 posuk13-PCSPEC Hud
0x0300000a  0 posuk13-PCSPEC Desktop
0x04400001  0 posuk13-PCSPEC Inbox - xxxxxx@gmail.com - Gmail - Google Chrome
0x04400039  0 posuk13-PCSPEC How to move Chrome windows using wmctrl? - Ask Ubuntu - Google Chrome
0x0440003a  0 posuk13-PCSPEC YouTube - Google Chrome
0x0440003b  0 posuk13-PCSPEC Online regex tester and debugger: JavaScript, Python, PHP, and PCRE - Google Chrome

现在假设我需要将YouTube窗口移动到工作区#2。

代码语言:javascript
复制
wmctrl -r YouTube -e 0,2000,0,-1,-1

这也起作用了:

代码语言:javascript
复制
wmctrl -r 0x0440003a -i -e 0,2000,0,-1,-1

但问题是,每次重新启动时,窗口ID是不同的,每次切换选项卡时,窗口ID的标题都是不同的。是否有一种方法可以按部分(最后3-4位数字)选择其ID的窗口(在重启后启动窗口时,最后2-3位数字总是相同的),还是从列表中选择例如第7个窗口?我需要这样做的原因是我想要编写启动所有所需应用程序的脚本(Chrome,Apache,SublimeText.)并将窗口移动到特定的工作场所(我有一个工作场所用于电子邮件/Facebook,一个用于音乐,另一个用于工作)。

PS:请不要建议使用系统休眠--这对我来说不是一个选项,因为有些司机问题。

PS2:我正在使用Ubuntu15.04

EN

回答 2

Ask Ubuntu用户

回答已采纳

发布于 2015-09-14 21:20:38

如何识别Chrome

的特定窗口

如果窗口总是按照相同的时间顺序(如您在注释中提到的)创建(在启动时),则可以使用命令wmctrl -l的输出的特定属性:列表总是按照创建的顺序列出窗口。

这意味着如果你有(例如)三个窗口,按相同的顺序重新创建,您可以首先过滤掉属于Chrome的窗口,然后根据窗口的顺序“标记”它们在wmctrl输出中的出现(Ed)。

如何从wmctrl

中筛选出Chrome窗口

要标识属于应用程序的窗口,需要使用以下命令:

代码语言:javascript
复制
wmctrl -lp

它还将显示窗口所属的pid。通常,这是一个单一pid。然而,在Chrome的例子中,将会有几个。然后,以编程方式进行的过程是:

  1. 通过运行: pgrep查找Chrome的pids
  2. 运行命令: wmctrl -lp
  3. 每个窗口解析出该窗口所属的pid,并在pgrep chrome的输出(列表)中查找匹配项。
  1. 这将生成属于Chrome的窗口列表。如前所述,他们的身份是他们在名单中的顺序。然后,您所需要做的就是解析它们的窗口id (运行的wmctrl -lp输出中的第一个字符串),您就完成了。

随后,使用通常的命令将窗口移动到所需的工作区。

一个示例;测试

作为测试这是否有效的示例脚本(python,还有什么:)

代码语言:javascript
复制
#!/usr/bin/env python3
import subprocess

# get the list of pids of chrome
pids = [p for p in subprocess.check_output(["pgrep", "chrome"]).decode("utf-8").splitlines()]
# get the list of windows
windows = [l.split() for l in subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8").splitlines()]
# filter out the windows of chrome, parse their window-id
matches = [w[0] for w in windows if w[2] in pids]
print(matches)

# raise the window
subprocess.Popen(["wmctrl", "-ia", matches[0]])

在本例中,我打开了三个Chrome窗口,按照您的描述关闭了它们,并再次打开了Chrome

matches[0] (最后一行)中,我让它引发列表的第一个窗口:

代码语言:javascript
复制
['0x05600001', '0x05600039', '0x0560003a']

在下一次运行时,窗口id已经更改:

代码语言:javascript
复制
['0x05800001', '0x05800039', '0x0580003a']

但是它们在列表中的顺序仍然存在,因为(实际上)窗口总是按照相同的(时间顺序)创建。因此,脚本的最后一行:

代码语言:javascript
复制
subprocess.Popen(["wmctrl", "-ia", matches[0]])

总是打开相同的(第一个)窗口,而

代码语言:javascript
复制
subprocess.Popen(["wmctrl", "-ia", matches[1]])

永远都会提出第二个等等。

用“移动”命令替换“提升-命令”,您就可以完成脚本工作了。

票数 2
EN

Ask Ubuntu用户

发布于 2015-09-15 07:21:19

所以我能够用Python来解决这个问题。请记住,这是我的第一个Python脚本,所以它并不完美。

代码语言:javascript
复制
#!/usr/bin/python
import subprocess

foo=subprocess.check_output(["wmctrl", "-lx"])  #list windows with WM_CLASS
def f1(foo=foo): return iter(foo.splitlines())
list=list(f1());
gloop=0  #google loop - to count google windows
sloop=0  #sublime loop - to count sublime windows (currently only one, but I might add more in future)
google = [ ["0", "0"], ["2000", "0"], ["2000", "2000"],  ["2000", "0"] ]  #google windows positioning
sublime = [ ["2000", "0"] ]  #sublime windows positioning
for s in list:
    if (s[14:20]=='Google'):
        #print "Google"
        windowid=s[0:10]
        windowpos="0,"+google[gloop][0]+","+google[gloop][1]+",-1,-1"
        subprocess.call(["wmctrl", "-r", windowid, "-i", "-e", windowpos]);
        gloop+=1
    if (s[14:20]=='sublim'):
        #print "Sublime_text"
        windowid=s[0:10]
        windowpos="0,"+sublime[sloop][0]+","+sublime[sloop][1]+",-1,-1"
        subprocess.call(["wmctrl", "-r", windowid, "-i", "-e", windowpos]);
        sloop+=1
票数 0
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/674186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档