Package for devuan: chicago95-theme-all

Because self-promotion (erm, I mean… learning!) is the purpose of this blog, here is a package I have assembled from a nifty upstream: Chicago95!

You can go get it from the OBS repository now.

screenshot of XFCE with chicago95 theme in use
Screenshot from project

chicago95-theme-all is a metapackage that pulls in all the elements needed to configure your Devuan GNU+Linux system to look like a classic non-free OS from 1995!

$ apt-cache search chicago
chicago95-theme-all - XFCE Windows 95 Total Conversion
chicago95-theme-cursors - Mouse cursor themes for Chicago95
chicago95-theme-doc - Documentation for Chicago95
chicago95-theme-fonts - Fonts for Chicago95
chicago95-theme-greeter - Lightdm webkit greeter for Chicago95
chicago95-theme-gtk - GTK and WM themes for Chicago95
chicago95-theme-icons - Icon themes for Chicago95
chicago95-theme-login-sound - Login sound for Chicago95
chicago95-theme-plymouth - Plymouth theme for Chicago95
$ apt-cache policy chicago95-theme-all
  Installed: (none)
  Candidate: 0.0.1-1+devuan
  Version table:
     0.0.1-1+devuan 500
        500  Packages

Of course, like any other theme, you need to manually change your settings to use the theme. But these packages make it easy to install it so you can control the files with the package manager.


I was helping a family member set up a system to look like a particular non-free OS, and an old one was acceptable, and even preferred. After some research, I discovered a few good places to look for themes:

There were multiple options for the type of theme I wanted, but Chicago95 was the most cohesive and cleanly-installed set.

Thunar column widths

So I suffer from Thunar columns that reset for each new window. I just want to see the full name of each file!

I can resize the columns of course, however, I have to do it every single time. There’s a config setting that changes this!

View menu -> Configure columns… -> “Automatically expand columns as needed.”

After changing that setting, my new windows show the full filename! Hurray!



xfce – Thunar column width – Unix & Linux Stack Exchange

Devuan with lightdm and xfce will not let user reboot or shutdown from user session

I use Devuan GNU+Linux on most of my desktop systems now. I use XFCE, but I have my daily driver on Fluxbox because I can.

Well, I think a recent change that happened, or else I only recently noticed it, was that when I use Devuan ceres with lightdm (instead of slim) with xfce4, the user cannot effectively select “Restart” or “Shutdown” from the menu.

The options may nor may not be enabled, but selecting either of them just return the user to the login screen.
For some random reason I was searching for “consolekit” on the Devuan forum and stumbled across an interesting title: HOWTO: lightdm (with libpam-elogind) + xfce4 (ASCII/Stable) / Documentation / Dev1 Galaxy Forum
After adapting the instructions for ceres (unstable) release, I am pleased to announce the successful results! The steps that I took are the following. Observe that they are briefer than the instructions provided by the source. Trying to add or remove other packages than the two listed here on my system caused apt-get to want to remove some crazy sets of packages which I obviously wanted to keep

sudo apt-get install --no-install-recommends libpolkit-gobject-elogind-1-0 policykit-1 lightdm lightdm-gtk-greeter
# and adjust pam:
sed -i -r -e '/session\s+optional\;' /etc/pam.d/lightdm-greeter

I chose to reboot to ensure lightdm inherited the new pam settings. And, then my user could shut down from the user session! It’s the little things, isn’t it…

PolicyKit rule for admins to automatically mount iso files in file manager

If you use a graphical file manager and want to take advantage of automatically mounting .iso files, you might be prompted to authenticate as an authorized user. This interrupts the workflow, and should not happen.

XFCE PolicyKit Agent warning about authentication required to perform an action
Workflow interruption detected! A Linux guru is needed if you want to automate this.

Here is a polkit rule you can make and place in the /usr/lib/polkit-1/rules.d directory. I don’t think freeipa has policykit abilities, so you have to apply this file locally for any system that needs it.

