LINUX.ORG.RU

[ЖЖ][python][code wtf] pytyle2 и панели по бокам экрана

 ,


0

2

Обнаружил, что pytyle2 резервирует место под панели, даже если они в режиме автоскрытия, полез разбираться. Нашел такой вот кусок кода:

            for wid in wids:
                win = ptxcb.Window(wid)

                # We're listening to _NET_WORKAREA, so a panel
                # might have died before _NET_CLIENT_LIST was updated...
                try:
                    x, y, w, h = win.get_geometry()
                    d = win.get_desktop_number()
                except:
                    continue

                if self.workspace.contains(win.get_desktop_number()) and self.contains(x, y):
                    struts = win.get_strut_partial()

                    if not struts:
                        struts = win.get_strut()

                    key = (x, y, w, h, struts)

                    if key in log:
                        continue

                    log.append(key)

                    if struts and not all([struts[i] == 0 for i in struts]):
                        if struts['left'] or struts['right']:
                            if struts['left']:
                                self.wa_x += w
                            self.wa_width -= w

                        if struts['top'] or struts['bottom']:
                            if struts['top']:
                                self.wa_y += h
                            self.wa_height -= h
                    elif struts:
                        # When accounting for struts on left/right, and
                        # struts are reported properly, x shouldn't be
                        # zero. Similarly for top/bottom and y.

                        if x > 0 and self.width == (x + w):
                            self.wa_width -= w
                        elif y > 0 and self.height == (y + h):
                            self.wa_height -= h
                        elif x > 0 and self.wa_x == x:
                            self.wa_x += w
                            self.wa_width -= w
                        elif y > 0 and self.wa_y == y:
                            self.wa_y += h
                            self.wa_height -= h

(полная версия)

Тут перебираются окна верхнего уровня, проверяется их свойство struts, резервирующее место под окно панельного типа и пересчитывается размер области, доступной для окон приложений.

Долго медитировал, глядя на код. Мучили вопросы:

1. Зачем берутся размеры окна панели (self.wa_width -= w) вместо явно указанного в struts размера зарезервированной под панель области?

2. Какой мистический смысл заключен в проверке and not all([struts == 0 for i in struts])?

3. Что за wtf живёт под условием elif struts и какой частный случай он призвал был обслуживать?

Попробовал исправить п.1. Столкнулся с тем, что после этого перестало корректно вычисляться место рабочей области, если с одной стороны экрана пристыковано более одной панели. Что и логично, если посмотреть свойства окон через xprops. В итоге вышеуказанный винегрет переписал вот так:

            for wid in wids:
                win = ptxcb.Window(wid)

                # We're listening to _NET_WORKAREA, so a panel
                # might have died before _NET_CLIENT_LIST was updated...
                try:
                    x, y, w, h = win.get_geometry()
                    d = win.get_desktop_number()
                except:
                    continue

                if self.workspace.contains(win.get_desktop_number()) and self.contains(x, y):
                    struts = win.get_strut_partial()

                    if not struts:
                        struts = win.get_strut()

                    key = (x, y, w, h, struts)

                    if key in log:
                        continue

                    log.append(key)

                    if struts:
                        struts_left = max(struts_left, struts['left'])
                        struts_right = max(struts_right, struts['right'])
                        struts_top = max(struts_top, struts['top'])
                        struts_bottom = max(struts_bottom, struts['bottom'])


            self.wa_x += struts_left
            self.wa_width -= struts_left + struts_right
            self.wa_y += struts_top
            self.wa_height -= struts_top + struts_bottom

У этом варианте, УМВР.

Собственно вопрос. Кто-нибудь понимает, что хотел сказать автор кода? Или это просто code wtf, бессмысленный и беспощадный?

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.