<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../assets/xml/rss.xsl" media="all"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Knowledge Base (Posts about menu)</title><link>https://bgstack15.ddns.net/blog/</link><description></description><atom:link href="https://bgstack15.ddns.net/blog/categories/menu.xml" rel="self" type="application/rss+xml"></atom:link><language>en</language><copyright>Contents © 2022 &lt;a href="mailto:bgstack15@gmail.com"&gt;bgstack15&lt;/a&gt; 
&lt;a rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/"&gt;
&lt;img alt="Creative Commons License BY-SA"
style="border-width:0; margin-bottom:12px;"
src="https://bgstack15.ddns.net/.images/l_by-sa_4.0_88x31.png"&gt;&lt;/a&gt;</copyright><lastBuildDate>Sun, 27 Feb 2022 04:04:59 GMT</lastBuildDate><generator>Nikola (getnikola.com)</generator><docs>http://blogs.law.harvard.edu/tech/rss</docs><item><title>Menu for choosing screen orientation on a tablet computer</title><link>https://bgstack15.ddns.net/blog/posts/2021/10/29/menu-for-choosing-screen-orientation-on-a-tablet-computer/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;&lt;a href="https://bgstack15.ddns.net/blog/2021/10/29/choose-screen-orientation.png"&gt;&lt;img alt="Screenshot of Choose Screen Orientation" src="https://bgstack15.ddns.net/blog/2021/10/29/choose-screen-orientation.png"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Overview&lt;/h2&gt;
&lt;p&gt;I found some great sources on the Internet for how to set up a menu for choosing screen orientation on a tablet computer that doesn't have gyros or other sensors to orient the screen "up." My solution involves a number of scripts, a .desktop file, and some config entries in a few spots.&lt;/p&gt;
&lt;h2&gt;Design&lt;/h2&gt;
&lt;p&gt;I wanted a menu, with arrows, where the user selects the arrow that points up. So the current screen orientation will affect the chosen value. Research on the Internet showed that I will need to rotate the tablet input and optionally the wallpaper. My environment uses fluxbox, so the architecture will hardcode in fluxbox controls but obviously this can be adapted as needed.&lt;/p&gt;
&lt;h3&gt;Dependencies&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;yad&lt;/li&gt;
&lt;li&gt;xrandr&lt;/li&gt;
&lt;li&gt;xinput&lt;/li&gt;
&lt;li&gt;fbsetbg (optional)&lt;/li&gt;
&lt;li&gt;mktrayicon (optional)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Files involved&lt;/h3&gt;
&lt;p&gt;I placed all the scripts in &lt;code&gt;/usr/local/bin&lt;/code&gt;. The desktop file is placed in &lt;code&gt;/usr/share/applications&lt;/code&gt;.&lt;/p&gt;
&lt;h4&gt;Files modified&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/etc/rc.local&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.fluxbox/keys&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;New files&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rotate-menu.sh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rotate.sh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rotate-wallpaper.sh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rotate-trayicon.sh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;rotate-trayicon.desktop&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Rotate menu&lt;/h5&gt;
&lt;p&gt;The main GUI is in &lt;code&gt;rotate-menu.sh&lt;/code&gt;. This script uses yad (because it had way fewer dependencies than zenity) to generate a simple window with buttons. The chosen orientation is calculated relative to the current orientation, and the true orientation is passed to the Rotate script.&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;
&lt;span class="normal"&gt;28&lt;/span&gt;
&lt;span class="normal"&gt;29&lt;/span&gt;
&lt;span class="normal"&gt;30&lt;/span&gt;
&lt;span class="normal"&gt;31&lt;/span&gt;
&lt;span class="normal"&gt;32&lt;/span&gt;
&lt;span class="normal"&gt;33&lt;/span&gt;
&lt;span class="normal"&gt;34&lt;/span&gt;
&lt;span class="normal"&gt;35&lt;/span&gt;
&lt;span class="normal"&gt;36&lt;/span&gt;
&lt;span class="normal"&gt;37&lt;/span&gt;
&lt;span class="normal"&gt;38&lt;/span&gt;
&lt;span class="normal"&gt;39&lt;/span&gt;
&lt;span class="normal"&gt;40&lt;/span&gt;
&lt;span class="normal"&gt;41&lt;/span&gt;
&lt;span class="normal"&gt;42&lt;/span&gt;
&lt;span class="normal"&gt;43&lt;/span&gt;
&lt;span class="normal"&gt;44&lt;/span&gt;
&lt;span class="normal"&gt;45&lt;/span&gt;
&lt;span class="normal"&gt;46&lt;/span&gt;
&lt;span class="normal"&gt;47&lt;/span&gt;
&lt;span class="normal"&gt;48&lt;/span&gt;
&lt;span class="normal"&gt;49&lt;/span&gt;
&lt;span class="normal"&gt;50&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c1"&gt;# File: rotate-menu.sh&lt;/span&gt;
&lt;span class="c1"&gt;# Locations:&lt;/span&gt;
&lt;span class="c1"&gt;#    /usr/local/bin/&lt;/span&gt;
&lt;span class="c1"&gt;# Author: bgstack15&lt;/span&gt;
&lt;span class="c1"&gt;# Startdate: 2021-10-20 09:50&lt;/span&gt;
&lt;span class="c1"&gt;# SPDX-License-Identifier: GPL-3.0&lt;/span&gt;
&lt;span class="c1"&gt;# Title: Menu for Choosing Screen Orientation on Thinkpad X230&lt;/span&gt;
&lt;span class="c1"&gt;# Purpose: Make it easy to rotate screen&lt;/span&gt;
&lt;span class="c1"&gt;# Usage: ./rotate-menu.sh&lt;/span&gt;
&lt;span class="c1"&gt;#    or press the "screen rotate" button&lt;/span&gt;
&lt;span class="c1"&gt;# Dependencies: yad, xrandr&lt;/span&gt;
&lt;span class="c1"&gt;#    In /etc/rc.local: "setkeycodes 6c 132"&lt;/span&gt;
&lt;span class="c1"&gt;#    In ~/.fluxbox/keys "140 :Exec /usr/local/bin/rotate-menu.sh"&lt;/span&gt;
&lt;span class="c1"&gt;# Reference:&lt;/span&gt;
&lt;span class="c1"&gt;#    https://forums.linuxmint.com/viewtopic.php?t=110395&lt;/span&gt;
&lt;span class="c1"&gt;#    https://forum.thinkpads.com/viewtopic.php?t=108785&lt;/span&gt;
&lt;span class="c1"&gt;#    https://wiki.archlinux.org/title/HiDPI#GDK_3_(GTK_3)&lt;/span&gt;
&lt;span class="c1"&gt;# Improve:&lt;/span&gt;
&lt;span class="c1"&gt;# Documentation:&lt;/span&gt;
&lt;span class="c1"&gt;#    Chose yad because zenity wanted 121MB of dependencies and yad needed no additional dependencies.&lt;/span&gt;
&lt;span class="c1"&gt;#    YES, the fluxbox and rc.local keycodes are not the same. I don't know why they need to be different to work.&lt;/span&gt;