// File: /usr/share/polkit-1/rules.d/mount-iso.rules
// File: /usr/share/polkit-1/rules.d/mount-iso.rules
// Author: bgstack15
// Startdate: 2018-12-29 19:18
// Title: PolicyKit Rules for Allowing FreeIPA admins to mount loop devices for ISO files
// History:
// Usage:
// Reference:
//    lightdm.rules
// Documentation: comments are C-style
polkit.addRule(function(action, subject) {
    if ( ("org.freedesktop.udisks2.filesystem-mount-system") == 0) || 
         ("org.freedesktop.udisks2.loop-modify-others") == 0) ) {
        polkit.log("action=" + action);
        polkit.log("subject=" + subject);
        if (subject.isInGroup ("wheel") || subject.isInGroup("admins") || subject.isInGroup("cdrom")) {
            return polkit.Result.YES;

I realize the logic is crude so if you have any improvements, please share them!

Quick and dirty script to set up a terminal server with xfce

Who needs proprietary OSes and CALs to use a terminal server? Not this guy!

Here’s the guidelines I use when standing up a new terminal server with Xfce, because Gnome operates too slowly and is bloated. This is my file named el7ts201.txt.

# How to install terminal server

sudo su -
sed -i -r -e '/10\.200/s/^[^#]/#/;' -e '/^\&/s/^/#/;' /etc/rsyslog.conf
systemctl restart rsyslog

# install epel
# reference:
yum -y install epel-release-latest-7.noarch.rpm

# install xrdp
yum -y groupinstall xfce ; yum -y install xrdp tigervnc-server patch xfce4-whiskermenu-plugin ; yum -y remove gnome-session

# install fonts
yum -y install gnu-free-*-fonts open-sans-fonts libXfont xorg-x11-font*

touch "${tf}" ; chmod 0644 "${tf}" ; restorecon "${tf}" ; chown root.root "${tf}"
cat <<'EOF' 1> "${tf}"
<?xml version="1.0" encoding="utf-8"?>
  <description>Terminal services</description>
  <port protocol="tcp" port="3389"/>
firewall-cmd --reload
firewall-cmd --add-service=xrdp --permanent
firewall-cmd --reload

# add XFCE to the /etc/X11/xinit/Xclients file
cp -p "${tf}" "${tf}.$( date "+%s" )"
cat <<'EOFXCLIENTS' 1> "${tf}"

STARTXFCE="$(type -p startxfce4)"

# check to see if the user has a preferred desktop

# We should also support /etc/X11/xinit/Xclients.d scripts
if [ "$#" -eq 1 ] && [ -x "$XCLIENTS_D/Xclients.$" ]; then
    exec -l $SHELL -c "$SSH_AGENT $XCLIENTS_D/Xclients.$"

# Failsafe.

# these files are left sitting around by TheNextLevel.
rm -f $HOME/Xrootenv.0

systemctl enable xrdp xrdp-sesman
systemctl start xrdp xrdp-sesman

echo done

# Next steps
# apply valid ssl certificate

A few useful keybindings for Window Manager in Xfce

xfce4-keyboard-shortcuts /xfwm4/custom/Down             tile_down_left_key
xfce4-keyboard-shortcuts /xfwm4/custom/Left             tile_up_left_key
xfce4-keyboard-shortcuts /xfwm4/custom/Right            tile_down_right_key
xfce4-keyboard-shortcuts /xfwm4/custom/Up               tile_up_right_key
xfce4-keyboard-shortcuts /xfwm4/custom/Down                  tile_down_key
xfce4-keyboard-shortcuts /xfwm4/custom/Left                  tile_left_key
xfce4-keyboard-shortcuts /xfwm4/custom/Right                 tile_right_key
xfce4-keyboard-shortcuts /xfwm4/custom/Up                    tile_up_key

I found that by having these values, I can use the keyboard to control the window placement with almost identical functionality as Cinnamon. This was one of the key differences (no pun intended) for me between Xfce and Cinnamon.

To import these settings with that input as is, check out I describe it here on the blog at xfconf-query save and load from file

Xfce on Xrdp on Fedora 26


This post will demonstrate how to set up a Fedora installation to act as a terminal server that serves desktops over RDP. This will allow Windows computers to connect to it, as well as a GNU/Linux system running xfreerdp clients.
These instructions should be easy to follow on any RHEL-based distros, and easily adapted to others. The copy-paste segments have been tested on Fedora 26 but the accompanying instructions should guide you in deploying a terminal server on a broad range of GNU/Linux environments.

How to set up xrdp on Fedora

Ensure your desktop environment is installed. For CentOS 7 that would be something similar to yum groupinstall “Server with gui” or yum groupinstall xfce.
Install the components necessary for rdp and vnc. When the rdp server allows a user to connect, the user connects to a X windows session in VNC.

yum -y install xrdp tigervnc-server

Set up a firewall rule for the RDP port.

tf=/lib/firewalld/services/xrdp.xml; touch "${tf}"; chmod 0644 "${tf}"
cat <<EOF >"${tf}"
<?xml version="1.0" encoding="utf-8"?>
  <short>Remote Desktop Protocol (RDP)</short>
  <description>A RDP service that serves X desktop sessions. Using this allows a Windows client to connect using the built-in mstsc utility!</description>
  <port protocol="tcp" port="3389"/>
firewall-cmd --reload
firewall-cmd --permanent --add-service=xrdp
firewall-cmd --reload

Running xfce or any arbitrary DE

On Fedora, for xfce specifically you need to make sure that X clients are told to run xfce. The vnc services will try to start a window manager, but as of the time of this writing xfce is not included in the list, so it will fail out (or run gnome, if it’s present).
The file to inspect is /etc/X11/xinit/Xclients, or the per-user settings at ~/.Xclients. For the etc file, it should be fairly obvious how to add to it. Additionally, make sure the file is executable!

For Fedora 26 and xfce, you can inspect this patch file, and then either run the patch statement or make the changes yourself manually.

# for all users
tf=/etc/X11/xinit/Xclients.patch; touch "${tf}"; chmod 0644 "${tf}";
cat <<'EOFPATCH' >"${tf}"
--- /etc/X11/xinit/Xclients	2017-02-12 00:38:18.000000000 -0500
+++ /etc/X11/xinit/	2017-10-14 08:12:34.340524791 -0400
@@ -12,6 +12,7 @@
 MSESSION="$(type -p mate-session)"
 STARTKDE="$(type -p startkde)"
 STARTLXDE="$(type -p startlxde)"
+STARTXFCE="$(type -p startxfce4)"
 # check to see if the user has a preferred desktop
@@ -25,6 +26,8 @@
     elif [ "$DESKTOP" = "LXDE" ]; then
+    elif [ "$DESKTOP" = "XFCE" ]; then
@@ -44,6 +47,9 @@
 elif [ -n "$STARTLXDE" ]; then
     # if neither GNOME nor KDE then LXDE
     exec "$STARTLXDE"
+elif [ -n "$STARTXFCE" ]; then
+    # if none of the above, try XFCE.
+    exec "$STARTXFCE"
 # We should also support /etc/X11/xinit/Xclients.d scripts
patch -p1 /etc/X11/xinit/Xclients < /etc/X11/xinit/Xclients.patch

And for the individual users (I have yet to test to see if the normal order of resolution of the X files lets this actually override it for the user):

tf=~/.Xclients; touch "${tf}"; chmod 0700 "${tf}";
cat <<EOF > "${tf}"
exec /usr/bin/startxfce4

And that’s it! A sample xfreerdp statement to connect to this service could be:

xfreerdp /sec-rdp /cert-tofu /size:1520x820 /bpp:16 /v: -z /disp /audio-mode:0 /wallpaper /themes /u:bgstack15
Screenshot of session manager login screen in vnc in xrdp
Login screen after connecting to xrdp service



  1. Using the patch utility
  2. update file /etc/X11/xinit/Xclients
  4. General xrdp guide
  5. Notes about cinnamon on CentOS 7
  6. xrdp on centos 7

xfconf-query save and load from file

xfconf-query load from file


The wonderful xfce desktop environment provides a mechanism to inspect and modify your settings, similar to dconf. This tool is named xfconf-query, and it allows you to list and modify entries one at a time. Unfortunately, it does not provide a way to export to a file and import, the way dconf does (with standard redirection).

Save settings to file
For xfce, you can display the settings by specifying the channel:

xfconf-query -c thunar -lv

#place sample output here

You can save this to a file with output redirection, but you won’t be able to load this very easily from such a file.

To get the settings in a nicer format for saving to a text file, use this oneliner:

xfconf-query -l | sed -r -e '/Channels:/d' | while read line; do xfconf-query -lv -c "${line}" | sed -r -e "s/^/${line} /"; done > my-settings.xfconf

#place sample output here

xfconf-query load settings from file

I wrote a wrapper script that loads the settings from such a file. Please check out the full script at gitlab.
Its basic use is very simple. Call the script with the settings file as the only parameter: mysettings.xfconf

Code walkthrough

# File: /usr/share/bgconf/inc/
# Author: bgstack15
# Startdate: 2017-09-17 08:10
# Title: Script that Loads Settings into Xfconf
# Purpose: To make a single interface for other bgconf scripts to call for loading an xfconf file
# History:
#    2017-06 Main research was done but put in separate bgconf scripts.
#    2017-09-17 I decided to separate it out to streamline the bgconf scripts themselves.
# Usage:
#    In a script, determine that an xfconf file exists, then call:
# mysettings.xfconf
#    To generate a new xfconf file, you can run:
#       xfconf-query -l | sed -r -e '/Channels:/d' | while read line; do xfconf-query -lv -c "${line}" | sed -r -e "s/^/${line} /"; done > outfile
# Reference:
# Improve:
# Document: Below this line


# get DBUS_SESSION_BUS_ADDRESS of first DE process of this user
# reference:
tmpfile1="$( mktemp )"
if test -n "${SUDO_USER}"; then _user="${SUDO_USER}"; else _user="${USER}"; fi
cat /proc/$( ps -eu${_user} | grep -E "${thisDE}" | tail -n1 | awk '{print $1}' )/environ 2>/dev/null | tr '\0' '\n' | grep -E "DBUS_SESSION_BUS_ADDRESS|DISPLAY" > "${tmpfile1}"
test -f "${tmpfile1}" && test $( grep -cE "(DBUS_SESSION_BUS_ADDRESS|DISPLAY)=.+" "${tmpfile1}" 2>/dev/null ) -ge 2 || echo "$0 error: Skipping ${thisDE}: Could not find current session." 1>&2
chmod +rx "${tmpfile1}" 2>/dev/null
. "${tmpfile1}"
/bin/rm -f "${tmpfile1}" 1>/dev/null 2>&1

# Assume infile exists as a file
if test -n "$( cat "${infile}" 2>/dev/null )" && test -x "$( which "${thisDEconf}" )" && ps -ef | grep -qE "${thisDE}" && test -n "${DBUS_SESSION_BUS_ADDRESS}";

   # get user of that directory
   thisowner="$( stat -c '%U' "${infile}" )"
   thisowneruid="$( stat -c '%u' "${infile}" )"

   # xfce custom configuration
   grep -viE '^\s*((#|;).*)?$' "${infile}" | while read channel attrib value;

      # display output
      #printf "channel=%s\tattrib=%s\tvalue\%s\n" "${channel}" "${attrib}" "${value}"

      # provide data type. This needs to be researched before making a new .xfconf file.
      case "${attrib}" in
         *last-separator-position) _thistype=integer ;;
         *last-show-hidden|*misc-single-click) _thistype=bool ;;

      # make change
      sudo su - "${thisowner}" -c "DISPLAY=${DISPLAY} DBUS_SESSION_BUS_ADDRESS=${DBUS_SESSION_BUS_ADDRESS} ${thisDEconf} --create -t ${_thistype} -c ${channel} -p ${attrib} -s ${value}"


