- Программа для создания desktop-файлов
- Немного о desktop-файлах
- Краткое описание
- Как работает
- How to Create a .Desktop File for Your Application in Linux
- Content
- How to Create Desktop Launchers
- How to Copy .Desktop Files
- How to Create .Desktop Files With a Third-Party Program
- Frequently Asked Questions
- Is it possible to use a .desktop file even if I am using a window manager?
- Is it possible to create a .desktop file for CLI and TUI applications using Arronax?
- Is it possible to hide a desktop shortcut from an Application Menu?
Программа для создания desktop-файлов
В дистрибутивах GNU/Linux значки приложений в меню описываются специальными текстовыми файлами. Эти файлы имеют расширение .desktop и при установке приложения создаются автоматически. Но иногда бывают ситуации когда нужно самому создать такой файл. Это может быть когда у вас на руках имеется только исполняемый файл приложения, то есть когда приложение не упаковано должным образом. В некоторых дистрибутивах из коробки имеются программы для создания значков запуска, а в некоторых их нет и нужно искать такие приложения в репозиториях. Я создал свой вариант такой программы и в этом посте расскажу, что она из себя представляет.
Немного о desktop-файлах
Вот пример desktop-файла для консольной игры nsnake:
[Desktop Entry] Version=1.1 Type=Application Name=nsnake GenericName=Classic snake game on the terminal NoDisplay=false//отображать в меню Icon=nsnake Exec=nsnake Terminal=true//запускать в терминале Actions= Categories=ActionGame;Game; Keywords=snake;ncurses;textual;terminal;
Тут и так все понятно, но я все-таки прокомментировал пару позиций. Самое главное, что нужно прописать это название приложения (Name), путь до исполняемого файла (Exec) и путь до иконки (Icon). Если иконки нет и нет желания ее искать или создавать, то некоторые окружения рабочего стола установят иконку по умолчанию.
Краткое описание
Исходники приложения находятся здесь. Программа довольно простая. Выглядит она вот так:
Нужно заполнить необходимые поля, отметить нужные чекбоксы и нажать кнопку CREATE. Программа запросит подтверждение и после согласия оповестит об успешном или неуспешном создании файла.
В хидербаре находится кнопка, при нажатии на которую в файловом менеджере откроется папка, находящаяся по пути /.local/share/applications. Именно там программа сохраняет созданные файлы.
Как работает
Приложение написано на языке Vala с помощью среды разработки GNOME Builder. Устанавливал самую свежую версию среды (40.0) из репозитория Flathub. Оказалось, что визуальный дизайнер в этой версии еще багованнее, чем в предыдущей, поэтому интерфейс делал в Glade.
После того как созданы значки в полях ввода и к ним, также как и к другим кнопкам, привязаны необходимые действия, записываем в переменную directory_path путь до папки с desktop-файлами. Также на всякий случай надо проверить наличие этой папки перед запуском приложения и если папка по каким-то причинам отсутствует, то вывести специальное сообщение и деактивировать кнопку CREATE, так как в этом случае в ней нет необходимости.
button_open.clicked.connect(on_open_directory); button_create.clicked.connect(on_create_file); directory_path = Environment.get_home_dir()+"/.local/share/applications"; GLib.File file = GLib.File.new_for_path(directory_path); if(!file.query_exists())/проверяем существует ли директория alert("Error!\nPath "+directory_path+" is not exists!\nThe program will not be able to perform its functions."); button_create.set_sensitive(false);//деактивация кнопки CREATE >
При нажатии на кнопку CREATE вызывается метод on_create_file:
private void on_create_file () < if(is_empty(entry_name.get_text()))/проверяем введено ли имя файла alert("Enter the name"); entry_name.grab_focus();//устанавливаем фокус return; >GLib.File file = GLib.File.new_for_path(directory_path+"/"+entry_name.get_text().strip()+".desktop"); if(file.query_exists())/проверяем есть ли файл с таким именем alert("A file with the same name already exists"); entry_name.grab_focus(); return; > var dialog_create_desktop_file = new Gtk.MessageDialog(this,Gtk.DialogFlags.MODAL,Gtk.MessageType.QUESTION, Gtk.ButtonsType.OK_CANCEL, "Create file "+file.get_basename()+" ?"); dialog_create_desktop_file.set_title("Question"); Gtk.ResponseType result = (Gtk.ResponseType)dialog_create_desktop_file.run (); dialog_create_desktop_file.destroy(); if(result==Gtk.ResponseType.OK) < create_desktop_file();//создаем файл >>
Он предназначен для проверки ввода имени файла и проверки возможных совпадений с именами уже существующих в папке файлов, а также для вывода запроса подтверждения на создание файла. Если все проверки пройдены и пользователь подтвердил создание файла, то вызывается метод create_desktop_file:
private void create_desktop_file()< string display; if(checkbutton_no_display.get_active())/проверяем первый чекбокс display="true"; >else < display="false"; >string terminal; if(checkbutton_terminal.get_active())/проверяем второй чекбокс terminal="true"; >else < terminal="false"; >string desktop_file="[Desktop Entry] Encoding=UTF-8 Type=Application NoDisplay="+display+" Terminal="+terminal+" Exec="+entry_exec.get_text().strip()+" Icon="+entry_icon.get_text().strip()+" Name="+entry_name.get_text().strip()+" Comment="+entry_comment.get_text().strip()+" Categories="+entry_categories.get_text().strip();//записываем содержимое будущего файла в переменную string path=directory_path+"/"+entry_name.get_text()+".desktop"; try < FileUtils.set_contents (path, desktop_file);//создаем файл >catch (Error e) < stderr.printf ("Error: %s\n", e.message); >GLib.File file = GLib.File.new_for_path(path); if(file.query_exists())/проверяем существование файла alert("File "+file.get_basename()+" is created!\nPath: "+path); >else < alert("Error! Could not create file"); >>
Чтобы просмотреть готовые файлы существует метод on_open_directory. Он срабатывает при нажатии на кнопку в хидербаре.
private void on_open_directory()< try< Gtk.show_uri_on_window(this, "file://"+directory_path, Gdk.CURRENT_TIME); >catch(Error e) < alert("Error!\n"+e.message); >>
Для выбора исполняемого файла используется следующий код:
private void on_open_exec() < var file_chooser = new Gtk.FileChooserDialog ("Choose a file", this, Gtk.FileChooserAction.OPEN, "_Cancel", Gtk.ResponseType.CANCEL, "_Open", Gtk.ResponseType.ACCEPT); if (file_chooser.run () == Gtk.ResponseType.ACCEPT) < entry_exec.set_text(file_chooser.get_filename()); >file_chooser.destroy (); >
А для выбора иконки код сложнее, так как данный диалог, помимо фильтра, содержит функционал предварительного просмотра изображения:
private void on_open_icon () < var file_chooser = new Gtk.FileChooserDialog ("Select image file", this, Gtk.FileChooserAction.OPEN, "_Cancel", Gtk.ResponseType.CANCEL, "_Open", Gtk.ResponseType.ACCEPT); Gtk.FileFilter filter = new Gtk.FileFilter (); file_chooser.set_filter (filter);//установка фильтра для изображений filter.add_mime_type ("image/jpeg"); filter.add_mime_type ("image/png"); Gtk.Image preview_area = new Gtk.Image (); file_chooser.set_preview_widget (preview_area);//установка области предпросмотра file_chooser.update_preview.connect (() => < string uri = file_chooser.get_preview_uri (); string path = file_chooser.get_preview_filename(); if (uri != null && uri.has_prefix ("file://") == true) < try < Gdk.Pixbuf pixbuf = new Gdk.Pixbuf.from_file_at_scale (path, 250, 250, true); preview_area.set_from_pixbuf (pixbuf);//установка изображения preview_area.show ();//показываем область предпросмотра >catch (Error e) < preview_area.hide ();//скрываем область предпросмотра >> else < preview_area.hide (); >>); if (file_chooser.run () == Gtk.ResponseType.ACCEPT) < entry_icon.set_text(file_chooser.get_filename()); >file_chooser.destroy (); >
Метод для вывода сообщений пользователю:
private void alert (string str)
Чтобы проверить введено ли какое-либо значение в текстовое поле используется такой метод:
private bool is_empty(string str)
На этом все! Надеюсь, что пост был для Вас полезен.
Дополнительная ссылка на SourceForge. До встречи в следующих постах!
How to Create a .Desktop File for Your Application in Linux
A .desktop file is simply a shortcut that is used to launch applications in Linux. Without the .desktop file, your application won’t show up in the Applications menu and can’t be launched with third-party launchers such as Ulauncher and Albert.
Most applications, when installed, will create the .desktop files automatically and place themselves in the “Application” menu for quick access. However, if you compile a program from source or download an app in archive format, this may not be the case, and you may have to open the terminal to execute the binary every time you want to use it. Obviously, this can become a very tedious and troublesome step. This tutorial shows how you can create a .desktop file for any application you use that can be launched from the “Application” menu.
Content
How to Create Desktop Launchers
A .desktop file is a simple text file that holds information about a program. It is usually placed in “~/.local/share/applications” or “/usr/share/applications/,” depending on whether you want the launcher to be accessible for your local account onlly or for everyone. If you navigate to either directory in your File Manager, you will see quite a few .desktop files that correspond with the installed apps on your computer.
For demonstration purposes, we are creating a .desktop file for Super Tux Kart, a kart racing game we like to play sometimes. A version is available in the Ubuntu repos, but this is often behind the latest stable version.
The only way to get the latest and greatest release is by downloading a tar archive, extracting it and executing a file which will launch the game.
You can follow along with whichever program you want to create a launcher for, and it should work the same way.
Note: the following steps assume you have the archive for the program you want to create a launcher for in your “Downloads” folder.
- Once the extraction is complete, change to the newly created folder and find the executable.
- Right-click it and select “Run as a Program” to launch the program just to ensure it is working.
- In some cases, you won’t see the “Run” option in the menu, often because the executable is a .text file. You can get around this by executing it via the terminal.
- If you’ve confirmed that the application works when you launch it, you can exit it.
- Launch your text editor and paste the following into the empty text file:
[Desktop Entry] Encoding=UTF-8 Version=1.0 Type=Application Terminal=false Exec=/path/to/executable Name=Name of Application Icon=/path/to/icon
Note: You’ll need to change the “Exec” field to the path to the executable and “Name” field to the name of the application. Most programs provide an icon somewhere in the archive, so don’t forget to include that as well. In our case, the launcher file for Super Tux Kart looks like the following image.
- Save the file in the “~/.local/share/applications” folder as “application-name.desktop”. The “.local” folder is a hidden folder in your “Home” directory and “Show Hidden Files” mode will have to be enabled for you to view it. If you want it to be globally accessible, run the following command in the terminal:
sudo mv ~/.local/share/applications/application-name.desktop> /usr/share/applications/
Note: don’t forget to change to the actual name of the .desktop file.
The method described here should work on all mainstream Linux-based operating systems. Here’s another screenshot showing Super Tux Kart in Xubuntu’s application launcher (XFCE).
How to Copy .Desktop Files
As discussed above, you can obtain a .desktop file from a program that you have installed through a repository. This is helpful if you want to create a custom .desktop file as a way of fixing a broken package in Ubuntu.
For the most part, each Linux distribution is largely similar in its structure, so while this section will heavily focus on Ubuntu 22.04, you can still use these instructions in your favorite desktop environment.
- To start, open a File Manager from your desktop. In this case, we are opening Nautilus, as it is the default for Ubuntu.
- Press the “Other Locations” entry in Nautilus’s left side bar.
- Go to “/usr/share/applications.” This directory contains the .desktop files that your desktop manager uses to create its Application Menu.
- Copy the application you want to create a shortcut to. For instance, right-click on “firefox-esr.desktop” and select “Copy.”
- Right-click on your .desktop file and select “Allow Launching.” Doing this will set the permission bits so that your desktop environment can use this file to launch your program.
How to Create .Desktop Files With a Third-Party Program
Aside from editing and copying .desktop files, it is also possible to create shortcuts in Linux through a Graphical User Interface (GUI) program. This is useful if you are not comfortable with editing configuration files.
Unlike the previous methods, this will require you to install a program like Arronax, which may not be present in your distribution’s repository. Despite that, it is still possible to use it by obtaining a copy from the developer’s website. To install the GUI in Ubuntu, follow the below instructions.
sudo add-apt-repository ppa:diesche/stable
- On the other hand, if you are installing it through a tarball, you need to unpack the archive using tar:
tar xvzf /home/$USER/Downloads/arronax-0.8.1.tar.gz
- Run Arronax by either running the command below or typing “arronax” while in the Application Menu. This will bring up a window where you can create and save .desktop files.
- To create your first shortcut using Arronax, click the “New” icon in Arronax’s Menu Bar to create a template that you can use for your shortcut.
- Provide the shortcut’s name and a file path to your program. For example, we are creating a .desktop file for Firefox by typing “Firefox” in the “Title” field and /bin/firefox-esr in the “Command” field.
- Right-click this .desktop file and select “Allow Launching” to set the permission bits for it, as shown above.
Frequently Asked Questions
Is it possible to use a .desktop file even if I am using a window manager?
No, a .desktop file will not work on most window managers, as it lacks the necessary support for the “XDG Menu” specification. While it is possible to create a .desktop file in a window manager, it will not show up as a desktop shortcut. One way to recreate this mechanism is by using shell scripts alongside the Simple X Hotkey Daemon.
Is it possible to create a .desktop file for CLI and TUI applications using Arronax?
Yes! You can easily create a .desktop file for a program that runs in the terminal, which is useful if you are already using TUI programs and want to have a quick way to access them.
To do this using Arronax, create a new .desktop shortcut by providing both a “Title” and a “Command,” then toggle the “Run in Terminal” option and save the new shortcut.
Is it possible to hide a desktop shortcut from an Application Menu?
Yes! It is possible to modify a .desktop file to not show on your Applications Menu by adding a single line of code in the file that you want to edit. For example, if you want to hide Firefox from your Applications Menu, open the “firefox-esr.desktop” file in “/usr/share/applications”. From there, add Hidden=true at the end of the file, then restart your computer to apply the changes.
Image credit: Charles-Adrien Fournier via Unsplash All screenshots by Ramces Red.
Ramces is a technology writer that lived with computers all his life. A prolific reader and a student of Anthropology, he is an eccentric character that writes articles about Linux and anything *nix.
Our latest tutorials delivered straight to your inbox