Как разместить окно Xul как «Всегда сверху»? - PullRequest
3 голосов
/ 02 декабря 2010

Я нашел этот файл в коде Google с функцией:

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;
    }
}

Части, которые мне нужны, просто:

var xulWin = window.QueryInterface(Ci.nsIInterfaceRequestor)
        .getInterface(Ci.nsIWebNavigation).QueryInterface(Ci.nsIDocShellTreeItem)
        .treeOwner.QueryInterface(Ci.nsIInterfaceRequestor)
        .getInterface(Ci.nsIXULWindow);
xulWin.zLevel = xulWin.raisedZ;

Но я не нахожу, что, где определен Си. Есть идеи, что это может быть? Или любая другая идея о том, как установить окно всегда сверху? (это решение "только для окон" мне не подходит).

- обновление

Я читаю о nsIWindowMediator , в котором есть несколько методов для обработки Z-порядка окна. Но это говорит о том, что методы должны использоваться из c ++, а не из JavaScript. Это означает, что код должен использоваться из компонентов XPCOM (я должен как компонент XPCOM, чтобы открыть окно)? Кто-нибудь, кто уже использовал это, мог подтвердить?

Я все еще читаю.

- обновление

Я пробовал nsIWindowMediator (с компонентом XPCOM), но он просто ничего не делает, когда я устанавливаю уровень Z.

Все еще ищите способ поставить окно сверху ...

- попытка «всегда поднят»:

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>

не сработало.

- попытка с использованием '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>

не сработало. Ни с установленным всегда повышенным, либо с добавлением более высокого или более низкого уровня zlevel к test.xul (с top.xul zlevel = "6")

Ответы [ 2 ]

2 голосов
/ 08 февраля 2011

Найдено: просто откройте его с помощью openDialog, и оно всегда будет сверху.

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>
1 голос
/ 22 января 2011

Если вы всегда хотите, чтобы окно было сверху, то самый простой способ - использовать хромированный флаг alwaysraised при открытии окна.

Если вы не можете открыть окно самостоятельно, второй самый простой способ - использовать <window zlevel="6"> в вашем XUL. Вы можете даже сохранить уровень; Окно справки SeaMonkey делает это, используя опцию контекстного меню для переключения zLevel.

Кстати, Ci - это обычное сокращение для Components.interfaces, так как писать (например) Components.interfaces.nsIXULWindow.rasiedZ сложно на 80-символьных строках.

...