/bin/rm -f "${tmpfile1}" 2>/dev/null

The line numbers here are different from the script on github, and probably will get outdated as I make improvements to this utility. So I will use line numbers for the version seen above. Also, this script was originally written as a small portion of a larger project to deploy my settings to a whole system. That’s why you’ll see the “sudo – su” and logic to determine file ownership, because it is being called by a command running with sudo.

Lines 23-31 find the running desktop environment for the user (or the user who called sudo) and grab the values for DBUS_SESSION_BUS_ADDRESS and DISPLAY that point to that running desktop environment. I don’t know a more official way, so I assembled this kludge over the course of this project. I’m rather fond of this logic despite the kludgeyness. You will observe on line 30 that this script actually dot sources a temp file with those variables. I actually first used this technique for loading conf files in an attempt to be more unix-like and use environment variables first, and then load in a conf file.

Line 34 calculates the requested file has contents, and the desktop environment really exists and is running, and one of the variables from the previous section is defined.
Lines 42-58 perform the actual import of settings from the file. The interesting regular expression is my official non-blank non-comment regex. For quick hand-typed oneliners, I normally just use ‘^$|^#’ but here I went with the fancier version that handles whitespace.
So the block reads three entries per line, the channel, item, and item value. Then it runs xfconf-query and plugs in the variable.
Lines 48-53 perform a manual type declaration based on hard-coded names. I don’t know how to query that from xfconf-query, so I had to use the graphical xfce settings tool to collect the exact names. You will definitely need to read through your xfconf files to make sure you include all the right options here. I suppose one could find a list of all the datatypes maybe from xfce’s documentation and parse it. I guess I’ll add that to the “Improve:” header.

