Кажется, я наконец получил что-то приемлемое. Но сейчас уже поздно (вернее, уже рано). Утром постараюсь привести код.
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Я внешним редактором не пользуюсь совсем …
Аналогично...
На пробу: custom_buttons-0.0.5.8.9-fixed6pre.xpi
Как-то коряво, но сойдет, переписывать не хочется. Бонусом должно было научиться в юникодные пути.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
На пробу
Попробовал. Работает.
Какая сложная система callback'ов, я бы так не смог, наверно.
Значит всё к лучшему.
Кстати, глаз зацепился за такую часть кода:
if(navigator.platform == "Win32") { // Convert Unix newlines to standard network newlines textBoxText = textBoxText.replace(/\n/g, "\r\n"); }
А если navigator.platform Win64, и блок if не исполнится,
то ожидаются ли какие-нибудь проблемы?
Скроллинг работает гораздо аккуратнее, чем колёсиком - можно подвинуть буквально на пару пикселей в какую хочешь сторону
Для не e10s звучит как
addEventListener("mousemove", e => e.ctrlKey && !e.shiftKey && !e.altKey && gBrowser.selectedBrowser.matches(":hover") && content.scrollBy(-e.movementX, -e.movementY) , false, gBrowser);
Отсутствует
difabor пишетСкроллинг работает гораздо аккуратнее, чем колёсиком - можно подвинуть буквально на пару пикселей в какую хочешь сторону
Для не e10s звучит как
скрытый текстВыделить кодКод:
addEventListener("mousemove", e => e.ctrlKey && !e.shiftKey && !e.altKey && gBrowser.selectedBrowser.matches(":hover") && content.scrollBy(-e.movementX, -e.movementY) , false, gBrowser);
Спасибо большое!
Я всю ночь провозился и тоже добился приемлемого скроллинга. Правда код получился больше.
Но почему Вы написали "Для не e10s"? У меня Ваш код и на e10s работает...
Может, я чего-то не учитываю?
Привожу пока что мой, несколько неказистый код
/*Initialization Code*/ //return(0); var revers=1, step=50, lcnt=0, tLong=800, tOut=3000, toscr=30, tocnt=14; var height = document.documentElement.scrollHeight, width = document.documentElement.scrollWidth; var Mdown = [Date.now(),0,0], ScrEn=[0,Date.now()]; var cnt = 0, yBuf=[], xBuf=[], speed=2, limit=6; function UpOrClick(e,inp) { var udx=e.clientX-Mdown[1],udy=e.clientY-Mdown[2],dx2=udx*udx,dy2=udy*udy,trem=dx2+dy2,step2=step*step; Mdown[3]=0; if (e.button==0 && (trem<16) && (Date.now()-Mdown[0]>tLong) && (inp=='C')) {lcnt=(lcnt+1)%2;} if ((e.button == 2) && (lcnt==0)) { if ((trem<16) && (Date.now()-Mdown[0]>tLong)) {e.preventDefault();e.stopPropagation(); if (ScrEn[0]==0) {speed=2;limit=6}; ScrEn=[1,Date.now()]} if ((trem>16) && (udx<0) && (9*dx2 > dy2)) {e.preventDefault();if (ScrEn[0]==0) {speed=1;limit=3};ScrEn=[1,Date.now()]} if ((trem>16) && (udx>0) && (9*dx2 > dy2)) {e.preventDefault();if (ScrEn[0]==0) {speed=1+trem/step2;limit=3*speed};ScrEn=[1,Date.now()]} if ((trem>16) && (udy>0) && (9*dy2 > dx2)) {e.preventDefault();if (ScrEn[0]==0) revers = -1; ScrEn=[1,Date.now()]} if ((trem>16) && (udy<0) && (9*dy2 > dx2)) {e.preventDefault();if (ScrEn[0]==0) revers = 1; ScrEn=[1,Date.now()]} if ((trem>16) && (9*dx2 < dy2)) {e.preventDefault();if (ScrEn[0]==0) {speed=2;limit=6};ScrEn=[1,Date.now()]} if ((trem<16) && (Date.now()-Mdown[0]<=tLong)&&(ScrEn[0]==1)&&(inp=='C')) {e.preventDefault(); ScrEn=[0,Date.now()]; speed=2;limit=6} } } function MouseUp(e,inp) {UpOrClick(e,'U')}; function Click(e,inp) {UpOrClick(e,'C')}; addEventListener("mousedown", function(e) {Mdown=[Date.now(),e.clientX,e.clientY,1]; if(Date.now()-ScrEn[1]>tOut) ScrEn[0]=0}, false, gBrowser ); addEventListener("mouseup", MouseUp, false, gBrowser); addEventListener("click", Click, false, gBrowser); addEventListener('keydown',function(e){ if (!e.ctrlKey && e.altKey && e.shiftKey && (e.keyCode==54)) revers=-revers; },0,window); function scroll(e){ if (e.ctrlKey||e.shiftKey&&!e.altKey||((ScrEn[0]==1)&&(Date.now()-ScrEn[1]<=tOut))&&(Mdown[3]==0)){ var y = e.clientY,x = e.clientX; yBuf[cnt]=y, xBuf[cnt]=x; cnt=(cnt+1)%999; if ( e.ctrlKey&&!e.shiftKey&&!e.altKey) {speed=1; limit=3; ScrEn[0] = 0} if (!e.ctrlKey&& e.shiftKey&&!e.altKey) {speed=2; limit=6; ScrEn[0] = 0} if ( e.ctrlKey&& e.shiftKey&&!e.altKey) {speed=5; limit=15; ScrEn[0] = 0} if ( e.ctrlKey&&!e.shiftKey&& e.altKey) {speed=10; limit=30; ScrEn[0] = 0} if ( e.ctrlKey&& e.shiftKey&& e.altKey) {speed=15; limit=45; ScrEn[0] = 0} ScrEn[1]=Date.now(); setTimeout(()=> { var dx = (e.clientX-xBuf[0]>limit) ? limit : e.clientX-xBuf[0]; var dy = (e.clientY-yBuf[0]>limit) ? limit : e.clientY-yBuf[0]; content.scrollBy(revers*speed*dx,revers*speed*dy); setTimeout(()=> {cnt=0},tocnt); },toscr); } } gBrowser.onmousemove = scroll;
Ctrl скроллинг с минимальной скоростью, для чего-то прецезиоонного - подвинуть буквально на пару пикселейКроме того, для тех, кто не любит пользоваться модификаторами Ctrl, Shift, Alt из-за того, что требуется задействовать обе руки (как, например, я ), добавлен скроллинг без модификаторов - просто движением мышки.
Shift скроллинг с пониженной скоростью (в ~2 раза выше) - тоже достаточно аккуратный, гораздо аккуратнее (моего) колёсика (или, скажем, колёсика в моих руках)
Ctrl-Shift скроллинг с нормальной скоростью (в ~5 раз выше минимальной, но субъективно ощущается не в 5 раз, а где-то в 3 раза)
Ctrl-Alt скроллинг с повышенной скоростью (в ~10 раз выше минимальной, но субъективно ощущается где-то в 4-5 раз)
Ctrl-Shift-Alt скроллинг с повышенной скоростью (в ~15 раз выше минимальной, но субъективно ощущается где-то в 5-7 раз)
Alt, Alt-Shift не использовал (Alt дёргает менюбар, а Alt-Shift пока ещё используется для переключения раскладок, хотя сейчас можно и другим сочетанием).
Alt-Shift-6 переворачивает направление скроллинга
Длинный клик ПКМ - включение скроллинга с пониженной скоростью (в ~два раза больше минимальной)То есть имеется раздельное управление как скоростью, так и направлением скроллинга, в т.ч и без изменения направления скроллинга (Длинный клик, жесты Влево и Вправо).
Вправо-Вверх или Вправо или Вправо-Вниз ПКМ - включение повышенных и высоких скоростей - скорость определяется амплитудой жеста, чем больше - тем выше
Влево-Вверх или Влево или Влево-Вниз ПКМ - включение минимальной скорости
Влево-Вверх или Вверх или Вправо-Вверх ПКМ - устанавливает направление скроллинга - по ходу движения мышки
Влево-Вниз или Вниз или Вправо-Вниз ПКМ - устанавливает направление скроллинга - против хода движения мышки
Вверх или Вниз - устанавливает скроллинг с пониженной скоростью (как и длинный клик ПКМ) - для тех, кто не любит длинных кликов
Отредактировано difabor (20-09-2017 16:44:51)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Dumby
Классно, страницу во все стороны можно двигать. А можно сюда добавить чтобы ещё включалось длинным ПКМ, и выключалось коротким, как у difabor сделано. Просто мне не нужны переключатели скоростей и всё прочее. Меньше кода, меньше глюков.
addEventListener("mousemove", e => e.ctrlKey && !e.shiftKey && !e.altKey && gBrowser.selectedBrowser.matches(":hover") && content.scrollBy(-e.movementX, -e.movementY) , false, gBrowser);
Отредактировано villa7 (20-09-2017 17:25:21)
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
Какая сложная система callback'ов, я бы так не смог, наверно.
Не, ну прибедняться тоже не надо.
Думается, все современные редакторы должны уже понимать формат новой строки с \n, но да, неаккуратно выходит.
Заодно поднял свои старые недотестированные наработки от двойной инициализации при открытии окна в SeaMonkey:
custom_buttons-0.0.5.8.9-fixed6pre2.xpi
На всякий случай сделал отключатель в виде extensions.custombuttons.preventDoubleInitialization.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Адаптировал код Dumby. Получилась очень простая в управлении СВ - без различных режимов - всего одна скорость, но чрезвычайно гибкая и универсальная - на все случаи жизни!
То есть можно прецизионно добавлять буквально пару пикселей, а можно перелистнуть разом сотни строк! Если медленно двигать мышкой будет аккуратное, даже прецизионное перемещение.
Если быстро - скачет как антилопа Перемещение осуществляется одновременно по обоим направлениям - вертикальном и горизонтальном (если есть куда ).
Используется один модификатор: ctrl (без alt и shift);
Кроме того для для тех, кто не любит пользоваться модификаторами из-за того, что требуется задействовать обе руки (как, например, я ), реализован также скроллинг без Ctrl - просто движением мышки.
Правая кнопка мышки (ПКМ) используется для включения и выключения скроллинга.
Длинный клик ПКМ - включение скроллинга, короткий клик ПКМ - выключение скроллинга.
При скроллинге без Ctrl нажатая ПКМ блокирует скроллинг (но не отключает его) - аналог отпускания Ctrl.
Режим управления скроллингом с помощью ПКМ может быть отключён (блокирован) длинным кликом ЛКМ - тогда все клики ПКМ можно использовать и для других целей.
Отмена этой блокировки тоже осуществляется длинным кликом ЛКМ.
Кроме того, скроллинг без модификаторов - "забывчивый" - он перестаёт работать если в течение 3 секунд не было движения мышки. Время тоже можно просто изменить в коде: 3-я строка: tOut=3000 - задают 3 секунды.
Длительность длинного клика - в той же строке: tLong=600 задаёт 0.6 секунды. Всё это очень легко поменять.
По умолчанию - направление движения мышки совпадает с перемещением контента, но можно переключить и на противоположное направление - всё зависит от вкусов и предпочтений пользователя.
Переключение направления - по горячей комбинации Alt-Shift-6.
У кого эта комбинация занята - очень просто изменить - 5-я строка кода ведает этим.
К сожалению, режим управления с помощью ПКМ (для тех, кто не любит модификаторы в сочетании с мышкой), а также переключение направление скроллинга возможен только с отключённым e10s
/*Initialization Code*/ //return(0); var revers=-1, lcnt=0, tLong=600, tOut=3000; addEventListener('keydown',function(e){ if (!e.ctrlKey && e.altKey && e.shiftKey && (e.keyCode==54)) revers=-revers; },0,window); var Mdown = [Date.now(),0,0], ScrEn=[0,Date.now()]; function ClickUp(e,s){ var udx=e.clientX-Mdown[1],udy=e.clientY-Mdown[2],dx2=udx*udx,dy2=udy*udy,trem=dx2+dy2; Mdown[3]=0; if ((e.button==0) && (trem<16) && (Date.now()-Mdown[0]>tLong) && (s=='C')) {lcnt=(lcnt+1)%2;} if ((e.button==2)&&(lcnt==0) &&((Date.now()-Mdown[0]>tLong)||(trem>=16))) {e.preventDefault(); ScrEn=[1,Date.now()]} if ((e.button==2)&&(trem<16) && (Date.now()-Mdown[0]<=tLong)&&(ScrEn[0]==1)&&(s=='C')) { e.preventDefault(); ScrEn=[0,Date.now()]} } function MouseUp(e,s) {ClickUp(e,'U')}; function Click(e,s) {ClickUp(e,'C')}; addEventListener("mousedown", function(e) {Mdown=[Date.now(),e.clientX,e.clientY,1]; if(Date.now()-ScrEn[1]>tOut) ScrEn[0]=0}, false, gBrowser ); addEventListener("mouseup", MouseUp, false, gBrowser); addEventListener("click", Click, false, gBrowser); addEventListener("mousemove", e => ((e.ctrlKey && !e.shiftKey && !e.altKey) || (((ScrEn[0]==1)&&(Date.now()-ScrEn[1]<=tOut)) && (Mdown[3]==0))) && gBrowser.selectedBrowser.matches(":hover")&& (ScrEn[1]=Date.now()) && content.scrollBy(revers*e.movementX*e.movementX*e.movementX, revers*e.movementY*e.movementY*e.movementY) , false, gBrowser);
Пару слов - как достигнута столь высокая гибкость скорости - от прецизиозного перемещения до перелистывания сотен строк текста за раз:
В коде зависимость скроллинга от перемещения не линейная, а кубическая: чем быстрее и размашистей двигаем мышкой - тем быстрее в кубе будет скроллинг.
И наоборот: чем медленнее двигаем мышкой - тем большая аккуратность достигается. С колёсиком даже сравнивать нечего - день и ночь!
Чего пока не удаётся достичь - это скроллинга в текскстовом поле и вообще в подполях... Хотя дополнению Scrollbar Anywhere это удаётся..
Код надо положить в инициализацию.
На досуге я "повоюю" с e10s.
Отредактировано difabor (20-09-2017 22:58:57)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Нашёл workaround для e10s - скроллинг без модификаторов вообще. Workaround до предела простой:
Вертикальный скроллинг можно делать без модификаторов и установки режимов ПКМ если просто перемещать курсор в "коридоре" 9 рх у левого края. Получается типа левого скроллбара
Горизонтальный скроллинг можно делать без модификаторов и установки режимов ПКМ если просто перемещать курсор в "коридоре" 9 рх у верхнего края рабочей области (под самым нижним из верхних тулбаров).
Иными словами: если хотите просто перемещать курсор без скроллинга - избегайте вертикальных перемещений в левом узком вертикальном "коридоре" 9рх и горизонтальных перемещений в узком верхнем горизонтальном коридоре 9рх.
Это не мешает доступаться до иконок. У кого есть вертикальный тулбар (VT, авторы Dumby, bunda1) - вертикальный коридор достаточно широк, чтобы VT не вылазил (или поднастройте дистанцию его выпадания). Если же он стоит перманентно - вертикальный коридор получается сразу после него (рабочая область смещается).
Короче - попробуйте.
Главное - и в e10s работает!
/*Initialization Code*/ var revers=-1, lcnt=0, tLong=600, tOut=3000, Mdown = [Date.now(),0,0],ScrEn=[0,Date.now()]; addEventListener('keydown',function(e){ if (!e.ctrlKey && e.altKey && e.shiftKey && (e.keyCode==54)) revers=-revers; },0,window); function ClickUp(e,s){ var udx=e.clientX-Mdown[1],udy=e.clientY-Mdown[2],dx2=udx*udx,dy2=udy*udy,trem=dx2+dy2; Mdown[3]=0; if ((e.button==0) && (trem<16) && (Date.now()-Mdown[0]>tLong) && (s=='C')) {lcnt=(lcnt+1)%2;} if ((e.button==2)&&(lcnt==0) &&((Date.now()-Mdown[0]>tLong)||(trem>=16))) {e.preventDefault(); ScrEn=[1,Date.now()]} if ((e.button==2)&&(trem<16) && (Date.now()-Mdown[0]<=tLong)&&(ScrEn[0]==1)&&(s=='C')) { e.preventDefault(); ScrEn=[0,Date.now()]} } addEventListener("mousedown", function(e) {Mdown=[Date.now(),e.clientX,e.clientY,1]; if(Date.now()-ScrEn[1]>tOut) ScrEn[0]=0}, false, gBrowser ); addEventListener("mouseup", function(e,s){ClickUp(e,'U')}, false, gBrowser); addEventListener("click", function(e,s){ClickUp(e,'C')}, false, gBrowser); addEventListener("mousemove", e => ((e.ctrlKey&&!e.shiftKey&&!e.altKey)||(e.clientX<9)||(e.clientY<9) || (((ScrEn[0]==1)&&(Date.now()-ScrEn[1]<=tOut)) && (Mdown[3]==0))) && gBrowser.selectedBrowser.matches(":hover")&& (ScrEn[1]=Date.now()) && content.scrollBy((e.ctrlKey||(e.clientY<9)||ScrEn[0])*revers*e.movementX*e.movementX*e.movementX, (e.ctrlKey||(e.clientX<9)||ScrEn[0])*revers*e.movementY*e.movementY*e.movementY) , false,gBrowser);
Отредактировано difabor (21-09-2017 19:10:34)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
difabor
Выше спрашивал у Dumby, но что-то его нет. С этим кодом не поможете, добавить включение-отключение по ПКМ, не всегда клавиатура под рукой чтобы CTRL нажимать. Мне просто быстрая прокрутка не нужна, да и пользоваться ей у меня не получается, всё прыгает туда-сюда, руки-крюки. И ещё реверс сразу сделать, я привык по другому перемещать, чем здесь, в обратную сторону. Спасибо.
addEventListener("mousemove", e => e.ctrlKey && !e.shiftKey && !e.altKey && gBrowser.selectedBrowser.matches(":hover") && content.scrollBy(-e.movementX, -e.movementY) , false, gBrowser);
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
difabor
Выше спрашивал у Dumby, но что-то его нет. С этим кодом не поможете, добавить включение-отключение по ПКМ, не всегда клавиатура под рукой чтобы CTRL нажимать. Мне просто быстрая прокрутка не нужна, да и пользоваться ей у меня не получается, всё прыгает туда-сюда, руки-крюки. И ещё реверс сразу сделать, я привык по другому перемещать, чем здесь, в обратную сторону. Спасибо.Выделить кодКод:
addEventListener("mousemove", e => e.ctrlKey && !e.shiftKey && !e.altKey && gBrowser.selectedBrowser.matches(":hover") && content.scrollBy(-e.movementX, -e.movementY) , false, gBrowser);
Предельно простой код, адаптированный под Вас:
addEventListener("mousemove", e => ((e.ctrlKey&&!e.shiftKey&&!e.altKey)||(e.clientX<9)||(e.clientY<9)) && gBrowser.selectedBrowser.matches(":hover") && content.scrollBy((e.ctrlKey||(e.clientY<9))*e.movementX*e.movementX*e.movementX, (e.ctrlKey||(e.clientX<9))*e.movementY*e.movementY*e.movementY) , false,gBrowser);
1. Скроллит в привычном Вам направлении.
2. Можно скроллить и без Ctrl:
а) вертикально: в "коридоре" 9рх у левого края
б) горизонтально: в "коридоре" 9рх в верхней части контента (рабочей области под тулбарами)
3. В любом месте и в любых направлениях - с Ctrl
4. Работает и в e10s
Попробуйте. "Коридор" можно сузить или расширить очень просто.
Отредактировано difabor (21-09-2017 15:43:59)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
difabor
а) вертикально: в "коридоре" 9рх у левого края
б) горизонтально: в "коридоре" 9рх в верхней части контента (рабочей области под тулбарами)
А можно просто включать-отключать по ПКМ, и прокручивать в любом месте страницы, дело вкуса, но мне не совсем удобно как сейчас, у меня несколько всплывающих панелей, то попадаю, прокручивает, то не попадаю, не прокручивает. Хочется попроще. Да, прокрутка стала в нужную сторону, спасибо.
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
villa7
Посмотрите эти дополнение...с прицелом на Firefox 57
ScrollAnywhere :: Add-ons for Firefox
Drag To Scroll :: Add-ons for Firefox
Отсутствует
difabor
а) вертикально: в "коридоре" 9рх у левого края
б) горизонтально: в "коридоре" 9рх в верхней части контента (рабочей области под тулбарами)А можно просто включать-отключать по ПКМ, и прокручивать в любом месте страницы, дело вкуса, но мне не совсем удобно как сейчас, у меня несколько всплывающих панелей, то попадаю, прокручивает, то не попадаю, не прокручивает. Хочется попроще. Да, прокрутка стала в нужную сторону, спасибо.
Попробуйте этот:
/*Initialization Code*/ var tLong=600, tOut=3000, Mdown = [Date.now(),0,0],ScrEn=[0,Date.now()]; function ClickUp(e,s){ var udx=e.clientX-Mdown[1],udy=e.clientY-Mdown[2],dx2=udx*udx,dy2=udy*udy,trem=dx2+dy2; Mdown[3]=0; if ((e.button==2)&&((Date.now()-Mdown[0]>tLong)||(trem>=16))) {e.preventDefault(); ScrEn=[1,Date.now()]} if ((e.button==2)&&(trem<16)&&(Date.now()-Mdown[0]<=tLong)&&ScrEn[0]&&s){e.preventDefault(); ScrEn=[0,Date.now()]} } addEventListener("mousedown", function(e) {Mdown=[Date.now(),e.clientX,e.clientY,1]; if(Date.now()-ScrEn[1]>tOut) ScrEn[0]=0}, false, gBrowser ); addEventListener("mouseup", function(e,s){ClickUp(e,0)}, false, gBrowser); addEventListener("click", function(e,s){ClickUp(e,1)}, false, gBrowser); addEventListener("mousemove", e => ((e.ctrlKey&&!e.shiftKey&&!e.altKey) || (((ScrEn[0]==1)&&(Date.now()-ScrEn[1]<=tOut)) && (Mdown[3]==0))) && gBrowser.selectedBrowser.matches(":hover")&& (ScrEn[1]=Date.now()) && content.scrollBy(e.movementX*e.movementX*e.movementX,e.movementY*e.movementY*e.movementY) , false,gBrowser);
Но в e10s по ПКМ работать не будет.
С Ctrl - будет.
Отредактировано difabor (21-09-2017 19:31:15)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
difabor
Этот код ведёт себя так же как тот что Вы выше выкладывали, чуть сдвинул и уже в конце страницы. Мне нужно чтобы вёл себя как в коде ниже.
addEventListener("mousemove", e => e.ctrlKey && !e.shiftKey && !e.altKey && gBrowser.selectedBrowser.matches(":hover") && content.scrollBy(-e.movementX, -e.movementY) , false, gBrowser);
Мне именно такое поведение нужно, только добавить включение-отключение по ПКМ, и всё.
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
difabor
Этот код ведёт себя так же как тот что Вы выше выкладывали, чуть сдвинул и уже в конце страницы. Мне нужно чтобы вёл себя как в коде ниже.Выделить кодКод:
addEventListener("mousemove", e => e.ctrlKey && !e.shiftKey && !e.altKey && gBrowser.selectedBrowser.matches(":hover") && content.scrollBy(-e.movementX, -e.movementY) , false, gBrowser);Мне именно такое поведение нужно, только добавить включение-отключение по ПКМ, и всё.
Пожалуйста:
/*Initialization Code*/ var tLong=600, tOut=3000, Mdown = [Date.now(),0,0],ScrEn=[0,Date.now()]; function ClickUp(e,s){ var udx=e.clientX-Mdown[1],udy=e.clientY-Mdown[2],dx2=udx*udx,dy2=udy*udy,trem=dx2+dy2; Mdown[3]=0; if ((e.button==2)&&((Date.now()-Mdown[0]>tLong)||(trem>=16))) {e.preventDefault(); ScrEn=[1,Date.now()]} if ((e.button==2)&&(trem<16)&&(Date.now()-Mdown[0]<=tLong)&&ScrEn[0]&&s){e.preventDefault(); ScrEn=[0,Date.now()]} } addEventListener("mousedown", function(e) {Mdown=[Date.now(),e.clientX,e.clientY,1]; if(Date.now()-ScrEn[1]>tOut) ScrEn[0]=0}, false, gBrowser ); addEventListener("mouseup", function(e,s){ClickUp(e,0)}, false, gBrowser); addEventListener("click", function(e,s){ClickUp(e,1)}, false, gBrowser); addEventListener("mousemove", e => ((e.ctrlKey&&!e.shiftKey&&!e.altKey) || (((ScrEn[0]==1)&&(Date.now()-ScrEn[1]<=tOut)) && (Mdown[3]==0))) && gBrowser.selectedBrowser.matches(":hover")&& (ScrEn[1]=Date.now()) && content.scrollBy(e.movementX,e.movementY), false, gBrowser);
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
difabor
Блин, вечно у меня не как у людей. Работает так как надо, спасибо. Но. Конфликтует с кнопкой жестов
https://forum.mozilla-russia.org/viewtopic.php?pid=561354#p561354
стоит сделать любой жест, как прокрутка сразу включается, без долгого ПКМ, можно их как то помирить , чтобы включалось только по долгому ПКМ.
Отредактировано villa7 (21-09-2017 21:00:55)
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
difabor
Блин, вечно у меня не как у людей. Работает так как надо, спасибо. Но. Конфликтует с кнопкой жестовhttps://forum.mozilla-russia.org/viewtopic.php?pid=561354#p561354
стоит сделать любой жест, как прокрутка сразу включается, без долгого ПКМ, можно их как то помирить , чтобы включалось только по долгому ПКМ.
Мы постепенно возвращаемся к исходному коду, в котором и это было предусмотрено
Попробуйте этот код:
/*Initialization Code*/ var tLong=600, tOut=3000, Mdown = [Date.now(),0,0],ScrEn=[0,Date.now()], lcnt=1; function ClickUp(e,s){ var udx=e.clientX-Mdown[1],udy=e.clientY-Mdown[2],dx2=udx*udx,dy2=udy*udy,trem=dx2+dy2; Mdown[3]=0; if ((e.button==0)&&(trem<16)&&(Date.now()-Mdown[0]>tLong)&&s){lcnt=(lcnt+1)%2;} if ((e.button==2)&&lcnt&&((Date.now()-Mdown[0]>tLong)||(trem>=16))) {e.preventDefault(); ScrEn=[1,Date.now()]} if ((e.button==2)&&(trem<16)&&(Date.now()-Mdown[0]<=tLong)&&ScrEn[0]&&s){e.preventDefault(); ScrEn=[0,Date.now()]} } addEventListener("mousedown", function(e) {Mdown=[Date.now(),e.clientX,e.clientY,1]; if(Date.now()-ScrEn[1]>tOut) ScrEn[0]=0}, false, gBrowser ); addEventListener("mouseup", function(e,s){ClickUp(e,0)}, false, gBrowser); addEventListener("click", function(e,s){ClickUp(e,1)}, false, gBrowser); addEventListener("mousemove", e => ((e.ctrlKey&&!e.shiftKey&&!e.altKey) || (((ScrEn[0]==1)&&(Date.now()-ScrEn[1]<=tOut)) && (Mdown[3]==0))) && gBrowser.selectedBrowser.matches(":hover")&& (ScrEn[1]=Date.now()) && content.scrollBy(e.movementX*(e.movementX<0?-e.movementX:e.movementX), e.movementY*(e.movementY<0?-e.movementY:e.movementY)), false, gBrowser);
Здесь длинный ЛКМ запрещает управление скроллингом от ПКМ. Этот же длинный ЛКМ разрешает ПКМ.
По умолчанию управление скроллингом по ПКМ разрешено. Если сделаете длинный ЛКМ - запретите управление скроллингом от ПКМ и можете работать жестами.
Закончили работу жестами - опять длинный ЛКМ - разрешили управление скроллингом. И т.д.
А как иначе разрешить такой конфликт?
Использовать СКМ не годится - её может и не быть на лэптопе...
---------------------------------------------------------------------------------------
Я не пользуюсь FireGestures, поэтому у меня к Вам вопрос:
А эти жесты как-то включаются, или они сразу включены?
У расширения предусмотрено отключение жестов при конфликтах? Его можно как-то включать/отключать помимо стандартного включения/отключения дополнений через Аддон Менеджер?
Отредактировано difabor (21-09-2017 21:30:29)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
villa7, мне удалось разрешить конфликт проще и элегантнее, без использования ЛКМ!
Теперь любые жесты ПКМ не будут включать скроллинг (если только отпускание кнопки не будет в той же точке, где нажатие - достаточно разницы в 3рх, а это меньше миллиметра.
Запрет по длинному ЛКМ оставил на всякий случай
/*Initialization Code*/ var tLong=600, tOut=3000, Mdown = [Date.now(),0,0], ScrEn=[0,Date.now()], lcnt=1; function ClickUp(e,s){ var udx=e.clientX-Mdown[1],udy=e.clientY-Mdown[2],dx2=udx*udx,dy2=udy*udy,trem=dx2+dy2; Mdown[3]=0; if ((e.button==0)&&(trem<9)&&(Date.now()-Mdown[0]>tLong)&&s) lcnt=(lcnt+1)%2; if ((e.button==2)&&lcnt&&((Date.now()-Mdown[0]>tLong)||(trem>=9))) { e.preventDefault();ScrEn[1]=Date.now(); if (trem<9) ScrEn[0]=1 } if ((e.button==2)&&(trem<9)&&(Date.now()-Mdown[0]<=tLong)&&ScrEn[0]&&s) { e.preventDefault(); ScrEn=[0,Date.now()] } } addEventListener("mousedown", function(e) {Mdown=[Date.now(),e.clientX,e.clientY,1]; if(Date.now()-ScrEn[1]>tOut) ScrEn[0]=0}, false, gBrowser); addEventListener("mouseup", function(e,s){ClickUp(e,0)}, false, gBrowser); addEventListener("click", function(e,s){ClickUp(e,1)}, false, gBrowser); addEventListener("mousemove", e => ((e.ctrlKey&&!e.shiftKey&&!e.altKey) || (((ScrEn[0]==1)&&(Date.now()-ScrEn[1]<=tOut)) && (Mdown[3]==0))) && gBrowser.selectedBrowser.matches(":hover")&& (ScrEn[1]=Date.now()) && content.scrollBy(e.movementX*(e.movementX<0?-e.movementX:e.movementX), e.movementY*(e.movementY<0?-e.movementY:e.movementY)),false,gBrowser);
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
difabor
Последний код, работает как хотелось. Из-вините что замучил Вас своими хотелками. Спасибо большое.
Ну что Вы!
Благодаря нашему диалогу мне удалось отшлифовать свой основной код.
Кроме того я сам задумался - а не слишком ли "шустрым" получается скроллинг при кубической зависимости и сделал эту зависимость квадратной по умолчанию.
Также сделал возможность управлять этой зависимостью, кому нужно (напр. сделать её вообще линейной - как в Вашем случае)
Думаю в ближайшее время опубликовать обновлённый код.
Так что это скорее я Вас должен благодарить! Рад, что сумел обеспечить Вам желаемое
Отредактировано difabor (22-09-2017 00:13:53)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
Думаю в ближайшее время опубликовать обновлённый код.
ждем
Добавлено 22-09-2017 10:06:45
можно ли AvtoCopy заставить копировать в текстовых полях, в строке ввода поискового запроса в яндексе и т.п. ?
вот код
//отключение меню this.oncontextmenu =e=> { e.button && !e.ctrlKey && e.preventDefault() }; // Autocopy+3 от 26.12.2013. // Настройка функций кликов мыши для кнопки ................................ this.onclick = function(e) { if ( e.button == 0 ) cbu.setPrefs("Autocopy", !cbu.getPrefs("Autocopy") ); if ( e.button == 2 ) { e.preventDefault(); menuPopup.showPopup( this, -1, -1, "popup", "bottomleft", "topleft"); } }; // Проверить наличие строк в 'about:config' и создать если не существует ................................ if ( !cbu.isPref("Autocopy.saveWithDoubleClick") ) { ["Autocopy", "Autocopy.reset", "Autocopy.selectingTextBlink", "Autocopy.selectWithDoubleClick", "Autocopy.copyWithDoubleClick", "Autocopy.saveWithDoubleClick"].forEach(function(pref) { cbu.setPrefs( pref, false ) }); }; // Создать меню ................................ var array = [ { label: 'Выключать автокопирование при выходе из браузера', value: 'Autocopy.reset' }, { label: 'Выделенный текст мигает при автокопировании', value: 'Autocopy.selectingTextBlink' }, { separator: ''}, { label: 'Двойной правый клик мыши копирует выделенный текст', value: 'Autocopy.copyWithDoubleClick' }, { label: 'Двойной левый клик мыши выделяет все в текстовых полях', value: 'Autocopy.selectWithDoubleClick' }, { label: 'Двойной правый клик мыши сохраняет изображение без запроса', value: 'Autocopy.saveWithDoubleClick' }, { label: 'Средним кликом вставлятъ текст с заменой выделенного текста', value: 'middlemouse.paste' } ]; var menuPopup = self.appendChild( document.createElement("menupopup") ); array.forEach(function( m ) { if ( "separator" in m ) { menuPopup.appendChild( document.createElement("menuseparator") ); return }; var mItem = document.createElement("menuitem"); mItem.setAttribute("label", m.label); mItem.setAttribute('type', 'checkbox'); mItem.setAttribute('checked', custombuttons.getPrefs( m.value ) ); mItem.setAttribute('onclick', 'custombuttons.setPrefs("' + m.value + '", !custombuttons.getPrefs("' + m.value + '"))'); menuPopup.appendChild( mItem ); }); menuPopup.setAttribute("onclick", "event.stopPropagation()"); // добавить стандартное контекстное меню .... menuPopup.appendChild( document.createElement("menuseparator") ); menuPopup.appendChild( document.createElement("menu") ).setAttribute("label", "Меню кнопки"); var clone = menuPopup.lastChild.appendChild( document.getElementById("custombuttons-contextpopup").cloneNode(true) ); clone.setAttribute("onpopupshowing", "document.popupNode = document.getElementById('" + _id + "')"); // Установить нужную иконку кнопки при старте браузера или при изменениях настроек в 'about:config' ................................ const s = "Autocopy"; function toggleImage() { self.image = cbu.getPrefs(s) ? "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgMBAAQIAAcEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAcACAMEAQEAAAAAAAAAAAAAAAACAwADAAAAABUnAB9cqgC3a7wB4Gq5Ad1qugHearoB3mq6Ad5qugHearoB3mi4AN1qugHgYrMAxR43AC8AAAAAAAEAAAECAAQAAAQAV6AAprP9Vv/W/qn80/+f/9T/ov/U/6L/1P+i/9T/ov/U/6L/1/+n/9X+pfy3/WL/Y7QAvwEAAQAAAAAAFSgAH1ehAKlyzwD1htgf/YzcJ/2K2yP9i9sk/YvbJf2L2yX9i9sm/YnaIv2b4kP92/21/Nf+qv9quwHdBQkACAAAAQBeqwCzr/tR/8X0j/u+8X//vvJ//77ygP++8oD/vvKA/77yf/+98n7/wvSH/4zcKv+e4kv93v+0/2i5AN0DBwAIBQkACGu8AdzV/af/4v/B/d//u//h/7//4f+//+H/v//h/7//4f+//9/+u//n/8n/w/GK/4zaK/3g/7r/aroC3gMHAAgEBwAIarkC3dX/pf/g/sD93v67/9/+vv/g/r//4P6//+D+v//f/r7/3f66/+T/xv/B8Yb/j9st/eT/w/9qugPeAwcACAQHAAhqugLe2v+w/+j/z/3l/8r/5//N/+f/zv/n/87/5//O/+f/zf/l/sj/7P/W/8Xyj/+Q2y/96f/N/2q6A94DBwAIBAcACGq6At7f/7n/7v/c/ev/1v/t/9n/7f/a/+3/2v/t/9r/7f/Z/+r+1f/y/+P/yPKW/5DbMf3s/9X/aroE3gMHAAgEBwAIaroC3uP/wf/z/+j98P/h//L/5P/z/+X/8//l//P/5f/y/+T/8P7g//j/7v/L8p3/kdsy/fD/3P9rugTeAwcACAQHAAhqugLe5v/J//j/8v31/+r/9v/t//f/7v/3/+//9//u//b/7f/0/un//f/4/87yo/+R2zL98f/f/2q5Bd0DBwAIBAcACGq6At7p/8///P/6/fj/8f/6//T/+v/1//r/9f/6//X/+v/0//f+8P//////0fGo/5PbNf30/+f/a7wE3AQJAAgEBwAIabkC3er/0f/+//79+v/0//v/9//8//j//P/4//z/+P/7//f/+f70///////T8qz/i9go+8P9ef9dqwCzAAACAAUJAAhquwHd7f7a//////z+//39/////f////3////9/////f////39/vz9/////dzzvv5v0AD1VqECqRUnAB8AAAAAAQACAGK0AL/J/Yf/8v7k/O3/1//u/9n/7v/Z/+7/2f/u/9n/7v/Z/+3/1//x/eP8vfxu/1WgAKYAAAUAAQIABAABAAAAAAAAHjcALmGzAMVquwLgarkC3Wq6At5qugLearoC3mq6At5qugLearkC3Wu8AeBbqgC3FScAHwAAAAACAwADAAAAAAAAAAAAAAAAAwQCAQQIAAgEBwAIBAcACAQHAAgEBwAIBAcACAQHAAgEBwAIBAgABwMDAgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" : "data:image/x-icon;base64,AAABAAEAEREAAAEAIADwBAAAFgAAACgAAAARAAAAIgAAAAEAIAAAAAAAyAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAgEDAAQACAcEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAHCAMBBAEAAAAAAAAAAAAAAAACAAMDAAAAABUAJx9cAKq3awG84GoBud1qAbreagG63moBut5qAbreagG63mgAuN1qAbrgYgCzxR4ANy8AAAAAAAABAAEAAgQABAAAVwCgprNW/f/Wqf7805///9Si///Uov//1KL//9Si///Uov//16f//9Wl/vy3Yv3/YwC0vwEBAAAAAAAAFQAoH1cAoalyAM/1hh/Y/Ywn3P2KI9v9iyTb/Ysl2/2LJdv9iybb/Yki2v2bQ+L927X9/Neq/v9qAbvdBQAJCAABAABeAKuzr1H7/8WP9Pu+f/H/vn/y/76A8v++gPL/voDy/75/8v+9fvL/wof0/4wq3P+eS+L93rT//2gAud0DAAcIBQAJCGsBvNzVp/3/4sH//d+7///hv///4b///+G////hv///4b///9+7/v/nyf//w4rx/4wr2v3guv//agK63gMABwgEAAcIagK53dWl///gwP793rv+/9++/v/gv/7/4L/+/+C//v/fvv7/3br+/+TG///BhvH/jy3b/eTD//9qA7reAwAHCAQABwhqArre2rD//+jP//3lyv//583//+fO///nzv//587//+fN///lyP7/7Nb//8WP8v+QL9v96c3//2oDut4DAAcIBAAHCGoCut7fuf//7tz//evW///t2f//7dr//+3a///t2v//7dn//+rV/v/y4///yJby/5Ax2/3s1f//agS63gMABwgEAAcIagK63uPB///z6P/98OH///Lk///z5f//8+X///Pl///y5P//8OD+//ju///LnfL/kTLb/fDc//9rBLreAwAHCAQABwhqArre5sn///jy//316v//9u3///fu///37///9+7///bt///06f7//fj//86j8v+RMtv98d///2oFud0DAAcIBAAHCGoCut7pz////Pr//fjx///69P//+vX///r1///69f//+vT///fw/v//////0ajx/5M12/305///awS83AQACQgEAAcIaQK53erR///+/v/9+vT///v3///8+P///Pj///z4///79///+fT+///////TrPL/iyjY+8N5/f9dAKuzAAIAAAUACQhqAbvd7dr+//////z+/f/9/////f////3////9/////f////39/P79/////dy+8/5vAND1VgKhqRUAJx8AAAAAAQIAAGIAtL/Jh/3/8uT+/O3X///u2f//7tn//+7Z///u2f//7tn//+3X///x4/38vW78/1UAoKYABQAAAQACBAAAAQAAAAAAHgA3LmEAs8VqArvgagK53WoCut5qArreagK63moCut5qArreagK53WsBvOBbAKq3FQAnHwAAAAACAAMDAAAAAAAAAAAAAAAAAwIEAQQACAgEAAcIBAAHCAQABwgEAAcIBAAHCAQABwgEAAcIBAAIBwMCAwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="; }; toggleImage(); gPrefService.addObserver( s, toggleImage, false ); addDestructor(function() { gPrefService.removeObserver( s, toggleImage, false ) }); // Выключать кнопку при закрытии браузера если это разрешено в 'about:config' ................................ var turnOffButton = { observe: function(subject, topic, data) { if ( cbu.getPrefs("Autocopy.reset") && data == "shutdown" ) cbu.setPrefs("Autocopy", false ); } }; Services.obs.addObserver( turnOffButton, "quit-application", false); addDestructor(function() { Services.obs.addObserver( turnOffButton, "quit-application", false ) }); // Функции автоматически копирует выделенный текст на странице, если это разрешено в 'about:config' ................................ function autocopy(e) { if ( e.button == 2 ) return; if ( /input|password|textarea|textbox|searchbar|findbar|tabbrowser/.test( e.target.localName.toLowerCase() ) ) return; if ( e.type == 'mousedown' ) var lastSelection = getBrowserSelection(); if ( e.type !== 'mouseup' ) return; var selection = getBrowserSelection(); if ( cbu.getPrefs("Autocopy") && selection && selection !== lastSelection ) { goDoCommand('cmd_copy'); // выделенный текст мигает .... if ( !cbu.getPrefs("Autocopy.selectingTextBlink") ) return; document.activeElement.blur(); setTimeout(function() { window.content.focus() }, 300); } }; addEventListener("mouseup", autocopy, false, gBrowser ); addEventListener("mousedown", autocopy, false, gBrowser ); // Cредней кнопкой мыши вставить текст из буфера обмена в текстовые поля с заменой выделенного текста ................................ function middleMousePaste(e) { if ( e.button == 1 && cbu.getPrefs('middlemouse.paste') ) { if ( /input|password|textarea|textbox|searchbar|findbar|cbeditor/.test( e.target.localName.toLowerCase() ) && document.commandDispatcher.getControllerForCommand("cmd_paste") ) { e.preventDefault(); e.stopPropagation(); // вставить текст .... var cmd = "cmd_insertText"; var commandDispatcher = ( this.document || document ).commandDispatcher; var controller = commandDispatcher.getControllerForCommand(cmd); if ( controller && controller.isCommandEnabled(cmd) ) { controller = controller.QueryInterface(Components.interfaces.nsICommandController); var params = Components.classes["@mozilla.org/embedcomp/command-params;1"] .createInstance(Components.interfaces.nsICommandParams); params.setStringValue("state_data", gClipboard.read() ); controller.doCommandWithParams(cmd, params); } } } }; addEventListener("click", middleMousePaste, true, document.documentElement ); // Дополнительные возможности для значка идентификации сайта в строке адреса ................................ addEventListener("click", function(e) { e.preventDefault(); e.stopPropagation(); // ЛКМ без запроса открывает информацию о странице в вкладке 'Разрешения' .... if ( e.button == 0 ) { var doc = content.document; BrowserPageInfo( doc, ( (doc.location.protocol).slice(0,4) == "http") ? "permTab" : "generalTab" ); } // ПКМ копирует текущий адрес .... if ( e.button == 2) { gClipboard.write( content.location ); // значок идентификации сайта мигает красным .... document.getElementById("identity-box").setAttribute("style", "background: red;"); setTimeout(function() { document.getElementById("identity-box").removeAttribute("style") }, 500); } }, true, document.getElementById("identity-box") ); // Дополнительные возможности для двойного клика мыши, если это разрешено в 'about:config' ................................ function handleDblClick(e) { var node = e.target; var editor = node.editor; // выделить все в текстовых полях .... if ( e.button == 0 && custombuttons.getPrefs("Autocopy.selectWithDoubleClick") ) { e.preventDefault(); if ( /input|textbox|textarea/.test( node.localName ) ) !editor ? node.select() : editor.selectAll(); } // сохранить изображение без запроса .... if ( e.button == 2 && cbu.getPrefs("Autocopy.saveWithDoubleClick") && node.localName == 'img' ) { saveImageURL( gContextMenu.imageURL, 0, 0, 0, 1, null, content.document ); setTimeout(function() { document.getElementById("contentAreaContextMenu").hidePopup() }, 20); } // скопировать выделенный текст .... if ( e.button == 2 && cbu.getPrefs("Autocopy.copyWithDoubleClick") && !/findbar|tabbrowser/.test( node.localName ) ) { e.preventDefault(); !editor ? goDoCommand("cmd_copy") : editor.copy(); try { var box = ( node.textbox || node ).inputField.parentNode; var popup = box.ownerDocument.getAnonymousElementByAttribute( box, "anonid", "input-box-contextmenu"); setTimeout(function() popup.hidePopup(), 50); } catch(e) { document.getElementById("contentAreaContextMenu").hidePopup() }; } }; addEventListener("dblclick", handleDblClick, false, gBrowser ); // Наблюдатель следит за открытием окон адреса которых указанны в коде и добавляет им обработчики ................................ var observer = { observe: function(subject, topic, data) { subject.addEventListener("load", this, false); }, handleEvent: function(e) { var doc = e.target; var win = doc.defaultView; var href = doc.location.href; win.removeEventListener("load", this, false); // закрывать 'Информацию о странице' или 'Библиотеку' двойным кликом на ней .... if ( /pageInfo.xul|places.xul/.test( href ) ) { win.addEventListener("dblclick", function close() { this.close() }, true); win.addEventListener("unload", function(e) { win.removeEventListener(e.type, arguments.callee, false); win.removeEventListener("dblclick", close, true); }, false); }; // добавлять и удалять обработчики клика для редактора Custom Buttons .... if ( href.substring(0, 41) == "chrome://custombuttons/content/editor.xul" ) { win.addEventListener("click", middleMousePaste, true ); win.addEventListener("dblclick", handleDblClick, false ); win.addEventListener("unload", function(e) { win.removeEventListener(e.type, arguments.callee, false ); win.removeEventListener("click", middleMousePaste, true ); win.removeEventListener("dblclick", handleDblClick, false ); }, false); }; } }; Services.obs.addObserver(observer, "domwindowopened", false); addDestructor(function() { Services.obs.removeObserver(observer, "domwindowopened", false) }); // Подсказка для кнопки ................................ this.tooltipText = "Autocopy \nЛ: Переключить автоматическое копирование \nП: Меню + CB меню";
Отредактировано intersk (22-09-2017 10:06:45)
Отсутствует
Мне удалось добиться работы этой кнопки в e10s в полном объёме.
var rv=-1,tL=600,tO=3000,pw=1,pE=0,c=1,m=999999,B=0,Mdn=[],EnS=[],V,H; function cM(n,m){var x=(Date.now()-B>99)?(n+1)%m:n;B=Date.now();return(x)} function rM(n) {var x=(Date.now()-B>99) ? -n : n; B=Date.now();return(x)} function sp(base,pw) {return(base*Math.pow(Math.abs(base),pw))} addEventListener('keydown',e=>(!e.ctrlKey && e.altKey && e.shiftKey && (((e.keyCode==54)&&(rv=rM(rv)))||(e.keyCode==53)&&(pw=cM(pw,3)))),0,window); addEventListener("mousedown",(e)=>{if(Date.now()-B<99){B=Date.now();return} B=Date.now(); Mdn=[Date.now(),e.clientX,e.clientY,1]; if(Date.now()-EnS[1]>tO){pE=EnS[0]; EnS[0]=0}}, false, gBrowser); addEventListener("click",(e)=>{if(Date.now()-B<99) {B=Date.now();return} var udx=e.clientX-Mdn[1], udy=e.clientY-Mdn[2], trem=udx*udx+udy*udy; if (!e.button&&!e.altKey) { if (!e.ctrlKey&&!e.shiftKey&&(trem<9)&&(EnS[0]||pE)){EnS=[0,Date.now()]} if (!e.ctrlKey&&!e.shiftKey&&(Date.now()-Mdn[0]>tL)) { EnS[1]=Date.now();if(trem<9)EnS[0]=1 } if ( e.ctrlKey&&!e.shiftKey&&(Date.now()-Mdn[0]>tL)) custombuttons.editButton(this); if (!e.ctrlKey&& e.shiftKey&&(Date.now()-Mdn[0]>tL))gShowPopup(this); } Mdn[3]=0; B=Date.now(); pE=0;}, false, gBrowser); addEventListener("mousemove", e => (H=content.innerWidth-20) && (V=content.innerHeight-20 ) && gBrowser.selectedBrowser.matches(":hover") && (e.clientX < 20 && e.clientY < 20 && content.scrollBy(-m*c*rv,0)) || (e.clientX < 20 && e.clientY > V && content.scrollBy( m*c*rv,0)) || (e.clientX > H && e.clientY < 20 && content.scrollBy(0,-m*c*rv)) || (e.clientX > H && e.clientY > V && content.scrollBy(0, m*c*rv)) || ((e.ctrlKey&&!e.shiftKey&&!e.altKey)||(e.clientX>H)||(e.clientY>V) || (((EnS[0]==1)&&(Date.now()-EnS[1]<=tO)) && (Mdn[3]==0))) && (EnS=((Date.now()-EnS[1]<=tO)&&EnS[0])?[1,Date.now()]:[0,0]) && content.scrollBy((e.ctrlKey||(e.clientY>V)||EnS[0])*rv*sp(e.movementX,pw), (e.ctrlKey||(e.clientX>H)||EnS[0])*rv*sp(e.movementY,pw)),false,gBrowser);
var rv=-1,tL=600,tO=3000,pw=1,pE=0,c=1,m=999999,B=0,Mdn=[],EnS=[],V,H;Надо изменить rv с -1 на 1.
(H=content.innerWidth-20) && (V=content.innerHeight-20 ) &&- сделайте вместо -20 +20 и этот коридор никогда не появится.
#custombuttons-button[№СВ] {visibility: collapse !important;}например:
#custombuttons-button[№СВ] > menupopup {visibility: visible !important;}
#custombuttons-button39 {visibility: collapse !important;}
#custombuttons-button39 > menupopup {visibility: visible !important;}
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%3EWheelLessScroll%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAnJycGKioqCyYmJhEoKCgYKioqISkpJCceHhVUFRMkthsaIbQjIiZZKScqMykpKSkpKSkeKCgoEyYmJgwnJycHKSkpBS8vLgYsKy0DKCQpCx8eHTYbGjSQHBqB4R8Vr/8lPSH/LlwP3CQrH4QmJCYvKyolDS0tLAkpKSkKKSkpBiUlJQAjHycAGRwbNBUoA48VGTfmIhrP/yEd5f8bEcj/IkAZ/zeJAP81ewf/IDcc1BwWPHAhIRsYIyMfACcnJwAREhAeFzYLnyFhBOwodwD/GCJE/x0U2P8eGtP/GA/E/x49GP80fwD/M4IA/yVKG/8pI8H/JCWP0xcWKGsODQoLDBMIUShyBf8pfwD/JHQA/xggQv8eE97/HBfb/wwEof8OLA3/LnwC/zWFAP8kRhT/KSHE/zUz9f8sKZ77BwYFNxcvDE0lZwX/J3oA/yZ4AP8VIz7/CwCd/w4KV/8xMUb/Nioc/y83Bv8hYQT/IEYT/ysgxP82MOn/KSie9w8PHzodQAxMJmoD/yVwAP8ZSgD/EBcR/1lWYP+npaD/zM/W/31aP/+kUAD/bT8H/yQgCv8YEIj/Lynl/y0pqfobFTI8EiQATBYzA/8NKzj/ACV6/zI7VP/d19r/4t7o/8zO3P9vUzr/qVoA/8FpAf9pPAf/Ei0L/xoeTf8eFXb8GREzPgceUkwHOqT/Alf7/wBS+f80Q2f/1MnN/9fP2f/Ozdz/clQ8/6hYAP+1YwD/aDwI/yFeBf8ycAD/HzgK/hAQDkEENpZLAVTj/wBd//8ATev/NkNl/93U1P/b1dj/r7Gz/0k2KP+KQgD/umQA/24+Bf8cVAX/MnoE/y1iCP8cLA5DBDKMSwNO3P8AXP//AFH6/yM1W/+QjJP/Xl2D/zs5lP85N7D/KyRg/1QtGf9GIgD/G1QA/y93AP8lWgb/GSwNRQY5m04AUOH/AEbg/xE3kv8wJRf/HR1U/zxD3P9cXv//Xl///09R+P8qLpT/Kyo5/x86E/8QUwD/HVoB/xcyCUkHG0Y/MDVK95RjF//UhAD/7ZoA/8F7Av93RSj/QDF+/0s8lf+EeZz/ubjB//X29v/Z1dz/eoCA/x84Hf8JGQVFCwEABTQZAEGHWQKfzYcF7+CSB/+tjSj/YIxd/wyfmP8Yn53/g7Ov/+Dk5f/8+vr/0c3M8aeYlLFRPDleKRkVDA8FBAAZDAcAFxAJAB0SCiQ4Kh99BXKIzwDT3f8A////Ae7w/wu3vfE2ZW69X1FTczocCSdUNykAUz0xADcoHgAOBQQAHg8HACEWCAAZEgwALBkWAA4PJxINg49hDrzBrg2usog1bnI0REFGBEtBQwA5GQUAWj4xAFM+MwA1Jh0A/n8AAPgfAADgDwAAgAMAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAMADAAD4HwAA/n8AAA%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bvar%20rv%3D-1%2CtL%3D600%2CtO%3D3000%2Cpw%3D1%2CpE%3D0%2Cc%3D1%2Cm%3D999999%2CB%3D0%2CMdn%3D%5B%5D%2CEnS%3D%5B%5D%2CV%2CH%3B%0A%0Afunction%20cM%28n%2Cm%29%7Bvar%20x%3D%28Date.now%28%29-B%3E99%29%3F%28n+1%29%25m%3An%3BB%3DDate.now%28%29%3Breturn%28x%29%7D%0Afunction%20rM%28n%29%20%20%7Bvar%20x%3D%28Date.now%28%29-B%3E99%29%20%3F%20-n%20%3A%20n%3B%20B%3DDate.now%28%29%3Breturn%28x%29%7D%0Afunction%20sp%28base%2Cpw%29%20%7Breturn%28base*Math.pow%28Math.abs%28base%29%2Cpw%29%29%7D%0A%0AaddEventListener%28%27keydown%27%2Ce%3D%3E%28%21e.ctrlKey%20%26%26%20e.altKey%20%26%26%20e.shiftKey%20%26%26%0A%28%28%28e.keyCode%3D%3D54%29%26%26%28rv%3DrM%28rv%29%29%29%7C%7C%28e.keyCode%3D%3D53%29%26%26%28pw%3DcM%28pw%2C3%29%29%29%29%2C0%2Cwindow%29%3B%0A%0AaddEventListener%28%22mousedown%22%2C%28e%29%3D%3E%7Bif%28Date.now%28%29-B%3C99%29%7BB%3DDate.now%28%29%3Breturn%7D%0A%20%20B%3DDate.now%28%29%3B%20Mdn%3D%5BDate.now%28%29%2Ce.clientX%2Ce.clientY%2C1%5D%3B%0A%20%20if%28Date.now%28%29-EnS%5B1%5D%3EtO%29%7BpE%3DEnS%5B0%5D%3B%20EnS%5B0%5D%3D0%7D%7D%2C%20false%2C%20gBrowser%29%3B%0A%0AaddEventListener%28%22click%22%2C%28e%29%3D%3E%7Bif%28Date.now%28%29-B%3C99%29%20%7BB%3DDate.now%28%29%3Breturn%7D%0A%20%20var%20udx%3De.clientX-Mdn%5B1%5D%2C%20udy%3De.clientY-Mdn%5B2%5D%2C%20trem%3Dudx*udx+udy*udy%3B%0A%20%20if%20%28%21e.button%26%26%21e.altKey%29%20%7B%0A%20%20%20%20if%20%28%21e.ctrlKey%26%26%21e.shiftKey%26%26%28trem%3C9%29%26%26%28EnS%5B0%5D%7C%7CpE%29%29%7BEnS%3D%5B0%2CDate.now%28%29%5D%7D%0A%20%20%20%20if%20%28%21e.ctrlKey%26%26%21e.shiftKey%26%26%28Date.now%28%29-Mdn%5B0%5D%3EtL%29%29%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20EnS%5B1%5D%3DDate.now%28%29%3Bif%28trem%3C9%29EnS%5B0%5D%3D1%20%20%20%7D%0A%20%20%20%20if%20%28%20e.ctrlKey%26%26%21e.shiftKey%26%26%28Date.now%28%29-Mdn%5B0%5D%3EtL%29%29%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20custombuttons.editButton%28this%29%3B%0A%20%20%20%20if%20%28%21e.ctrlKey%26%26%20e.shiftKey%26%26%28Date.now%28%29-Mdn%5B0%5D%3EtL%29%29gShowPopup%28this%29%3B%0A%20%20%7D%20%20Mdn%5B3%5D%3D0%3B%20B%3DDate.now%28%29%3B%20pE%3D0%3B%7D%2C%20false%2C%20gBrowser%29%3B%0A%0AaddEventListener%28%22mousemove%22%2C%20e%20%3D%3E%0A%20%20%28H%3Dcontent.innerWidth-20%29%20%26%26%20%28V%3Dcontent.innerHeight-20%20%29%20%20%20%20%20%20%20%20%20%20%20%20%20%26%26%0A%20%20gBrowser.selectedBrowser.matches%28%22%3Ahover%22%29%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%26%26%0A%20%20%28e.clientX%20%3C%2020%20%26%26%20e.clientY%20%3C%2020%20%26%26%20content.scrollBy%28-m*c*rv%2C0%29%29%20%20%20%20%7C%7C%0A%20%20%28e.clientX%20%3C%2020%20%26%26%20e.clientY%20%3E%20%20V%20%26%26%20content.scrollBy%28%20m*c*rv%2C0%29%29%20%20%20%20%7C%7C%0A%20%20%28e.clientX%20%3E%20%20H%20%26%26%20e.clientY%20%3C%2020%20%26%26%20content.scrollBy%280%2C-m*c*rv%29%29%20%20%20%20%7C%7C%0A%20%20%28e.clientX%20%3E%20%20H%20%26%26%20e.clientY%20%3E%20%20V%20%26%26%20content.scrollBy%280%2C%20m*c*rv%29%29%20%20%20%20%7C%7C%0A%20%20%28%28e.ctrlKey%26%26%21e.shiftKey%26%26%21e.altKey%29%7C%7C%28e.clientX%3EH%29%7C%7C%28e.clientY%3EV%29%20%20%20%7C%7C%0A%20%20%28%28%28EnS%5B0%5D%3D%3D1%29%26%26%28Date.now%28%29-EnS%5B1%5D%3C%3DtO%29%29%20%26%26%20%28Mdn%5B3%5D%3D%3D0%29%29%29%20%20%20%20%20%20%20%20%20%20%20%20%20%26%26%0A%20%20%28EnS%3D%28%28Date.now%28%29-EnS%5B1%5D%3C%3DtO%29%26%26EnS%5B0%5D%29%3F%5B1%2CDate.now%28%29%5D%3A%5B0%2C0%5D%29%20%20%20%20%20%20%20%20%20%26%26%0A%20%20content.scrollBy%28%28e.ctrlKey%7C%7C%28e.clientY%3EV%29%7C%7CEnS%5B0%5D%29*rv*sp%28e.movementX%2Cpw%29%2C%0A%20%20%28e.ctrlKey%7C%7C%28e.clientX%3EH%29%7C%7CEnS%5B0%5D%29*rv*sp%28e.movementY%2Cpw%29%29%2Cfalse%2CgBrowser%29%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%0Acustombuttons.editButton%28this%29%3B%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
Отредактировано difabor (23-09-2017 02:05:54)
Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©
Отсутствует
3. Скроллинг без модификатора и без включения/отключения скроллинга - в "коридорах":
а) в правом вертикальном коридоре шириной 20рх (у правого края рабочей области) - вертикальный скроллинг
в) в нижнем горизонтальном коридоре шириной 20рх (у нижнего края рабочей области) - горизонтальный скроллинг
Можно ли установить задержку на включение этой функции (~1 сек)?
Отсутствует