LINUX.ORG.RU

Как сделать, чтобы приложение открывалось в fullscreen?

 


1

3

Через контекстное меню файла выбираю Open with other application, в поле Use a custome command ввожу /usr/bin/название-приложения — файл открывается и просматривается. Всё в норме.

Вопрос же возник такой: какую команду добавить к /usr/bin/название-приложения, чтобы открывать файл сразу на весь экран?

На англоязычных форумах встречала упоминание wmctrl и эмуляцию нажатия клавиш Ctrl+F, но конкретного объяснения так и не нашла. Везде вода на уровне диванных теоретиков.

Как решить задачу с fullscreen? Поделитесь знанием, кто умеет.


На англоязычных форумах встречала упоминание wmctrl и эмуляцию нажатия клавиш Ctrl+F

Это может работать только уже по факту открытого приложения. Старт приложения в развернутом виде - это другой механизм. Ест три варианта:

1. Приложение само умеет стартовать в fullscreen (речь идет именно о fullscreen, а не maximized?)

2. Оконные менеджеры некоторые могут.

3. Devilspie.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Всё верно. Нужен именно fullscreen, а не maximized. Некоторые файлы, связанные с приложением сразу открываются в fullscreen.

Joanna
() автор топика
Ответ на: комментарий от Joanna

Некоторые файлы, связанные с приложением сразу открываются в fullscreen.

Здесь непонятно. Что за приложение, что такое странное поведение?

Zubok ★★★★★
()
Ответ на: комментарий от Joanna

Пардон, я долго в танке воевал: а что, у Adobe есть отдельное приложение, которое позволяет игры запускать без браузера? (я не большой знаток продукции Adobe). Это под wine работает?

Zubok ★★★★★
()
Ответ на: комментарий от anonymous

Угу, спс, понятно. Я вообще не знал :)

Тогда план такой, Joanna: открываешь игру, которая не fullscreen, в терминале набираешь xprop, появится крестик, ткни в окно, где игра, вывод на pastebin.com Посмотрим, какой у окна class и пр.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от Zubok

Да. Можно открывать флэш-игры, скачанные с интернета, или открывать игры через адресную строку, указываю ссылку на игру. Есть возможность даже делать закладки. Wine не нужен.

Joanna
() автор топика
Ответ на: комментарий от Joanna

Готово — https://pastebin.com/cKPjvEiV

Ок. Значит, я глянул в xfwm4 и там вроде нет правил для окон. Может, какие-то твики есть дополнительные, но не вижу. Если кто-то сейчас подскажет, то будет круто. Я рассказываю (вслепую, без пробы), как сделать с devilspie.

Ставишь devilspie и создаешь простое правило в ~/.devilspie/flashplayer.ds:

(if (is (window_class) "flashplayer") (fullscreen))
Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от Joanna

А у adobe этого какие-то настройки есть? Может, там есть какая-то настройка (или параметр командной строки), чтобы стартовать полноэкранно по умолчанию и не надо тогда ставить third-party tools?

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Максимум, что есть в приложении — контекстное меню View > Full screen и хоткей Ctrl+F. Буду пробовать devilspie.

Joanna
() автор топика
Ответ на: комментарий от Zhbert

Зачем? Что мешает открыть его на весь экран через секунду после старта?

Ну про игру сказали уже потом. Если через секунду, то можно fullscreen сделать комбинацией в XFCE вручную. Зачем тогда автоматом-то? Но бывают приложения типа киосков там всяких, которые надо в fullscreen стартовать сразу. Заранее как бы и не ясно было, что надо автору. Может, автор не знает, какая комбинация окно fullscreen раскрывает в XFCE? Я, конечно, могу погуглить за него в LMGTFY. :)

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Назовём это не проблемой, а потребностью «автоматизации процесса» :) Это вроде как вызов со стороны приложения — запусти меня в fullscreen без хоткея, покажи свои знания, реши лёгкую на вид задачу.

Попробовала сделать так, как вы написали с devilspie — пока ничего не выходит.

Joanna
() автор топика
Ответ на: комментарий от Joanna

Для пробы запустила devilspie через терминал. Открываю игру — не происходит переход в fullscreen.

Давайте проверять, все ли правильно сделано.

Скопируйте вывод:

$ # обращаю внимание на точку.
$ ls ~/.devilspie

Если выдает flashplayer.ds, то скопировать вывод

$ cat ~/.devilspie/flashplayer.ds

Все ли правильно?

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Joanna

Должно работать. Вроде все правильно. Проверь еще раз у того окна с игрой, на которой тестируешь, тот же Window class? Перекрестием надо нажать в окно с игрой.

$ xprop | grep "WM_CLASS"

