Difference between revisions of "Xmonad/Using xmonad in MATE"

From HaskellWiki
Jump to: navigation, search
(stub at present)
 
(Add alternative route to set window manager in MATE settings)
 
(2 intermediate revisions by one other user not shown)
Line 3: Line 3:
   
 
== Using xmonad in MATE ==
 
== Using xmonad in MATE ==
MATE is a supported fork of Gnome 2, with various components renamed to avoid collisions with Gnome components. At present, Fedora ships both MATE and an xmonad session using it (`xmonad-mate` package); for other platforms, look for MATE in your package manager or check http://mate-desktop.org.
+
MATE is a supported fork of Gnome 2, with various components renamed to avoid collisions with Gnome components. At present, Fedora ships both MATE and an xmonad session using it (<code>xmonad-mate</code> package); for other platforms, look for MATE in your package manager or check http://mate-desktop.org.
   
The current development version of xmonad-contrib from darcs has an `XMonad.Config.Mate` which should work out of the box on most platforms. For earlier versions, you may want to copy `XMonad.Config.Gnome` to `~/.xmonad/lib/XMonad/Config/Mate.hs` and replace (matching case as appropriate) all instances of "`gnome`" with "`mate`". This will affect the terminal, the session manager connection, and the X11 message sent to activate the run command dialog, among other things.
+
The current development version of <code>xmonad-contrib</code> from git has an <code>XMonad.Config.Mate</code> which should work out of the box on most platforms. For earlier versions, you may want to copy <code>XMonad.Config.Gnome</code> to <code>~/.xmonad/lib/XMonad/Config/Mate.hs</code> and replace (matching case as appropriate) all instances of <code>gnome</code> with <code>mate</code>. This will affect the terminal, the session manager connection, and the X11 message sent to activate the run command dialog, among other things.
   
 
== Replacing the default window manager ==
 
== Replacing the default window manager ==
You will need to create a freedesktop.org desktop file for xmonad:
+
You will need to create a <code>freedesktop.org</code> desktop file for <code>xmonad</code>, probably in <code>/usr/share/applications/xmonad.desktop</code>:
   
 
[Desktop Entry]
 
[Desktop Entry]
Line 20: Line 20:
 
X-GNOME-Autostart-Notify=true
 
X-GNOME-Autostart-Notify=true
   
To replace `marco` with `xmonad` for all sessions, use the following (per user):
+
To replace <code>marco</code> with <code>xmonad</code> for all sessions, use the following (per user):
   
 
dconf write /org/mate/session/required-components/windowmanager xmonad
 
dconf write /org/mate/session/required-components/windowmanager xmonad
  +
  +
Alternatively, you may need to set this via gsettings on distributions such as Arch
  +
  +
gsettings set org.mate.session.required-components.windowmanager xmonad
   
 
(TODO: alternative session file)
 
(TODO: alternative session file)
  +
  +
== Recent MATE with <code>window-manager-launcher</code> ==
  +
  +
Recently Linux Mint upgraded its MATE to use a separate script to start the window manager; as shipped, it only works with a limited number of window managers that does not include xmonad. I have minimally modified it to support other window managers, including a first cut at user-installed ones. (If someone has a better way to handle this, please do so; I have no way to host this file currently.) My changes are both marked with <code># sigh</code>.
  +
  +
<pre style="white-space: pre;">
  +
#!/usr/bin/python3
  +
  +
import sys
  +
import os
  +
import gettext
  +
import signal
  +
import subprocess
  +
import time
  +
import gi
  +
from gi.repository import Gio
  +
  +
# i18n
  +
gettext.install("mintdesktop", "/usr/share/linuxmint/locale")
  +
  +
settings = Gio.Settings("com.linuxmint.desktop")
  +
  +
# Detect which DE is running
  +
if "XDG_CURRENT_DESKTOP" not in os.environ:
  +
print ("window-manager-launcher: XDG_CURRENT_DESKTOP is not set! Exiting..")
  +
sys.exit(0)
  +
  +
