Как я делаю второй снимок окна к противоположной стороне экрана?

Я происхожу из Windows 10, хотя я запустил (и принял), способ, которым работает Ubuntu, их все еще несколько вещей, которые я люблю в Windows 10, рассматриваемой функцией здесь является путь, Если я привязываю окна к экстремальной правой стороне дисплея, это поднимает правильную половину части дисплея (который также подобен в человечности), но другое приложение в фоне берет левую половину дисплея и не должно вручную делать этого.

Screenshot

В этом изображении, если бы я привязываю Окна браузера направо, окно Nautilus не влияло бы действием, Но я хочу, чтобы оно (окно наутилуса) привязалось к левому

Подробнее

  • Ubuntu 17.04
  • Аромат Gnome

Обновление

результат fillscreen.py сценарий

1st result

в первой попытке fillscreen уведомление прибыл (я не мог получить это), и это переместило 2-е окно (окно в праве) в поле, и 1-е окно не было затронуто вообще.

2nd result

во второй попытке присутствовало это смещение, но это действительно работало (и это главным образом работает),

2
задан 24 April 2017 в 09:05

1 ответ

Важное примечание!

Сценарий ниже сделает точно, как Вы описываете на двух самых молодых окнах, который является: два окна, которые были в последний раз созданы.

Сценарий, поведение

  • Сценарий действует на перетаскивание одного из двух "новейших" окон к одной из этих двух областей на экране, как показано в изображении.

    enter image description here

    Область сознательно не трудна в угол, чтобы удостовериться, что это не вмешивается в "нормальную" привязку окна.

  • Если окно тормозится к любой из областей, сценарий ожидает 0,15 секунды, чтобы видеть, находится ли мышь все еще в том же положении, чтобы удостовериться, что не действовала, если пользователь был на пути к углу экрана для нормальной привязки окна.

  • Впоследствии, перетащенное окно сфотографировано в половину экрана, область идет, второе окно сфотографировано к противоположной стороне экрана

    1. перетащите окно к области

    enter image description here

    2. снимки окна, другой привязывается на противоположный сайт

    enter image description here

  • наконец, как подтверждение, уведомление показывает в течение трех секунд:

    enter image description here

    См. сценарий в действии

Сценарий и установка

