Как я могу увидеть точные свойства, которые устанавливаются с помощью XSet?

Быстрый ответ - это ввод в файл команд, например, chres , а затем, в ответ на приглашение, команда командной консоли выполнить команды следующим образом:

$ sh chres

Если требуется выполнить команду из любого каталога, поместите команду в свой личный каталог bin ( $ HOME/bin ) и сделайте ее исполняемой ( ~ расширяется до полного пути к вашему каталогу HOME:

$ mkdir -p ~/bin
$ mv chres ~/bin
$ chmod +x ~/bin/chres

Убедитесь, что $ HOME/bin находится в ПУТИ. Обычно это выполняется в ~ .profile или ~ .bashrc . Каталог ~/bin может быть добавлен в PATH автоматически, если каталог существует. Можно полностью выйти из системы и снова войти в систему, чтобы узнать, требуется ли изменить .profile . Для получения информации введите echo «$ PATH» .

-121--243074-

Выглядит как неверный аргумент. Попробуйте

taskset -c 30 -p 

-121--132928-

Синтаксис globbing можно поместить непосредственно в цикл for. Вам не нужно найти вообще. И если вы используете глоббинг непосредственно в цикле for, вам не придется беспокоиться о разделении слов, так как оболочка заботится об этом автоматически.

Рекомендуется также цитировать переменные оболочки, когда они появляются в командах, иначе они будут подвергнуты разделению слов после подстановки.

Наконец, предпочтительнее printf вместо echo , так как он будет вести себя более корректно, если имя файла содержит определенные символы и является более переносимым в различных реализациях.

for PNG in *.png; do

  pngquant --ext .png --force 256 "$PNG"
  printf "Optimized PNG: %s\n" "$PNG"

done

В zsh и bash с соответствующим набором опций можно выполнять рекурсивные глобусы так:

for PNG in **/*.png; do

  pngquant --ext .png --force 256 "$PNG"
  printf "Optimized PNG: %s\n" "$PNG"

done

Это приведет к тому, что поиск опустится в подкаталоги, как это делает команда find . Однако это не стандарт POSIX, поэтому, если вам нужно что-то, чтобы работать портально во всех POSIX-подобных системах, вы должны использовать один из других ответов.

6
05.03.2018, 21:40
1 ответ

Неполный ответ, но я выяснил некоторые детали, просмотрев исходный код.

Я просмотрел исходный код xsetв файле xset.c, который входит в состав пакета x11-xserver-utils. Код в файле, загруженном в мою систему (Ubuntu 16.04 )автором apt-get source x11-xserver-utils, более или менее совпадает с кодом, найденным здесь , поэтому я буду использовать код на этой странице в качестве ссылки..

Что происходит, когда указана опция mouse, можно увидеть в L475 -502 (EDIT :в обновленной ссылке 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и thresholdдолжны быть в диапазоне от 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, содержащему файл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.

Мне не удалось выяснить, почему вывод xinput list-propsне обновляется после изменения свойств с помощью xset.

2
27.01.2020, 20:30

Теги

Похожие вопросы