Скрыть заголовок окна в gnome-shell, используя mutter, gdk, wnck или gtk

У меня есть способ:

  1. получить список всех открытых в настоящее время окон приложений в виде окон Gdk или Gtk
  2. удалить декорации окон для выбранных окон (развернуто в мой случай).

Я хотел бы сделать это, используя mutter, gdk, wnck или gtk (или GdkX11, ...) (то есть что-нибудь с самоанализом объекта).

Я видел следующий вопрос: Удалите заголовок заголовка из развернутого окна терминала , но я пытаюсь преобразовать его во что-то, что работает.

(Язык, который я использую, - это javascript, но это несколько не имеет значения, так как все использует интроспекцию gobject).

В настоящее время я использую GNOME 3.2 (хотя я открыт для решений GNOME 3.4).


Что касается 1. , я знаю, что могу получить все окна с wnck и mutter довольно легко (например, Wnck.Screen.get_default().get_windows()), но как мне затем преобразовать их в G (t или d?) k окон, чтобы убрать украшения?

Я могу преобразовать окно бормочущего в Gdk примерно так:

xwin = GdkX11.X11Window.foreign_new_for_display( 
                          Gdk.Display.get_default(), 
                          mutterWindow.get_compositor_private()['x-window'] );

Однако , этот объект xwin не отвечает на команды, такие как xwin.unmaximize() и xwin.maximize(), поэтому я чувствую, что что-то пошло не так при преобразовании!

Причина, по которой я хочу преобразовать окно в Gdk или Gtk, заключается в том, что поэтому я могу использовать Gdk set_decorations или Gtk set_hide_titlebar_when_maximized .

Я взглянул на Gdk.Screen.get_default().get_toplevel_windows() и Gtk.Window.list_toplevels(), но они возвращают списки большего количества окон, чем у меня, и я не уверен, есть ли в списке мои фактические окна приложений и как их сопоставить.


Что касается 2. , если я сначала получу активное окно из GDK (поскольку я знаю, что это окно GDK, и оно правильно реагирует на такие события, как unmaximize и maximize в отличие от того, когда я использую foreign_new_for_display), а затем пытаюсь удалить оформление согласно ранее связанному вопросу, окно (& process) умирает! Я не уверен, в чем ошибка.

const Gdk = imports.gi.Gdk;

// get current window. It's a terminal, not null.
// For now assume it's maximized.
curwin = Gdk.Screen.get_default().get_active_window();
// decorations don't seem to updated unless I unmaximize & re-maximize
curwin.unmaximize();
// try remove decorations: window + process dies!
curwin.set_decorations(0);
curwin.maximize();

Если я использую curwin.set_decorations(Gdk.WMDecoration.BORDER) (примечание: документация окна GDK здесь ), окно появляется так, как я хочу, когда окно не максимизировано (строка заголовка пропала), но когда развернуто, пространство для строка заголовка все еще остается, хотя сам текст не отображается.


Кто-нибудь сможет дать мне представление о том, как достичь любой из моих целей? (В конечном счете, автоматическое скрытие заголовков максимизированных окон, например, maximus для ремикса нетбука Unity от Ubuntu). Я действительно хочу использовать это, используя Gtk / Gdk / wnck / mutter / что-нибудь с интроспекцией gobject, в отличие от внешнего приложения, такого как compiz, или изменения XML-темы окна метасити (что, я знаю, вы можете сделать для достижения этой цели).

4
задан 13 April 2017 в 15:23

1 ответ

После небольшого количества обсуждения с оболочкой гнома devs, это было разрешено.

преобразование я попытался сделать в 1. никогда не была опция - такая вещь не работает.

версия в 2. был корректный код, но будет только работать, если выполнено от внешний расширение оболочки гнома (т.е. выполните файл JavaScript с помощью gjs двоичный файл в противоположность от зеркала или расширения). Оказалось, что слоняние без дела с художественными оформлениями окна как этот из процесса gnome-shell/mutter вызовет катастрофический отказ.

, Таким образом, проблема могла быть решена, пока код был выполнен от внешний расширение. Запуск внешнего процесса для выполнения сценария в опции 2), работал (хотя оказалось легче просто породить xprop и установить _GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED атом к true на окне (определенный его X идентификаторами, будучи ребенок из окна с XID агента окна).

(Если кому-либо интересно, конечный результат расширение оболочки гнома Maximus )

3
ответ дан 13 April 2017 в 15:23

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

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