Полезная информация

Будьте в курсе последних изменений в мире Mozilla, следя за нашим микроблогом в Twitter.

№117-08-2012 23:45:23

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 14.0

[CB]Custom Buttons Editor: Toggle on Top

Custom Buttons Editor: Toggle on Top 0.1.11 (2015-06-04)
Совместимость: [firefox] Firefox, [seamonkey] SeaMonkey, [thunderbird] Thunderbird
Автор: Infocatcher
Описание: добавляет в редактор Custom Buttons кнопку для перевода окна поверх других окон.
Сама кнопка как таковая не нужна, это просто способ запуска, так что можно поместить ее на скрытую панель инструментов.

cbEditorToggleOnTop-ru.png
Примечание: кнопка использует API, не работающий в Linux (во всяком случае, раньше не работало).

Установить:

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3ECustom%20Buttons%20Editor%3A%20Toggle%20on%20Top%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAABm1BMVEXlAQEAAACVAAABAQGWAADlAQG9AABfAACbAADlAQGZAAAmAAC/AAAAAADgAQGVAAC8AAC5AQEAAACcAAAAAAAAAACWAAAAAACpAADeAQHjAQHfAQHiAQG/AAD6e3vrSkqaAAC4AQGcAADbAQH/jIy9AAC7AAClAACZAADkAQG4AAC2AADlAQGuBgaXAABcAABaAACvAADAJCSdAADRAQHbDQ3lAQHiAQEAAADQAQHbQ0OXAADHAQEBAQEBAQEDAwNUAgKiAADrUlKVAADjAQECAgICAgKnp6cEBAQEBARUAgKgAACdAACVAAADAwNMTEwEBAQCAgIoAAB0AACYAABwAACpAAAEBAQCAgIAAAAAAAAAAAAAAAAAAADX19cAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsXV3/nJzVQ0PkWlrrVFT/oaH8c3PpbW3PNjbaSEjZT0/cQkL5gID0bm7jTEzROTn8k5Pxd3f7kZHoWVnvVlb/qanhT0/cVFTuVVX/jY27u7v/qKjZTU0f8fwIAAAAbHRSTlMAAAAAAKsAAAA8AAAAGQBIAAANAA8ezAXEr61dPczu00dCybD8SMzGywBIzKTHSABgzN9rALaBAGc/9Ka4A1V7acz9xI0AQctmEQBIzMwtnkwDAEjMmcyJTzEuKiYi9xUQDAgaFxYUEgsJBwNZ8TUYAAAA20lEQVR4XkXHZXMCMRgA4TfJKXBA6eHuFKm7u7u7ew+n7t6f3cAw7c7shwdKVdFF1tFYUVl2CwD77W/7sxbA9vnQ6f23aL15e7d4KJrZ+KBdZJNK6u7FBBqN8zXgcjcllXTYZ9IBxwVD2dzto5KO6FQYU+ujsafny6tEtaponudrauvyhfv6BkFgMBBCDK1fyz/X7R0Mw6ipu7q3e3r7Mv0DGKsRkKHhkdGx8YnJjylKBGh6ZnYOofmFxSVKBMaV1bX1jc0to7Szu7dvBlk6kA6Pjk9kw+nZufniF9r0KCW1uStmAAAAAElFTkSuQmCC%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B//%20https%3A//forum.mozilla-russia.org/viewtopic.php%3Fid%3D56040%0A//%20http%3A//infocatcher.ucoz.net/js/cb/cbEditorToggleOnTop.js%0A//%20https%3A//github.com/Infocatcher/Custom_Buttons/tree/master/CB_Editor_Toggle_on_Top%0A%0A//%20Custom%20Buttons%20Editor%3A%20Toggle%20on%20Top%20button%20for%20Custom%20Buttons%0A//%20%28code%20for%20%22initialization%22%20section%29%0A%0A//%20%28c%29%20Infocatcher%202012-2015%0A//%20version%200.1.11%20-%202015-06-04%0A%0A//%20Hotkey%3A%20Ctrl+T%0A%0Aconst%20watcherId%20%3D%20%22customButtonsToggleOnTop_%22%20+%20this.id%3B%0Avar%20%7BComponents%7D%20%3D%20window%3B%20//%20Prevent%20garbage%20collection%20in%20Firefox%203.6%20and%20older%0Avar%20storage%20%3D%20%28function%28%29%20%7B%0A%09if%28%21%28%22Services%22%20in%20window%29%29%20//%20Firefox%203.6%20and%20older%0A%09%09return%20Application.storage%3B%0A%09//%20Simple%20replacement%20for%20Application.storage%0A%09//%20See%20https%3A//bugzilla.mozilla.org/show_bug.cgi%3Fid%3D1090880%0A%09//var%20global%20%3D%20Components.utils.getGlobalForObject%28Services%29%3B%0A%09//%20Ensure%2C%20that%20we%20have%20global%20object%20%28because%20window.Services%20may%20be%20overwriten%29%0A%09var%20global%20%3D%20Components.utils.import%28%22resource%3A//gre/modules/Services.jsm%22%2C%20%7B%7D%29%3B%0A%09var%20ns%20%3D%20%22_cbEditorToggleOnTopStorage%22%3B%0A%09var%20storage%20%3D%20global%5Bns%5D%20%7C%7C%20%28global%5Bns%5D%20%3D%20global.Object.create%28null%29%29%3B%0A%09return%20%7B%0A%09%09get%3A%20function%28key%2C%20defaultVal%29%20%7B%0A%09%09%09if%28key%20in%20storage%29%0A%09%09%09%09return%20storage%5Bkey%5D%3B%0A%09%09%09return%20defaultVal%3B%0A%09%09%7D%2C%0A%09%09set%3A%20function%28key%2C%20val%29%20%7B%0A%09%09%09if%28key%20%3D%3D%3D%20null%29%0A%09%09%09%09delete%20storage%5Bkey%5D%3B%0A%09%09%09else%0A%09%09%09%09storage%5Bkey%5D%20%3D%20val%3B%0A%09%09%7D%0A%09%7D%3B%0A%7D%29%28%29%3B%0Avar%20watcher%20%3D%20storage.get%28watcherId%2C%20null%29%3B%0Aif%28%21watcher%29%20%7B%0A%09watcher%20%3D%20%7B%0A%09%09btnPos%3A%200%2C%20//%200%20-%20at%20top%20right%20window%20corner%2C%201%20-%20at%20end%20of%20tabs%2C%202%20-%20before%20dialog%20buttons%20spacer%0A%09%09btnStyle%3A%20%22button%22%2C%20//%20%22button%22%20or%20%22toolbarbutton%22%0A%09%09btnChecked%3A%20true%2C%20//%20use%20%22checked%22%20style%3A%20true%20or%20false%0A%0A%09%09//%20Fogue%20icons%2C%20http%3A//p.yusukekamiyamane.com/%0A%09%09//%20http%3A//www.iconfinder.com/icondetails/12276/16/gps_location_pin_icon%0A%09%09icon%3A%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3AgNBjAx4SevkwAAAjxJREFUKM+FUk1oE0EU/mZnRU0U6cFLIT1KKkkNpIcSWwUvVty2l142hZpDoQcPgYQKQkUEz6V6sHgR/KGQQwleQg/xEKRRsIEmga4NoZa2oRGKpJaWmp2Z52UX12Dxg4838+D73ps3jzUYQycIgDc7l0oNAkgqpZ4n5uc/NgHsEEHDKZB/X5OJRGJcSplemJ6+6SZPFStvJ0Ta4eEhTNMcE0I8fDsxcQsAdPwHc6nUoBRCOz4+Rr1eR39//+18Pn/h/cjIGea+eS6VegLgKoBfRPRdKbXGOf8GIBmPx8cty0Kz2YTf74ff70cmkynpNSIAwP7+/t2ZmZnowcGBPDo6+rm1tdWo1Wo7pmnesSwLtm2jWCx+EkJwKSUnoln2wWnv9eTkMBE9TafT0b29PbTbbXDO0Wq1YNs2lpaWVpVSj8ZyuWXhaPg953CtXK6v9fVtr6ys9A4NDXU3Gg24JoVC4fPJycnjsVxu2TtMzgCUAVQAUKVSrwDtzc3NQCQS6d7d3XU7EK1W62twY+ML84i1N4zB5TvgYrVaPTs1NRXNZDKlrq4u+Hw+BAKBy1LK6zYA2xE+6/gqzhgbXl9fnw+FQrPBYPCHlBKjo6NRIjpPRD3kEdbcJWGMgTF2Y3Fx8UE4HE4yxl70WtYCEc1ms9kS51wDcM4r/FOS87BhGK90XTc0TeNuPgggFosNG4axOjAw8PJKxwIxAD26rt9XShWVUtvOWosO2h1RAJAMwCUAPseInGG6UTlm6l/8DZ+nFuAjSdH0AAAAAElFTkSuQmCC%22%2C%0A%09%09iconPinned%3A%20%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3AgNBjIpwH1VRwAAAgdJREFUKM+FkkFoU0EQhr/dtxFSquLBS8CAICISQci1oBWLKaaINL300psXDxH0ItSD4L21UKgUxV4aWnKyiIGaQwio2IQ0PQQpBaEhoaEk0dSQNsnb9WAepg+LPwz/7DD/7O7MiJIQuGEAV3QIiNowV4f0HlA0BskJsI8fo75YLHIEjw3ccIInivVxX1IqcXFu7l4Lnhq4BaD4P4Y6INsHB+zlcpwfH7+zG48PavCIvj8/B64CRxoqXdg8Bd+BqG9xMVJNpaiUy5zxehkcGCC2uppV28Y44rs3V1aCFIt2p15v/MzlSj/S6eKlmZnRairFoW2zmUx+boHVBsvAtEj+fV5Iw4vbS0tBe2uLw04H2+ulUy5zaNu8X17OdOGZgkTX3TADCRumP0xNZY3fz6/9fSr5PNVGg6/x+BfdE/Y3wxJAHtj6wzt5aHsSiQv+4WFfbWcHu9VCeDzdRq32DdgQfZMQom9JjDGngcn19fWF2shI9vrYWNBqNjFCND8mk+8MTDq5s65RWUKIUKFQmA0EAtP3pawdra0xGokE0dqrwe8kvgS2e1cjpURKORyLxTaUUg+UUuciUvIWQq8hU5uYMPOQmQcuu7fAsqxr4XD4jVIqLKW0nPgV4AmEFiDzCF65hQLwK6Ueaq0/aa13e2vddVnHxV3AFsBZYKBXyPSa6bDuFdP/st/BfOD54p3eIQAAAABJRU5ErkJggg%3D%3D%22%2C%0A%0A%09%09boxId%3A%20%22cbToggleOnTopBox%22%2C%0A%09%09btnId%3A%20%22cbToggleOnTopButton%22%2C%0A%09%09onTopAttr%3A%20%22cbOnTop%22%2C%0A%09%09naAttr%3A%20%22cbOnTopNA%22%2C%0A%09%09styleId%3A%20%22cbToggleOnTopStyle%22%2C%0A%09%09get%20btnTip%28%29%20%7B%0A%09%09%09var%20locale%20%3D%20%28function%28%29%20%7B%0A%09%09%09%09var%20prefs%20%3D%20%22Services%22%20in%20window%20%26%26%20Services.prefs%0A%09%09%09%09%09%7C%7C%20Components.classes%5B%22@mozilla.org/preferences-service%3B1%22%5D%0A%09%09%09%09%09%09.getService%28Components.interfaces.nsIPrefBranch%29%3B%0A%09%09%09%09if%28%21prefs.getBoolPref%28%22intl.locale.matchOS%22%29%29%20%7B%0A%09%09%09%09%09var%20locale%20%3D%20prefs.getCharPref%28%22general.useragent.locale%22%29%3B%0A%09%09%09%09%09if%28locale.substr%280%2C%209%29%20%21%3D%20%22chrome%3A//%22%29%0A%09%09%09%09%09%09return%20locale%3B%0A%09%09%09%09%7D%0A%09%09%09%09return%20Components.classes%5B%22@mozilla.org/chrome/chrome-registry%3B1%22%5D%0A%09%09%09%09%09.getService%28Components.interfaces.nsIXULChromeRegistry%29%0A%09%09%09%09%09.getSelectedLocale%28%22global%22%29%3B%0A%09%09%09%7D%29%28%29.match%28/%5E%5Ba-z%5D*/%29%5B0%5D%3B%0A%09%09%09if%28locale%20%3D%3D%20%22ru%22%29%0A%09%09%09%09return%20%22%u041F%u043E%u0432%u0435%u0440%u0445%20%u0432%u0441%u0435%u0445%20%u043E%u043A%u043E%u043D%20%28Ctrl+T%29%22%3B%0A%09%09%09return%20%22Always%20on%20top%20%28Ctrl+T%29%22%3B%0A%09%09%7D%2C%0A%0A%09%09REASON_STARTUP%3A%201%2C%0A%09%09REASON_SHUTDOWN%3A%202%2C%0A%09%09REASON_WINDOW_LOADED%3A%203%2C%0A%09%09REASON_WINDOW_CLOSED%3A%204%2C%0A%0A%09%09get%20obs%28%29%20%7B%0A%09%09%09delete%20this.obs%3B%0A%09%09%09return%20this.obs%20%3D%20Components.classes%5B%22@mozilla.org/observer-service%3B1%22%5D%0A%09%09%09%09.getService%28Components.interfaces.nsIObserverService%29%3B%0A%09%09%7D%2C%0A%09%09get%20ww%28%29%20%7B%0A%09%09%09delete%20this.ww%3B%0A%09%09%09return%20this.ww%20%3D%20Components.classes%5B%22@mozilla.org/embedcomp/window-watcher%3B1%22%5D%0A%09%09%09%09.getService%28Components.interfaces.nsIWindowWatcher%29%3B%0A%09%09%7D%2C%0A%09%09get%20wm%28%29%20%7B%0A%09%09%09delete%20this.wm%3B%0A%09%09%09return%20this.wm%20%3D%20Components.classes%5B%22@mozilla.org/appshell/window-mediator%3B1%22%5D%0A%09%09%09%09.getService%28Components.interfaces.nsIWindowMediator%29%3B%0A%09%09%7D%2C%0A%09%09init%3A%20function%28reason%29%20%7B%0A%09%09%09this.obs.addObserver%28this%2C%20%22quit-application-granted%22%2C%20false%29%3B%0A%09%09%09var%20ws%20%3D%20this.wm.getEnumerator%28null%29%3B%0A%09%09%09while%28ws.hasMoreElements%28%29%29%0A%09%09%09%09this.initWindow%28ws.getNext%28%29%2C%20reason%29%3B%0A%09%09%09this.ww.registerNotification%28this%29%3B%0A%09%09%7D%2C%0A%09%09destroy%3A%20function%28reason%29%20%7B%0A%09%09%09this.obs.removeObserver%28this%2C%20%22quit-application-granted%22%29%3B%0A%09%09%09var%20ws%20%3D%20this.wm.getEnumerator%28null%29%3B%0A%09%09%09while%28ws.hasMoreElements%28%29%29%0A%09%09%09%09this.destroyWindow%28ws.getNext%28%29%2C%20reason%29%3B%0A%09%09%09this.ww.unregisterNotification%28this%29%3B%0A%09%09%7D%2C%0A%09%09initWindow%3A%20function%28window%2C%20reason%29%20%7B%0A%09%09%09if%28%21this.isTargetWindow%28window%29%29%0A%09%09%09%09return%3B%0A%09%09%09window.addEventListener%28%22keypress%22%2C%20this%2C%20true%29%3B%0A%09%09%09if%28this.hasSizeModeChangeEvent%29%0A%09%09%09%09window.addEventListener%28%22sizemodechange%22%2C%20this%2C%20false%29%3B%0A%09%09%09else%20%7B%0A%09%09%09%09window.addEventListener%28%22resize%22%2C%20this%2C%20false%29%3B%20//%20Can%20detect%20only%20maximize/restore%0A%09%09%09%09this.legacySizeModeChange%28window%29%3B%0A%09%09%09%7D%0A%0A%09%09%09var%20document%20%3D%20window.document%3B%0A%09%09%09this.removeStyle%28document%29%3B%0A%09%09%09this.addStyle%28document%29%3B%0A%09%09%09var%20box%20%3D%20document.getElementById%28this.boxId%29%3B%0A%09%09%09box%20%26%26%20box.parentNode.removeChild%28box%29%3B%0A%09%09%09box%20%3D%20document.createElement%28%22hbox%22%29%3B%0A%09%09%09box.id%20%3D%20this.boxId%3B%0A%09%09%09var%20btn%20%3D%20document.createElement%28this.btnStyle%29%3B%0A%09%09%09btn.id%20%3D%20this.btnId%3B%0A%09%09%09if%28this.btnChecked%29%20%7B%0A%09%09%09%09btn.setAttribute%28%22type%22%2C%20%22checkbox%22%29%3B%0A%09%09%09%09btn.setAttribute%28%22autoCheck%22%2C%20%22false%22%29%3B%0A%09%09%09%7D%0A%09%09%09btn.tooltipText%20%3D%20this.btnTip%3B%0A%09%09%09btn.addEventListener%28%22command%22%2C%20this%2C%20false%29%3B%0A%09%09%09box.appendChild%28btn%29%3B%0A%09%09%09switch%28this.btnPos%29%20%7B%0A%09%09%09%09default%3A%0A%09%09%09%09%09box.setAttribute%28%22cbOnTopFloat%22%2C%20%22true%22%29%3B%0A%09%09%09%09%09document.documentElement.appendChild%28box%29%3B%0A%09%09%09%09break%3B%0A%09%09%09%09case%201%3A%0A%09%09%09%09%09box.setAttribute%28%22align%22%2C%20%22right%22%29%3B%0A%09%09%09%09%09let%20tabbox%20%3D%20document.getElementById%28%22custombuttons-editbutton-tabbox%22%29%3B%0A%09%09%09%09%09let%20tabs%20%3D%20tabbox.getElementsByTagName%28%22tabs%22%29%5B0%5D%3B%0A%09%09%09%09%09tabs.parentNode.insertBefore%28box%2C%20tabs%29%3B%0A%09%09%09%09%09box.style.marginBottom%20%3D%20-btn.boxObject.height%20+%20%22px%22%3B%0A%09%09%09%09break%3B%0A%09%09%09%09case%202%3A%0A%09%09%09%09%09box.setAttribute%28%22align%22%2C%20%22center%22%29%3B%0A%09%09%09%09%09let%20btnBox%20%3D%20document.documentElement.getButton%28%22accept%22%29.parentNode%3B%0A%09%09%09%09%09let%20insPos%20%3D%20btnBox.firstChild%3B%0A%09%09%09%09%09for%28let%20node%20%3D%20insPos%3B%20node%3B%20node%20%3D%20node.nextSibling%29%20%7B%0A%09%09%09%09%09%09if%28node.localName%20%3D%3D%20%22spacer%22%29%20%7B%0A%09%09%09%09%09%09%09insPos%20%3D%20node%3B%0A%09%09%09%09%09%09%09break%3B%0A%09%09%09%09%09%09%7D%0A%09%09%09%09%09%7D%0A%09%09%09%09%09btnBox.insertBefore%28box%2C%20insPos%29%3B%0A%09%09%09%7D%0A%09%09%09this.checkWindowStatus%28window%2C%20box%29%3B%0A%09%09%09//this.setOnTop%28btn%29%3B%0A%09%09%7D%2C%0A%09%09destroyWindow%3A%20function%28window%2C%20reason%29%20%7B%0A%09%09%09if%28reason%20%3D%3D%20this.REASON_WINDOW_CLOSED%29%0A%09%09%09%09window.removeEventListener%28%22DOMContentLoaded%22%2C%20this%2C%20false%29%3B%20//%20Window%20can%20be%20closed%20before%20DOMContentLoaded%0A%09%09%09if%28%21this.isTargetWindow%28window%29%29%0A%09%09%09%09return%3B%0A%09%09%09window.removeEventListener%28%22keypress%22%2C%20this%2C%20true%29%3B%0A%09%09%09if%28this.hasSizeModeChangeEvent%29%0A%09%09%09%09window.removeEventListener%28%22sizemodechange%22%2C%20this%2C%20false%29%3B%0A%09%09%09else%0A%09%09%09%09window.removeEventListener%28%22resize%22%2C%20this%2C%20false%29%3B%0A%09%09%09var%20document%20%3D%20window.document%3B%0A%09%09%09var%20btn%20%3D%20document.getElementById%28this.btnId%29%3B%0A%09%09%09btn.removeEventListener%28%22command%22%2C%20this%2C%20false%29%3B%0A%09%09%09if%28reason%20%3D%3D%20this.REASON_SHUTDOWN%29%20%7B%0A%09%09%09%09let%20box%20%3D%20btn.parentNode%3B%0A%09%09%09%09box.parentNode.removeChild%28box%29%3B%0A%09%09%09%09this.removeStyle%28document%29%3B%0A%09%09%09%7D%0A%09%09%7D%2C%0A%09%09isTargetWindow%3A%20function%28window%29%20%7B%0A%09%09%09return%20window.location.href.substr%280%2C%2041%29%20%3D%3D%20%22chrome%3A//custombuttons/content/editor.xul%22%3B%0A%09%09%7D%2C%0A%09%09observe%3A%20function%28subject%2C%20topic%2C%20data%29%20%7B%0A%09%09%09if%28topic%20%3D%3D%20%22quit-application-granted%22%29%0A%09%09%09%09this.destroy%28%29%3B%0A%09%09%09else%20if%28topic%20%3D%3D%20%22domwindowopened%22%29%0A%09%09%09%09subject.addEventListener%28%22DOMContentLoaded%22%2C%20this%2C%20false%29%3B%0A%09%09%09else%20if%28topic%20%3D%3D%20%22domwindowclosed%22%29%0A%09%09%09%09this.destroyWindow%28subject%2C%20this.REASON_WINDOW_CLOSED%29%3B%0A%09%09%7D%2C%0A%09%09handleEvent%3A%20function%28e%29%20%7B%0A%09%09%09var%20trg%20%3D%20e.originalTarget%20%7C%7C%20e.target%3B%0A%09%09%09var%20window%3B%0A%09%09%09switch%28e.type%29%20%7B%0A%09%09%09%09case%20%22DOMContentLoaded%22%3A%0A%09%09%09%09%09window%20%3D%20trg.defaultView%3B%0A%09%09%09%09%09window.removeEventListener%28%22DOMContentLoaded%22%2C%20this%2C%20false%29%3B%0A%09%09%09%09%09this.initWindow%28window%2C%20this.REASON_WINDOW_LOADED%29%3B%0A%09%09%09%09break%3B%0A%09%09%09%09case%20%22keypress%22%3A%0A%09%09%09%09%09if%28%0A%09%09%09%09%09%09%21%28%0A%09%09%09%09%09%09%09%28e.ctrlKey%20%7C%7C%20e.metaKey%29%20%26%26%20%21e.altKey%20%26%26%20%21e.shiftKey%0A%09%09%09%09%09%09%09%26%26%20String.fromCharCode%28e.charCode%29.toLowerCase%28%29%20%3D%3D%20%22t%22%0A%09%09%09%09%09%09%29%0A%09%09%09%09%09%29%0A%09%09%09%09%09%09break%3B%0A%09%09%09%09%09e.preventDefault%28%29%3B%0A%09%09%09%09%09e.stopPropagation%28%29%3B%0A%09%09%09%09case%20%22command%22%3A%0A%09%09%09%09%09window%20%3D%20trg.ownerDocument.defaultView.top%3B%0A%09%09%09%09%09this.toggleOnTop%28window%29%3B%0A%09%09%09%09break%3B%0A%09%09%09%09case%20%22sizemodechange%22%3A%0A%09%09%09%09case%20%22resize%22%3A%0A%09%09%09%09%09window%20%3D%20trg%3B%0A%09%09%09%09%09this.checkWindowStatus%28window%29%3B%0A%09%09%09%7D%0A%09%09%7D%2C%0A%09%09get%20hasSizeModeChangeEvent%28%29%20%7B%0A%09%09%09delete%20this.hasSizeModeChangeEvent%3B%0A%09%09%09return%20this.hasSizeModeChangeEvent%20%3D%20parseFloat%28%0A%09%09%09%09Components.classes%5B%22@mozilla.org/xre/app-info%3B1%22%5D%0A%09%09%09%09%09.getService%28Components.interfaces.nsIXULAppInfo%29%0A%09%09%09%09%09.platformVersion%0A%09%09%09%29%20%3E%3D%208%3B%0A%09%09%7D%2C%0A%09%09legacySizeModeChange%3A%20function%28window%29%20%7B%0A%09%09%09var%20lastState%20%3D%20window.windowState%3B%0A%09%09%09window.setInterval%28function%28window%2C%20_this%29%20%7B%0A%09%09%09%09var%20state%20%3D%20window.windowState%3B%0A%09%09%09%09if%28state%20%21%3D%20lastState%29%0A%09%09%09%09%09_this.checkWindowStatus%28window%29%3B%0A%09%09%09%09lastState%20%3D%20state%3B%0A%09%09%09%7D%2C%20150%2C%20window%2C%20this%29%3B%0A%09%09%7D%2C%0A%09%09checkWindowStatus%3A%20function%28window%2C%20box%29%20%7B%0A%09%09%09if%28%21box%29%0A%09%09%09%09box%20%3D%20window.document.getElementById%28this.boxId%29%3B%0A%09%09%09var%20na%20%3D%20String%28window.windowState%20%21%3D%20window.STATE_NORMAL%29%3B%0A%09%09%09if%28box.getAttribute%28this.naAttr%29%20%3D%3D%20na%29%0A%09%09%09%09return%3B%0A%09%09%09box.setAttribute%28this.naAttr%2C%20na%29%3B%0A%09%09%09//LOG%28%22Set%20n/a%3A%20%22%20+%20na%29%3B%0A%09%09%09this.setOnTop%28box.firstChild%29%3B%0A%09%09%7D%2C%0A%09%09addStyle%3A%20function%28document%29%20%7B%0A%09%09%09var%20style%20%3D%20%27%5C%0A%09%09%09%09%25box%25%5BcbOnTopFloat%5D%20%7B%5Cn%5C%0A%09%09%09%09%09position%3A%20fixed%20%21important%3B%5Cn%5C%0A%09%09%09%09%09top%3A%200%20%21important%3B%5Cn%5C%0A%09%09%09%09%09right%3A%200%20%21important%3B%5Cn%5C%0A%09%09%09%09%7D%5Cn%5C%0A%09%09%09%09%25btn%25%2C%20%25btn%25%20*%20%7B%5Cn%5C%0A%09%09%09%09%09margin%3A%200%20%21important%3B%5Cn%5C%0A%09%09%09%09%09padding%3A%200%20%21important%3B%5Cn%5C%0A%09%09%09%09%7D%5Cn%5C%0A%09%09%09%09%25btn%25%20%3E%20.button-box%20%3E%20.button-icon%20%7B%5Cn%5C%0A%09%09%09%09%09margin%3A%20-3px%20-1px%20%21important%3B%5Cn%5C%0A%09%09%09%09%7D%5Cn%5C%0A%09%09%09%09toolbarbutton%25btn%25%20%7B%5Cn%5C%0A%09%09%09%09%09padding%3A%200%202px%20%21important%3B%5Cn%5C%0A%09%09%09%09%7D%5Cn%5C%0A%09%09%09%09%25btn%25%20%7B%5Cn%5C%0A%09%09%09%09%09position%3A%20relative%20%21important%3B%5Cn%5C%0A%09%09%09%09%09z-index%3A%202147483647%20%21important%3B%5Cn%5C%0A%09%09%09%09%09list-style-image%3A%20url%28%22%25icon%25%22%29%20%21important%3B%5Cn%5C%0A%09%09%09%09%09-moz-user-focus%3A%20ignore%20%21important%3B%5Cn%5C%0A%09%09%09%09%09min-height%3A%200%20%21important%3B%5Cn%5C%0A%09%09%09%09%09min-width%3A%200%20%21important%3B%5Cn%5C%0A%09%09%09%09%7D%5Cn%5C%0A%09%09%09%09%25btn%25%5B%25onTopAttr%25%3D%22true%22%5D%20%7B%5Cn%5C%0A%09%09%09%09%09list-style-image%3A%20url%28%22%25iconPinned%25%22%29%20%21important%3B%5Cn%5C%0A%09%09%09%09%7D%5Cn%5C%0A%09%09%09%09%25box%25%5B%25naAttr%25%3D%22true%22%5D%20image%20%7B%5Cn%5C%0A%09%09%09%09%09opacity%3A%200.75%20%21important%3B%5Cn%5C%0A%09%09%09%09%7D%27%0A%09%09%09%09.replace%28/%25box%25/g%2C%20%22%23%22%20+%20this.boxId%29%0A%09%09%09%09.replace%28/%25btn%25/g%2C%20%22%23%22%20+%20this.btnId%29%0A%09%09%09%09.replace%28/%25onTopAttr%25/g%2C%20this.onTopAttr%29%0A%09%09%09%09.replace%28/%25icon%25/g%2C%20this.icon%29%0A%09%09%09%09.replace%28/%25iconPinned%25/g%2C%20this.iconPinned%29%0A%09%09%09%09.replace%28/%25naAttr%25/g%2C%20this.naAttr%29%3B%0A%0A%09%09%09document.insertBefore%28%0A%09%09%09%09document.createProcessingInstruction%28%0A%09%09%09%09%09%22xml-stylesheet%22%2C%0A%09%09%09%09%09%27id%3D%22%27%20+%20this.styleId%20+%20%27%22%20href%3D%22%27%20+%20%22data%3Atext/css%2C%22%0A%09%09%09%09%09%09+%20encodeURIComponent%28style%29%20+%20%27%22%20type%3D%22text/css%22%27%0A%09%09%09%09%29%2C%0A%09%09%09%09document.firstChild%0A%09%09%09%29%3B%0A%09%09%7D%2C%0A%09%09removeStyle%3A%20function%28document%29%20%7B%0A%09%09%09for%28var%20child%20%3D%20document.firstChild%3B%20child%3B%20child%20%3D%20child.nextSibling%29%20%7B%0A%09%09%09%09if%28%0A%09%09%09%09%09child.nodeType%20%3D%3D%20child.PROCESSING_INSTRUCTION_NODE%0A%09%09%09%09%09%26%26%20child.data.indexOf%28this.styleId%29%20%21%3D%20-1%0A%09%09%09%09%29%20%7B%0A%09%09%09%09%09document.removeChild%28child%29%3B%0A%09%09%09%09%09break%3B%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%7D%2C%0A%09%09getXulWin%3A%20function%28window%29%20%7B%0A%09%09%09return%20window.QueryInterface%28Components.interfaces.nsIInterfaceRequestor%29%0A%09%09%09%09.getInterface%28Components.interfaces.nsIWebNavigation%29%0A%09%09%09%09.QueryInterface%28Components.interfaces.nsIDocShellTreeItem%29%0A%09%09%09%09.treeOwner%0A%09%09%09%09.QueryInterface%28Components.interfaces.nsIInterfaceRequestor%29%0A%09%09%09%09.getInterface%28Components.interfaces.nsIXULWindow%29%3B%0A%09%09%7D%2C%0A%09%09setOnTop%3A%20function%28btn%2C%20toggle%29%20%7B%0A%09%09%09var%20document%20%3D%20btn.ownerDocument%3B%0A%09%09%09var%20root%20%3D%20document.documentElement%3B%0A%09%09%09var%20onTop%20%3D%20root.getAttribute%28this.onTopAttr%29%20%3D%3D%20%22true%22%3B%0A%09%09%09if%28toggle%29%20%7B%0A%09%09%09%09onTop%20%3D%20%21onTop%3B%0A%09%09%09%09root.setAttribute%28this.onTopAttr%2C%20onTop%29%3B%0A%09%09%09%09root.id%20%26%26%20document.persist%28root.id%2C%20this.onTopAttr%29%3B%0A%09%09%09%7D%0A%09%09%09else%20if%28%21onTop%29%20//%20Just%20opened%20or%20restored%20window%20always%20have%20zLevel%20%3D%3D%20normalZ%0A%09%09%09%09return%3B%0A%09%09%09var%20window%20%3D%20document.defaultView%3B%0A%09%09%09var%20state%20%3D%20window.windowState%3B%0A%09%09%09//%20Strange%20glitches%20with%20minimized%20%22raisedZ%22%20window...%0A%09%09%09var%20restore%20%3D%20onTop%20%26%26%20state%20%3D%3D%20window.STATE_MINIMIZED%3B%0A%09%09%09if%28restore%20%7C%7C%20state%20%3D%3D%20window.STATE_NORMAL%29%20%7B%0A%09%09%09%09if%28restore%29%0A%09%09%09%09%09onTop%20%3D%20false%3B%0A%09%09%09%09let%20xulWin%20%3D%20this.getXulWin%28window%29%3B%0A%09%09%09%09xulWin.zLevel%20%3D%20onTop%20%3F%20xulWin.raisedZ%20%3A%20xulWin.normalZ%3B%0A%09%09%09%09//LOG%28%22Set%20on%20top%3A%20%22%20+%20onTop%29%3B%0A%09%09%09%7D%0A%09%09%09this.checkButton%28btn%2C%20onTop%29%3B%0A%09%09%7D%2C%0A%09%09toggleOnTop%3A%20function%28window%29%20%7B%0A%09%09%09this.setOnTop%28window.document.getElementById%28this.btnId%29%2C%20true%29%3B%0A%09%09%7D%2C%0A%09%09checkButton%3A%20function%28btn%2C%20onTop%29%20%7B%0A%09%09%09btn.setAttribute%28this.onTopAttr%2C%20onTop%29%3B%0A%09%09%09this.btnChecked%20%26%26%20btn.setAttribute%28%22checked%22%2C%20onTop%29%3B%0A%09%09%7D%0A%09%7D%3B%0A%09storage.set%28watcherId%2C%20watcher%29%3B%0A%09watcher.init%28watcher.REASON_STARTUP%29%3B%0A%7D%0Afunction%20destructor%28reason%29%20%7B%0A%09if%28reason%20%3D%3D%20%22update%22%20%7C%7C%20reason%20%3D%3D%20%22delete%22%29%20%7B%0A%09%09watcher.destroy%28watcher.REASON_SHUTDOWN%29%3B%0A%09%09storage.set%28watcherId%2C%20null%29%3B%0A%09%7D%0A%7D%0Aif%28%0A%09typeof%20addDestructor%20%3D%3D%20%22function%22%20//%20Custom%20Buttons%200.0.5.6pre4+%0A%09%26%26%20addDestructor%20%21%3D%20%28%22addDestructor%22%20in%20window%20%26%26%20window.addDestructor%29%0A%29%0A%09addDestructor%28destructor%2C%20this%29%3B%0Aelse%0A%09this.onDestroy%20%3D%20destructor%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E