&lt;span class="nv"&gt;rotate_script&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/local/bin/rotate.sh
&lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"left,normal,right,inverted,left,normal,right"&lt;/span&gt;

&lt;span class="nv"&gt;current_orientation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; xrandr -q --verbose &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;'connected'&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -o  -E &lt;span class="s1"&gt;'\) (normal|left|inverted|right) \('&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -o -E &lt;span class="s1"&gt;'(normal|left|inverted|right)'&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Currently facing: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;current_orientation&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

new_orientation&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
   &lt;span class="c1"&gt;# call: new_orientation ${orientation} ${NUMBER}&lt;/span&gt;
   &lt;span class="c1"&gt;# where number is [0-3] and we want to move to the orientation adjacent to old orientation&lt;/span&gt;
   &lt;span class="nv"&gt;first&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s1"&gt;','&lt;/span&gt; &lt;span class="s1"&gt;'\n'&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk -v &lt;span class="s2"&gt;"or=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s1"&gt;'$0 ~ or &amp;amp;&amp;amp; a==0 {a=1;print NR}'&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
   &lt;span class="c1"&gt;#echo "first=${first}"&lt;/span&gt;
   &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;order&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s1"&gt;','&lt;/span&gt; &lt;span class="s1"&gt;'\n'&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk -v &lt;span class="s2"&gt;"add=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; -v &lt;span class="s2"&gt;"or=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;first&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s1"&gt;'NR==(add+or){print;}'&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;GDK_SCALE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; yad --form --center --buttons-layout&lt;span class="o"&gt;=&lt;/span&gt;center --window-icon&lt;span class="o"&gt;=&lt;/span&gt;display --title&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Change screen orientation'&lt;/span&gt; --align&lt;span class="o"&gt;=&lt;/span&gt;center --field&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'Which direction should be up?:LBL'&lt;/span&gt; --button&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'!go-previous:152'&lt;/span&gt; --button&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'!up:150'&lt;/span&gt; --button&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'!down:151'&lt;/span&gt; --button&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'!go-next:153'&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;/dev/null &lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="nv"&gt;result&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;
