Здравствуйте!
Есть возможность из командной строки какой-нибудь утилитой
назначить имя окну по его id?
Оно запускается из программы на Qt, но никакого отношения к Qt
не имеет и имени не имеет. Оно создаётся вызовом неких функций
из сторонней библиотеки.
Потом ещё надо будет лишить его заголовка и рамки, но в Astra Linux,
если у окна есть имя, это можно сделать настройкой в системе,
так что мне надо как-то присвоить ему имя.
Пётр.
set window name
Peter, окна ЧЕГО? Мы тут должны гадать про иксы или про ELF?
Я не понял, при чём тут ELF. Это окно с программой в X-ах,
а что ещё я мог иметь в виду, говоря о Qt?
Пётр.
Peter, например, конкретный WM
Не знаю, какой в Astra 1.4 WM, как-то нигде не нашёл. DM - это fly-dm,
запущено два его экземпляра. Возможно, по совместительству
он же и WM. fly-wm тоже существует, но он не запущен.
Но я надеялся, что существуют независимые утилиты для
работы с окнами. Если нет, то, м.б., есть какие-нибудь
библиотечные функции?
Пётр.
Peter, я выражаю Вам искреннее восхищение! Столько лет долбаться с различными OS Linux, задать столько вопросов и получить столько ответов... Я просто завидую!
Да вот бывает, что ответов я как раз не получаю.
Пока что я выяснил, что мне нужно другое: мне надо дать имя процессу,
создающемуся в моей программе. Он создаётся исключительно вызовом
функций из сторонней библиотеки и имени не имеет, т.е. я его не вижу
в выводе ps. Мне бы надо, чтобы он имел имя, как моя программа имеет
имя name.elf, какое указано в name.pro. И он не является дочерним
по отношению к моей программе, во всяком случае, при последнем
запуске он не был для неё дочерним.
Т.е. можно ли назначить имя процессу по его id?
Пётр.
Peter, процесс чего и в какой среде?
В графической среде. Я в своей программе вызываю функции из некоей библиотеки,
а они создают окно. У этого окна есть id, его можно получить из вывода xwininfo,
а вот есть ли у процесса с этим окном id в выводе ps, я ещё не понял. Однако этот
процесс работает со своей платой, у платы есть драйвер, устройство в /dev и ещё
какой-то процесс от драйвера постоянно есть в системе, его показывает ps.
Мне желательно назначить этому окну или связанному с ним процессу имя,
тогда средствами Astra можно будет избавиться от заголовка.
Пётр.
Оказалось, что системного id у этого окна нет, только id окна, но это устраивает.
Однако не удаётся изменить состояние окна с помощью функций Xlib, ни созданного,
ни окна главной программы. Например, с помощью XStoreName изменяю имя окна,
потом XFetchName возвращает мне новое имя, т.е. якобы выполнилось, но и на экране
и в выводе xwininfo имя остаётся старое. Так же и другие функции не отрабатываются,
например, перемещение. В чём тут причина и что делать?
Это в Astra Linux, там есть особенности в работе с окнами.
Пётр.
Peter, обратитесь к разработчикам! Ну неужто Вы верите в то, что тут все пользуются Астрой и её специфическими особенностями?
Завтра попробую, но сегодня я не знаю, действительно ли это связано с Astra.
А здесь кто-нибудь мог пользоваться этими функциями и сказать, работают ли они,
как ожидается и нет ли здесь каких-нибудь тонкостей. Ведь в мире есть много
загадочного и непонятного.
Пётр.
в мире есть много загадочного и непонятного
Например отношение теории струн в квантовой механике к тёмной материи. Только мало у кого есть на это неоплаченного времени.
Сильно подозреваю, что менеджер окон подобными вопросами интересуется только один раз при создании окна. Так что имя нужно менять заранее.
С окном связаны структуры с его свойствами, свойства можно изменять,
например, размер и положение окна. Во всяком случае, в описании функций
XStoreName и XSetWMName не говорится, что нельзя изменять имя уже
существующего окна, но вполне возможно, что в некоторых системах
имя окна можно назначать только один раз. В Astra я замечал, что
свойства окна, назначенные через настройки системы, например,
связанные с заголовком, имеют приоритет над флагами Qt.
Пётр.
Peter, скажите нам честно: Вам этот геморрой нужен с какой конкретной целью?
Peter, скажите нам честно: Вам этот геморрой нужен с какой конкретной целью?
цель понятная: обработать нестандартно. Только средства скорее всего негодные.
Если по уму - нужен киоск? Это отдельная задача, и решается несколько нетривиально. Я эту задачу решал, и без wm или de
Добавлено: 2017-05-05 12:46:39
С окном связаны структуры с его свойствами, свойства можно изменять,
например, размер и положение окна. Во всяком случае, в описании функций
XStoreName и XSetWMName не говорится, что нельзя изменять имя уже
существующего окна, но вполне возможно, что в некоторых системах
имя окна можно назначать только один раз. В Astra я замечал, что
свойства окна, назначенные через настройки системы, например,
связанные с заголовком, имеют приоритет над флагами Qt.
Пётр.
Да, пожалуйста, меняйте сколько хотите. Только window manager, для которого это всё и придумано, на это скорее всего болт положит.
Добавлено: 2017-05-05 12:49:14
С окном связаны структуры с его свойствами, свойства можно изменять,
например, размер и положение окна. Во всяком случае, в описании функций
XStoreName и XSetWMName не говорится, что нельзя изменять имя уже
существующего окна, но вполне возможно, что в некоторых системах
имя окна можно назначать только один раз. В Astra я замечал, что
свойства окна, назначенные через настройки системы, например,
связанные с заголовком, имеют приоритет над флагами Qt.
Пётр.
Да, пожалуйста, меняйте сколько хотите. Только window manager, для которого это всё и придумано, на это скорее всего болт положит. И вообще с ним спорить - себе дороже.
цель понятная: обработать нестандартно
Как раз и непонятна! Какой в этом практический смысл?
Вообще мне надо у окна, которое создаётся из главной программы, но не является
для него дочерним, убрать заголовок и рамку, а также, возможно, иметь возможность
его перемещать, а чтобы сделать это средствами Astra, надо дать ему имя.
Тут мой колега нашёл пример, в котором перемещение и переименование
делается с помощью xcb. У него в Ubuntu, запущенной в Windows в виртуальной
машине, это работает, но в Astra и в реальной Ubuntu работает перемещение и
изменение размера, но переименование не работает.
Пётр.
В конце концов кое-как нам удалось решить этот вопрос, но очень кривым способом.
Сначала оказалось, что ни функции Xlib, ни функции xcb не убирают рамку окна, хотя
такой параметр есть. Но окно не реагирует на его установку, ни в 0, ни в другое значение.
Потом имя окну удалось назначить только с помощью функции xcb, хотя такие функции
есть и в Xlib и не одна. Т.е. не удалось убрать рамку и заголовок.
Ещё был вариант в Qt, его пробовал мой коллега. Там есть функция создания Window по
id: fromWinId(id), а также создания виджета-контейнера: createWindowContainer(Window *,
QWidget * parent=0, flags). Если её вызвать с (Window *w,this,Qt::CustomizeWindowHint)
для Window, созданному по id того окна и заранее установить в Astra Linux для его имени
в ~/.fly/apprc свойства, что оно без рамки и без заголовка, то это отрабатывается.
Если последнего не делать, то флаг игнорируется, т.е. он не нужен.
Причём этот способ не работает с окном, созданным в тестовой программе для проверки
createWindowContainer() в том отношении, что ней не удаётся изменить её собственное имя.
Т.е. надо с помощью xcb назначить имя окну, затем создать окно по его id, создать виджет
как контейнер для этого окна, вызвать для него функцию Qt setGeomtery() и установить
для этого имени свойства с помощью Astra. setGeometry() вызывать обязательно, чтобы
виджет перерисовался и WM заново назначил ему всякие свойства. Кроме того, оказалось,
что функции Xlib могут возвратить пустую структуру XWindowChanges, хотя, судя по
описанию, должны возвращать заполненную.
Это не то, чего я хотел, но иначе, только функциями Xlib или xcb, не получилось.
Пётр.