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

Хотите узнать больше о расширениях? Посмотрите ролики, рассказывающие о работе с расширениями Firefox.

№1217620-09-2017 05:52:17

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 523
UA: Firefox 52.0
Веб-сайт

Re: Custom Buttons

Кажется, я наконец получил что-то приемлемое. Но сейчас уже поздно (вернее, уже рано). Утром постараюсь привести код.


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№1217720-09-2017 10:21:58

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

Re: Custom Buttons

Dumby пишет:

Я внешним редактором не пользуюсь совсем …

Аналогично...

На пробу: custom_buttons-0.0.5.8.9-fixed6pre.xpi
Как-то коряво, но сойдет, переписывать не хочется. Бонусом должно было научиться в юникодные пути.


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

Отсутствует

 

№1217820-09-2017 12:41:28

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

Re: Custom Buttons

Infocatcher пишет:

На пробу

Попробовал. Работает.
Какая сложная система callback'ов, я бы так не смог, наверно.
Значит всё к лучшему.

Кстати, глаз зацепился за такую часть кода:

Выделить код

Код:

    if(navigator.platform == "Win32") {
        // Convert Unix newlines to standard network newlines
        textBoxText = textBoxText.replace(/\n/g, "\r\n");
    }

А если navigator.platform Win64, и блок if не исполнится,
то ожидаются ли какие-нибудь проблемы?

difabor пишет:

Скроллинг работает гораздо аккуратнее, чем колёсиком - можно подвинуть буквально на пару пикселей в какую хочешь сторону

Для не e10s звучит как

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

Выделить код

Код:

addEventListener("mousemove", e =>
    e.ctrlKey && !e.shiftKey && !e.altKey
    && gBrowser.selectedBrowser.matches(":hover")
    && content.scrollBy(-e.movementX, -e.movementY)
, false, gBrowser);

Отсутствует

 

№1217920-09-2017 14:53:36

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 523
UA: Firefox 52.0
Веб-сайт

Re: Custom Buttons

Dumby пишет:

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;


Он обеспечивает скроллинг как прецизионный, так и быстрый (5 скоростей) а также управление режимом скроллинга: как по ходу движения мышки, так и против (по ходу движения ScrollBar Button, совпадая с направлением колёсика). Мне всё время было удобнее пользоваться первым режимом (у Вас, кстати, именно он), но вчера, в мучениях и эмпирических "тыках" наугад, обнаружил, что если страница очень большая и с большим текстовым содержимым и надо быстро добраться до чего-то в нижней части, то как ни странно, но в этом случае удобнее скроллить "наоборот", как, собственно говоря, скроллит колёсико :).
Конечно - "удобнее" - это очень и очень субъективно, может мне вчера поздно ночью, да ещё и уставшему и нервному, так просто показалось...
Короче, я решил добавить и оперативное управление направлением тоже.
Получились следующие возможности:
Ctrl           скроллинг с минимальной скоростью, для чего-то прецезиоонного - подвинуть буквально на пару пикселей
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    переворачивает направление скроллинга
Кроме того, для тех, кто не любит пользоваться модификаторами Ctrl, Shift, Alt из-за того, что требуется задействовать обе руки (как, например, я :)), добавлен скроллинг без модификаторов - просто движением мышки.
Правая кнопка мышки (ПКМ) используется для включения и выключения скроллинга и управления скроллингом:
Длинный клик ПКМ - включение скроллинга с пониженной скоростью (в ~два раза больше минимальной)
Вправо-Вверх или Вправо или Вправо-Вниз  ПКМ - включение повышенных и высоких скоростей - скорость определяется амплитудой жеста, чем больше - тем выше
Влево-Вверх  или Влево  или Влево-Вниз   ПКМ - включение минимальной скорости
Влево-Вверх  или Вверх  или Вправо-Вверх ПКМ - устанавливает направление скроллинга - по ходу движения мышки
Влево-Вниз   или Вниз   или Вправо-Вниз  ПКМ - устанавливает направление скроллинга - против хода движения мышки
Вверх или Вниз - устанавливает скроллинг с пониженной скоростью (как и длинный клик ПКМ) - для тех, кто не любит длинных кликов
То есть имеется раздельное управление как скоростью, так и направлением скроллинга, в т.ч и без изменения направления скроллинга (Длинный клик, жесты Влево и Вправо).
Этот режим отключается коротким кликом ПКМ.
Кроме того, этот режим - "забывчивый" - он перестаёт работать если в течение 3 секунд не было движения мышки.
В этом режиме движение с нажатой ПКМ блокирует скроллинг (но не отменяет его аналогично отпусканию модификаторов).
Кроме этого есть возможность оперативно менять скорость скроллинга модификаторами (тогда они её задают, одновременно отменяя этот режим, но не блокируя его).
Режим управления скроллингом с помощью ПКМ может быть отключён (блокирован) длинным кликом ЛКМ - тогда все клики ПКМ можно использовать и для других целей. Отмена этой блокировки тоже осуществляется длинным кликом ЛКМ.
Примечание: Вправо-Вниз, Вправо-Вверх, Влево-Вниз и Влево-Вверх не означает, что надо двигаться сначала в одном направлении, а потом - в перпендикулярном ему.
Это просто диагональные движения. Отслеживаются лишь координаты нажатия ПКМ и отпускания ПКМ, а не само движение ПКМ
К сожалению, режим управления с помощью ПКМ (для тех, кто не любит модификаторы в сочетании с мышкой - занимаются обе руки), возможен только с отключённым e10s :(
-----------------------------------------------------------------------------------------------------------------------------------
Во второй половине дня я немного поработаю с Вашим кодом - постараюсь навесить на него скорости, управление ПКМ и направлением.
Кроме того, Ваш код ведёт себя гораздо лучше моего - скроллинг получается гораздо деликатнее.
Прошу не ругать меня сильно - понятно, что сам механизм скроллинга у меня искусственный, через таймауты - но я просто не знал о e.movementX/e.movementY, до scrollBy я сам дошёл...

Отредактировано difabor (20-09-2017 16:44:51)


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№1218020-09-2017 17:08:56

villa7
Участник
 
Группа: Members
Зарегистрирован: 21-07-2012
Сообщений: 2235
UA: Firefox 42.0

Re: Custom Buttons

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)


Лучше спросить у знающих - чем лезть не зная.

Отсутствует

 

№1218120-09-2017 20:30:54

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

Re: Custom Buttons

Dumby пишет:

Какая сложная система callback'ов, я бы так не смог, наверно.

Не, ну прибедняться тоже не надо. :blush:

Dumby пишет:

Выделить код

Код:

    if(navigator.platform == "Win32") {

Думается, все современные редакторы должны уже понимать формат новой строки с \n, но да, неаккуратно выходит.

Заодно поднял свои старые недотестированные наработки от двойной инициализации при открытии окна в SeaMonkey:
custom_buttons-0.0.5.8.9-fixed6pre2.xpi
На всякий случай сделал отключатель в виде extensions.custombuttons.preventDoubleInitialization.


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

Отсутствует

 

№1218220-09-2017 21:57:43

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 523
UA: Firefox 52.0
Веб-сайт

Re: Custom Buttons

Адаптировал код 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)


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№1218321-09-2017 13:38:50

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 523
UA: Firefox 52.0
Веб-сайт

Re: Custom Buttons

Нашёл 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);


Уважаемые bunda1 и Dumby, я собираюсь поместить код либо в Готовых кнопках, либо отдельной темой.
Не возражаете?

Отредактировано difabor (21-09-2017 19:10:34)


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№1218421-09-2017 14:53:39

villa7
Участник
 
Группа: Members
Зарегистрирован: 21-07-2012
Сообщений: 2235
UA: Firefox 42.0

Re: Custom Buttons

difabor
Выше спрашивал у Dumby, но что-то его нет. С этим кодом не поможете, добавить включение-отключение по ПКМ, не всегда клавиатура под рукой чтобы CTRL нажимать. Мне просто быстрая прокрутка не нужна, да и пользоваться ей у меня не получается, всё прыгает туда-сюда, руки-крюки. И ещё реверс сразу сделать, я привык по другому перемещать, чем здесь, в обратную сторону. Спасибо.

Выделить код

Код:

addEventListener("mousemove", e =>
    e.ctrlKey && !e.shiftKey && !e.altKey
    && gBrowser.selectedBrowser.matches(":hover")
    && content.scrollBy(-e.movementX, -e.movementY)
, false, gBrowser);

Лучше спросить у знающих - чем лезть не зная.

Отсутствует

 

№1218521-09-2017 15:42:04

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 523
UA: Firefox 52.0
Веб-сайт

Re: Custom Buttons

villa7 пишет:

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)


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№1218621-09-2017 15:50:13

intersk
Участник
 
Группа: Members
Зарегистрирован: 20-06-2013
Сообщений: 90
UA: Firefox 51.0

Re: Custom Buttons

можно ли AvtoCopy заставить копировать в текстовых полях, в строке ввода поискового запроса в яндексе и т.п. ?

Отсутствует

 

№1218721-09-2017 17:21:43

villa7
Участник
 
Группа: Members
Зарегистрирован: 21-07-2012
Сообщений: 2235
UA: Firefox 42.0

Re: Custom Buttons

difabor

а) вертикально: в "коридоре" 9рх у левого края
б) горизонтально: в "коридоре" 9рх в верхней части контента (рабочей области под тулбарами)

А можно просто включать-отключать по ПКМ, и прокручивать в любом месте страницы, дело вкуса, но мне не совсем удобно как сейчас, у меня несколько всплывающих панелей, то попадаю, прокручивает, то не попадаю, не прокручивает. Хочется попроще. Да, прокрутка стала в нужную сторону, спасибо.


Лучше спросить у знающих - чем лезть не зная.

Отсутствует

 

№1218821-09-2017 17:28:45

oleg.sgh
Участник
 
Группа: Members
Зарегистрирован: 19-04-2014
Сообщений: 2423
UA: Firefox 56.0

Re: Custom Buttons

villa7
Посмотрите эти дополнение...с прицелом на Firefox 57
ScrollAnywhere :: Add-ons for Firefox
Drag To Scroll :: Add-ons for Firefox

Отсутствует

 

№1218921-09-2017 17:47:07

villa7
Участник
 
Группа: Members
Зарегистрирован: 21-07-2012
Сообщений: 2235
UA: Firefox 42.0

Re: Custom Buttons

oleg.sgh
Спасибо, но у меня 42 [firefox], пока не собираюсь переходить.


Лучше спросить у знающих - чем лезть не зная.

Отсутствует

 

№1219021-09-2017 18:56:33

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 523
UA: Firefox 52.0
Веб-сайт

Re: Custom Buttons

villa7 пишет:

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)


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№1219121-09-2017 19:31:45

villa7
Участник
 
Группа: Members
Зарегистрирован: 21-07-2012
Сообщений: 2235
UA: Firefox 42.0

Re: Custom Buttons

difabor
Этот код ведёт себя так же как тот что Вы выше выкладывали, чуть сдвинул и уже в конце страницы. Мне нужно чтобы вёл себя как в коде ниже.

Выделить код

Код:

addEventListener("mousemove", e =>
    e.ctrlKey && !e.shiftKey && !e.altKey
    && gBrowser.selectedBrowser.matches(":hover")
    && content.scrollBy(-e.movementX, -e.movementY)
, false, gBrowser);

Мне именно такое поведение нужно, только добавить включение-отключение по ПКМ, и всё.


Лучше спросить у знающих - чем лезть не зная.

Отсутствует

 

№1219221-09-2017 19:54:18

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 523
UA: Firefox 52.0
Веб-сайт

Re: Custom Buttons

villa7 пишет:

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

Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№1219321-09-2017 21:00:06

villa7
Участник
 
Группа: Members
Зарегистрирован: 21-07-2012
Сообщений: 2235
UA: Firefox 42.0

Re: Custom Buttons

difabor
Блин, вечно у меня не как у людей. Работает так как надо, спасибо. Но. Конфликтует с кнопкой жестов

https://forum.mozilla-russia.org/viewtopic.php?pid=561354#p561354

стоит сделать любой жест, как прокрутка сразу включается, без долгого ПКМ, можно их как то помирить , чтобы включалось только по долгому ПКМ.

Отредактировано villa7 (21-09-2017 21:00:55)


Лучше спросить у знающих - чем лезть не зная.

Отсутствует

 

№1219421-09-2017 21:19:45

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 523
UA: Firefox 52.0
Веб-сайт

Re: Custom Buttons

villa7 пишет:

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)


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№1219521-09-2017 22:04:34

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 523
UA: Firefox 52.0
Веб-сайт

Re: Custom Buttons

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

Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№1219621-09-2017 23:57:09

villa7
Участник
 
Группа: Members
Зарегистрирован: 21-07-2012
Сообщений: 2235
UA: Firefox 42.0

Re: Custom Buttons

difabor
Последний код, работает как хотелось. Из-вините что замучил Вас своими хотелками. Спасибо большое.


Лучше спросить у знающих - чем лезть не зная.

Отсутствует

 

№1219722-09-2017 00:07:24

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 523
UA: Firefox 52.0
Веб-сайт

Re: Custom Buttons

villa7 пишет:

difabor
Последний код, работает как хотелось. Из-вините что замучил Вас своими хотелками. Спасибо большое.

Ну что Вы!
Благодаря нашему диалогу мне удалось отшлифовать свой основной код.
Кроме того я сам задумался - а не слишком ли "шустрым" получается скроллинг при кубической зависимости и сделал эту зависимость квадратной по умолчанию.
Также сделал возможность управлять этой зависимостью, кому нужно (напр. сделать её вообще линейной - как в Вашем случае)
Думаю в ближайшее время опубликовать обновлённый код.
Так что это скорее я Вас должен благодарить! Рад, что сумел обеспечить Вам желаемое

Отредактировано difabor (22-09-2017 00:13:53)


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№1219822-09-2017 10:04:22

intersk
Участник
 
Группа: Members
Зарегистрирован: 20-06-2013
Сообщений: 90
UA: Firefox 55.0

Re: Custom Buttons

difabor пишет:

Думаю в ближайшее время опубликовать обновлённый код.

ждем

Добавлено 22-09-2017 10:06:45

intersk пишет:

можно ли 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)

Отсутствует

 

№1219923-09-2017 01:53:08

difabor
Участник
 
Группа: Members
Зарегистрирован: 21-09-2013
Сообщений: 523
UA: Firefox 52.0
Веб-сайт

Re: Custom Buttons

Мне удалось добиться работы этой кнопки в 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);


Основные функции:
1. Скроллинг с Ctrl - в любом месте рабочей области (не на тулбарах, а там где страница)
2. Скроллинг без модификатора - в любом месте рабочей области
а) Включается: длинным кликом ЛКМ. Подчёркиваю: левым кликом мышки, не правым
б) Отключается: коротким кликом ЛКМ.
в) Кроме того, если в течение 3 секунд мышку не двигали - тоже прекращает скроллинг
г) Не должен конфликтовать с FireGestures и другими жестами (если отпускание ЛКМ не происходит в том же месте, что и нажатие - достаточно 3рх разницы, что меньше миллиметра)
3. Скроллинг без модификатора и без включения/отключения скроллинга - в "коридорах":
а) в правом вертикальном коридоре шириной 20рх (у правого края рабочей области) - вертикальный скроллинг
в) в нижнем горизонтальном коридоре шириной 20рх (у нижнего края рабочей области) - горизонтальный скроллинг
4. Заодно реализованы бескликовые переходы в начало страницы, конец страницы, до конца влево и до конца вправо
а) если курсор в нижнем правом углу (20х20рх) рабочей области - в начало страницы (горизонтальная координата не изменяется)
б) если в левом правом углу (20х20) - в конец страницы (горизонтальная координата не изменяется)
в) если в левом нижнем углу (20х20) - до конца влево (вертикальная координата не изменяется)
г) если в левом верхнем углу (20х20) - до конца вправо (вертикальная координата не изменяется)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Несколько слов о скорости и направлении скроллинга.
По умолчанию скроллинг осуществляется в направлении, противоположном, тому, как делает колёсико, т.е. - в направлении перемещения контента (курсор как бы "приклеивается" к контенту)
Многие привыкли наоборот. Они могут очень просто это перестроить под себя:
Первая строка кода:
var rv=-1,tL=600,tO=3000,pw=1,pE=0,c=1,m=999999,B=0,Mdn=[],EnS=[],V,H;
Надо изменить rv с -1 на 1.
Теперь - насчёт скорости.
В предыдущей версии скорость очень шустро менялась из-за кубической зависимости от скорости движения мышки и это оказалось не совсем удобным.
"Одно неосторожное движение, и ты уже отец"©М.Жванецкий
Поэтому я немного поубавил ускорение с кубической зависимости до квадратной (по умолчанию).
Но кому и такая зависимость не понравится - тоже может с лёгкостью это подогнать под себя.
Та же первая строка: если хотите ещё спокойнее - с квадратичной зависимости до линейной - надо: вместо pw=1 написать pw=0,
Если же кто-то предпочтёт кубическую, то надо вместо pw=1 написать pw=2.
Так же очень просто перестроить параметры длинного клика и время самостоятельного отключения:
tL=600 задаёт минимальную длительность длинного клика (0.6 секунды), каждый может это время подстроить под себя.
То же касается времени самостоятельного отключения. По умолчанию - это 3 секунды - tO=3000 - можете подстроить под себя.
Теперь - самый спорный и запутанный момент - бескликовые переходы.
Когда курсор в правом нижнем углу - надо перемещаться на самый верх или на самый низ?
С одной стороны - напрашивается - на самый низ, в конец страницы. Но с другой стороны, если мы скроллим по направлению мышки, т.е. против направления движения колёсика - то надо наоборот.
В кнопке я поступил просто: те, кому привычно скроллить по направлению мышки, (т.е. против направления движения колёсика) - будет на самый верх, а те, кто против движения мышки - будет на самый низ.
То есть та же переменная rv ведает и этим.
Но если человек привык скроллить  по направлению мышки, но хочет, чтобы в правом нижнем углу 20х20 перемещаться в конец, а в правом верхнем углу - в начало?
Тоже - без проблем: для этого есть переменная c=1 - смените значение на -1.
Тем же, кому вообще не нравится так прыгать - сделайте c=0.
Тем, кому не нравится скроллинг в коридорах - его тоже можно заблокировать:
26-я строка:
  (H=content.innerWidth-20) && (V=content.innerHeight-20 )             &&
- сделайте вместо -20 +20 и этот коридор никогда не появится.
Кстати, Вы можете изменить ширину коридора: - 30 будет шире, а -10 - у́же
Кроме того, можно ещё и изменить линейную составляющую скорости:
Переменная rv не обязательно должна быть ±1, она может быть и ±2, и ±3, и ±0.5 и так далее и Вы можете подобрать себе такую скорость, как хотите.
Кнопка позволяет динамически (без редактирования кода) изменять переменные rv и pw.
То есть Вы можете оперативно менять направление скроллинга и скорость - с квадратичной до кубической или линеной.
Горячая комбинация Alt-Shift-6 меняет знак у rv, а комбинация Alt-Shift-5 - циклически меняет pw - 1->2->0->1->2 и т.д.
Если эти горячие комбинации у вас заняты - нетрудно подобрать другие.
-------------------------------------------------------------------------------------------------------------------------------------------------------------
Кнопка не требует кликов на неё саму. Поэтому её можно спрятать.
Чтобы её спрятать надо поместить её на открытый тулбар, а в Classic Theme Restorer в Custom css code написать:
#custombuttons-button[№СВ]  {visibility: collapse !important;}
#custombuttons-button[№СВ]  > menupopup {visibility: visible !important;}
например:
#custombuttons-button39  {visibility: collapse !important;}
#custombuttons-button39  > menupopup {visibility: visible !important;}

Вам может потребоваться доступ к этой кнопке только для редактирования, отключения и т.п.
С этой целью в коде предусмотрено:
Длинный ЛКМ с Ctrl в  любом месте рабочей области: - вызывает редактор этой кнопки
Длинный ЛКМ с Shift в любом месте рабочей области: - вызывает стандартное контекстное меню СВ
---------------------------------------------------------------------------------------------------------------------------------
Ну вот, пожалуй и всё.
Многопроцессорность действительно заставила многое поменять - из-за неё пришлось с Правой Кнопки Мыши "пересесть" на Левую.
Кроме того, нужны были специальные приёмы, чтобы с помощью горячих комбинаций менять значения переменных...
Сначала создавалось впечатление, что в МП режиме горячие клавиши вообще не хотят работать.
Я делаю rv=-rv, а оно не делается :) Лишь потом я обнаружил, что оно таки делается, но несколько раз - каждым процессором самостоятельно.
Поэтому если это делают 2 процессора, то ничего как бы не изменяется - дважды  rv=-rv оставляет  rv без изменения :)
Пришлось искать противоядие. Наверное есть какие-то стандартные приёмы для этого, но я их не знаю, пришлось придумывать доморощенные...
Будут вопросы - задавайте.
код той же кнопки - через адресную строку

Выделить код

Код:

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)


Хорошо, когда у человека есть выбор, но плохо, когда он перед ним стоит ©

Отсутствует

 

№1220023-09-2017 08:55:34

Ultima2m
Участник
 
Группа: Members
Откуда: Россия
Зарегистрирован: 28-11-2013
Сообщений: 574
UA: Firefox 52.0

Re: Custom Buttons

difabor пишет:

3. Скроллинг без модификатора и без включения/отключения скроллинга - в "коридорах":
а) в правом вертикальном коридоре шириной 20рх (у правого края рабочей области) - вертикальный скроллинг
в) в нижнем горизонтальном коридоре шириной 20рх (у нижнего края рабочей области) - горизонтальный скроллинг

Можно ли установить задержку на включение этой функции (~1 сек)?

Отсутствует

 

Board footer

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