Настройки:
В начале кода можно изменить следующие значения:
        btnPos: 0, // 0 - в правом верхнем углу окна, 1 - в конце панели вкладок, 2 - перед spacer'ом в нижнем ряду кнопок
        btnStyle: "button", // вид кнопки: "button" или "toolbarbutton"
        btnChecked: true, // использовать "нажатый" стиль: true или false

Исходный код, инициализация: cbEditorToggleOnTop.js

Отредактировано Infocatcher (04-06-2015 23:01:47)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№217-08-2012 23:47:43

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 14.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Тестовая версия, будьте осторожны!

Разрабатываемая версия

Отредактировано Infocatcher (09-02-2013 23:10:54)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№318-08-2012 18:20:21

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 14.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Custom Buttons Editor: Toggle on Top 0.1.7 (2012-08-18)
x Исправлена обработка сворачивания окна в Gecko 7.0 и более старых


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№418-08-2012 22:19:54

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 14.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Custom Buttons Editor: Toggle on Top 0.1.8 (2012-08-18)
* Улучшена обработка разворачивания/восстановления окна в Gecko 7.0 и более старых


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№508-09-2012 00:21:54

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 15.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Custom Buttons Editor: Toggle on Top 0.1.9 (2012-09-08)
x Исправлена работа в Firefox 3.6 после закрытия первого окна с кнопкой


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№609-02-2013 23:08:49

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 18.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Custom Buttons Editor: Toggle on Top 0.1.10 (2013-02-09)
* Теперь при использовании Custom Buttons 0.0.5.6pre4 и новее кнопка будет корректно работать, если поместить код в инициализацию любой другой кнопки

