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

Я после способ:

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

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

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

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

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


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

Я могу преобразовать окно Mutk в 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 или ГТК 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), а затем попытайтесь удалить украшение согласно ранее связанному вопросу, окно (и процесс) умирает! Я не уверен, что ошибка.

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-темы окна метасити (что, я знаю, вы можете сделать для достижения этой цели).

1 ответ

Решение

After a bit of discussion with the gnome-shell devs, this was resolved.

The conversion I attempted to do in 1. was never an option - that sort of thing doesn't work.

The version in 2. was the correct code, but would only work if run from outside a gnome-shell extension (ie run the javascript file using the gjs binary as opposed to from the looking glass or an extension). It turned out that mucking around with window decorations like that from within the gnome-shell/mutter process would cause the crash.

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

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

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