xsetを使用して設定された正確なプロパティをどのように表示できますか?

xsetを使用して設定された正確なプロパティをどのように表示できますか?

X入力デバイスを設定してテストする2つの主なユーティリティxinputxset

(私が知っている限り)2つの主な違いは、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見つかったのとほぼ同じです。ここそのため、そのページのコードを参照として使用します。

オプションが提供されると、何が起こるかをmouseL475-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_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

おすすめ記事