代码之家  ›  专栏  ›  技术社区  ›  scippie

i3 wm:在特定的屏幕上启动我的应用程序,使其聚焦并将鼠标移动到那里

  •  0
  • scippie  · 技术社区  · 5 年前

    我搜索了几个论坛,总能找到部分答案,但似乎没有一个能解决我的问题。

    我正在一台台式电脑上开发自己的游戏(顺便说一句,我使用Arch;-)),有两个屏幕和i3窗口管理器。我在右边(1:1)屏幕上开发,编译后我想在左边(16:9)屏幕上打开我的游戏。在编译过程中,我可以通过将鼠标移动到左屏幕来模拟这一点,这样游戏就会在那里打开,但我需要打开一个空的工作区才能移动到其中。

    我可以在i3配置文件中找到解决方案,在那里我可以在特定的工作区(不一定是特定的监视器)上专门打开一个带有特定类名的窗口,之后我当然不能给它焦点。

    我希望能够用命令行命令来实现这一点:我在vim中开发,并有一个启动make&运行脚本。当没有编译器错误时,脚本将运行应用程序。如果该命令可以扩展为“并将其放在空工作区的左侧监视器上,并通过将鼠标移动到该工作区来为其提供焦点”,那就太好了。

    一个可靠的i3配置解决方案也可以,也许更好,因为我不需要笔记本电脑上的功能。

    如果有帮助的话,我不介意为我的游戏预留一个特定的工作空间。

    任何人

    0 回复  |  直到 5 年前
        1
  •  4
  •   prosoitos CodeHunter    5 年前

    我可以在i3配置文件中找到解决方案,我可以在特定的工作区(不一定是特定的监视器)上专门打开一个带有特定类名的窗口,当然我不能(原文如此)在那之后集中注意力。

    (注意:这里的“不是”是打字错误吗?我有点困惑)。

    就配置文件的解决方案而言,您已经完成了一半。你需要做的唯一一件事就是把这个工作区放在你选择的显示器上。

    下面是一个完整的解决方案(带有配置文件),包括您已经解决的步骤:

    1.为你的游戏留出一个工作空间

    由于您可以创建任意多个工作区,因此这没有任何不利之处。

    assign [class="MyGame"] game
    

    2.将此工作区分配到左侧屏幕

    首先,你需要知道屏幕的名称 xrandr ( xorg-xrandr 包裹在拱门上)。

    以下是“我的设置”中的输出示例:

    $ xrandr
    
    Screen 0: minimum 8 x 8, current 2560 x 2520, maximum 32767 x 32767
    eDP1 connected primary 1920x1080+0+1440 (normal left inverted right x axis y axis) 310mm x 170mm
       1920x1080     60.00*+  59.93    48.00  
       1680x1050     59.95    59.88  
       1400x1050     59.98  
       1600x900      60.00    59.95    59.82  
       1280x1024     60.02  
       1400x900      59.96    59.88  
       1280x960      60.00  
       1368x768      60.00    59.88    59.85  
       1280x800      59.81    59.91  
       1280x720      59.86    60.00    59.74  
       1024x768      60.00  
       1024x576      60.00    59.90    59.82  
       960x540       60.00    59.63    59.82  
       800x600       60.32    56.25  
       864x486       60.00    59.92    59.57  
       640x480       59.94  
       720x405       59.51    60.00    58.99  
       640x360       59.84    59.32    60.00  
    DP1 disconnected (normal left inverted right x axis y axis)
    DP2 connected 2560x1440+0+0 (normal left inverted right x axis y axis) 550mm x 310mm
       2560x1440     59.95*+
       2048x1080     60.00    24.00  
       1920x1080     60.00    50.00    59.94  
       1920x1080i    60.00    50.00    59.94  
       1600x1200     60.00  
       1280x1024     75.02    60.02  
       1152x864      75.00  
       1280x720      60.00    50.00    59.94  
       1024x768      75.03    60.00  
       800x600       75.00    60.32  
       720x576       50.00  
       720x480       60.00    59.94  
       640x480       75.00    60.00    59.94  
       720x400       70.08  
    HDMI1 disconnected (normal left inverted right x axis y axis)
    HDMI2 disconnected (normal left inverted right x axis y axis)
    VIRTUAL1 disconnected (normal left inverted right x axis y axis)
    

    就我而言, eDP1 是我的主要(笔记本电脑)显示器和 DP2 这是我的外部监视器。

    如果我想要工作空间 game 在我的外部显示器上,我会使用:

    workspace game output DP2
    

    3.创建一个键绑定,运行“make&run脚本”,并将焦点和鼠标移动到游戏工作区

    bindsym <my-bind> exec --no-startup-id <make&run script>; workspace game
    

    不使用vim热键,而是使用i3键绑定来运行脚本(这将打开应用程序,并且由于上述设置,应用程序将在正确的监视器中打开),并将焦点移动到该监视器:

    让i3执行命令很容易,而让命令移动鼠标并集中注意力却很难(因为这是wm或桌面环境的任务)。


    我能想到这种方法的缺点:

    当你遇到一个编译器错误时,你的焦点和鼠标仍然会跳到你的左监视器上。如果这种情况经常发生,你可能会觉得很烦人。


    我从一个工作区跳到另一个工作区的方式是,我有一个命名工作区的列表,可以很容易地找到它们。

    因此,我处理这个问题的方式与使用一个键绑定(或您要求的命令)来处理整个问题略有不同:

    • 我会有一个工作区,在我的左显示器上有一堆我一直想要的应用程序
    assign [class="MyGame"] workspaceleft
    assign [class="App1"] workspaceleft
    assign [class="App2"] workspaceleft
    assign [class="App3"] workspaceleft
    
    workspace workspaceleft output <left-monitor-name-given-by-xrandr>
    workspace workspacevim output <right-monitor-name-given-by-xrandr>
    
    • 我会有一个简单的键绑定去那个工作区(其他人去我的其他工作区。所以我也会有键绑定去or,这取决于你是希望每个工作区有一个应用程序,还是每个监视器只有一个工作区,等等)
    bindsym <bind1> workspaceleft 
    bindsym <bind2> workspacevim
    

    所以我会在vim中工作,并使用vim热键。如果编译成功,由于我们早期的设置,游戏将在适当的监视器中着陆。然后我会按 <bind1> 要做到这一点(以及 <bind2> 当我想回到右边的显示器时)。

    我认为这可能比做整个键绑定更方便。

    此外,能够通过按键跳转到任何应用程序,并让我的所有应用程序在默认情况下以我想要的方式到达我想要的地方,这是我真正喜欢i3的原因之一。因此,除了这个特定的应用程序之外,设置这些东西可能会使您的工作流程变得更好。


    或者,您可以使用按键绑定在监视器之间切换:

    bindsym <bind> focus output left
    

    (请注意,此处“left”不是工作区名称,而是方向。这将在相邻设置的监控器之间切换。如果监控器相互重叠,则将“left”替换为“up”)。

    推荐文章