web-dev-qa-db-fra.com

Masquer le titre de la fenêtre dans gnome-Shell en utilisant mutter, gdk, wnck ou gtk

Je cherche un moyen de:

  1. obtenir la liste de toutes les fenêtres d'application actuellement ouvertes, en tant que fenêtre Gdk ou Gtk
  2. supprimer les décorations de fenêtre pour les fenêtres sélectionnées (maximisées dans mon cas).

J'aimerais faire cela en utilisant mutter, gdk, wnck ou gtk (ou GdkX11, ...) (c'est-à-dire tout ce qui comporte une introspection de gobject).

J'ai vu la question suivante: Supprimer la barre de titre de la fenêtre du terminal maximisé mais je ne parviens pas à la convertir en quelque chose qui fonctionne.

(Le langage que j'utilise est le javascript, mais c'est un peu hors de propos puisque tout cela utilise l'introspection de gobject).

J'utilise actuellement GNOME 3.2 (je suis cependant ouvert aux solutions GNOME 3.4).


En ce qui concerne 1., je sais que je peux obtenir toutes les fenêtres avec wnck et mutter assez facilement (par exemple Wnck.Screen.get_default().get_windows()), mais comment puis-je les convertir en G (t ou d?) K fenêtres afin de supprimer les décorations?

Je peux convertir une fenêtre de murmure en une fenêtre Gdk comme celle-ci:

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

Cependant , cet objet xwin ne répond pas aux commandes telles que xwin.unmaximize() et xwin.maximize(), je sens donc que quelque chose s'est mal passé lors de la conversion. !

La raison pour laquelle je veux convertir la fenêtre en Gdk ou en Gtk, c'est pour pouvoir utiliser Gdk set_decorations ou en Gtk set_hide_titlebar_when_maximized .

J'ai jeté un œil à Gdk.Screen.get_default().get_toplevel_windows() et Gtk.Window.list_toplevels(), mais ces listes renvoient plus de fenêtres que celles que j'ai ouvertes et je ne suis pas sûr que mes fenêtres d'application réelles soient dans la liste et comment les faire correspondre.


Quant à 2., si j’obtiens d’abord la fenêtre active de Gdk (puisque je sais que c’est une fenêtre de Gdk et qu’elle répond correctement à des événements tels que unmaximize et maximize, contrairement à lorsque j'utilise _foreign_new_for_display_), puis que j'essaie de supprimer la décoration conformément à la question précédemment liée, la fenêtre (et le processus) meurent! Je ne sais pas quelle est l'erreur.

_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();
_

Si j'utilise curwin.set_decorations(Gdk.WMDecoration.BORDER) (remarque: documentation de la fenêtre GDK ici ), la fenêtre s'affiche comme je le souhaite lorsque la fenêtre n'est pas maximisée (la barre de titre a disparu), mais lorsqu'elle est agrandie, l'espace pour la barre de titre reste, bien que le texte lui-même ne soit pas affiché.


Quelqu'un pourrait-il me donner un aperçu de la manière d'atteindre l'un ou l'autre de mes objectifs? (En fin de compte, masquage automatique de la barre de titre des fenêtres maximisées, comme maximus pour le remix de netbook Unity d’Ubuntu). Je souhaite vraiment utiliser ceci en utilisant Gtk/Gdk/wnck/mutter/n'importe quoi avec l'introspection de gobject, par opposition à une application externe comme compiz ou en modifiant le code XML du thème de la fenêtre de métacité (ce que je sais que vous pouvez faire pour y parvenir).

4

Après quelques discussions avec les développeurs gnome-Shell, le problème a été résolu.

La conversion que j'ai tenté de réaliser dans 1. n'a jamais été une option - ce genre de chose ne fonctionne pas.

La version dans 2. était le code correct, mais ne fonctionnerait que si elle était exécutée à partir de extérieur une extension gnome-Shell (c.-à-d. Exécuter le fichier javascript à l'aide du binaire gjs par opposition à la recherche. verre ou une extension). Il s'est avéré que foncer avec des décorations de fenêtres comme celle du processus gnome-Shell/murmure provoquerait le crash.

Donc, le problème pourrait être résolu tant que le code était exécuté depuis l'extension extérieur. Lancer un processus externe pour exécuter le script dans l'option 2) fonctionnait (même s'il s'est avéré plus facile de simplement générer xprop et de définir le _GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED atom sur true sur la fenêtre (identifié par son X ID, étant le enfant ​​de la fenêtre avec le XID de l'acteur de la fenêtre).

(Si quelqu'un est intéressé, le résultat final est le extension de Maximus gnome Shell )

3
mathematical.coffee