Отредактировано Infocatcher (09-02-2013 23:09:41)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№702-07-2014 17:08:14

Garider
Участник
 
Группа: Members
Зарегистрирован: 02-07-2014
Сообщений: 48
UA: Palemoon 24.0

Re: [CB]Custom Buttons Editor: Toggle on Top

А можно такую кнопку для окна [firefox], или может есть такая?

Отсутствует

 

№802-07-2014 21:40:59

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 30.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Garider пишет

А можно такую кнопку для окна [firefox]

Это гораздо легче. Вот простейший вариант (для секции «код»), только он без обработки сворачивания окна:

Выделить код

Код:

var xulWin = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
    .getInterface(Components.interfaces.nsIWebNavigation)
    .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
    .treeOwner
    .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
    .getInterface(Components.interfaces.nsIXULWindow);
var onTop = xulWin.zLevel == xulWin.normalZ;
xulWin.zLevel = onTop ? xulWin.raisedZ : xulWin.normalZ;
this.checked = onTop;

Отредактировано Infocatcher (02-07-2014 21:41:20)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№903-07-2014 16:16:25

Garider
Участник
 
Группа: Members
Зарегистрирован: 02-07-2014
Сообщений: 48
UA: Palemoon 24.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Infocatcher
Большое спасибо!Но что-то у меня не работает ни для CB(отдельная кнопка),
ни для окна [firefox].
Проверял на Pale Moon 24.6.2(x86) и на портативном [firefox] 30.0.:(
Я правильно понимаю работу кнопки, у меня настроено в Windows автоматически скрывать панель задач, если нажать на кнопку , то я эту выезжающюю панель не должен видеть, равно как и любые другие окна.
А вообще есть такое расширение Always on Top https://addons.mozilla.org/en-US/firefo … ys-on-top/, вот оно работает у меня правильно, но хотелось бы кнопку.Или не заморачиваться?:)

Отредактировано Garider (03-07-2014 16:26:54)

Отсутствует

 

№1003-07-2014 17:18:57

Garider
Участник
 
Группа: Members
Зарегистрирован: 02-07-2014
Сообщений: 48
UA: Palemoon 24.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Сейчас проверил на чистом профиле Pale Moon и ту, и другую кнопку - не работают.:(

Отсутствует

 

№1103-07-2014 17:50:27

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 33.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Garider пишет

Я правильно понимаю работу кнопки, у меня настроено в Windows автоматически скрывать панель задач, если нажать на кнопку , то я эту выезжающюю панель не должен видеть, равно как и любые другие окна.

Ну ты нафантазировал. :) Читай шапку внимательно, кнопка только для редактора Custom Buttons.

Отсутствует

 

№1203-07-2014 18:06:19

Garider
Участник
 
Группа: Members
Зарегистрирован: 02-07-2014
Сообщений: 48
UA: Palemoon 24.0

Re: [CB]Custom Buttons Editor: Toggle on Top

voqabuhe пишет

Ну ты нафантазировал. :) Читай шапку внимательно, кнопка только для редактора Custom Buttons.

