配置和测试 X 输入设备的两个主要实用程序是xinput
和xset
。
两者之间的主要区别(据我所知)是xinput
允许对(可能依赖于设备的)属性进行更细粒度的控制。另一方面,有时通过给出的设置xset
是一个很好的起点。
我想做的是从 给出的设置开始xset
,并通过 在那里应用一些微调xinput
。
问题在于,似乎通过 获得的配置xset
并未由 注册xinput
,并且xset
手册页没有给出其生成的设置的确切详细信息。
例如,假设我想更改触摸板的速度。我知道xinput --list
相关的设备 ID 是 15,这样我就可以用来xinput --list-props 15
列出所有触摸板属性。我现在可以使用 来更改某些属性,例如将恒定减速度(在本例中 ID 为 276)更改为值 1.5 xinput --set-prop 15 276 1.5
。
然而,xset mouse 5 5
也为我提供了相当好的速度设置。我想了解使用此命令配置的确切配置,但运行xinput --list-props 15
后xset mouse 5 5
没有发现任何差异。我怎样才能得到这些信息?
答案1
不是一个完整的答案,但我通过查看源代码找出了一些细节。
我查看了xset
文件中的源代码xset.c
,它来自包x11-xserver-utils
。在我的系统(Ubuntu 16.04)上下载的文件中的代码apt-get source x11-xserver-utils
与找到的代码或多或少相同这里,所以我将使用该页面上的代码作为参考。
给出选项时会发生什么mouse
可以在 L475-502 中看到(编辑:在更新的参考文献 L450-475 中):
/* Set pointer (mouse) settings: Acceleration and Threshold. */
else if (strcmp(arg, "m") == 0 || strcmp(arg, "mouse") == 0) {
acc_num = SERVER_DEFAULT; /* restore server defaults */
acc_denom = SERVER_DEFAULT;
threshold = SERVER_DEFAULT;
if (i >= argc){
set_mouse(dpy, acc_num, acc_denom, threshold);
break;
}
arg = argv[i];
if (strcmp(arg, "default") == 0) {
i++;
}
else if (*arg >= '0' && *arg <= '9') {
acc_denom = 1;
sscanf(arg, "%d/%d", &acc_num, &acc_denom);
i++;
if (i >= argc) {
set_mouse(dpy, acc_num, acc_denom, threshold);
break;
}
arg = argv[i];
if (*arg >= '0' && *arg <= '9') {
threshold = atoi(arg); /* Set threshold as user specified. */
i++;
}
}
set_mouse(dpy, acc_num, acc_denom, threshold);
}
其中SERVER_DEFAULT
被设置为-1
.这只是读取参数并调用set_mouse
。值得注意的是,如果没有给出其他参数(命令称为 as xset mouse
),则默认值为xset mouse -1/-1 -1
。另外,acc_num
和必须在 0 到 9 之间,否则使用threshold
默认值,且 的默认值为1。-1
acc_denom
该函数set_mouse
再次只是对非法输入值进行一系列检查:
set_mouse(Display *dpy, int acc_num, int acc_denom, int threshold)
{
int do_accel = True, do_threshold = True;
if (acc_num == DONT_CHANGE) /* what an incredible crock... */
do_accel = False;
if (threshold == DONT_CHANGE)
do_threshold = False;
if (acc_num < 0) /* shouldn't happen */
acc_num = SERVER_DEFAULT;
if (acc_denom <= 0) /* prevent divide by zero */
acc_denom = SERVER_DEFAULT;
if (threshold < 0) threshold = SERVER_DEFAULT;
XChangePointerControl(dpy, do_accel, do_threshold, acc_num,
acc_denom, threshold);
return;
}
现在球传给了XChangePointerControl
。然而这个函数没有在这个包中定义。对包含的依赖项的一些搜索将我带到了libx11
包含文件的包ChPntCont.c
(源代码这里),它定义了这个函数:
int
XChangePointerControl(
register Display *dpy,
Bool do_acc,
Bool do_thresh,
int acc_numerator,
int acc_denominator,
int threshold)
{
register xChangePointerControlReq *req;
LockDisplay(dpy);
GetReq(ChangePointerControl, req);
req->doAccel = do_acc;
req->doThresh = do_thresh;
req->accelNum = acc_numerator;
req->accelDenum = acc_denominator;
req->threshold = threshold;
UnlockDisplay(dpy);
SyncHandle();
return 1;
}
除此之外,我并没有真正理解太多。由包中GetReq
文件中的宏定义,我们在几个不同的函数之间来回切换。但归根结底,我们可能从上述函数中获得了足够的信息,因为输入值似乎直接作为触摸板设备的类似命名属性的新值提供。Xlibint.h
libx11
上面至少告诉我们一些关于 的默认值和可接受的值xset
。
我没能弄清楚为什么xinput list-props
属性更改后输出没有更新xset
。