current_desktop = os.environ["XDG_CURRENT_DESKTOP"]
  +
  +
if current_desktop not in ["MATE", "XFCE"]:
  +
print ("Current desktop %s is not supported." % current_desktop)
  +
sys.exit(0)
  +
  +
if current_desktop == "MATE":
  +
wm = settings.get_string("mate-window-manager")
  +
else:
  +
wm = settings.get_string("xfce-window-manager")
  +
  +
# Kill all compositors/managers first
  +
p = subprocess.Popen(['ps', '-u', str(os.getuid())], stdout=subprocess.PIPE)
  +
out, err = p.communicate()
  +
processes_found = False
  +
for process in ['compton', "marco", "xfwm4", "compiz", "metacity", "openbox", "awesome" ]:
  +
for line in out.splitlines():
  +
pname = line.decode('utf-8').split()[-1]
  +
if process in pname:
  +
pid = int(line.split(None, 1)[0])
  +
print ("Killing pid %d (%s)" % (pid, pname))
  +
try:
  +
os.kill(pid, signal.SIGKILL)
  +
except Exception as e:
  +
print ("Failed to kill process %d (%s): %s" % (pid, pname, e))
  +
processes_found = True
  +
  +
if (processes_found):
  +
# avoid race conditions before launching new WMs
  +
print ("Waiting 0.2 seconds...")
  +
time.sleep(0.2)
  +
  +
# sigh
  +
os.environ["PATH"] += ':' + os.path.expanduser("~/.local/bin")
  +
  +
if wm == "marco":
  +
settings = Gio.Settings("org.mate.Marco.general")
  +
settings.set_boolean("compositing-manager", False)
  +
subprocess.Popen(["marco", "--no-composite", "--replace"])
  +
elif wm == "marco-composite":
  +
settings = Gio.Settings("org.mate.Marco.general")
  +
settings.set_boolean("compositing-manager", True)
  +
subprocess.Popen(["marco", "--composite", "--replace"])
  +
elif wm == "marco-compton":
  +
settings = Gio.Settings("org.mate.Marco.general")
  +
settings.set_boolean("compositing-manager", False)
  +
subprocess.Popen(["marco", "--no-composite", "--replace"])
  +
time.sleep(2)
  +
subprocess.Popen(["compton", "--backend", "glx", "--vsync", "opengl-swc"])
  +
elif wm == "xfwm4":
  +
subprocess.Popen(["xfconf-query", "-c", "xfwm4", "-p", "/general/use_compositing", "--set", "false"])
  +
subprocess.Popen(["xfwm4", "--compositor=off", "--replace"])
  +
elif wm == "xfwm4-composite":
  +
subprocess.Popen(["xfconf-query", "-c", "xfwm4", "-p", "/general/use_compositing", "--set", "true"])
  +
subprocess.Popen(["xfwm4", "--compositor=on", "--replace"])
  +
elif wm == "xfwm4-compton":
  +
subprocess.Popen(["xfconf-query", "-c", "xfwm4", "-p", "/general/use_compositing", "--set", "false"])
  +
subprocess.Popen(["xfwm4", "--compositor=off", "--replace"])
  +
time.sleep(2)
  +
subprocess.Popen(["compton", "--backend", "glx", "--vsync", "opengl-swc"])
  +
elif wm == "compiz":
  +
subprocess.Popen(["compiz", "--replace"])
  +
elif wm == "metacity":
  +
settings = Gio.Settings("org.gnome.metacity")
  +
settings.set_boolean("compositing-manager", False)
  +
subprocess.Popen(["metacity", "--replace"])
  +
elif wm == "metacity-composite":
  +
settings = Gio.Settings("org.gnome.metacity")
  +
settings.set_boolean("compositing-manager", True)
  +
subprocess.Popen(["metacity", "--replace"])
  +
elif wm == "metacity-compton":
  +
settings = Gio.Settings("org.gnome.metacity")
  +
settings.set_boolean("compositing-manager", False)
  +
subprocess.Popen(["metacity", "--replace"])
  +
time.sleep(2)
  +