.
В посте №8 код для окна[firefox].:/

Отсутствует

 

№1303-07-2014 18:06:47

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 30.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Garider пишет

Я правильно понимаю работу кнопки, у меня настроено в Windows автоматически скрывать панель задач, если нажать на кнопку , то я эту выезжающюю панель не должен видеть, равно как и любые другие окна.

Я не проверял. Используется особый «on top» браузера, окно будет выводиться только поверх других окон браузера.

Garider пишет

А вообще есть такое расширение Always on Top https://addons.mozilla.org/en-US/firefo … ys-on-top/, вот оно работает у меня правильно, но хотелось бы кнопку.Или не заморачиваться?:)

Можно скопировать оттуда нужный код:

Выделить код

Код:

var onTop = this.checked = !this.checked;
alwaysontop_coremakeAlwaysOnTop(window, onTop);

// chrome/content/alwaysontop_core.js from https://addons.mozilla.org/addon/always-on-top/
function alwaysontop_logxxx(msg) {
    var consoleService = Components.classes["@mozilla.org/consoleservice;1"]
        .getService(Components.interfaces.nsIConsoleService);
        
    consoleService.logStringMessage(msg);
}

function alwaysontop_coremakeAlwaysOnTop(window, onTop)
{
    try {

    Components.utils.import("resource://gre/modules/ctypes.jsm");
    var lib = ctypes.open("user32.dll");
    var funcActiveWindow = 0;
    try
    {
         funcActiveWindow = lib.declare("GetActiveWindow", ctypes.winapi_abi, ctypes.int32_t);
    }
    catch (ex)
    {
        funcActiveWindow = lib.declare("GetActiveWindow", ctypes.stdcall_abi, ctypes.int32_t);
    }
    
    if (funcActiveWindow != 0)
    {
        var activeWindow = funcActiveWindow();
        
        var funcSetWindowPos = 0;
        try
        {
            funcSetWindowPos = lib.declare("SetWindowPos",
                                ctypes.winapi_abi,
                                ctypes.bool,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.uint32_t);
        }
        catch(ex)
        {
            funcSetWindowPos = lib.declare("SetWindowPos",
                                ctypes.stdcall_abi,
                                ctypes.bool,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.uint32_t);        
        }
        
        var hwndAfter = -2;
        if (onTop)
            hwndAfter = -1;
        funcSetWindowPos(activeWindow, hwndAfter, 0, 0, 0, 0, 19);
    }

    lib.close();
    
    } catch (ex) {
        alwaysontop_log(ex);
    }
}

Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№1403-07-2014 18:46:26