И еще вопрос. Как называется приложение (исполняемый файл) адобовского плеера, в котором запускаются игры?

devilspie уже в автозапуске.

Проверь, в процессах он висит?

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Вывод после

xprop | grep "WM_CLASS"
на запущенной игре:
WM_CLASS(STRING) = "flashplayer", "Flashplayer"

Исполняемый файл — flashplayer. Находится в /usr/bin.

Joanna
() автор топика
Ответ на: комментарий от Zubok

Вот что изменилось после смены класса flashplayer на Flashplayer: приложение пытается развернуться на весь экран, но сразу же возвращается в дефолтные установленные для игры размеры.

Joanna
() автор топика
Ответ на: комментарий от Joanna

Плохо. Это так себя погано, видимо, плеер с игрой ведет. То есть пока игра еще на стартовала (а окно уже открылось) он становится fullscreen, а после загрузки и старта игры он все к дефолту, установленному в игре возвращает. Значит, придется паузу выждать попробовать. М-да уж.

Попробуй тогда с паузой, хотя это хрень, но так себя flashplayer ведет. Если одной секунды не будет хватать, то сделай больше. Прямой команды sleep в devilspie вроде нет. Делаю синхронный вызов внешней.

(if (is (window_class) "Flashplayer") 
    (begin
        (spawn_sync "/bin/sleep 1")
        (fullscreen)))  

только когда правило изменишь, то перезапусти devilspie.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Вот это волшебство! Работает! Ваш опыт и знания помогли мне заставить приложение «слушаться» так, как его «просят».

Вот только devilspie почему-то не запускается сам после добавления в автозапуск.

Joanna
() автор топика
Ответ на: комментарий от Joanna

Ну тут уж я не знаю. А куда помещается devilspie? Ошибки нет в указании названия программы? Чтобы автозапуск сработал, надо перезагрузить сессию XFCE.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

devilspie — в /usr/bin/devilspie

Запускаю из под рута:

systemctl enable devilspie

А в ответ:

Failed to enable unit: File devilspir.service: No such file or directory

Простите, что не отстаю. Очень нужно знать: можно ли через flashplayer.ds скрыть строку меню и адресную строку в полноэкранном режиме.

Joanna
() автор топика
Ответ на: комментарий от Joanna

systemctl enable devilspie

Это не там. В XFCE должен быть в меню пункт автозапуска. Вот туда добавить.

Очень нужно знать: можно ли через flashplayer.ds скрыть строку меню и адресную строку в полноэкранном режиме.

Что за меню и адресная строка? А он в полноэкране сам не умеет скрывать их? А если нажать Ctrl-F, то скрывает или тоже показывает? Ctrl-F - это хоткей именно flashplayer?

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Код, который вы предложили,

(if (is (window_class) "Flashplayer") 
    (begin
        (spawn_sync "/bin/sleep 1")
        (fullscreen)))

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

С Ctrl+F — исчезают все элементы интерфейса, остаётся только игровое пространство. Можно ли этого добиться через devilspie?

Joanna
() автор топика
Ответ на: комментарий от Joanna

Все, я понял. Значит, решение не годится, так как только flashplayer знает, как убирать элементы интерфейса и он это делает по Ctrl+F. Просто сделать fullscreen недостаточно. Flashplayer оставляет элементы. Значит, решение не годится. Единственный вариант решения - пульнуть из devilspie в flashplayer комбинацию Ctrl+F . Сейчас подумаю, как лучше. Через xdotool очевидно.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

1. Ставишь xdotool

2. Новое правило. sleep можно поиграться. Я не знаю, сразу ли он Ctrl+F чувствует. Еще я тут принудительно после 1 сек. активирую именно то окно, которое сработало по правилу на тот случай, если за одну секунду другое окно перехватило фокус (тогда Ctrl+F достанется ему). Я проверил, поставив 3 сек. Появилось окно, я передал фокус другому окну, но потом возвратилось то, что надо и ему передалась комбинация. Пробуй.

(if (is (window_class) "Flashplayer") 
    (spawn_sync (str "/usr/bin/xdotool sleep 1 windowactivate "
		     (str (hex (window_xid))) " key Ctrl+F")))
Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от futurama

Открыла приложение и нашла ID открытого окна:

xdotool search --name 'Adobe Flash Player'
33554435

Подставила значение:

xdotool key --window 33554435 ctrl+f

Запускаю игру и отдаю команду в терминале

xdotool key --window 33554435 ctrl+f

Приложение переходит в fullscreen без элементов интерфейса.

Как такое поведение привязать к запуску каждого файла игры?

Joanna
() автор топика
Ответ на: комментарий от futurama

xdotool search --classname Flashplayer key 'ctrl+f'