subprocess.Popen(["compton", "--backend", "glx", "--vsync", "opengl-swc"])
  +
elif wm == "openbox":
  +
subprocess.Popen(["openbox", "--replace"])
  +
elif wm == "openbox-compton":
  +
subprocess.Popen(["openbox", "--replace"])
  +
time.sleep(2)
  +
subprocess.Popen(["compton", "--backend", "glx", "--vsync", "opengl-swc"])
  +
elif wm == "awesome":
  +
# subprocess.call(["killall", "marco", "xfwm4", "compiz", "metacity", "openbox", "awesome"]) # Kill all other window managers that might possibly still be running
  +
# time.sleep(0.1) # Wait some time until really all other window managers are killed otherwise awesome won't start up
  +
subprocess.Popen(["awesome"])
  +
if current_desktop == "MATE": # The mate panel seems to move up a bit when starting awesome
  +
subprocess.Popen(["mate-panel", "--replace"]) # this seems to fix this issue
  +
# sigh
  +
else:
  +
subprocess.Popen([wm, "--replace"])
  +
</pre>

Latest revision as of 08:14, 2 September 2019

Xmonad-logo-small.png

XMonad

Using xmonad in MATE

MATE is a supported fork of Gnome 2, with various components renamed to avoid collisions with Gnome components. At present, Fedora ships both MATE and an xmonad session using it (xmonad-mate package); for other platforms, look for MATE in your package manager or check http://mate-desktop.org.

The current development version of xmonad-contrib from git has an XMonad.Config.Mate which should work out of the box on most platforms. For earlier versions, you may want to copy XMonad.Config.Gnome to ~/.xmonad/lib/XMonad/Config/Mate.hs and replace (matching case as appropriate) all instances of gnome with mate. This will affect the terminal, the session manager connection, and the X11 message sent to activate the run command dialog, among other things.

Replacing the default window manager

You will need to create a freedesktop.org desktop file for xmonad, probably in /usr/share/applications/xmonad.desktop:

   [Desktop Entry]
   Type=Application
   Name=XMonad
   Exec=/usr/bin/xmonad
   NoDisplay=true
   X-GNOME-WMName=XMonad
   X-GNOME-Autostart-Phase=WindowManager
   X-GNOME-Provides=windowmanager
   X-GNOME-Autostart-Notify=true

To replace marco with xmonad for all sessions, use the following (per user):

   dconf write /org/mate/session/required-components/windowmanager xmonad

Alternatively, you may need to set this via gsettings on distributions such as Arch

   gsettings set org.mate.session.required-components.windowmanager xmonad

(TODO: alternative session file)

Recent MATE with window-manager-launcher

Recently Linux Mint upgraded its MATE to use a separate script to start the window manager; as shipped, it only works with a limited number of window managers that does not include xmonad. I have minimally modified it to support other window managers, including a first cut at user-installed ones. (If someone has a better way to handle this, please do so; I have no way to host this file currently.) My changes are both marked with # sigh.

#!/usr/bin/python3

import sys
import os
import gettext
import signal
import subprocess
import time
import gi
from gi.repository import Gio

# i18n
gettext.install("mintdesktop", "/usr/share/linuxmint/locale")

settings = Gio.Settings("com.linuxmint.desktop")

# Detect which DE is running
if "XDG_CURRENT_DESKTOP" not in os.environ:
    print ("window-manager-launcher: XDG_CURRENT_DESKTOP is not set! Exiting..")
    sys.exit(0)

current_desktop = os.environ["XDG_CURRENT_DESKTOP"]

if current_desktop not in ["MATE", "XFCE"]:
    print ("Current desktop %s is not supported." % current_desktop)
    sys.exit(0)

if current_desktop == "MATE":
    wm = settings.get_string("mate-window-manager")
else:
    wm = settings.get_string("xfce-window-manager")