Garider
Участник
 
Группа: Members
Зарегистрирован: 02-07-2014
Сообщений: 48
UA: Palemoon 24.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Infocatcher
Спасибо!Так работает.
А это куда вставить,чтобы значки цвет меняли :

this.image = onTop
    ? "data:image/png;base64,..."
    : "data:image/png;base64,...";

Или здесь как-то по другому надо?
А оригинальная Custom Buttons Editor: Toggle on Top 0.1.10 (2013-02-09) не работает так.
Вообще понятие лёгкое/тяжёлое расширение играет роль именно в этом конкретном случае?
Расширение Always on Top https://addons.mozilla.org/en-US/firefo … ys-on-top/ против
этой кнопки.Вроде раширение весит мало (около 9kb) и код не большой.

Отредактировано Garider (03-07-2014 18:47:15)

Отсутствует

 

№1503-07-2014 19:59:22

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 30.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Garider пишет

А это куда вставить,чтобы значки цвет меняли :

this.image = onTop
    ? "data:image/png;base64,..."
    : "data:image/png;base64,...";

Или здесь как-то по другому надо?

Если не мешает индикация «нажатости» кнопки, можно добавить этот код после

Выделить код

Код:

var onTop = this.checked = !this.checked;

Если надо без индикации, можно вот так:

