LINUX.ORG.RU

Maximize terminal

 , ,


0

1

Известно, что gnome-terminal ресайзится не плавно по 1 пикселю, а дискретно на кратное размеру знакоместа число пикселей, например, по 9 пикселей по ширине и по 18 пикселей по высоте, поэтому его окну нельзя задать произвольный размер. Но тем не менее, современные оконные менеджеры позволяют развернуть окно терминала на весь экран (максимизировать) так, что не остаётся пустого места вокруг окна и размер этого окна не удовлетворяет требованиям к дискретному ресайзу.

Проблема такая: когда я пытаюсь из собственного оконного менеджера с помощью XConfigureWindow() задать размер окну терминала, равный размеру экрана (но не помещающий целое число знакомест), терминал начинает вести себя странно: его главное окно не отрисовывается вообще, т.е. ввода и промпта не видно, а если открыть меню, то после закрытия след от него останется. Я ловлю ConfigureRequest'ы и смотрю в них на _NET_WM_STATE: если там есть _NET_WM_MAXIMIZED_VERT или _NET_WM_MAXIMIZED_HORZ, то я соответствующим образом меняю координаты и размер окна и вызываю XConfigureWindow() с изменённым размером, иначе я вызываю XConfigureWindow() с теми координатами и размером, что мне пришли в сообщении.

После первого XConfigureWindow() с максимизированным окном терминал пытается послать ещё один ConfigureRequest с чуть меньшими координатами, на что WM делает ещё один такой же, как и первый, XConfigureWindow().

Терминал запускаю так: «DISPLAY=:1 gnome-terminal --maximize».

Reparent окон я пока не делаю, рамки не рисую.

Что я делаю не так? Почему с другими оконными менеджерами типа openbox нет такой проблемы? В исходниках openbox и xfwm4 не нашёл явного решения. Как исправить проблему в моём WM?

Кажется, решилось посылкой synthetic ConfigureNotify event, несмотря на то, что в ICCCM не написано, что его нужно посылать:

Resizing the window or changing its border width (regardless of whether the window was also moved or restacked).

A client that has selected for StructureNotify events will receive a real ConfigureNotify event. Note that the coordinates in this event are relative to the parent, which may not be the root if the window has been reparented. The coordinates will reflect the actual border width of the window (which the window manager may have changed). The TranslateCoordinates request can be used to convert the coordinates if required.

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