# Kill all compositors/managers first
p = subprocess.Popen(['ps', '-u', str(os.getuid())], stdout=subprocess.PIPE)
out, err = p.communicate()
processes_found = False
for process in ['compton', "marco", "xfwm4", "compiz", "metacity", "openbox", "awesome" ]:
    for line in out.splitlines():
        pname = line.decode('utf-8').split()[-1]
        if process in pname:
            pid = int(line.split(None, 1)[0])
            print ("Killing pid %d (%s)" % (pid, pname))
            try:
                os.kill(pid, signal.SIGKILL)
            except Exception as e:
                print ("Failed to kill process %d (%s): %s" % (pid, pname, e))
            processes_found = True

if (processes_found):
    # avoid race conditions before launching new WMs
    print ("Waiting 0.2 seconds...")
    time.sleep(0.2)

# sigh
os.environ["PATH"] += ':' + os.path.expanduser("~/.local/bin")

if wm == "marco":
    settings = Gio.Settings("org.mate.Marco.general")
    settings.set_boolean("compositing-manager", False)
    subprocess.Popen(["marco", "--no-composite", "--replace"])
elif wm == "marco-composite":
    settings = Gio.Settings("org.mate.Marco.general")
    settings.set_boolean("compositing-manager", True)
    subprocess.Popen(["marco", "--composite", "--replace"])
elif wm == "marco-compton":
    settings = Gio.Settings("org.mate.Marco.general")
    settings.set_boolean("compositing-manager", False)
    subprocess.Popen(["marco", "--no-composite", "--replace"])
    time.sleep(2)
    subprocess.Popen(["compton", "--backend", "glx", "--vsync", "opengl-swc"])
elif wm == "xfwm4":
    subprocess.Popen(["xfconf-query", "-c", "xfwm4", "-p", "/general/use_compositing", "--set", "false"])
    subprocess.Popen(["xfwm4", "--compositor=off", "--replace"])
elif wm == "xfwm4-composite":
    subprocess.Popen(["xfconf-query", "-c", "xfwm4", "-p", "/general/use_compositing", "--set", "true"])
    subprocess.Popen(["xfwm4", "--compositor=on", "--replace"])
elif wm == "xfwm4-compton":
    subprocess.Popen(["xfconf-query", "-c", "xfwm4", "-p", "/general/use_compositing", "--set", "false"])
    subprocess.Popen(["xfwm4", "--compositor=off", "--replace"])
    time.sleep(2)
    subprocess.Popen(["compton", "--backend", "glx", "--vsync", "opengl-swc"])
elif wm == "compiz":
    subprocess.Popen(["compiz", "--replace"])
elif wm == "metacity":
    settings = Gio.Settings("org.gnome.metacity")
    settings.set_boolean("compositing-manager", False)
    subprocess.Popen(["metacity", "--replace"])
elif wm == "metacity-composite":
    settings = Gio.Settings("org.gnome.metacity")
    settings.set_boolean("compositing-manager", True)
    subprocess.Popen(["metacity", "--replace"])
elif wm == "metacity-compton":
    settings = Gio.Settings("org.gnome.metacity")
    settings.set_boolean("compositing-manager", False)
    subprocess.Popen(["metacity", "--replace"])
    time.sleep(2)
    subprocess.Popen(["compton", "--backend", "glx", "--vsync", "opengl-swc"])
elif wm == "openbox":
    subprocess.Popen(["openbox", "--replace"])
elif wm == "openbox-compton":
    subprocess.Popen(["openbox", "--replace"])
    time.sleep(2)
    subprocess.Popen(["compton", "--backend", "glx", "--vsync", "opengl-swc"])
elif wm == "awesome":
    # subprocess.call(["killall", "marco", "xfwm4", "compiz", "metacity", "openbox", "awesome"]) # Kill all other window managers that might possibly still be running
    # time.sleep(0.1) # Wait some time until really all other window managers are killed otherwise awesome won't start up
    subprocess.Popen(["awesome"])
    if current_desktop == "MATE":  # The mate panel seems to move up a bit when starting awesome
        subprocess.Popen(["mate-panel", "--replace"])  # this seems to fix this issue
# sigh
else:
    subprocess.Popen([wm, "--replace"])