Выделить код

Код:

var onTop = this.cbOnTop = !this.cbOnTop;
this.image = onTop ? ... : ...;
Garider пишет

А оригинальная Custom Buttons Editor: Toggle on Top 0.1.10 (2013-02-09) не работает так.

Как минимум, надо заменить

Выделить код

Код:

let xulWin = this.getXulWin(window);
                xulWin.zLevel = onTop ? xulWin.raisedZ : xulWin.normalZ;

на

Выделить код

Код:

alwaysontop_coremakeAlwaysOnTop(window, onTop);

(и добавить в конец код из alwaysontop_core.js расширения Always on Top)

Garider пишет

Вообще понятие лёгкое/тяжёлое расширение играет роль именно в этом конкретном случае?
Расширение Always on Top https://addons.mozilla.org/en-US/firefo … ys-on-top/ против
этой кнопки.Вроде раширение весит мало (около 9kb) и код не большой.

Вряд ли в этом случае будет сколько-нибудь заметная разница.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№1603-07-2014 20:28:08

Garider
Участник
 
Группа: Members
Зарегистрирован: 02-07-2014
Сообщений: 48
UA: Palemoon 24.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Понятно.Сейчас попробую.:rock:
С окном [firefox] получилось, а с Custom Buttons Editor: Toggle on Top не работает (после замены и добавки кода).Да и ладно, это я уж из спортивного интереса.:)

