如何查看使用 xset 设置的确切属性?

如何查看使用 xset 设置的确切属性?

配置和测试 X 输入设备的两个主要实用程序是xinputxset

两者之间的主要区别(据我所知)是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 15xset 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。-1acc_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.hlibx11

上面至少告诉我们一些关于 的默认值和可接受的值xset

我没能弄清楚为什么xinput list-props属性更改后输出没有更新xset

相关内容