매우 민감한 마우스가 있는데 감도를 줄여야 합니다. 이에 대한 일반적인 해결책은 좌표 변환 행렬을 허용 가능한 값으로 설정하는 것 같습니다. 그래서 다음 값을 사용합니다.
xinput --set-prop 19 'Coordinate Transformation Matrix' 0.25 0 0 0 0.25 0 0 0 1
Minecraft를 플레이할 때 문제가 발생한다는 것을 마침내 깨달았다는 점을 제외하면 이것은 훌륭하게 작동했습니다. 커서를 반환하는 키를 누르면 마우스를 움직일 때마다 커서가 화면의 왼쪽 위 사분면으로 이동합니다. 정확한 위치는 내가 사용하는 확대/축소 수에 비례하므로 0.25는 0.45보다 커서를 모서리에 더 가깝게 만듭니다. 또한 1보다 큰 값을 사용하면 커서가 모니터의 다른 사분면으로 이동합니다. 물론 값이 1이면 예상대로 커서가 화면 중앙에 유지됩니다. 이는 첫 번째 마우스 입력에서만 발생하며 그 이후에는 마우스가 정상적으로 작동합니다.
이 커서 이동을 방지하는 방법에 대한 조언이 필요합니다. 정말 짜증나네요. 나는 또한 이것이 엄격하게 Minecraft 문제라고 생각하지 않으며 마우스 커서를 획득하고 해제하는 다른 Java 응용 프로그램에서도 이런 일이 발생할 것이라고 생각합니다.
추가 정보, 내 컴퓨터는 Kubuntu 18.04 및 openJDK 10.0.2를 실행하고 있습니다.
편집: 더 많은 정보를 추가했습니다. 나는 정상적인 작업 흐름 중에 다른 곳에서도 이 동작을 발견하기 시작했습니다. 언제 이런 일이 발생했는지는 확실하지 않지만 KDE가 마우스 이벤트 및 창 포커스를 처리하는 방법과 관련이 있을 수 있습니다. 저는 팔로우 마우스를 사용합니다 - 마우스를 먼저 사용합니다.
답변1
내 "해결책"은 중앙에 있을 때 커서를 제자리에 유지하는 변환 행렬을 선택하는 것이었습니다.
사용하려는 매트릭스는 다음과 같습니다.
여기서 s는 원하는 마우스 배율입니다(예: 절반 속도의 경우 0.5). x와 y는 화면 중앙의 좌표입니다.
x,y 값을 얻는 간단한 방법은 xdotool getmouselocation
점프하기 전에 사용하는 것입니다.
예
나는 감도 s = 0.4를 원한다.
Minecraft에서 내 인벤토리를 열면 xdotool getmouseloation
x = 960, y = 1729라고 보고됩니다. 내 오프셋을 계산합니다 (1-s)*x = 0.6*960 = 576 및 (1-s)*y = 0.6*1729 = 1037.4
그런 다음 그에 따라 좌표 변환 행렬을 변경했습니다.
xinput set-prop 8 'Coordinate Transformation Matrix' 0.4 0 576 0 0.4 1037.4 0 0 1
(내 마우스는 장치 8이므로 사용자의 마우스는 다를 수 있습니다.)
결함
이는 특정 좌표의 문제만 해결합니다. 일반적으로 창을 같은 위치에 유지하는 Minecraft와 같은 경우, 이 수정은 인벤토리에 들어갈 때 더 이상 마우스가 점프하지 않을 정도로 충분합니다.
다른 사용 사례에서는 여전히 점프가 발생하지만 마우스가 선택한 x, y에 가까워지면 점프가 더 작아집니다.
수학적 세부 사항
수학에 대한 자세한 내용은 다음을 참조하세요.https://math.stackexchange.com/questions/2954781/calculated-the-translation-of-an-affine-matrix-so-that-it-centres-during-scalin
답변2
대신 가속을 사용하세요. 내 HyperX Pulsefire Surge의 16000 DPI의 경우 정상 값은 -0.935입니다. 이 버그는 자동 숨김, 마우스 순간 이동 패널에도 적용됩니다.
답변3
자신의 XWarpPointer 버전에 XIWarpPointer를 사용해 보십시오. 그것은 다음과 같습니다:
#include <X11/extensions/XInput2.h>
int XWarpPointer(Display *display, Window src_w, Window dest_w, int src_x, int
src_y, unsigned int src_width, unsigned int src_height, int dest_x, int
dest_y){
static int isnew=1;
static int device=0;
int dev_temp;
if(XIGetClientPointer(display,dest_w,&dev_temp)){
isnew=0;
device=dev_temp;
}
if(isnew) return 1;
return XIWarpPointer(display,device,src_w,dest_w,src_x,src_y,src_width,src_height,dest_x,dest_y);
}
gcc xwarp.c --shared -o xwarp.so -lXi로 컴파일한 다음 LD_PRELOAD를 사용하세요.