Отредактировано Garider (03-07-2014 21:32:20)

Отсутствует

 

№1703-07-2014 21:47:06

Garider
Участник
 
Группа: Members
Зарегистрирован: 02-07-2014
Сообщений: 48
UA: Palemoon 24.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Может кому пригодится.
Кнопка Toggle on Top Firefox (закрепляет окно Firefox поверх всех окон).Положить в код :

Выделить код

Код:

var onTop = this.cbOnTop = !this.cbOnTop;
this.image = onTop
? "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAWdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjA76PVpAAACS0lEQVQ4T7XTXUiTURzH8QeLIiuydDkpispeCLqKIAPpwmBLjbnGk0osfClr6VUWYS42mChb1qoth9bEuTa3ORtlatrMar1IVBdJQdSFUrLMaro3n+1Jf21xbjeb0AceOIfzvTn/w0P9dx71UEqorlsRPGPRBcr1Co9ImwPatogc/zumaVAautKPmYsOBKpuw3fsJrzillGPUFMKSpZEsvmFtM561jyMkKoXwRo7/KcM8JXo4ZMYMCm4ahvaL1tM0vhYvesA2/MOYcNzMPX3ETxrhb+8FV76Bjz5akzsk0tIOj9GPfDUL2nHd7EO46U6/KjQY0rcjMm8RnzNlheSLL4JWruC0T3y+U4b8TlLisEt5TBzCmDZcMTbta7wPMlic7f3L2cNz3KDNZ2acMcreCNDfrGzEoY1+TClCuS9FH8pSWObuWDnsY63P38//gim+QmYS31w85S4s74IxnRhwLFKkELS2MYrmpODintTs29GwQ68h1/Vg+mTbRjZfQ5tqYdg2Vz8zZjMyyB5bHNlt1aGTC8DbOdrMBonokMey6nDgx3HoePkQp1xEK2rc7tJHh/r/CAMtbrC0af2FungzlZgODKfDq4ILWvz0Lnt6KyNQ3NJHl9Q1ZcVqDKNTAuuY2yPFK7ME7CkFcAYGfbd7SWwpx3eStL51VZXb2oUVXo+7a21P8ws+2VOF8LEFc7ZNxb3yxL5PYwGo1xSWdUUXcsoKula5Mmj39/DRFgs1i8NDZd3ke3CWK3WZUqlSkO2C0fT9BI+P9FrUNQf3t4uEkpfyLgAAAAASUVORK5CYII="
: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAWdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjA76PVpAAACFklEQVQ4T52SX2hSYRjGpV11U5fddtFNjK4b5WorFrViDXUXw6ALK+imWuj+UGBjti0Mc2meVZDukOQkgi1Xc67ZzBqEYHNFMNv6Y+q0HZnNtDznfE8n+K5GivN39/D+eOD93k/2P2xJ/pA5ybM34nzEEOejxgQfNcWL84YvBUfHYv4g1crzkCN77KsEd3+IsKRE3EwKGEjwkAqhjxWhXS6IFxd+7qZ6acwrZMfjjPjbs0bAcgRMWoR5RcDg9yK6PmRwduZrVv1scRvVy+PkhLbxNbHApAT0LuegmV1Ckz2A+ttTv5rvzymoVhnWNN9sl9a7+jmPdu9H1Num0TQcPELHldMX4xsmpPWuSyspx95Bbn6Ok+zCPjqunI1FjRYvlJstcgM11pSg21h02OrvkOn1W6hWHncG22fWSWA6S+DiBBhif6SiMOSmccj7XTgwNOmrG32zleqleZDmbZE8MLtOMCxdrftTDqdfRnGUDWDvrQkoHK9xbCRspHpppJMvvcoBoxkCk/QZr3wr4szbBI67Q6gbmkQj44fSGQlRvTTOjKD2ZUmc5UQYadG58CpansxDfseHBosvpmBDrVQvz7/HdnCk1pwQTnWP+T2aEc+j9qfv1fvvvaiVtblrqLY5tFpt/4mWVh2N1eNyuQYvXLrcS2P1eL1TA7qunms0Vk8wOHe+s7NHQ2P1MAyzU6VS7aKxBDLZX2cYVSnmZO7XAAAAAElFTkSuQmCC";
alwaysontop_coremakeAlwaysOnTop(window, onTop);

// chrome/content/alwaysontop_core.js from https://addons.mozilla.org/addon/always-on-top/
function alwaysontop_logxxx(msg) {
    var consoleService = Components.classes["@mozilla.org/consoleservice;1"]
        .getService(Components.interfaces.nsIConsoleService);
        
    consoleService.logStringMessage(msg);
}

function alwaysontop_coremakeAlwaysOnTop(window, onTop)
{
    try {

    Components.utils.import("resource://gre/modules/ctypes.jsm");
    var lib = ctypes.open("user32.dll");
    var funcActiveWindow = 0;
    try
    {
         funcActiveWindow = lib.declare("GetActiveWindow", ctypes.winapi_abi, ctypes.int32_t);
    }
    catch (ex)
    {
        funcActiveWindow = lib.declare("GetActiveWindow", ctypes.stdcall_abi, ctypes.int32_t);
    }
    
    if (funcActiveWindow != 0)
    {
        var activeWindow = funcActiveWindow();
        
        var funcSetWindowPos = 0;
        try
        {
            funcSetWindowPos = lib.declare("SetWindowPos",
                                ctypes.winapi_abi,
                                ctypes.bool,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.uint32_t);
        }
        catch(ex)
        {
            funcSetWindowPos = lib.declare("SetWindowPos",
                                ctypes.stdcall_abi,
                                ctypes.bool,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.int32_t,
                                ctypes.uint32_t);        
        }
        
        var hwndAfter = -2;
        if (onTop)
            hwndAfter = -1;
        funcSetWindowPos(activeWindow, hwndAfter, 0, 0, 0, 0, 19);
    }

    lib.close();
    
    } catch (ex) {
        alwaysontop_log(ex);
    }
}

Отредактировано Garider (04-07-2014 16:18:43)

Отсутствует

 

№1816-09-2017 22:20:59

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2129
UA: Firefox 52.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Infocatcher
В Nightly переключили настройку jsloader.shareGlobal,
и теперь баг во всей своей красе.

Cu.import() вместо BackstagePass возвращает NonSyntacticVariablesObject
А у него нет свойства Object, соответственно кнопка не работает.

Не знаю почему используется Object.create() и не знаю как правильно.
Пока записал так

скрытый текст

Выделить код

Код:

//var storage = global[ns] || (global[ns] = global.Object.create(null));
    var storage = global[ns];
    if (!storage) try {
        storage = global[ns] = global.Object.create(null);
    } catch(ex) {
        storage = global[ns] = Components.utils.getGlobalForObject(global).Object.create(null);
    }


