Исходные данные. Некоторое время назад я столкнулся с тем, что программа gnome-screenshot (она же «Снимок экрана») сохраняет скриншоты при использовании горячих клавиш (PrtScr, Alt + PrtScr) с именем вида «Снимок экрана от 2022-02-02 10:11:59.png». Я же привык использовать имя вида «2022-02-02_101159.png». К тому же двоеточия в имени файла ставят в тупик Windows. Тогда я так и не смог найти, как настроить имя файла при снимке горячими клавишами и написал небольшой bash-скрипт, который обеспечивал мне нужный результат.

Во время поисков решения я натолкнулся на описание проблемы на сайте askubuntu.com. Среди ответов привлек мое внимание следующий: «истинный linux way — собери свой собственный gnome-screenshot из исходников!». В тот момент я подумал, что это слишком сложно. А на днях решил попробовать. Дальше я опишу порядок своих действий. В материале вряд ли будет что-то новое для опытных пользователей. Поэтому я считаю, что он может быть интересен:

1) тем, кто как и я хочет исправить проблему с форматом имени файла,
2) тем, кто пока ещё ничего из исходников не собирал.

Итак, переходим к созданию своей сборки gnome-screenshot.

UPD: Дальше я пошел к цели очень сложным путем. О чем мне указали в комментариях практически сразу после публикации. Как оказалось, я столько всего делал «не так», что проще описать правильную последовательность действий, чем вносить правки в уже написанное. Итак, в терминале:
1) скачиваем исходные коды:
apt-get source gnome-screenshot

2) поверяем наличие в системе всех пакетов, необходимых для сборки:
sudo apt-get build-dep gnome-screenshot

3) переходим в папку с исходными кодами:
cd gnome-screenshot-3.10.1/

4) редактируем файл, отвечающий за формат даты — подробности ниже, под спойлером:
gedit src/screenshot-filename-builder.c

5) создаем пакет:
dpkg-buildpackage -b

6) устанавливаем пакет:
sudo dpkg -i ../gnome-screenshot_3.10.1-0ubuntu1_i386.deb

а вот мой первоначальный запутанный путь с картинками
1) Скачиваем исходники с репозитория Git. Для примера я консервативно выбрал версию 3.10.1, которая и стояла у меня в Ubuntu 14.04 до сих пор. Думаю, любители новинок могут выбрать самую свежую версию (сейчас это 3.16.2).

2) Распаковываем архив. Открываем файл src/screenshot-filename-builder.c. Находим строку 135 и меняем формат даты в имени файла, т.е. строчку origin = g_date_time_format (d, "%Y-%m-%d %H:%M:%S") меняем на origin = g_date_time_format (d, "%Y-%m-%d_%H%M%S").



В этом же файле, строки 145 и 152, я удалил текст «Screenshot from» при создании переменной file_name. Обратите внимание, данный текст изменяется в зависимости от локализации системы. Поэтому если вы хотите отредактировать его, а не удалить полностью, см. файл po/ru.po. Закрываем и сохраняем файл.

3) Запускаем терминал, переходим в папку, куда распакованы исходники. Делаем файл autogen.sh исполняемым и запускаем его:


cd /home/user/Загрузки/gnome-screenshot-3.10.1
sudo chmod +x autogen.sh
./autogen.sh

После запуска файла система, скорее всего, сообщит о нехватке каких-нибудь пакетов. Устанавливаем пакет, запускаем ещё раз, узнаем, что не хватает чего-то ещё. И так несколько раз. У меня при сборке ничего не потребовалось, т.к. ранее я пробовал собрать 3.16.2 и поставил все пакеты, которые были нужны. Может быть для 3.10.1 что-то здесь избыточно, но на всякий случай коротко какие пакеты просила система и какими командами я их ставил:

>> You must have glib-gettext >= 2.2.0 installed
sudo apt-get install libglib2.0-dev

>> No package 'xext' found
>> No package 'x11' found
sudo apt-get install libxext-dev
sudo apt-get install libxdamage-dev

>> No package 'gtk+-3.0' found
>> No package 'libcanberra-gtk3' found
sudo apt-get install libgtk-3-dev
sudo apt-get install libcanberra-gtk3-dev

4) После этого система сообщила мне, что все хорошо, и я могу использовать make:



Выполняем данную команду. Сообщений об ошибках нет, значит все готово к установке:



