Comment placer une fenêtre XUL « Always On Top »?
-
30-09-2019 - |
Question
Je trouve ce fichier au code Google avec la fonction:
function SetAlwaysOnTop() {
var chkTop = document.getElementById("itmAlwaysOnTop");
var xulWin = window.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation).QueryInterface(Ci.nsIDocShellTreeItem)
.treeOwner.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIXULWindow);
if(chkTop.getAttribute("checked") == "true") {
xulWin.zLevel = xulWin.raisedZ;
} else {
xulWin.zLevel = xulWin.normalZ;
}
}
Les parties de ce que j'ai besoin sont juste:
var xulWin = window.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation).QueryInterface(Ci.nsIDocShellTreeItem)
.treeOwner.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIXULWindow);
xulWin.zLevel = xulWin.raisedZ;
Mais je ne trouve pas ce où est le Ci défini. Toute idée que peut-il être? Ou toute autre idée de comment définir une fenêtre toujours sur le dessus? (Cette solution "juste pour les fenêtres" ne pas fits pour moi).
- Mise à jour
Je lis sur le nsIWindowMediator , qui a des méthodes pour gérer la fenêtre pour Z . Mais il est dit que les méthodes doivent être utilisées de c ++, pas javascript. Cela signifie que le code doit être utilisé à partir de composants XPCOM (je devrais comme XPCOM élément pour ouvrir la fenêtre)? Est-ce que quelqu'un qui déjà utilisé pourrait confirmer
Je lis toujours de toute façon.
- Mise à jour
Je l'ai essayé le nsIWindowMediator (avec un composant XPCOM), mais il n'a tout simplement rien quand je régler le niveau Z.
cherchent encore un moyen de mettre les aways fenêtre sur le dessus ..
- tentative avec 'alwaysraised':
test.xul:
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window width="400" height="300"
onload="open('top.xul','GreenfoxChannelWindow','chrome, alwaysraised');"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<label value="MAIN WINDOW"/>
</window>
top.xul:
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window width="400" height="300"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<label value="ON TOP"/>
</window>
n'a pas travaillé.
- tentative avec 'zlevel':
test.xul:
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window width="400" height="300"
onload="open('top.xul','GreenfoxChannelWindow','chrome');"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<label value="MAIN WINDOW"/>
</window>
top.xul:
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window width="400" height="300" zlevel="6"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<label value="ON TOP"/>
</window>
n'a pas travaillé. Nither avec alwaysraised sertie, ou en ajoutant un zlevel supérieure ou inférieure à la test.xul (avec top.xul zlevel = "6")
La solution
Résultats:. Il suffit d'ouvrir l'aide openDialog, et il sera toujours au-dessus
Ex:
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window width="400" height="300"
onload="openDialog('top.xul','TopWindow','chrome');"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<label value="MAIN WINDOW"/>
</window>
top.xul:
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<window width="400" height="300"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<label value="ON TOP" />
</window>
Autres conseils
Si vous voulez toujours la fenêtre pour être sur le dessus, le plus simple est d'utiliser le drapeau de chrome alwaysraised
lors de l'ouverture de la fenêtre.
Si vous ne parvenez pas à ouvrir la fenêtre vous, la deuxième façon la plus simple est d'utiliser <window zlevel="6">
dans votre XUL. Vous pouvez même conserver l'zlevel; La fenêtre d'aide de Seamonkey fait cela, en utilisant une option de menu contextuel pour basculer l'zLevel.
Par ailleurs, Ci
est une abréviation courante pour Components.interfaces
depuis l'écriture (par exemple) Components.interfaces.nsIXULWindow.rasiedZ
est difficile à faire sur les lignes de 80 caractères.