web-dev-qa-db-ja.com

xsetで設定された正確なプロパティを確認するにはどうすればよいですか?

X入力デバイスを構成およびテストする2つの主なユーティリティは、xinputxsetです。

2つの主な違い(私が理解していること)は、xinputにより、(おそらくデバイスに依存する)プロパティをより細かく制御できることです。一方、xsetを介して与えられる設定は、かなり良い出発点になる場合があります。

私がやりたいのは、xsetで指定された設定から開始し、そこからxinputを介して微調整を適用することです。

問題は、xsetを介して取得された構成がxinputによって登録されていないようであり、xsetのマニュアルページに、生成された設定の正確な詳細が示されていないことです。

たとえば、タッチパッドの速度を変更したいとします。 xinput --listから、関連するデバイスIDが15であることを知っているので、xinput --list-props 15を使用してすべてのタッチパッドプロパティを一覧表示できます。次に、xinput --set-prop 15 276 1.5を使用して、一定の減速度(この場合はID 276)の値を1.5に変更します。

ただし、xset mouse 5 5を使用すると、速度設定もかなり向上します。このコマンドで構成されている正確な構成を理解したいのですが、xinput --list-props 15の後にxset mouse 5 5を実行しても違いが登録されません。どうすればこの情報を入手できますか?

6
glS

完全な答えではありませんが、ソースコードを調べて詳細を理解しました。

xset.cパッケージに含まれるx11-xserver-utilsファイル内のxsetのソースコードを確認しました。私のシステム(Ubuntu 16.04)にapt-get source x11-xserver-utilsによってダウンロードされたファイルのコードは、見つかったコードとほぼ同じです here なので、そのページのコードを参照として使用します。

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を呼び出すだけです。特に、追加の引数が指定されていない場合(xset mouseと呼ばれるコマンド)、デフォルトはxset mouse -1/-1 -1です。また、acc_numthresholdは0〜9でなければなりません。そうでない場合は、デフォルト値-1が使用され、acc_denomのデフォルト値は1です。

関数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ファイル(ソースコード here )を含む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のデフォルト値と許容値について何かを教えてくれます。

ただし、xsetを使用してプロパティを変更した後、xinput list-propsの出力が更新されない理由を理解できませんでした。

2
glS