Não é uma resposta completa, mas descobri alguns detalhes ao analisar o código-fonte.
Eu dei uma olhada no código-fonte de xset
no arquivo xset.c
, que vem do pacote x11-xserver-utils
. O código no arquivo baixado no meu sistema (Ubuntu 16.04) por apt-get source x11-xserver-utils
é mais ou menos o mesmo que o código encontrado aqui , então vou usar o código nessa página como referência.
O que acontece quando a opção mouse
é dada pode ser vista em L475-502 (EDIT: na referência atualizada 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);
}
em que SERVER_DEFAULT
está definido como -1
.
Isso apenas lê os argumentos e chama set_mouse
.
Notavelmente, se nenhum argumento adicional for fornecido (comando chamado como xset mouse
), os padrões serão xset mouse -1/-1 -1
. Além disso, acc_num
e threshold
devem estar entre 0 e 9, caso contrário, o valor padrão -1
é usado e o valor padrão para acc_denom
é 1.
A função set_mouse
é novamente apenas um monte de verificações de valores de entrada ilegais:
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;
}
A bola agora é passada para XChangePointerControl
. No entanto, esta função não está definida neste pacote. Algumas pesquisas por meio das dependências incluídas me levaram ao pacote libx11
, contendo o arquivo ChPntCont.c
(código-fonte aqui ), que define esta função:
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;
}
Eu realmente não consegui entender muito além desse ponto. GetReq
é definido por uma macro no arquivo Xlibint.h
no pacote libx11
e somos devolvidos entre várias funções diferentes.
No final do dia, provavelmente temos informações suficientes a partir das funções acima, pois os valores de entrada parecem ser alimentados diretamente como novos valores para propriedades de nome similar do dispositivo touchpad.
O acima, pelo menos, nos diz algo sobre os valores padrão e aceitos de xset
.
Não consegui descobrir por que a saída de xinput list-props
não é atualizada depois que as propriedades são alteradas com xset
.