Como posso ver as propriedades exatas que estão definidas com xset?

6

Os dois principais utilitários para configurar e testar dispositivos de entrada X são xinput e xset .

A principal diferença entre os dois (pelo que entendi) é que xinput permite um controle mais refinado sobre as propriedades (possivelmente dependentes do dispositivo). Por outro lado, às vezes as configurações dadas via xset são um bom ponto de partida.

O que eu gostaria de fazer é começar pelas configurações dadas por xset e aplicar alguns ajustes finos a partir de xinput .

O problema é que parece que as configurações obtidas através de xset não são registradas por xinput , e a página xset man não fornece os detalhes exatos das configurações que produz.

Por exemplo, digamos que eu queira alterar a velocidade do meu touchpad. Eu sei de xinput --list que o ID do dispositivo relevante é 15, para que eu possa usar xinput --list-props 15 para listar todas as propriedades do touchpad. Eu poderia agora ir e alterar alguma propriedade, dizer a desaceleração constante (que neste caso tem ID 276) para o valor 1,5, usando xinput --set-prop 15 276 1.5 .

No entanto, xset mouse 5 5 também oferece uma boa velocidade para mim. Eu quero entender quais configurações exatas estão sendo configuradas com este comando, mas executar xinput --list-props 15 após xset mouse 5 5 não registra nenhuma diferença. Como posso obter essa informação?

    
por glS 05.03.2018 / 20:40

1 resposta

2

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 .

    
por 09.03.2018 / 19:59

Tags