&lt;span class="c1"&gt;#echo "${result}"&lt;/span&gt;
&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;result&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
   &lt;span class="m"&gt;150&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"pressed button up"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;new&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; new_orientation &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;current_orientation&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
   &lt;span class="m"&gt;151&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"pressed button down"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;new&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; new_orientation &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;current_orientation&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
   &lt;span class="m"&gt;152&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"pressed button left"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;new&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; new_orientation &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;current_orientation&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
   &lt;span class="m"&gt;153&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"pressed button right"&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;new&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; new_orientation &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;current_orientation&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
   *&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"invalid response: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;result&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="k"&gt;esac&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"new rotation should be &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;new&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;rotate_script&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;new&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;h5&gt;Rotate&lt;/h5&gt;
&lt;p&gt;The actual rotation logic is stored in a separate script, &lt;code&gt;rotate.sh&lt;/code&gt;. Decoupling the UI from the functions is always useful, particularly for someone who wants to run arbitary rotation commands. This script rotates the X screen, and also the stylus, eraser (other end of the stylus?), and touch inputs. Without the input rotations, hilarity can ensue. You should try it sometime just to see what it's like.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;#/bin/sh
# File: rotate.sh
# Locations:
#    /usr/local/bin/
# Author: bgstack15
# Startdate: 2021-10-20
# SPDX-License-Identifier: GPL-3.0
# Title: Rotate display and inputs
# Purpose: Rotates X display and also the inputs
# History:
# Usage:
#    rotate.sh [left|right|normal|inverted]
#    Called from rotate-menu.sh, which calculates which of the directions to use.
# Reference:
#    https://forums.linuxmint.com/viewtopic.php?t=110395
# Improve:
# Dependencies:
#    xinput

test -z "&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;DISPLAY&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;" &lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt; { echo "Fatal! Need DISPLAY set. Aborted." 1&amp;gt;&lt;span class="err"&gt;&amp;amp;&lt;/span&gt;2 ; exit 1 ; }
test -z "&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;ROTATE_WALLPAPER_SCRIPT&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;" &lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ROTATE_WALLPAPER_SCRIPT=/usr/local/bin/rotate-wallpaper.sh
orientation="&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;"

case "&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;" in
   normal) wacom_orientation="none" ;;
   inverted) wacom_orientation="half" ;;
   left) wacom_orientation="ccw" ;;
   right) wacom_orientation="cw" ;;
   *) echo "Invalid orientation &lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;. Aborted." 1&amp;gt;&lt;span class="err"&gt;&amp;amp;&lt;/span&gt;2 ; exit 1 ;;
esac

# collect stylus, touch, and eraser IDs
xi="$( xinput list )"
stylus="$( echo "&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;xi&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;" | awk '/stylus.*slave.*pointer/{print}' | awk -F'=' '{print $2}' | awk '{print $1}' )"
touch="$( echo "&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;xi&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;" | awk '/touch.*slave.*pointer/{print}' | awk -F'=' '{print $2}' | awk '{print $1}' )"
eraser="$( echo "&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;xi&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;" | awk '/eraser.*slave.*pointer/{print}' | awk -F'=' '{print $2}' | awk '{print $1}' )"

# MAIN
xrandr -o "&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;orientation&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;"
"&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;ROTATE_WALLPAPER_SCRIPT&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;"
xsetwacom set "&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;stylus&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;" rotate "&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;wacom_orientation&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;"
xsetwacom set "&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;touch&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;" rotate "&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;wacom_orientation&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;"
xsetwacom set "&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;eraser&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;" rotate "&lt;span class="cp"&gt;${&lt;/span&gt;&lt;span class="n"&gt;wacom_orientation&lt;/span&gt;&lt;span class="cp"&gt;}&lt;/span&gt;"
&lt;/code&gt;&lt;/pre&gt;