5) Дальше, в соответствии вот с этим мануалом рекомендуют ни в коем случае не использовать sudo make install (где-то в сети, напротив, рекомендуют его), а собрать deb-пакет одним из возможных способов.

Я выбрал тот вариант, который использует программу checkinstall. Установка:


sudo apt-get install checkinstall

Далее выполняем:


sudo checkinstall -D --install=no

Что значат ключи:
-D — создание deb-пакета,
--install=no — без инсталляции.

Появляется приглашение заполнить описание создаваемого пакета. Я написал просто «gnome-screenshot-3.10.1-fixname». Описание может состоять из нескольких строк, поэтому для завершения дважды нажимаем Enter.

Появляется полное описание, которое можно отредактировать или перейти к следующему шагу:



Проверяем данные, нажимаем Enter. Получаем сообщение о том, что пакет сформирован, и мы можем установить его в систему с помощью команды:


sudo dpkg -i gnome-screenshot_3.10.1-1_i386.deb



6) Устанавливаем пакет.

Делаем скриншот с помощью горячих клавиш. Заходим в папку «Изображения» и смотрим на имя файла:


Задача решена!

P.S. Уже когда дописывал текст, наткнулся на статью, в которой подробно рассказано почему не стоит использовать make install.

Комментарии (15)


  1. Neuronix
    25.09.2015 09:03
    +4

    Зачем это на хабре?


    1. Abr_ya
      25.09.2015 20:21
      +2

      Вы правы! Почитал комментарии ниже и ужаснулся от того, насколько сложным путем пошел.
      Исправил свой пост.

      И все-таки, попробую ответить на ваш вопрос. Зачем?
      Когда-то я искал материал по теме, но не нашел.
      Наверное, плохо искал, но все же.
      Совета спросить не у кого. Пришлось выкручиваться самому, в основном при помощи мануалов в сети.
      Был удивлен тем, что все, оказывается, решается гораздо проще и элегантнее, чем в мануалах!
      Опять же, наверное, не те мануалы читал! Но все же!

      Считаю, мне повезло, что дали приглашение, и что опытные пользователи не просто погрозили пальцем «не шали, мол», но и привели верные шаги. Внес их в текст.

      Теперь если кто-то что-то захочет собрать, прочитав этот текст, будет собирать правильно.
      Если пытаясь что-то собрать, наткнется на этот текст и комментарии к нему — тоже будет делать правильно.

      В конце концов, все когда-то начинали и делали ошибки. Главное их исправлять, по-моему!


  1. Obramko
    25.09.2015 09:22
    +4

    > 1) Скачиваем исходники с репозитория Git.

    Дальше не читал. Правильно:

    apt-get source gnome-screenshot
    apt-get build-dep gnome-screenshot
    (поправить что там надо)
    dpkg-buildpackage -b
    dpkg -i blah-blah-blah.deb


    1. JIghtuse
      25.09.2015 09:59

      Пришёл написать этот комментарий.

      Можно ещё добавить, что без флага '-b' dpkg-buildpackage заставит создать файл-патч. Что удобно — патч можно сохранить и применять на более свежие версии пакета. Возможно, это можно как-то автоматизировать, это я уже не в курсе. Ещё можно копать в сторону dgit — вероятно, там ещё проще это сделать. Полная последовательность:

      $ apt-get source gnome-screenshot
      $ sudo apt-get build-dep gnome-screenshot
      $ cd gnome-screenshot-3.18.0/
      $ vim src/screenshot-filename-builder.c
      $ dpkg-buildpackage
      $ dpkg-source  --commit
      $ ls debian/patches/
      change_screenshot_filename_template.patch  series
      $ dpkg-buildpackage
      $ sudo dpkg -i ../gnome-screenshot_3.18.0-1_amd64.deb
      


      К слову, формат времени в апстриме уже без двоеточий (gnome-screenshot-3.18.0):
            origin = g_date_time_format (d, "%Y-%m-%d %H-%M-%S");


      1. Abr_ya
        25.09.2015 20:34
        +1

        Спасибо!
        На основе вашего и предидущего комментариев отредактировал пост.
        Свой кривой вариант убрал под спойлер, чтобы можно было посмотреть как можно, но не нужно!)

        С патчем у меня как-то не пошло пока. Но буду смотреть ещё, за эту идею отдельное спасибо!

        Формат даты исправили, но, наверное, осталось вот это «Снимок экрана от ...», нужное далеко не всем! Хотелось бы более гибких настроек, конечно!

        Если не рассматривать вариант «собрать из исходников», то достаточно гибко, на мой взгляд, дает управлять именем файла при использовании программы запуск вот таким скриптом:

        date=`date '+%Y-%m-%d_%H%M%S'`
        gnome-screenshot -w --delay=0 --file="Изображения/<text>$date<text>.jpg"

        И повесить его запуск на нужное сочетание клавиш.

        Или это тоже излишне сложный путь?


    1. Abr_ya
      25.09.2015 20:22

      Спасибо!
      На основе вашего и следующего комментариев отредактировал пост.
      Свой кривой вариант убрал под спойлер, чтобы можно было посмотреть как можно, но не нужно!)


  1. develop7
    25.09.2015 09:29

    А потом из репозиториев прилетает минорный апдейт пакета, ваши патчи отваливаются и вы снова пересобираете пакет. Это не говоря о том, что даже апстрим обновляет gnome-terminal пару раз между релизами.

    Автоматизировать пересборку пакетов с кастомными патчами можно средствами Launchpad, вот пример — https://code.launchpad.net/~develop7/+recipe/xkeyboard-config-rube-daily. Подробное руководство не пишу, разберётесь сами. По понятным причинам этот рецепт Ubuntu-only.


  1. fareloz
    25.09.2015 10:20
    +1

    Как пысали выше, при любом патче Ваши изменения отваляться. Поэтому логичнее прикрутить настройки этого дела к проге и отправить запрос на изменение автору. Да и писать статью о том, как изменил одну строчку в чужой программе — не кошерно.


    1. Abr_ya
      25.09.2015 20:58

      Спасибо за совет! «Прикрутить настройки» хотелось, но не получилось. Дошел до того, что лежат они в Dconf. Оценил собственные силы и понял, что создать ещё одну переменную там, да ещё и правильно ввести её в программу — это для меня сейчас задача неподъёмная!
      Как отправить запрос на исправление автору, увы, я тоже не знаю.

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

      И ещё о том, как это «настроенное под себя» собрать. Когда писал, поглядывая в мануалы на серьезном, как мне казалось, сайте, не подозревал, что все делается гораздо проще!

      Когда прочитал первые комментарии, стало понятно, как надо было. Исправил написанное. Думаю, в таком виде может кому-нибудь пригодиться, и вроде не должно никому навредить.


  1. DSL88
    25.09.2015 11:45
    -2

    Вот за это я не очень люблю линукс, простите


    1. Borz
      25.09.2015 11:52
      +1

      тут вина не Linux, а ТС — вместо того чтобы, как озвучили выше, добавить настройки у программы и поделиться с миром через Pull Request, он костылит локальный велосипед


    1. tmnhy
      25.09.2015 12:15
      +3

      За что «это» конкретно?
      За то, что:
      — с минимальными познаниями в программировании можно решить такую, пусть и не сложную, но все-таки задачу по изменению/добавлению функциональности;
      — или за то, что изменить функциональность можно разными способами — собрать приложение с изменениями вручную, написать патч, чтобы немного упростить процесс, сделать свой репозиторий с новым приложением и т.п.;
      — или за то, что можно связаться с разработчиками и предложить свое решение для включения в основную ветку программы?

      А можете поделиться решением в случае проприетарного продукта или не «линукс» системы?


      1. DSL88
        25.09.2015 13:45

        На самом деле соглашусь, это плюсы.
        Я начинал пользоваться линуксом когда терминал был еще неотъемлемой частью работы с ним (ну, постоянно приходилось в него лезть). Я постоянно использую дебиан на серверах и меня устраивает что большая часть работает «из коробки», но вот когда ради пустячковой ситуации приходится лезть в исходники, поскольку нет ни конфига, ни чего-то еще — это раздражает. Хотя, конечно, это все можно реализовать самостоятельно: не спорю — это плюс…


        1. tmnhy
          25.09.2015 13:53
          +3

          но вот когда ради пустячковой ситуации приходится лезть в исходники, поскольку нет ни конфига, ни чего-то еще — это раздражает.


          Так это не проблема экосистемы, это проблема конкретного софта, подобного достаточно на любой платформе.


  1. tmnhy
    25.09.2015 13:52

    del