Установка включает два объекта:

  • сценарий:

    #!/usr/bin/env python3
    import sys
    import os
    import subprocess
    import time
    from operator import itemgetter
    from itertools import groupby
    import math
    
    #--- set your preferences below: padding between windows, margin(s)
    cols = 2; rows = 1; padding = 20; left_margin = 0; top_margin = 30
    #---
    
    fpath = os.path.dirname(os.path.abspath(__file__))
    n_wins = cols*rows
    
    
    def get_spot(pos):
        # get the resolution
        scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2
        res = [int(n) for n in scrdata[resindex].split("+")[0].split("x")]
        # list the corners, could be more elegant no doubt
        corners = [[0, res[1]], [res[0], res[1]]]
        diff = [int(math.sqrt(sum([(c[i]-pos[i])**2 for i, n in enumerate(res)])))\
                for c in corners]
        return diff
    
    def get(cmd):
        try:
            return subprocess.check_output(cmd).decode("utf-8")
        except subprocess.CalledProcessError:
            pass
    
    def get_res():
        xr = get("xrandr").split(); pos = xr.index("current")
        return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
    
    def get_pos():
        return [int(s.split(":")[1]) for s in get(["xdotool", "getmouselocation"]).split()[:2]]
    
    
    def check_window(w_id):
        w_type = get(["xprop", "-id", w_id])
        if " _NET_WM_WINDOW_TYPE_NORMAL" in w_type:
            return True
        else:
            return False
    
    def confirm():
        val = False
        mouseloc = get_spot(get_pos())
        match = [mouseloc.index(n) for n in mouseloc if 50 < n < 400]
        if match:
            time.sleep(0.15)
            val = True if get_spot(get_pos()) == mouseloc else False
        return val, match
    
    def arrange_wins(active, side):
        # get resolution
        res = get_res()
        # define (calculate) the area to divide
        area_h = res[0] - left_margin; area_v = res[1] - top_margin
        # create a list of calculated coordinates
        x_coords = [int(left_margin+area_h/cols*n) for n in range(cols)]
        y_coords = [int(top_margin+area_v/rows*n) for n in range(rows)]
        coords = sum([[(cx, cy) for cx in x_coords] for cy in y_coords], [])
        # calculate the corresponding window size, given the padding, margins, columns and rows
        w_size = [str(int(area_h/cols - padding)), str(int(area_v/rows - padding))]
        # find windows of the application, identified by their pid
        active = hex(int(get(["xdotool", "getactivewindow"])))
        active = active[:2]+(10-len(active))*"0"+active[2:]
        wlist = [w.split()[0] for w in get(["wmctrl", "-l"]).splitlines()]
        w_list = [w for w in wlist if check_window(w) == True][-n_wins:]
        try:
            w_list = w_list[::-1] if w_list.index(active) != side else w_list
        except ValueError:
            pass
        else: 
            print(w_list)
            # remove possibly maximization, move the windows
            for n, w in enumerate(w_list):
                data = (",").join([str(item) for item in coords[n]])+","+(",").join(w_size)
                cmd1 = "wmctrl -ir "+w+" -b remove,maximized_horz"
                cmd2 = "wmctrl -ir "+w+" -b remove,maximized_vert"
                cmd3 = "wmctrl -ir "+w+" -e 0,"+data
                for cmd in [cmd1, cmd2, cmd3]:
                    subprocess.Popen(["/bin/bash", "-c", cmd])
    
    wins1 = []
    
    while True:
        time.sleep(0.5)
        windata = get(["wmctrl", "-lG"])
        if windata:
            wins2 = [[l[0], l[2]] for l in [
                ln.split() for ln in windata.splitlines()]
                       ]
            # combined window locations old/new, grouped to see if moved
            winlocs = sorted(wins1 + wins2, key = itemgetter(0))
            test = [[item, [item[1] for item in list(occ)]] \
                    for item, occ in groupby(winlocs, itemgetter(0))]
            for item in test:
                # old loc, new loc of window
                locs = item[1]
                # window moves?
                if locs.count(locs[0]) != len(locs):
                    args = confirm()
                    if args[0]:
                        arrange_wins(item[0], args[1][0])
                        subprocess.Popen([
                            "notify-send", "-i", os.path.join(
                                fpath, "left.png"), "Fill screen"
                            ])
                        time.sleep(3)
                        subprocess.Popen(["pkill", "notify-osd"])
            wins1 = wins2
    
  • значок для показа в уведомлении

    enter image description here

Установка

  1. Установите обоих xdotoolи wmctrl
  2. Скопируйте сценарий в пустой файл, сохраните его как fillscreen.py в специализированной папке где-нибудь.
  3. Щелкните правой кнопкой по значку выше, сохраните его как (точно) left.png в одной и той же папке как сценарий.
  4. Теперь откройте терминал, выполните команду:

    python3 /path/to/fillscreen.py
    

    Обратите внимание, что это окно терминала является одним из этих двух окон, которые привяжет сценарий. Draf терминал или к одной из областей слева или к праву. Два новых окна должны привязаться.

  5. Если все хорошо работает, добавьте сценарий для запущения приложений: Тире> Приложения Запуска> Добавляет. Добавьте команду:

    /bin/bash -c "sleep 10 && python3 /path/to/fillscreen.py"
    

Примечание:

Вследствие того, что сценарий только действует на перемещение окна, и впоследствии все дальнейшие действия зависят от ситуации, сценарий является очень низким на соке. Намного ниже затем я ожидал, что это будет, когда я начал работать над ним.

1
ответ дан 2 December 2019 в 04:49

Другие вопросы по тегам:

Похожие вопросы: