Самая большая проблема с попыткой обнаружить касание - это гибридные устройства, которые поддерживают как сенсорное управление, так и трекпад / мышь. Даже если вы в состоянии правильно определить, поддерживает ли устройство пользователя касание, вам действительно нужно определить, какое устройство ввода пользователь в настоящее время использует. Здесь есть подробное описание этой проблемы и возможное решение здесь .
По сути, подход к выяснению, касался ли пользователь экрана или вместо этого использовал мышь / трекпад, заключается в регистрации на странице событий touchstart
и mouseover
:
document.addEventListener('touchstart', functionref, false) // on user tap, "touchstart" fires first
document.addEventListener('mouseover', functionref, false) // followed by mouse event, ie: "mouseover"
Сенсорное действие вызовет оба этих события, хотя первое (touchstart
) всегда будет первым на большинстве устройств. Таким образом, рассчитывая на эту предсказуемую последовательность событий, вы можете создать механизм, который динамически добавляет или удаляет класс can-touch
к корню документа, чтобы отразить текущий тип ввода пользователя пользователя на данный момент в документе:
;(function(){
var isTouch = false //var to indicate current input type (is touch versus no touch)
var isTouchTimer
var curRootClass = '' //var indicating current document root class ("can-touch" or "")
function addtouchclass(e){
clearTimeout(isTouchTimer)
isTouch = true
if (curRootClass != 'can-touch'){ //add "can-touch' class if it's not already present
curRootClass = 'can-touch'
document.documentElement.classList.add(curRootClass)
}
isTouchTimer = setTimeout(function(){isTouch = false}, 500) //maintain "istouch" state for 500ms so removetouchclass doesn't get fired immediately following a touch event
}
function removetouchclass(e){
if (!isTouch && curRootClass == 'can-touch'){ //remove 'can-touch' class if not triggered by a touch event and class is present
isTouch = false
curRootClass = ''
document.documentElement.classList.remove('can-touch')
}
}
document.addEventListener('touchstart', addtouchclass, false) //this event only gets called when input type is touch
document.addEventListener('mouseover', removetouchclass, false) //this event gets called when input type is everything from touch to mouse/ trackpad
})();
Подробнее здесь .
Я нашел этот
There are two versions of hybrd graphics: MUXed and MUX-less. MUXed have a
display MUX to switch the displays between the discrete and integrated cards.
MUXed systems can be switched using vgaswitcheroo. MUX-less do not have a
display MUX and the displays are only connected to the integrated card. On
MUX-less systems, the discrete card is solely for rendering, not display. X
Server 1.14 is required to support rendering and display from different cards.
Most new laptops (2011+) are MUX-less.
Так что я думаю, что весьма вероятно, что моя система (будучи очень недавним ноутбуком) имеет MUX-less
(т.е. фактически подключена только карта Intel к дисплею), и хотя я могу «переключаться» через AMD Catalyst Control Centre
(если я буду достаточно смелым / глупым, чтобы установить fglrx
), это на самом деле сводится к следующему: «Высокая производительность» -> затем передать жесткие графические вычисления в dGPU перенаправьте их обратно через iGPU для отображения «Низкая производительность / хорошая батарея» -> выполните калибровку на iGPU, а затем отправьте непосредственно на дисплей. У меня также нет возможности переключать графические процессоры в BIOS, что также предполагает MUX-less
.
Таким образом, я, вероятно, никогда не смогу использовать VGA switcheroo.
Еще одно соображение заключается в том, что драйвер radeon
официально еще не поддерживает мою карту (кодовое название 8670M для солнечной системы Mars XT, не путать с OLAND). Таким образом, когда я загружаюсь с драйверами с открытым исходным кодом, я получаю сообщения типа No screens found
для Radeon. Учитывая, что switcheroo
для этого нужны Radeon и Intel, может произойти сбой, потому что драйвер Radeon не поддерживает мою карту.
Если это так, то возникает вопрос о том, как переключаться между картами ATI / Intel (без fglrx
) в системе MUX-less
.
Согласно это
MUXLESS SYSTEMS
Первое, что вам нужно сделать, это включить дискретный графический процессор если он еще не включен:
# echo ON > /sys/kernel/debug/vgaswitcheroo/switch
Убедитесь, что это сработало, выполнив эту команду еще раз:
# cat /sys/kernel/debug/vgaswitcheroo/switch
Теперь нам нужно узнать идентификаторы, которые xrandr присвоил вашим картам. Сделайте это снова как обычный пользователь, а не root:
$ xrandr --listproviders
Providers: number : 3
Provider 0: id: 108 cap: 0xb, Source Output, Sink Output, Sink Offload crtcs: 3 outputs: 4 associated providers: 2 name:Intel
Provider 1: id: 69 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 6 outputs: 0 associated providers: 2 name:radeon
Provider 2: id: 69 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 6 outputs: 0 associated providers: 2 name:radeon
В моем случае в списке 3 карты. Обратите внимание, что оба предоставляют 1 и 2 имеют одинаковый идентификатор. В этом случае моя дискретная карта имеет идентификатор 69, а моя встроенная карта - идентификатор 108.
Последнее, что нам нужно, это сказать X, чтобы использовать ваш дискретный графический процессор для рендеринга:
$ xrandr --setprovideroffloadsink 69 108
Где первое число - ваша дискретная карта, а второе - ваша интегрированная карта. Чтобы убедиться, что это сработало:
$ DRI_PRIME=1 glxinfo | grep renderer
OpenGL renderer string: Gallium 0.4 on AMD TURKS
Вы должны получить Gallium 0.4 в качестве средства визуализации. Отныне все ваши 3D-приложения будут отображаться на вашей карте ATI, нет необходимости перезапускать X.
Работал у меня в lenovo u400 с kubuntu 13.10.
/sys/kernel/debug/vgaswitcheroo/switch
просто не существует. Нет никакого способа отозваться эхом ВКЛ\ВЫКЛ в него.
– Jonathan Hartley
05.05.2020, 23:25