&lt;h5&gt;Rotate wallpaper&lt;/h5&gt;
&lt;p&gt;For additional aesthetic value, I decided to build a script that rotates the wallaper. The admin can establish symlinks in directory &lt;code&gt;/etc/installed/wallpapers&lt;/code&gt;, named the same as the orientations that X reports (normal, inverted, left, right). The symlinks can point to whatever you want.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; /etc/installed/wallpapers
$ ln -s wallpaper_wide.jpg normal
$ ln -s wallpaper_wide.jpg inverted
$ ln -s wallpaper_tall.jpg left
$ ln -s wallpaper_tall.jpg right
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The script &lt;code&gt;rotate-wallpaper.sh&lt;/code&gt; uses these symlinks.&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;
&lt;span class="normal"&gt;25&lt;/span&gt;
&lt;span class="normal"&gt;26&lt;/span&gt;
&lt;span class="normal"&gt;27&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c1"&gt;# File: rotate-wallpaper.sh&lt;/span&gt;
&lt;span class="c1"&gt;# Locations:&lt;/span&gt;
&lt;span class="c1"&gt;#    /usr/local/bin/&lt;/span&gt;
&lt;span class="c1"&gt;# Author: bgstack15&lt;/span&gt;
&lt;span class="c1"&gt;# Startdate: 2021-10-20 22:23&lt;/span&gt;
&lt;span class="c1"&gt;# SPDX-License-Identifier: GPL-3.0&lt;/span&gt;
&lt;span class="c1"&gt;# Title: Choose Wallpaper for Current Orientation&lt;/span&gt;
&lt;span class="c1"&gt;# Purpose: Choose wallpapers from the symlinks in /etc/installed/wallpapers/&lt;/span&gt;
&lt;span class="c1"&gt;# History:&lt;/span&gt;
&lt;span class="c1"&gt;# Usage:&lt;/span&gt;
&lt;span class="c1"&gt;#    rotate-wallpaper.sh&lt;/span&gt;
&lt;span class="c1"&gt;#    Called by ~/.fluxbox/startup or manually, or from rotate-menu.sh&lt;/span&gt;
&lt;span class="c1"&gt;# Reference:&lt;/span&gt;
&lt;span class="c1"&gt;#    rotate-menu.sh&lt;/span&gt;
&lt;span class="c1"&gt;# Improve:&lt;/span&gt;
&lt;span class="c1"&gt;# Dependencies:&lt;/span&gt;
&lt;span class="c1"&gt;#    xrandr, fbsetbg&lt;/span&gt;
&lt;span class="c1"&gt;#    symlinks named same as xrandr orientations: normal, right, inverted, left&lt;/span&gt;
&lt;span class="c1"&gt;# Documentation:&lt;/span&gt;
&lt;span class="nv"&gt;current_orientation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt; xrandr -q --verbose &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;'connected'&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -o  -E &lt;span class="s1"&gt;'\) (normal|left|inverted|right) \('&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -o -E &lt;span class="s1"&gt;'(normal|left|inverted|right)'&lt;/span&gt; &lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Currently facing: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;current_orientation&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;current_orientation&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt;
   normal&lt;span class="p"&gt;|&lt;/span&gt;inverted&lt;span class="p"&gt;|&lt;/span&gt;left&lt;span class="p"&gt;|&lt;/span&gt;right&lt;span class="o"&gt;)&lt;/span&gt; fbsetbg -f /etc/installed/wallpapers/&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;current_orientation&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
   *&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Unknown orientation &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;current_orientation&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;! Aborted."&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="k"&gt;esac&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;h5&gt;Tray icon&lt;/h5&gt;