All
Код для конфигурационного файла теперь уже только для 57b
надеюсь попробовать рассмотреть, а пока используйте настройки.

Отсутствует

 

№1918-09-2017 21:41:08

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 55.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Dumby
Что-то они странные, сначала разделили, а теперь обратно все в кучу валят. И я не понял, расширения тоже в отду кучу свалят?
И, главное, почему не вернуть глобальный объект... Так много вопросов, так мало ответов. :sick:

Object.create() – это хотелось, чтобы быстрее работало, проверки на property in object должны работать быстрее, если не лезет в прототип (которого нет). И in быстрее, чем .hasOwnProperty().
А по части корявости – что new global.Object() дернуть, что global.Object.create() позвать... многословно.

Подкрутил, спасибо!
https://github.com/Infocatcher/Custom_B … 1c867fe0f9


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№2019-09-2017 00:38:19

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2129
UA: Firefox 52.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Infocatcher пишет

И, главное, почему не вернуть глобальный объект...

Бррр, не каркай. Это было бы нехорошо для меня.

Ну, то есть, во второй аргумент EXPORTED_SYMBOLS, а вернёт глобальный объект.
И где тогда взять ссылку на NSVO ?

Я же полностью зависим от возможности что-то изменять кодом в .jsm'ках.
Тогда надо было бы держать настройку в false, и, может, ещё и другим объяснять почему.
А если вдруг настройку бы удалили, то для меня это означало бы досрочную смерть Firefox.
Разумеется, лиса может досрочно скончаться в любой момент и по другим причинам,
но проблем ещё и с этой стороны не хотелось бы.

проверки на property in object должны работать быстрее, если не лезет в прототип (которого нет)

О, спасибо за консультацию!
Какие чудеса перфекционизма. Круто, как всегда!

Подкрутил

Значит storage будет в едином глобальном объекте, а не в NSVO от Services
Нет, ну нормально, просто слегка неожиданно.

Отсутствует

 

№2119-09-2017 11:52:53

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 55.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Dumby пишет

Какие чудеса перфекционизма.

А, ну и еще если просто сделать storage = global[ns] = {} – начинает течь память, сборщику мусора не нравится, если подсовывать чужеродные объекты. Тут, наверное, по-простому не проверить, а вот с отключаемыми расширениями это видно, оседает в about:memory (если, конечно, внезапно вдруг не починили).

Dumby пишет

Значит storage будет в едином глобальном объекте, а не в NSVO от Services
Нет, ну нормально, просто слегка неожиданно.

Аaa, я что-то подумал, что вываливает некую обертку... а оказалось нечто уникальное для каждого jsm.
И куча оказалась не совсем кучей:

Выделить код

Код:

var global = Components.utils.import("resource://gre/modules/Services.jsm", {});
global = Components.utils.getGlobalForObject(global);
global.Services; // undefined

Раз так, пусть в старых версиях будет лишний вызов getGlobalForObject():
https://github.com/Infocatcher/Custom_B … eb50597eb3


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№2223-10-2017 11:36:58

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 56.0

Re: [CB]Custom Buttons Editor: Toggle on Top

А ведь еще и финт от неотключаемых расширений поломался из-за этого NonSyntacticVariablesObject:

Выделить код

Код:

if(addon.hidden) {
            _log("Let's try set addon.userDisabled using raw hack");
            let g = Components.utils.import("resource://gre/modules/addons/XPIProvider.jsm", {});
            // See "set userDisabled(val)"
            let addonFor = g.eval("addonFor");
            let rawAddon = addonFor(addon);
            //rawAddon.userDisabled = newDis;
            g.XPIProvider.updateAddonDisabledState(rawAddon, newDis);
        }

Любители скрытничать... :sick:
resource://gre/modules/addons/XPIProvider.jsm

Выделить код

Код:

// Maps instances of AddonInternal to AddonWrapper
const wrapperMap = new WeakMap();
let addonFor = wrapper => wrapperMap.get(wrapper);

Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№2323-10-2017 14:54:48

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2129
UA: Firefox 52.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Infocatcher пишет

финт от неотключаемых расширений поломался из-за этого NonSyntacticVariablesObject

Набрал из-под Firefox 58.0a1 (2017-10-21).

Жму в menupopup кнопки на «Firefox Screenshots».
Алерт алертится как если бы переключилось.

Жму в адесной строке на ●●● (#pageActionButton).
В выпадающей panel'и toolbarbutton «Сделать скриншот»
появляется или не появляется так, как показал алерт.

Нездоровый оптимизм.

скрытый текст

Выделить код

Код:

function updateAddonDisabledState(addon, newDis) {
    var nsvo = Components.utils.import("resource://gre/modules/addons/XPIProvider.jsm", {});
    var ssl = Components.classes["@mozilla.org/moz/jssubscript-loader;1"]
        .getService(Components.interfaces.mozIJSSubScriptLoader);

    var url = URL.createObjectURL(new Blob([
        "XPIProvider.updateAddonDisabledState(addonFor(this.blabla[0]), this.blabla[1]); delete this.blabla;"
    ]));
    addDestructor(function() {
        URL.revokeObjectURL(url);
    });
    (updateAddonDisabledState = function(addon, newDis) {
        nsvo.blabla = [addon, newDis];
        ssl.loadSubScript(url, nsvo);
    })(addon, newDis);
}
function setNewDisabled(addon) {
    var newDis = getNewDisabled(addon);
    var oldDis = addon.userDisabled;
    try {
        addon.userDisabled = newDis;
    }
    catch(e) { // Error: Cannot disable hidden add-on firefox@getpocket.com
        _log("Can't set addon.userDisabled to " + newDis + ", error:\n" + e);
        if(addon.hidden) {
            _log("Let's try set addon.userDisabled using raw hack");
            let g = Components.utils.import("resource://gre/modules/addons/XPIProvider.jsm", {});
            // See "set userDisabled(val)"
            /*
            let addonFor = g.eval("addonFor");
            let rawAddon = addonFor(addon);
            //rawAddon.userDisabled = newDis;
            g.XPIProvider.updateAddonDisabledState(rawAddon, newDis);
            */
            try {
                let addonFor = g.eval("addonFor");
                let rawAddon = addonFor(addon);
                //rawAddon.userDisabled = newDis;
                g.XPIProvider.updateAddonDisabledState(rawAddon, newDis);
            
            } catch(ex) {
                updateAddonDisabledState(addon, newDis);
            }
        }
    }
    var realDis = addon.userDisabled;
    alert(addon.id + "\nuserDisabled: " + realDis);

Отредактировано Dumby (23-10-2017 14:59:22)

Отсутствует

 

№2423-10-2017 22:32:22

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 56.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Dumby
Ого! Я и забыл про mozIJSSubScriptLoader. Благодарствую.
Одно печалит: чем дальше в лес, тем забористей распорки...
https://github.com/Infocatcher/Custom_B … 879e737d87


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№2507-12-2017 00:50:53

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2129
UA: Firefox 52.0

Re: [CB]Custom Buttons Editor: Toggle on Top

Infocatcher
Кошмар какой-то.
Пока просто тупо выключил, но хоть кнопка снова работает.

Выделить код

Код:

//if(!prefs.getBoolPref("intl.locale.matchOS")) {
                if(!prefs.getBoolPref("intl.locale.matchOS", false)) {

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]