Это, скорее всего, может не заработать, так как метод XSendEvent работает не всегда. В GTK3 вообще не работает. Они теперь фильтруют клинетские сообщения. Типа безопасность. В GTK2 еще работает. Можешь сам проверить на своих приложениях (я не знаю, какой тулкит использует flashplayer - 2 или 3.

Когда ты указываешь search --classname, то работает XSendEvent.

Zubok ★★★★★
()
Ответ на: комментарий от Joanna

Ха., заработало. Значит, еще на GTK2, наверное сидят. Сейчас правило перепишу.

Zubok ★★★★★
()
Ответ на: комментарий от Joanna

Замечу, что у меня это на некоторых приложениях не проходит. По той же вот причине, о которой я упомянул. Об этом упоминается также в документации xdotool. Но попробуйте.

(if (is (window_class) "Flashplayer") 
    (spawn_sync (str "/usr/bin/xdotool sleep 1 key --window "
		     (str (hex (window_xid))) " ctrl+f")))
SENDEVENT NOTES
       If you are trying to send key input to a specific window, and it does
       not appear to be working, then it's likely your application is ignoring
       the events xdotool is generating. This is fairly common.

       Sending keystrokes to a specific window uses a different API than
       simply typing to the active window. If you specify 'xdotool type
       --window 12345 hello' xdotool will generate key events and send them
       directly to window 12345.  However, X11 servers will set a special flag
       on all events generated in this way (see XEvent.xany.send_event in
       X11's manual). Many programs observe this flag and reject these events.

       It is important to note that for key and mouse events, we only use
       XSendEvent when a specific window is targeted. Otherwise, we use XTEST.

       Some programs can be configured to accept events even if they are
       generated by xdotool. Seek the documentation of your application for
       help.

Поэтому первое правило активирует окно и посылает активному окну комбинацию (используется XTEST, который всегда работает, но только для окна, имеющего фокус в данный момент), а второе правило - конкретному окну (используется XSendEvent, работает уже не всегда).

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Joanna

ой, там регистр может быть важен. Вместо F надо f, наверное. ctlr+f вместо Ctrl+F (хотя, наверное, к Ctrl это не относится).

Ну и без паузы можешь попробовать. Быть может. ctrl+f он поймает сразу как появится и назад не уменьшится в дефолтные размеры игры.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok
(if (is (window_class) "Flashplayer") 
    (spawn_sync (str "/usr/bin/xdotool sleep 1 key --window "
		     (str (hex (window_xid))) " ctrl+f")))

Работает великолепно! Сразу видно — вы настоящий знаток дела. Спасибо вам огромное за труд и уделённое время.

Благодаря вам узнала о возможностях неизвестных мне приложений и немного научилась их использовать.

Успехов вам во всех делах и начинаниях. Благодарю за помощь.

Joanna
() автор топика
Ответ на: комментарий от Joanna

1. Можно попробовать без паузы sleep. Может, сразу поймает.

2. Можно упростить строчку. str все преобразует:

(if (is (window_class) "Flashplayer") 
    (spawn_sync (str "/usr/bin/xdotool sleep 1 key --window "
		     (window_xid) " ctrl+f")))
Zubok ★★★★★
()
Ответ на: комментарий от Zubok

1. Без паузы sleep приложение ненадолго переходит в fullscreen, но возвращается к дефолтному размеру окна. Получается без паузы никак.
2. Упрощённая строчка тоже замечательно работает. Здорово.

Всегда можно остановиться на достигнутом, но приложение бросило мне новый вызов. Те немногочисленные игры, которые изначально запускаются в fullscreen, c предложенным вами кодом демонстрируют обратное поведение — уменьшаются в размере. Неплохо бы и их как-нибудь «победить».

Joanna
() автор топика
Ответ на: комментарий от Joanna

Те немногочисленные игры, которые изначально запускаются в fullscreen, c предложенным вами кодом демонстрируют обратное поведение — уменьшаются в размере. Неплохо бы и их как-нибудь «победить».

А я как-то не понимаю, как это правило может на это влиять. Оно только ctrl+f посылает. А если убить devilspie, запустить игру и нажать ctfl+f, то что? А если отдельно вызвать в терминале xdotool c ctfl+f, то тоже уменьшаются или все нормально?

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Хотя я понял, кажется. Когда игра запускается в полноэкране, то повторное нажатие Ctrl-F ее уменьшает. Работает как toggle. Так получается? То есть если нажать в изначально полноэкранной игре опять Ctrl-f, то она уменьшится?

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Нет. Повторное нажатие Сtrl+F в полноэкранном режиме ничего не делает. Выход из fullscreen в приложении сделан через Esc.

Joanna
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.