&lt;p&gt;The configurations described below set up the hardware "Screen rotate" button to trigger &lt;code&gt;rotate-menu.sh&lt;/code&gt;. My hardware doesn't always register presses of the button, so I wanted to add a software button. This script, &lt;code&gt;rotate-trayicon.sh&lt;/code&gt;, uses &lt;a href="https://gitlab.com/bgstack15/mktrayicon"&gt;mktrayicon&lt;/a&gt; to make a simple icon that runs the main GUI when clicked.&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;&lt;span class="normal"&gt; 1&lt;/span&gt;
&lt;span class="normal"&gt; 2&lt;/span&gt;
&lt;span class="normal"&gt; 3&lt;/span&gt;
&lt;span class="normal"&gt; 4&lt;/span&gt;
&lt;span class="normal"&gt; 5&lt;/span&gt;
&lt;span class="normal"&gt; 6&lt;/span&gt;
&lt;span class="normal"&gt; 7&lt;/span&gt;
&lt;span class="normal"&gt; 8&lt;/span&gt;
&lt;span class="normal"&gt; 9&lt;/span&gt;
&lt;span class="normal"&gt;10&lt;/span&gt;
&lt;span class="normal"&gt;11&lt;/span&gt;
&lt;span class="normal"&gt;12&lt;/span&gt;
&lt;span class="normal"&gt;13&lt;/span&gt;
&lt;span class="normal"&gt;14&lt;/span&gt;
&lt;span class="normal"&gt;15&lt;/span&gt;
&lt;span class="normal"&gt;16&lt;/span&gt;
&lt;span class="normal"&gt;17&lt;/span&gt;
&lt;span class="normal"&gt;18&lt;/span&gt;
&lt;span class="normal"&gt;19&lt;/span&gt;
&lt;span class="normal"&gt;20&lt;/span&gt;
&lt;span class="normal"&gt;21&lt;/span&gt;
&lt;span class="normal"&gt;22&lt;/span&gt;
&lt;span class="normal"&gt;23&lt;/span&gt;
&lt;span class="normal"&gt;24&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c1"&gt;# File: rotate-trayicon.sh&lt;/span&gt;
&lt;span class="c1"&gt;# Locations:&lt;/span&gt;
&lt;span class="c1"&gt;#    /usr/local/bin/&lt;/span&gt;
&lt;span class="c1"&gt;# Author: bgstack15&lt;/span&gt;
&lt;span class="c1"&gt;# Startdate: 2021-10-21 11:47&lt;/span&gt;
&lt;span class="c1"&gt;# SPDX-License-Identifier: GPL-3.0&lt;/span&gt;
&lt;span class="c1"&gt;# Title: Tray icon for rotate-menu&lt;/span&gt;
&lt;span class="c1"&gt;# Purpose: Display the display icon in the system tray, because the "rotate screen" physical button is not always registered.&lt;/span&gt;
&lt;span class="c1"&gt;# History:&lt;/span&gt;
&lt;span class="c1"&gt;# Usage:&lt;/span&gt;
&lt;span class="c1"&gt;#    rotate-trayicon.sh&lt;/span&gt;
&lt;span class="c1"&gt;#    Can be called from ~/.fluxbox/startup&lt;/span&gt;
&lt;span class="c1"&gt;# References:&lt;/span&gt;
&lt;span class="c1"&gt;# Improve:&lt;/span&gt;
&lt;span class="c1"&gt;# Dependencies:&lt;/span&gt;
&lt;span class="c1"&gt;#    mktrayicon&lt;/span&gt;
&lt;span class="nv"&gt;fifo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;XDG_RUNTIME_DIR&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;/tmp&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;.icon"&lt;/span&gt;
mkfifo &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;fifo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
mktrayicon &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;fifo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"i display"&lt;/span&gt; &amp;gt;&amp;gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;fifo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"m Exit,echo 'q'&amp;gt;&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;fifo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;;sleep 2;rm &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;fifo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;;"&lt;/span&gt; &amp;gt;&amp;gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;fifo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"c /usr/local/bin/rotate-menu.sh"&lt;/span&gt; &amp;gt;&amp;gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;fifo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"s"&lt;/span&gt; &amp;gt;&amp;gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;fifo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;h6&gt;Tray icon menu entry&lt;/h6&gt;
&lt;p&gt;In case the trayicon needs to be started from the application menu, here is my &lt;code&gt;rotate-trayicon.desktop&lt;/code&gt; file.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;[Desktop Entry]&lt;/span&gt;
&lt;span class="na"&gt;Comment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Tray icon for asking user the desired screen orientation&lt;/span&gt;
&lt;span class="na"&gt;Exec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;rotate-trayicon.sh&lt;/span&gt;
&lt;span class="na"&gt;Categories&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Utility;TrayIcon;&lt;/span&gt;
&lt;span class="na"&gt;GenericName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Display orientation helper tray icon&lt;/span&gt;
&lt;span class="na"&gt;Icon&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;display&lt;/span&gt;
&lt;span class="na"&gt;Keywords&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;display;rotate;&lt;/span&gt;
&lt;span class="na"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Rotate-menu tray icon&lt;/span&gt;
&lt;span class="na"&gt;Terminal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;false&lt;/span&gt;
&lt;span class="na"&gt;Type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Application&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Configurations&lt;/h3&gt;
&lt;p&gt;To take advantage of my specific hardware's rotate-screen button, I had to assign the scancode to a keycode. References [1][1] and [2][2] are great for describing how to assign a keycode to a scancode (what happens when you press a button). If you need a reminder, use &lt;code&gt;xev(1)&lt;/code&gt; and &lt;code&gt;showkey(1)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Once you know the scancode for your button, set up the setkeycode command in &lt;code&gt;/etc/rc.local&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;setkeycodes 6c 132
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And then in &lt;code&gt;~/.fluxbox/keys&lt;/code&gt; I used this directive.&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mi"&gt;140&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Exec&lt;/span&gt; &lt;span class="sr"&gt;/usr/local/bin/&lt;/span&gt;&lt;span class="n"&gt;rotate&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;menu&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Yes, for some reason the setkeycode and code that Fluxbox uses are not the same. I don't know why, unless one of them is not base10 or something. But I got it to work, some of the time anyway.&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://forums.linuxmint.com/viewtopic.php?t=110395"&gt;Tablet PC rotation HOW TO - Linux Mint Forums&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://forum.thinkpads.com/viewtopic.php?t=108785"&gt;[Guide] Setting up Tablet Screen Rotation with Linux - Thinkpads Forum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://wiki.archlinux.org/title/HiDPI#GDK_3_(GTK_3)"&gt;HiDPI - ArchWiki#GDK&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description><category>display</category><category>menu</category><category>orientation</category><category>rotate</category><category>screen</category><category>tablet</category><category>x11</category><guid>https://bgstack15.ddns.net/blog/posts/2021/10/29/menu-for-choosing-screen-orientation-on-a-tablet-computer/</guid><pubDate>Fri, 29 Oct 2021 12:44:23 GMT</pubDate></item><item><title>Package for devuan: xdgmenumaker</title><link>https://bgstack15.ddns.net/blog/posts/2020/03/03/package-for-devuan-xdgmenumaker/</link><dc:creator>bgstack15</dc:creator><description>&lt;p&gt;After a healthy discussion on the &lt;a href="https://dev1galaxy.org/viewtopic.php?id=3136"&gt;Devuan
forum&lt;/a&gt; about how to get &lt;a href="https://specifications.freedesktop.org/menu-spec/menu-spec-1.0.html"&gt;xdg-compliant&lt;/a&gt; menus for non-xdg-compliant window managers, I went and
packaged up &lt;a href="https://github.com/gapan/xdgmenumaker"&gt;xdgmenumaker&lt;/a&gt; for Devuan!
You can go install this utility as an easy
&lt;a href="https://build.opensuse.org/package/show/home:bgstack15/xdgmenumaker"&gt;dpkg&lt;/a&gt;
from my OBS, which includes a few of my own wrapper tools. One is a nice menu
entry for rebuilding the fluxbox menus. The nature of xdg menus is to use the
system-wide /usr/share/applications directory and its contents, and also
include your local ~/.local/share/applications (or other
$XDG_DATA_DIRS/applications/ locations as defined), so using the system-wide
xdg fluxbox menu would not be complete. Therefore, I highly recommend adding
to your ~/.fluxbox/startup script:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xdgmenumaker&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;fluxbox&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;~/.&lt;/span&gt;&lt;span class="n"&gt;fluxbox&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xdg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;menu&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And adjust your ~/.fluxbox/menu file to include at least these entries:&lt;/p&gt;
&lt;pre class="code literal-block"&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(.&lt;/span&gt;&lt;span class="n"&gt;fluxbox&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xdg&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;menu&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;xdgmenumaker&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fluxbox&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I recommend the above commented line, because in case for some reason your
per-user stuff is broken, The dpkg I build provides a menu entry for reloading
it, so you don't have to go to the command line and run the above command.
&lt;img alt='screenshot showing "Update xdg menu (fluxbox)" menu
entry' src="https://bgstack15.ddns.net/blog/2020/02/xdgmenumaker-upate-menu.png"&gt;&lt;/p&gt;</description><category>devuan</category><category>dpkg</category><category>fluxbox</category><category>menu</category><category>xdg</category><guid>https://bgstack15.ddns.net/blog/posts/2020/03/03/package-for-devuan-xdgmenumaker/</guid><pubDate>Tue, 03 Mar 2020 13:50:21 GMT</pubDate></item></channel></rss>