Typing glyphs on Linux: Difference between revisions

Jump to navigation Jump to search
m
Text replacement - "<source" to "<syntaxhighlight"
m (Fixed mistyped 0)
m (Text replacement - "<source" to "<syntaxhighlight")
Line 1: Line 1:
:''This article is specific for Linux. For Hardware and other platforms, see [[Typing glyphs]].''
:''This article is specific for Linux. For Hardware and other platforms, see [[Typing glyphs]].''


Since mid-2012, most Linux distributions with [[wikipedia:X_Window_System|X11]] and [[wikipedia:Wayland_(display_server_protocol)|Wayland]] have [[Dyalog APL]] keyboard support included with the distribution,<ref>[[Dyalog]] [[Forums]]. [https://forums.dyalog.com/viewtopic.php?f=20&t=210 Keyboard setup on Linux]. Sep 21, 2010.</ref> using <source lang=console inline>xkb</source>, the [https://www.x.org/wiki/XKB/ X Keyboard Extension].<ref name="Dyalog APL XKB">[[Geoff Streeter]]. [https://www.dyalog.com/uploads/conference/dyalog10/presentations/P19_Streeter_Keyboards.pdf Supporting APL keyboards on Linux]. [[Dyalog '10]].</ref>
Since mid-2012, most Linux distributions with [[wikipedia:X_Window_System|X11]] and [[wikipedia:Wayland_(display_server_protocol)|Wayland]] have [[Dyalog APL]] keyboard support included with the distribution,<ref>[[Dyalog]] [[Forums]]. [https://forums.dyalog.com/viewtopic.php?f=20&t=210 Keyboard setup on Linux]. Sep 21, 2010.</ref> using <syntaxhighlight lang=console inline>xkb</source>, the [https://www.x.org/wiki/XKB/ X Keyboard Extension].<ref name="Dyalog APL XKB">[[Geoff Streeter]]. [https://www.dyalog.com/uploads/conference/dyalog10/presentations/P19_Streeter_Keyboards.pdf Supporting APL keyboards on Linux]. [[Dyalog '10]].</ref>


== setxkbmap ==
== setxkbmap ==


The simplest way to set up an APL keyboard on Linux is with the following <source lang=console inline>setxkbmap</source> command. Enter the following in your terminal emulator of choice:
The simplest way to set up an APL keyboard on Linux is with the following <syntaxhighlight lang=console inline>setxkbmap</source> command. Enter the following in your terminal emulator of choice:


<source lang=console>
<syntaxhighlight lang=console>
setxkbmap -layout us,apl -variant ,dyalog -option grp:switch
setxkbmap -layout us,apl -variant ,dyalog -option grp:switch
</source>
</source>
Line 13: Line 13:
An explanation:
An explanation:


* <source lang=console inline>-layout us,apl</source> assigns <source lang=console inline>us</source> ([[wikipedia:American_English|U.S. English]]) to be the primary layout, whereas <source lang=console inline>apl</source> is secondary
* <syntaxhighlight lang=console inline>-layout us,apl</source> assigns <syntaxhighlight lang=console inline>us</source> ([[wikipedia:American_English|U.S. English]]) to be the primary layout, whereas <syntaxhighlight lang=console inline>apl</source> is secondary


* <source lang=console inline>-option grp:switch</source> assigns <kbd>Right Alt</kbd> to switch to the secondary <source lang=console inline>apl</source> layout when it is pressed, otherwise <source lang=console inline>us</source> is used
* <syntaxhighlight lang=console inline>-option grp:switch</source> assigns <kbd>Right Alt</kbd> to switch to the secondary <syntaxhighlight lang=console inline>apl</source> layout when it is pressed, otherwise <syntaxhighlight lang=console inline>us</source> is used


* <source lang=console inline>-variant ,dyalog</source> assigns the [[Dyalog APL]] variant to the <source lang=console inline>apl</source> layout which contains modifiations unique to the Dyalog language ('''Note the preceding comma''')
* <syntaxhighlight lang=console inline>-variant ,dyalog</source> assigns the [[Dyalog APL]] variant to the <syntaxhighlight lang=console inline>apl</source> layout which contains modifiations unique to the Dyalog language ('''Note the preceding comma''')


A full list of keys that can be used to switch layouts is included in <source lang=console inline>/usr/share/X11/xkb/rules/evdev.lst</source> under the <source lang=console inline>option</source> category.
A full list of keys that can be used to switch layouts is included in <syntaxhighlight lang=console inline>/usr/share/X11/xkb/rules/evdev.lst</source> under the <syntaxhighlight lang=console inline>option</source> category.


Note:
Note:
Line 25: Line 25:
* These changes are not permanent; the user will have to select one of a myriad of methods to run the command on startup. Alternatively, if they use one of the [[wikipedia:Desktop_environment|desktop environments]] listed below, they can follow those instructions.
* These changes are not permanent; the user will have to select one of a myriad of methods to run the command on startup. Alternatively, if they use one of the [[wikipedia:Desktop_environment|desktop environments]] listed below, they can follow those instructions.


* If you want to specify a different language, say for United Kingdom, specify <source lang=console inline>gb</source> instead of <source lang=console inline>us</source> (not <source lang=console inline>uk</source>)
* If you want to specify a different language, say for United Kingdom, specify <syntaxhighlight lang=console inline>gb</source> instead of <syntaxhighlight lang=console inline>us</source> (not <syntaxhighlight lang=console inline>uk</source>)


* If you want to specify a different layout, dvorak, bepo, etc, change the variant flag to <source lang=console inline>dvorak,dyalog</source>.
* If you want to specify a different layout, dvorak, bepo, etc, change the variant flag to <syntaxhighlight lang=console inline>dvorak,dyalog</source>.


== libinput ==
== libinput ==


X11 and Wayland use XKB rules to determine their layout. To set a layout create a file called <source lang=console inline>00-keyboard.conf</source> at <source lang=console inline>/etc/X11/xorg.conf.d</source> or <source lang=console inline>/usr/etc/X11/corg.conf.d</source>, ensuring you have permissions, and edit it to:
X11 and Wayland use XKB rules to determine their layout. To set a layout create a file called <syntaxhighlight lang=console inline>00-keyboard.conf</source> at <syntaxhighlight lang=console inline>/etc/X11/xorg.conf.d</source> or <syntaxhighlight lang=console inline>/usr/etc/X11/corg.conf.d</source>, ensuring you have permissions, and edit it to:


<source lang=console>
<syntaxhighlight lang=console>
Section "InputClass"
Section "InputClass"
         Identifier "system-keyboard"
         Identifier "system-keyboard"
Line 45: Line 45:
The options "us,apl", ",dyalog", and "grp:switch" are the same as in [[#setxkbmap|setxkbmap]] and can be changed to better suit your environment.
The options "us,apl", ",dyalog", and "grp:switch" are the same as in [[#setxkbmap|setxkbmap]] and can be changed to better suit your environment.


Once saved this will affect any future session. To change the current session and test out layouts, use <source lang=console inline>setxkbmap</source>.  
Once saved this will affect any future session. To change the current session and test out layouts, use <syntaxhighlight lang=console inline>setxkbmap</source>.  


== GNOME ==
== GNOME ==
Line 59: Line 59:


# Navigate to <code>~/.config/autostart</code> and create a <code>.desktop</code> with any name that will help you remember its function.
# Navigate to <code>~/.config/autostart</code> and create a <code>.desktop</code> with any name that will help you remember its function.
# Add the following to the contents of your file, customizing to suit your needs:<source lang=ini>
# Add the following to the contents of your file, customizing to suit your needs:<syntaxhighlight lang=ini>
[Desktop Entry]
[Desktop Entry]
Type=Application
Type=Application
Line 74: Line 74:
== LXDE ==
== LXDE ==


# Prepend an <source lang=console inline>@</source> to the <source lang=console inline>setxkbmap</source> command from above:<br><source lang=console>
# Prepend an <syntaxhighlight lang=console inline>@</source> to the <syntaxhighlight lang=console inline>setxkbmap</source> command from above:<br><syntaxhighlight lang=console>
@setxkbmap -layout us,apl -variant ,dyalog -option grp:switch
@setxkbmap -layout us,apl -variant ,dyalog -option grp:switch
</source>
</source>
# Add it as a line in your user's LXDE <source lang=console inline>autostart</source> file, located at:<br><source lang=console>
# Add it as a line in your user's LXDE <syntaxhighlight lang=console inline>autostart</source> file, located at:<br><syntaxhighlight lang=console>
~/.config/lxsession/LXDE/autostart
~/.config/lxsession/LXDE/autostart
</source>
</source>


For Lubuntu versions up to and including 18.04 (before the LXQt split), the location of <source lang=console inline>autostart</source> is <source lang=console inline>~/.config/lxsession/Lubuntu/autostart</source>.
For Lubuntu versions up to and including 18.04 (before the LXQt split), the location of <syntaxhighlight lang=console inline>autostart</source> is <syntaxhighlight lang=console inline>~/.config/lxsession/Lubuntu/autostart</source>.


== LXQt ==
== LXQt ==
Line 87: Line 87:
=== GUI ===
=== GUI ===


# From your LXQt panel, navigate to ''Preferences'' → ''LXQt Settings'' → ''Session Settings''; alternatively, enter <source lang=console inline>lxqt-config-session</source> in your terminal emulator. You will be greeted with the following window:<br>[[File:Lxqt-session-settings.png|frameless|LXQt Autostart menu of Session Settings window]]
# From your LXQt panel, navigate to ''Preferences'' → ''LXQt Settings'' → ''Session Settings''; alternatively, enter <syntaxhighlight lang=console inline>lxqt-config-session</source> in your terminal emulator. You will be greeted with the following window:<br>[[File:Lxqt-session-settings.png|frameless|LXQt Autostart menu of Session Settings window]]
# Select the <source lang=console inline>LXQt Autostart</source> dropdown (it will be highlighted as shown above) and click the <kbd>Add</kbd> button to display the following pop-up window:<br>[[File:Lxqt-add-autostart.png|frameless|LXQt add a new autostart menu item]]
# Select the <syntaxhighlight lang=console inline>LXQt Autostart</source> dropdown (it will be highlighted as shown above) and click the <kbd>Add</kbd> button to display the following pop-up window:<br>[[File:Lxqt-add-autostart.png|frameless|LXQt add a new autostart menu item]]
# Provide a name, enter your <code>setxkbmap</code> command, and click <kbd>OK</kbd> when finished.
# Provide a name, enter your <code>setxkbmap</code> command, and click <kbd>OK</kbd> when finished.


=== Terminal ===
=== Terminal ===


The above GUI approach merely creates a <source lang=console inline>.desktop</source> file in the user's <source lang=console inline>~/.config/autostart</source>. Create your own file in the <source lang=console inline>autostart</source> directory whose contents are as follows, to replicate the functionality achieved through the GUI:
The above GUI approach merely creates a <syntaxhighlight lang=console inline>.desktop</source> file in the user's <syntaxhighlight lang=console inline>~/.config/autostart</source>. Create your own file in the <syntaxhighlight lang=console inline>autostart</source> directory whose contents are as follows, to replicate the functionality achieved through the GUI:


<source lang=ini>
<syntaxhighlight lang=ini>
[Desktop Entry]
[Desktop Entry]
Exec=setxkbmap -layout us,apl -variant ,dyalog -option grp:switch
Exec=setxkbmap -layout us,apl -variant ,dyalog -option grp:switch
Line 119: Line 119:
Add the following to the contents of your file, customizing to suit your needs:
Add the following to the contents of your file, customizing to suit your needs:


<source lang=ini>
<syntaxhighlight lang=ini>
[Desktop Entry]
[Desktop Entry]
Type=Application
Type=Application
Line 155: Line 155:
Xfce ships with a utility, [https://docs.xfce.org/xfce/xfconf/xfconf-query xfconf-query], which allows you to manage Xfce's XML configuration files on the command line. Enter the following commands into your terminal:
Xfce ships with a utility, [https://docs.xfce.org/xfce/xfconf/xfconf-query xfconf-query], which allows you to manage Xfce's XML configuration files on the command line. Enter the following commands into your terminal:


<source lang=console>
<syntaxhighlight lang=console>
xfconf-query -c keyboard-layout -n -p '/Default/XkbDisable' -t 'bool' -s 'false'
xfconf-query -c keyboard-layout -n -p '/Default/XkbDisable' -t 'bool' -s 'false'
</source>
</source>
Line 161: Line 161:
This enables [https://www.x.org/wiki/XKB/ XKB], allowing us to manage our keyboard layout.
This enables [https://www.x.org/wiki/XKB/ XKB], allowing us to manage our keyboard layout.


<source lang=console>
<syntaxhighlight lang=console>
xfconf-query -c keyboard-layout -n -p '/Default/XkbLayout' -t 'string' -s 'us,apl'
xfconf-query -c keyboard-layout -n -p '/Default/XkbLayout' -t 'string' -s 'us,apl'
</source>
</source>
Line 167: Line 167:
Defines the keyboard layout itself. The comma-delimited <code>apl</code> specifies a second layout group. Make sure you replace <code>us</code> with the code for your language; a list of these can be found in <code>/usr/share/X11/xkb/rules/evdev.lst</code>, under the <code>layout</code> category.
Defines the keyboard layout itself. The comma-delimited <code>apl</code> specifies a second layout group. Make sure you replace <code>us</code> with the code for your language; a list of these can be found in <code>/usr/share/X11/xkb/rules/evdev.lst</code>, under the <code>layout</code> category.


<source lang=console>
<syntaxhighlight lang=console>
xfconf-query -c keyboard-layout -n -p '/Default/XkbOptions/Group' -t 'string' -s 'grp:win_switch'
xfconf-query -c keyboard-layout -n -p '/Default/XkbOptions/Group' -t 'string' -s 'grp:win_switch'
</source>
</source>
Line 173: Line 173:
This tells Xfce to switch to the APL layout only when the <kbd>Windows</kbd> key is pressed. When the <kbd>Windows</kbd> key is released, the layout will return to its previous setting. This is incredibly useful as the <code>apl</code> layouts in XKB do not support <kbd>Space</kbd>, <kbd>Enter</kbd>, or the arrow keys (among basically all the others). A full list of possible keys for switching between keyboard groups is located in <code>/usr/share/X11/xkb/rules/evdev.lst</code>, under the <code>option</code> category.
This tells Xfce to switch to the APL layout only when the <kbd>Windows</kbd> key is pressed. When the <kbd>Windows</kbd> key is released, the layout will return to its previous setting. This is incredibly useful as the <code>apl</code> layouts in XKB do not support <kbd>Space</kbd>, <kbd>Enter</kbd>, or the arrow keys (among basically all the others). A full list of possible keys for switching between keyboard groups is located in <code>/usr/share/X11/xkb/rules/evdev.lst</code>, under the <code>option</code> category.


<source lang=console>
<syntaxhighlight lang=console>
xfconf-query -c keyboard-layout -n -p '/Default/XkbVariant' -t 'string' -s ',dyalog'
xfconf-query -c keyboard-layout -n -p '/Default/XkbVariant' -t 'string' -s ',dyalog'
</source>
</source>
Line 183: Line 183:
== xmodmap ==
== xmodmap ==


Modifying the Linux keyboard to support APL keys via [https://linux.die.net/man/1/xmodmap xmodmap(1)] is possible, but not recommended — it has been superseded by the [https://wiki.archlinux.org/title/X_keyboard_extension X keyboard extension] (XKB). Generally <source lang=console inline>xmodmap</source> is best for simple tasks,<ref>ArchWiki Contributors. [https://wiki.archlinux.org/title/xmodmap xmodmap]. 19 July 2021</ref> which APL keyboards often tend not to be. [[Dyalog APL]], for example, has native support for XKB.<ref name="Dyalog APL XKB"/>
Modifying the Linux keyboard to support APL keys via [https://linux.die.net/man/1/xmodmap xmodmap(1)] is possible, but not recommended — it has been superseded by the [https://wiki.archlinux.org/title/X_keyboard_extension X keyboard extension] (XKB). Generally <syntaxhighlight lang=console inline>xmodmap</source> is best for simple tasks,<ref>ArchWiki Contributors. [https://wiki.archlinux.org/title/xmodmap xmodmap]. 19 July 2021</ref> which APL keyboards often tend not to be. [[Dyalog APL]], for example, has native support for XKB.<ref name="Dyalog APL XKB"/>


For users who understand the pitfalls, an example <source lang=console inline>~/.Xmodmap</source> can be [https://gist.github.com/Russtopia/20ae5ab571d5bed73359ca956d9010a7 found at this GitHub Gist].
For users who understand the pitfalls, an example <syntaxhighlight lang=console inline>~/.Xmodmap</source> can be [https://gist.github.com/Russtopia/20ae5ab571d5bed73359ca956d9010a7 found at this GitHub Gist].


== Troubleshooting ==
== Troubleshooting ==


=== Gnome catches keystrokes before Dyalog ===
=== Gnome catches keystrokes before Dyalog ===
After upgrading Ubuntu 21.04 (Hirsute Hippo), Gnome catches the keystrokes from the <kbd>Super</kbd> key to show the list of applications, before Dyalog can receive it. [[#setxkbmap|Changing the shifting key]] from <source lang=console inline>grp:win_switch</source> to <source lang=console inline>grp:caps_switch</source> avoids the issue. Changing it to <source lang=console inline>grp:rctrl_switch</source> does not work.
After upgrading Ubuntu 21.04 (Hirsute Hippo), Gnome catches the keystrokes from the <kbd>Super</kbd> key to show the list of applications, before Dyalog can receive it. [[#setxkbmap|Changing the shifting key]] from <syntaxhighlight lang=console inline>grp:win_switch</source> to <syntaxhighlight lang=console inline>grp:caps_switch</source> avoids the issue. Changing it to <syntaxhighlight lang=console inline>grp:rctrl_switch</source> does not work.


=== Dyalog Overrides Current Keyboard Settings ===
=== Dyalog Overrides Current Keyboard Settings ===
Line 198: Line 198:
To run Dyalog in the terminal without overriding ("hijacking") the user keyboard configuration, run <code>dyalog</code> with the <code>-nokbd</code> option:
To run Dyalog in the terminal without overriding ("hijacking") the user keyboard configuration, run <code>dyalog</code> with the <code>-nokbd</code> option:


<source lang=bash>
<syntaxhighlight lang=bash>
dyalog -nokbd
dyalog -nokbd
</source>
</source>
Line 204: Line 204:
The following script can be used to launch RIDE, immediately connecting a new Dyalog instance, without changing the xkb settings:
The following script can be used to launch RIDE, immediately connecting a new Dyalog instance, without changing the xkb settings:


<source lang=bash>
<syntaxhighlight lang=bash>
#!/usr/bin/env sh
#!/usr/bin/env sh
env RIDE_CONNECT=localhost:4502 ride &
env RIDE_CONNECT=localhost:4502 ride &
Line 216: Line 216:
Previous versions of Dyalog override the current keyboard configuration, as described in [[#Dyalog_Overrides_Current_Keyboard_Settings|this section]], but even using the default keyboard configuration by starting Dyalog 18.2 or later with
Previous versions of Dyalog override the current keyboard configuration, as described in [[#Dyalog_Overrides_Current_Keyboard_Settings|this section]], but even using the default keyboard configuration by starting Dyalog 18.2 or later with


<source lang=bash>
<syntaxhighlight lang=bash>
dyalog --keyboard
dyalog --keyboard
</source>
</source>
Line 222: Line 222:
fails to return the user to their previous keyboard configuration on exit. To solve this, create a custom [[wikipedia:Bash_(Unix_shell)|Bash]] script to save and revert keyboard settings upon exiting Dyalog APL:<ref>Adám Brudzewsky. [https://stackoverflow.com/questions/63431922/dyalog-apl-hijack-windows-key-and-do-not-give-it-back-fedora-32-gnome-free-lic/63433845#63433845 Stack Overflow answer]. 17 Aug, 2020</ref>
fails to return the user to their previous keyboard configuration on exit. To solve this, create a custom [[wikipedia:Bash_(Unix_shell)|Bash]] script to save and revert keyboard settings upon exiting Dyalog APL:<ref>Adám Brudzewsky. [https://stackoverflow.com/questions/63431922/dyalog-apl-hijack-windows-key-and-do-not-give-it-back-fedora-32-gnome-free-lic/63433845#63433845 Stack Overflow answer]. 17 Aug, 2020</ref>


<source lang=bash>
<syntaxhighlight lang=bash>
#!/usr/bin/sh
#!/usr/bin/sh
OLDLAYOUT=$(setxkbmap -query | sed -n 's/^layout://p')
OLDLAYOUT=$(setxkbmap -query | sed -n 's/^layout://p')
Line 235: Line 235:
=== Settings reverted during X Windows session ===
=== Settings reverted during X Windows session ===


Since at least March 2020 there have been issues with <source lang=console inline>setxkbmap</source> settings being reset without user instruction under the [[wikipedia:X Windows System|X Windows System]].
Since at least March 2020 there have been issues with <syntaxhighlight lang=console inline>setxkbmap</source> settings being reset without user instruction under the [[wikipedia:X Windows System|X Windows System]].


Below is a script written in [[wikipedia:Raku (programming language)|Raku]] that continuously checks for this undesirable reset behavior and puts the intended settings back in place.<ref>John Longwalker. [https://5ab5traction5.bearblog.dev/ 5ab5traction5 blog]. [https://5ab5traction5.bearblog.dev/apl-keyboard-keeper/ Raku to the Rescue: APL Keyboard Keeper]. 29 Jun, 2020</ref>
Below is a script written in [[wikipedia:Raku (programming language)|Raku]] that continuously checks for this undesirable reset behavior and puts the intended settings back in place.<ref>John Longwalker. [https://5ab5traction5.bearblog.dev/ 5ab5traction5 blog]. [https://5ab5traction5.bearblog.dev/apl-keyboard-keeper/ Raku to the Rescue: APL Keyboard Keeper]. 29 Jun, 2020</ref>


<source lang=perl6>
<syntaxhighlight lang=perl6>
#!/usr/bin/env raku
#!/usr/bin/env raku


Navigation menu