Fix Korora xfce spice display pausing

For the Fedora spin Korora with the xfce desktop running in a kvm virtual machine, the display might pause for 2 seconds every so often. The system is running, but sometimes the display just freezes.

To fix this issue, run the xfce “Window Manager Tweaks.” On the “Compositor tab” uncheck “Synchronize drawing to the vertical blank.”

Thanks to Jim at the Korora Project for this one!

Installing Korora 25 xfce in qemu/kvm


I wanted to install a Linux virtual machine on my Linux laptop. Already installed was virtual machine manager. For the time being, my host OS is Fedora 25 KDE and what I wanted to run in the vm is Korora 25 xfce. All this because I don’t know how to have two different versions of Teamviewer run at the same time.


I downloaded the K25 xfce iso and then started the “Create a new virtual machine” wizard. The process was simple enough (minus scraping out enough disk space on my host). I ran into an issue with interacting with the virtual machine, though. During the install, I had to switch my display to VNC server type.

And even then, my mouse location was not aligned the cursor during the entire process. It’s a good thing Anaconda works with keyboard input! I was actually quite impressed because I’ve had trouble with keyboard input in anaconda for CentOS 7. But for Korora 25 it was fine.

Once I installed and rebooted, I switched the display back to “Spice server” and then everything worked smoothly: keyboard and mouse. Maybe I missed some guest additions package or something, because my screen doesn’t resize automatically with the window of the display. But selecting a different screen resolution in the xfce display utility worked just fine!