не монятно
Ну, там же, по ссылке, написано: «js-ctypes to send keys winapi».
То есть код делает так, как если бы было дважды нажато Ctrl
А QTranslate это отслеживает
Системные горячие клавиши (по умолчанию):
Double Ctrl => Показать главное окно программы (с переводом, если есть выделенный текст)
Сподобился проверить в такой конфигурции
Отсутствует
momo2000
а чего его посылать, QTranslate сам все умеет забирать отовсюду: два раза CTRL жмакни и будет тебе перевод.
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
mokujin
а чего его посылать, QTranslate сам все умеет забирать отовсюду: два раза CTRL жмакни и будет тебе перевод.
Он у меня закрыт, когда нужен перевод я его открываю и копипастю(
Есть кнопка на тулбаре
var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile);
file.initWithPath('D:\\DRIVE\\PORTABLE\\QTranslate\\QTranslate.exe');
file.launch();
Вот я идумаю, как так сделать, чтобы по нажатию кнопки из буфера текст сразу был всавлен, походу морока, тогда черт с ней.
Отсутствует
походу морока, тогда черт с ней.
да, вроде, не морока ниразу Dumby всё дал, осталось собрать воедино и запустить:
Код
/* CODE */ // Запустить QTranslate и жмакнуть(программно) дважды CTRL(код Dumby) // - стандартн. комбин. для захвата текста из окна в QTranslate. // интервал можно увеличить или уменьшить, зависит от железа setTimeout(function() dblCtrlSend(), 2000); quickTranslate(); // ----------------------------------- = QuickTranslate = ---------------------------------------------- function quickTranslate() { // скопировать выделенный текст в буфер. // gClipboard.write(document.commandDispatcher.focusedWindow.getSelection().toString()); var profile = Services.dirsvc.get('ProfD', Ci.nsIFile); profile.initWithPath(profile.path + "\\Soft\\QTranslate\\QTranslate.exe"); var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess); var arg = []; process.init(profile); process.run(false, [arg], 1); // setTimeout(function() window.content.focus(), 500); }; function dblCtrlSend() { // See https://gist.github.com/Noitidart/0de3be2442a0295eb386 // vk codes: https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx // Double Ctrl [Ctrl-Down, Ctrl-Up, Ctrl-Down, Ctrl-Up] var data = [[0x11, false], [0x11, true], [0x11, false], [0x11, true]]; // Ctrl+Q [Ctrl-Down, Q-Down, Q-Up, Ctrl-Up] //var data = [[0x11, false], [0x51, false], [0x51, true], [0x11, true]]; var {ctypes} = Cu.import("resource://gre/modules/ctypes.jsm", {}); var KEYBDINPUT = ctypes.StructType("tagKEYBDINPUT", [ {wVk: ctypes.unsigned_short}, {wScan: ctypes.unsigned_short}, {dwFlags: ctypes.unsigned_long}, {time: ctypes.unsigned_long}, {dwExtraInfo: ctypes.voidptr_t.size == 8 ? ctypes.uint64_t : ctypes.unsigned_long}, {padding0: ctypes.uint8_t.array(8)} ]); var INPUT = ctypes.StructType("tagINPUT", [{type: ctypes.unsigned_long}, {ki: KEYBDINPUT}]); var pInputs = INPUT.array()(data.map(([vkCode, keyup]) => INPUT(1, KEYBDINPUT(vkCode, 0, keyup ? 2 : 0, 0, 0, ctypes.uint8_t.array(8)())) )); var user32 = ctypes.open("user32"); try { var SendInput = user32.declare("SendInput", ctypes.winapi_abi, ctypes.unsigned_int, ctypes.unsigned_int, INPUT.ptr, ctypes.int); SendInput(pInputs.length, pInputs, INPUT.size); } finally { user32.close(); } };
Добавлено 05-01-2018 16:55:48
зы. в твоем случае измени ф-цию function quickTranslate() {.... } на свой путь... хотя каки боком там тогда portable будет ?! Отталкиваться ж нужно от относительных путей , но как хочешь.
// змени моё тело на своё function quickTranslate() { var file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile); file.initWithPath('D:\\DRIVE\\PORTABLE\\QTranslate\\QTranslate.exe'); file.launch(); }
Отредактировано mokujin (05-01-2018 16:55:48)
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
Не работает. Окно QTranslate появляется, а выделенный текст в него не попадает. Пробовал на FF 57 и FF 52.
все работает. У мя и в PM и в FF 57.3 (расш-е CB отседава взято да прибудет с Infocatcher сила! ) эта кнопка делает то что и задумано - запускает QTranslate и выделенный текст вставляеццо, сразу переводиццо. См. ошибки в консоли у себя.
Может тебе нужно увеличить\уменьшить ожидание, поставь 3 секунды setTimeout(function() dblCtrlSend(), 3000); или наоборот 1 (1000)
Кнопка никак не предназначена для постоянного использования(жмаканья при выделении взамен нажатия ctrl )! Т.е. весь эффект только на один раз, для сафсем ленивых: программа не запущена - запускаем и жмакаем(программно через 2 сек.) дважды CTRL. Дальше жмакать CTRL можно и нужно ручками. Никаких проверок и условий тут нет. Они и не нужны, QT сам прекрасно отовсюду забирает текст.
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
а куда подевалось в 57-й getBrowserSelection(); или только у меня глючит?
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
Нет, не только у тебя.
Какой-то абсурд, кароче.
Благодарю.
прост, если добавить проверку на выделение, перед запуском(дабы окно не вылазило ежли ничего не выделено ) и в PM все норм.
if(getBrowserSelection()) { setTimeout(function() dblCtrlSend(), 2000); return; }; quickTranslate(); ........
а в 57-й знач надо добавить еще и эту ф-цию (замену я пока не нашел\не понял как)
if(getBrowserSelection()) { setTimeout(function() dblCtrlSend(), 2000); return; }; quickTranslate(); // выпиленная в 57-й ф-ция, вернуть её взад и заюзать в кнопке. function getBrowserSelection(aCharLen) { let focusedElement = document.activeElement; if (focusedElement && focusedElement.localName == "browser" && focusedElement.isRemoteBrowser) { throw "getBrowserSelection doesn't support child process windows"; } return BrowserUtils.getSelectionDetails(window, aCharLen).text; } ...........
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
Dumby Вы когда-то делали кнопку консоль браузера в боковой панели и в новой вкладке для разных версий. Для 57 не посмотрите? Или хотя бы попроще - прикрепить окно снизу или сбоку как у вебконсоли?
Отсутствует
Dumby Вы когда-то делали кнопку консоль браузера в боковой панели и в новой вкладке для разных версий. Для 57 не посмотрите?
OK, попробую
({ title: "Консоль браузера", icon: "chrome://devtools/skin/images/tool-webconsole.svg", url: "chrome://devtools/content/webconsole/webconsole.xul", init() { var trg = document.getElementById("browser"); trg && addEventListener("DOMContentLoaded", this, false, trg); var attrs = { sidebartitle: this.title, sidebarurl: this.url, type: "checkbox", group: "sidebar", checked: SidebarUI.isOpen && SidebarUI.browser.getAttribute("src") == this.url }; var broadcaster = this.element("broadcaster", Object.assign({ id: "viewBrowserConsoleSidebar" }, attrs), document.getElementById("mainBroadcasterSet")); Object.assign(attrs, { autoCheck: "false", label: this.title, observes: broadcaster.id, oncommand: `SidebarUI.toggle("${broadcaster.id}");` }); var btn = this.element("toolbarbutton", Object.assign({ id: "sidebar-switcher-browserconsole", class: "subviewbutton subviewbutton-iconic" }, attrs)); this.element("observes", {element: broadcaster.id, attribute: "checked"}, btn); document.querySelector("#sidebarMenu-popup > toolbarseparator").before(btn); var menuitem = this.element("menuitem", Object.assign({ id: "menu_browserConsoleSidebar" }, attrs), document.getElementById("viewSidebarMenu")); var css = `\ #${btn.id} > .toolbarbutton-icon, #sidebar-box[sidebarcommand="${broadcaster.id}"] > #sidebar-header > #sidebar-switcher-target > #sidebar-icon { list-style-image: url(${this.icon}); -moz-context-properties: fill; fill: currentColor; opacity: 0.8; } #TabsToolbar[brighttext] .tabbrowser-tab:not([visuallyselected=true]) .tab-icon-image[src="${this.icon}"] { filter: url("chrome://devtools/skin/images/filters.svg#icon-normal-dark"); }`; var dwu = QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils); var str = "data:text/css," + encodeURIComponent(css), type = dwu.AGENT_SHEET; dwu.loadSheetUsingURIString(str, type); addDestructor(() => { for(var node of [broadcaster, btn, menuitem]) node.remove(); dwu.removeSheetUsingURIString(str, type); }); self.onclick = e => { if (e.button == 2) return; if (!e.button) return SidebarUI.toggle(broadcaster.id); var st = gBrowser.selectedTab, tab; if (!e.ctrlKey) tab = gBrowser.visibleTabs.find( tab => tab.linkedBrowser.currentURI.spec == this.url ); if (tab == st) return; if (!tab) tab = gBrowser.addTab(this.url); gBrowser.moveTabTo(tab, st._tPos + 1); gBrowser.selectedTab = tab; } if (gBrowser.currentURI.spec == this.url) { var doc = gBrowser.selectedBrowser.contentDocument; if (!doc.querySelector("link")) this.handleEvent({target: doc}); } }, handleEvent({target: doc}) { if (!doc || Cu.isCrossProcessWrapper(doc)) return; var win = doc.defaultView, url = doc.documentURI; var inTab = !String(win).includes("ChromeWindow"); if (url == this.url) { if (inTab) { var link = doc.createElementNS(xhtmlns, "link"); link.setAttribute("rel", "shortcut icon"); link.setAttribute("href", this.icon); doc.documentElement.firstChild.before(link); } this.loader.Services.ww.wins.push(win); new this.loader.HUD_SERVICE().toggleBrowserConsole().then(bc => { if (!inTab) return; var dummy = {close() {}}; var parent = this.inIDOMUtils.getParentForNode(doc, true); if (parent && parent.id == "web-panels-browser") { SidebarUI._title.value = this.title; SidebarUI._icon.src = this.icon; dummy.close = () => SidebarUI._icon.removeAttribute("src"); } win.onbeforeunload = () => {bc.chromeWindow = dummy;} }, Cu.reportError); } else if ( inTab && url == "chrome://devtools/content/shared/widgets/VariablesView.xul" ) { var iframe = win.frameElement; if (!iframe || iframe.ownerDocument.documentURI != this.url) return; var listener = Services.els.getListenerInfoFor(iframe) .find(obj => obj.type == "load").listenerObject; iframe.removeEventListener("load", listener, true); win.addEventListener("load", () => listener({target: doc}), {once: true}); } }, get loader() { delete this.loader; var id = _id + "-browser-console"; var url = "resource://devtools/shared/Loader.jsm?" + id; var loader = {exports: {}}, nsvo = Cu.import(url, loader); addDestructor(reason => reason[5] == "e" && Cu.unload(url)); if (id in nsvo) return this.loader = nsvo[id]; Services.scriptloader.loadSubScript("resource://devtools/client/webconsole/hudservice.js", loader); var e = new CustomEvent("DOMContentLoaded", {bubbles: false}), ww = loader.Services.ww; loader.Services.ww = Cu.getGlobalForObject(nsvo).Object.create(ww, { wins: {value: []}, openWindow: {value: function() { var win = this.wins.shift(); setTimeout(() => win.dispatchEvent(e), 0); return win; }} }); Services.obs.removeObserver(loader.gDevToolsBrowser, "browser-delayed-startup-finished"); var func = nsvo.require("devtools/client/framework/browser-menus").removeMenus; for(var win of CustomizableUI.windows) func(win.document); return this.loader = nsvo[id] = loader; }, element(name, attrs, parent) { var node = document.createElement(name); for(var attr in attrs) node.setAttribute(attr, attrs[attr]); if (parent) parent.appendChild(node); return node; }, get inIDOMUtils() { delete this.inIDOMUtils; return this.inIDOMUtils = "inIDOMUtils" in Ci ? Cc["@mozilla.org/inspector/dom-utils;1"].getService(Ci.inIDOMUtils) : InspectorUtils; } }).init();
Отредактировано Dumby (20-01-2018 04:08:09)
Отсутствует
Dumby спасибо, все отлично работает на 57 версии
Отсутствует
Может подскажет кто, с кнопкой для PaleMoon
Сделал чтоб быстро копировать адреса RSS из значка в урл.строке(в PM он есть). Одно что хотел сделал, а вот другое немогу...
// ---------------- Копировать адресс RSS ленты в адр. строке по ПКМ ---------------------------------- (function copyRSSadr() { addEventListener("mousedown", e => { var rssadr = e.target.getAttribute('feed'); switch (e.button) { case 2: if (rssadr) { e.target.oncontextmenu = function() { return false; }; var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService); gClipboard.write(rssadr); alertsService.showAlertNotification(gBrowser.mCurrentTab.image, rssadr, "Адресс RSS-ленты скопирован", false, "", null, ""); // тут должно быть действие для случая когда !rssadr - т.е. несколько лент на сайте и надо открыть меню, которое откр-ся по левому клику break; } } }, false, document.getElementById("ub-feed-button"), document.getElementById("ub-feed-menu")); })();
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
подошел не так
получил по ид проверь по аттрибуту не меню ли это
если меню то ничего не делай и пусть оно откроется если не меню то копируй.
я помню те времена когда обновления программ убирали проблемы и исправляли баги, а не добавляли их.
toxID:05AB9B827D896AACEE7FF4573A02FB8F025F46ADC856B98F65BC1BA9BD21A81DC98BA9C36CE3
Отсутствует
а в том и моя печаль-беда, что это ничего не изменит там всегда там всегда type = menu. яж грю, по дурацки сделано. Вот, на этом форуме три источнека
а на хабре один и он виден сразу в тутлипе
... но в любом случае, я не знаю как открыть то меню, что открывается левый кликом - я хочу открыть правым кликом мыши.
буду ковырять еще, есть подозрение что так просто его нельзя вызвать и надо будет полностью строить самому(на примере исходного кода)
Отредактировано mokujin (16-01-2018 20:23:39)
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
могу предложить такой костыль
1 проверь что меняется в свойствах\атрибутах кнопки когда есть рсс и нет (да она скрывается но в дом дереве по идее должна оставаться)
2 пилишь свою кнопку помещая её туда а родную прячешь стилем (любым подходящим вариантом хоть просто уменьшая до пикселя)
3 в своей кнопке
а) детектишь показ родной и при показе показываешь свою
б) рсс адреса вытаскивешь сам из страницы (по <link rel="alternate" type="application/rss+xml" )
в) назначаешь на кнопки мыши свои действия как захочешь
var btn = this; this.onclick = function(event) { if(event.button == 0){ alert("ЛКМ"); // Действие при клике ЛКМ } else if(event.button == 1) { // Действие при клике СКМ gShowPopup(this); // Показываем контекстное меню кнопки } else if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) { // Действие при клике ПКМ без модификаторов var ps = document.getElementById("feedsPopup"); // ищи нужный попап в mainPopupSet ps.openPopup(btn) } }; // Блокируем контекстное меню при клике ПКМ без модификаторов.............. this.oncontextmenu = function(event) { if(event.button == 2 && !event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey) { event.preventDefault(); event.stopPropagation(); } };
я помню те времена когда обновления программ убирали проблемы и исправляли баги, а не добавляли их.
toxID:05AB9B827D896AACEE7FF4573A02FB8F025F46ADC856B98F65BC1BA9BD21A81DC98BA9C36CE3
Отсутствует
okkamas_knife
ну вот, опять чувствую себя дебилом... Конечно, благодарю!
Получилась кнопка как хотел, вот такая:
Для PaleMoon (или старых версий FF или др. бравзеров где есть икона RSS в адр. строке) копировать адреса найденых RSS лент по ПКМ.
// ---------------- Скопировать адресс RSS ленты в адр. строке ПКМ или откроется меню с лентами и там тоже ПКМ копирует адрес ---------------------------------- (function() { addEventListener("mousedown", e => { var rssadr = e.target.getAttribute('feed'); switch (e.button) { case 2: e.target.oncontextmenu = function() { return false; }; if (rssadr) { var alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService); gClipboard.write(rssadr); alertsService.showAlertNotification(gBrowser.mCurrentTab.image, rssadr, "Адресс RSS-ленты скопирован", false, "", null, "5000"); } else { var ps = document.getElementById("ub-feed-menu"); // так просто, а я ковырялся несколько дней и безтолку. ps.showPopup( -1, -1, "popup", "bottomleft", "topleft"); // в других случаях может нужно openPopup() break; }; } }, false, document.getElementById("ub-feed-button"), document.getElementById("ub-feed-menu")); })();
...программисты словно войну какую-то ведут за свои обновления. Блин, почему сейчас повсюду мания ухудшать интерфейсы и делать их максимально неудобными?! Radiation
Отсутствует
Заинтересовала кнопка GrabScroll (Firefox24+) от 24.04.2016. С тех пор, наверное, чего-то поменялось, и кнопочка не фурычит. Прокрутка не работает ни правой, ни левой кнопкой (менял в настройках), двойное нажатие ПКМ не вызывает меню СВ. Думал, конфликтует с установленным Yet Another Smooth Scrolling (хочу попробовать кнопку как альтернативу этому расширению) - отключал, ничего не меняется. bunda1, если можно - поправьте, пожалуйста. Спасибо
Отредактировано Viatcheslav (17-01-2018 22:26:09)
Отсутствует
Кнопка "увеличить изображение" аж 2014г. Работает,но не с мультипроцессом...FF58 - можно и выкл. мульти, так с запуском тормоза. Кнопку саму нельзя рихтануть?
Жалко.Уделал эту 58 , а только эту кнопку - никак....
Отсутствует
Dumby насчет кнопки - консоль браузера в боковой панели и в новой вкладке.
Вы бы не могли посмотреть такой нюанс -после нажатия кнопки и закрытия консоли в любом меню в пункте "Веб - разработка" удваивается количество пунктов начиная от Панели разработчика до Других инструментов. Или может это только у меня ? Хотя это не критично.
И еще просьба добавить по любой другой кнопке - в bottom panel.
Отредактировано Andrey_Krropotkin (18-01-2018 22:28:57)
Отсутствует
Заинтересовала кнопка GrabScroll (Firefox24+) от 24.04.2016. С тех пор, наверное, чего-то поменялось, и кнопочка не фурычит. Прокрутка не работает ни правой, ни левой кнопкой (менял в настройках), двойное нажатие ПКМ не вызывает меню СВ.
Странно но у меня работает. Двойное нажатие ПКМ не вызывает меню СВ, потому что в Сustom Buttons что-то сломано и иеперь в всех кнопках меню нельзя вызвать двойным нажатием ПКМ. А многопроцессный режим у тебя включен?
Отсутствует
А многопроцессный режим у тебя включен?
Да, включен. А как должно быть?
Отсутствует
Да, включен. А как должно быть?
Должно быть так как тебе удобней, но похоже что GrabScroll не работает с включенным многопроцессным режимом и я пока не могу это исправить.
Отсутствует
Должно быть так как тебе удобней, но похоже что GrabScroll не работает с включенным многопроцессным режимом и я пока не могу это исправить.
Спасибо за ответ. Надеюсь, что ключевое слово - "пока"
Отсутствует