Initial commit
This commit is contained in:
commit
12b97ed02a
7
.gitignore
vendored
Normal file
7
.gitignore
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
# Ignore the HTML page exported from the org file
|
||||
/chat_shortcut.html
|
||||
|
||||
# Ignore the unit files tangled from the org file
|
||||
/signal.service
|
||||
/element.service
|
||||
/element_fsu.service
|
174
chat_shortcut.org
Normal file
174
chat_shortcut.org
Normal file
@ -0,0 +1,174 @@
|
||||
#+TITLE: XFCE4 Application Shortcut for Starting my Chat Clients
|
||||
#+AUTHOR: Philipp Matthias Schäfer
|
||||
|
||||
#+HTML_DOCTYPE: html5
|
||||
#+OPTIONS: toc:nil
|
||||
|
||||
I am using three chat clients on my personal laptop:
|
||||
[[https://signal.org/][Signal]] and two instances of [[https://element.io/][Element]],
|
||||
one with my personal account and one with my work account.
|
||||
Because I like to work on my computer without distractions,
|
||||
I do not have the clients running most of the time.
|
||||
To read new messages I start the clients and once I am done close them again.
|
||||
|
||||
In the past I started each client from the command line.
|
||||
Then I wrote a function in [[https://www.gnu.org/software/emacs/manual/elisp.html][Emacs Lisp]] that I called using an [[https://docs.xfce.org/xfce/xfce4-settings/keyboard#application_shortcuts][XFCE4 Application Shortcut]].
|
||||
The function created three buffers,
|
||||
if they did not exist already,
|
||||
and started a process for each of the chat clients.
|
||||
This always opened a new [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Frames.html][Emacs frame]] in addition to the clients and three buffers that I never used.
|
||||
The was not a satisfying solution.
|
||||
|
||||
My newest solution uses [[https://www.freedesktop.org/software/systemd/man/latest/systemd.html][systemd]] user service units that are started and stopped via XFCE4 Application Shortcuts.
|
||||
This has the advantage that no Emacs frame is opened,
|
||||
no buffers clutter my Emacs session,
|
||||
and I can close all three clients with a single shortcut.
|
||||
|
||||
What still irks me in the current setup are the long startup times of the Element clients.
|
||||
oBut turning of notification is not enough for me,
|
||||
There may be no vestiges of these processes left on my desktop when I want to focus.
|
||||
|
||||
* systemd Unit Files
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: systemd_unit_files
|
||||
:END:
|
||||
The three unit files are very similar.
|
||||
I give a full explanation for the first one and restrict the others to changes.
|
||||
|
||||
** Signal
|
||||
:PROPERTIES:
|
||||
:header-args: :padline no :tangle "signal.service"
|
||||
:CUSTOM_ID: signal
|
||||
:END:
|
||||
|
||||
The configuration file begins with the ~[Unit]~ block and a description.
|
||||
|
||||
#+BEGIN_SRC systemd
|
||||
[Unit]
|
||||
Description=Signal chat client
|
||||
#+END_SRC
|
||||
|
||||
In the ~[Service]~ block,
|
||||
I first give the command line to start the service.
|
||||
The argument is necessary,
|
||||
because without it Signal at some point stopped finding the credentials is stored during setup.
|
||||
|
||||
#+BEGIN_SRC systemd :padline yes
|
||||
[Service]
|
||||
ExecStart=/usr/bin/signal-desktop --password-store=gnome-libsecret
|
||||
#+END_SRC
|
||||
|
||||
Next I configure the ~LANGUAGE~ environment variable to be set to two languages,
|
||||
so that Signal’s spellchecker uses both dictionaries instead of just the one for the system language.
|
||||
|
||||
#+BEGIN_SRC systemd
|
||||
Environment="LANGUAGE=en_US:de_DE"
|
||||
#+END_SRC
|
||||
|
||||
I also want the process to be restarted on failure instead of not at all,
|
||||
as is the default,
|
||||
and store the standard output of the last session in a file,
|
||||
so I can debug any problems,
|
||||
when they arise.
|
||||
|
||||
#+BEGIN_SRC systemd
|
||||
Restart=on-failure
|
||||
StandardOutput=file:%h/.cache/logs/signal.log
|
||||
#+END_SRC
|
||||
|
||||
** Private Element
|
||||
:PROPERTIES:
|
||||
:header-args: :tangle "element.service"
|
||||
:CUSTOM_ID: element
|
||||
:END:
|
||||
|
||||
The structure of the unit file for Element with my private profile is very similar.
|
||||
It obviously has a different command line,
|
||||
as it starts a different program.
|
||||
It also does not need any Environment variables.
|
||||
And the filename for the standard output is different.
|
||||
|
||||
#+BEGIN_SRC systemd
|
||||
[Unit]
|
||||
Description=Element chat client (private)
|
||||
|
||||
[Service]
|
||||
ExecStart=/usr/bin/element-desktop
|
||||
Restart=on-failure
|
||||
StandardOutput=file:%h/.cache/logs/element.log
|
||||
#+END_SRC
|
||||
|
||||
** Work Element
|
||||
:PROPERTIES:
|
||||
:header-args: :tangle "element_fsu.service"
|
||||
:CUSTOM_ID: element_fsu
|
||||
:END:
|
||||
|
||||
For the work account Element,
|
||||
the command line has an additional argument to select the profile.
|
||||
The profile name ~fsu~ stands for [[https://www.uni-jena.de/][Friedrich Schiller University]],
|
||||
which is my employer and the provider of the [[https://matrix.org/][Matrix]] server on which the account resides.
|
||||
|
||||
Again, the file for the standard output is different.
|
||||
|
||||
#+BEGIN_SRC systemd
|
||||
[Unit]
|
||||
Description=Element chat client (fsu)
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/usr/bin/element-desktop --profile fsu
|
||||
Restart=on-failure
|
||||
StandardOutput=file:%h/.cache/logs/element_fsu.log
|
||||
#+END_SRC
|
||||
|
||||
* Setup
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: setup
|
||||
:END:
|
||||
|
||||
Running ~org-babel-tangle~ (~C-c C-v t~) on this file creates all three unit files in the same directory.
|
||||
|
||||
To let systemd now about the unit files,
|
||||
which are supposed to be only available to my user,
|
||||
I create symlinks to them in ~~/.config/systemd/user/~ (see man page [[https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html][systemd.unit]]) by running
|
||||
|
||||
#+BEGIN_SRC bash
|
||||
for unit in signal element element_fsu; do
|
||||
ln -s -t ~/.config/systemd/user $(realpath "${unit}.service");
|
||||
done
|
||||
#+END_SRC
|
||||
|
||||
Afterwards I trigger a reload of the systemd configuration
|
||||
|
||||
#+BEGIN_SRC bash
|
||||
systemctl daemon-reload
|
||||
#+END_SRC
|
||||
|
||||
I also make sure that the directory for the log files exist,
|
||||
otherwise systemd will not be able start the processes:
|
||||
|
||||
#+BEGIN_SRC bash
|
||||
mkdir -p ~/.cache/logs
|
||||
#+END_SRC
|
||||
|
||||
To put it on an XFCE4 Application Shortcut,
|
||||
I open the settings (~xfce4-settings~),
|
||||
choose “Keyboard”,
|
||||
then the “Application Shortcuts” tab,
|
||||
and click “Add” to add first one,
|
||||
then another.
|
||||
|
||||
In my case I configure ~Super+R~ to start the chat clients,
|
||||
running the command line
|
||||
|
||||
#+BEGIN_SRC bash
|
||||
systemctl --user start signal element element_fsu
|
||||
#+END_SRC
|
||||
|
||||
and ~Super+I~ (like ignore) to stop the chat clients,
|
||||
running the command line
|
||||
|
||||
#+BEGIN_SRC bash
|
||||
systemctl --user stop signal element element_fsu
|
||||
#+END_SRC
|
Loading…
x
Reference in New Issue
Block a user