and offer a window manager selection dialog for remote/nested sessions .vnc/xstartup: * runs pekwm and a xdialog to choose a wm; then runs "$HOME/.xinitrc wm-name remote" where wm-name is a lower-case window manager name (corresponding to a exectuable in $PATH) * see TODO at the head of the document for things to be completed * ISSUE: xmonad is a binary executable so there is no way to pass it a special configuration for a single monitor setup (for a remote session). Instead there should be a single-head xmonad compiled to run on remote sessions; the question is how? .xinitrc: * massively restructured and now has a slightly different usage (see head of document) * still supports being run without command-line parameters and by slim (passed one cl parameter being the window manager (again in lower case and corresponding to a executable in $PATH) .xmonad/xmonad.hs: * added a new manage hook for opennx * added a new floating manage hook doMaxFloat (thanks to OODavo) which can float windows that request a size smaller then the area their widgets span Signed-off-by: Collin Doering <rekahsoft@gmail.com>master
@@ -0,0 +1,67 @@ | |||
#!/bin/sh | |||
# (C) Copyright Collin Doering @!@YEAR@!@ | |||
# | |||
# This program is free software: you can redistribute it and/or modify | |||
# it under the terms of the GNU General Public License as published by | |||
# the Free Software Foundation, either version 3 of the License, or | |||
# (at your option) any later version. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License | |||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
# File: .vnc/xstartup | |||
# Author: Collin J. Doering <rekahsoft@gmail.com> | |||
# Date: Jul 12, 2012 | |||
# Description: Acts as a window-manager selector for vnc/freenx sessions | |||
# TODO: - use retval in the case that Xdialog fails to display some message/log | |||
# - remove use of retval for window close and cancel button as they're disabled | |||
# - support a nicer way to add wm's to the radiolist | |||
# - a custom pekwm config so that there are no clicky menus and such | |||
# Set desktop default size | |||
xrandr --output default --mode 640x480 | |||
# Start pekwm and keep its pid | |||
pekwm & | |||
PEKWM_PID=$! | |||
# Offer a Xdialog session selector | |||
Xdialog --title "Session Selection" \ | |||
--no-cancel \ | |||
--no-close \ | |||
--radiolist "Choose a session to run:" 25 112 5 \ | |||
"XMonad" "a dynamically tiling X11 window manager" off \ | |||
"OpenBox" "a highly configurable, next generation WM with extensive standards support" off \ | |||
"PekWM" "a window manager that once up on a time was based on the aewm++ window manager" off \ | |||
"Awesome" "a highly configurable, next generation framework window manager for X" off \ | |||
"StumpWM" "a tiling, keyboard driven X11 Window Manager written entirely in Common Lisp" ON 2>/tmp/wmlist.tmp.$$ | |||
# Retain the return value of Xdialog and its choices saved in /tmp/wmlist.tmp.pid where pid is the pid of this shell | |||
retval=$? | |||
choice=`cat /tmp/wmlist.tmp.$$ | tr '[A-Z]' '[a-z]'` | |||
# Remove the temporary file containing Xdialogs choices | |||
rm -f /tmp/wmlist.tmp.$$ | |||
# Stop pekwm | |||
kill $PEKWM_PID | |||
# Run a session depending on the return value and choice from Xdialog | |||
case $retval in | |||
0) | |||
exec $HOME/.xinitrc $choice remote | |||
;; | |||
# 1) | |||
# echo "Cancel pressed." | |||
# ;; | |||
# 255) | |||
# echo "Box closed." | |||
# ;; | |||
esac |
@@ -6,48 +6,79 @@ | |||
# GENERIC # | |||
# Set the default curson used by xmonad | |||
xsetroot -cursor_name left_ptr | |||
# Setup monitors | |||
xrandr --output DVI-I-1 --auto --output DVI-I-2 --auto --left-of DVI-I-1 | |||
# Start xscreensaver | |||
xscreensaver -no-splash & | |||
# Set a desktop background | |||
nitrogen --restore & | |||
# Have mouse pointer hide after 5 seconds | |||
unclutter & | |||
# Setup system tray *DISABLED* :: whats the point of a systray if no apps use it? | |||
#trayer --monitor 1 --edge top --align right --expand true --width 4 --height 2 --transparent true --tint 0x000000 & | |||
# Use xbindkeys to bind media keys etc.. | |||
xbindkeys & | |||
# Usage: .xinitrc [window-manager] [session-type] | |||
# where: window-manager is one of '(xmonad openbox stumpwm awesome pekwm) | |||
# session-type is either "" or "remote" | |||
# Start pulseaudio | |||
#start-pulseaudio-x11 & | |||
# Set the default curson used by all WM's | |||
xsetroot -cursor_name left_ptr | |||
# Start-up applications | |||
parcellite & | |||
emacs --daemon & | |||
urxvtd --quiet & | |||
xcompmgr & | |||
# Initialize a local desktop session (run generic helper applications) | |||
function init_local_session() { | |||
# Setup monitors | |||
xrandr --output DVI-I-1 --auto --output DVI-I-2 --auto --left-of DVI-I-1 | |||
# Start xscreensaver | |||
xscreensaver -no-splash & | |||
# Set a desktop background | |||
nitrogen --restore & | |||
# Create variable GENERAL_SCREEN which is the pid of a screen called "general" | |||
export GENERAL_SCREEN=`screen -ls | grep general | cut -f1 -d'.' | sed 's/\W//g'` | |||
# Have mouse pointer hide after 5 seconds | |||
unclutter & | |||
# Setup system tray *DISABLED* :: whats the point of a systray if no apps use it? | |||
#trayer --monitor 1 --edge top --align right --expand true --width 4 --height 2 --transparent true --tint 0x000000 & | |||
# Use xbindkeys to bind media keys etc.. | |||
xbindkeys & | |||
# Start pulseaudio | |||
#start-pulseaudio-x11 & | |||
# Start-up applications | |||
#parcellite & | |||
emacs --daemon & | |||
urxvtd --quiet & | |||
xcompmgr & | |||
# Create variable GENERAL_SCREEN which is the pid of a screen called "general" | |||
export GENERAL_SCREEN=`screen -ls | grep general | cut -f1 -d'.' | sed 's/\W//g'` | |||
# Check to see if a general screen is already running | |||
if [ "x$GENERAL_SCREEN" == "x" ]; then | |||
screen -dmS general & | |||
fi | |||
# Set the default wm to xmonad | |||
DEFAULT_WM=xmonad | |||
} | |||
# Check to see if a general screen is already running | |||
if [ "x$GENERAL_SCREEN" == "x" ]; then | |||
screen -dmS general & | |||
fi | |||
# Initialize a remote desktop session (run generic helper applications) | |||
function init_remote_session() { | |||
# Set desktop background | |||
feh --bg-scale ~/.wallback/Cocaine_Wallpaper_II_by_mdornfeld.png & | |||
# Set the default wm to xmonad | |||
DEFAULT_WM=stumpwm | |||
} | |||
# Set the default session to xmonad | |||
DEFAULT_SESSION=xmonad | |||
# Check the second cl parameter which denotes the session-type (E.g. remote, local) | |||
case $2 in | |||
# Remote session | |||
remote) | |||
init_remote_session | |||
break | |||
;; | |||
# Local session or unspecified | |||
*) | |||
init_local_session | |||
;; | |||
esac | |||
# Check the given parameter from slim to determine the session being requested by slim/the user | |||
# Check the first cl parameter which denotes the window-manager to use | |||
# Notice: in each case expression below "exec app" hands over execution to some app thus | |||
# ceasing execution in this script so no "break" is required | |||
case $1 in | |||
xmonad) | |||
exec xmonad | |||
@@ -58,7 +89,13 @@ case $1 in | |||
stumpwm) | |||
exec stumpwm | |||
;; | |||
awesome) | |||
exec awesome | |||
;; | |||
pekwm) | |||
exec pekwm | |||
;; | |||
*) | |||
exec $DEFAULT_SESSION | |||
exec $DEFAULT_WM | |||
;; | |||
esac |
@@ -227,7 +227,7 @@ myGenericKeys = | |||
, ((modm .|. controlMask, xK_e), spawn "emacsclient -c") | |||
-- Launch tuxcmd | |||
, ((modm .|. controlMask, xK_t), spawn "tucmd") | |||
--, ((modm .|. controlMask, xK_t), spawn "tuxcmd") | |||
-- Launch zathura | |||
, ((modm .|. controlMask, xK_z), spawn "zathura") | |||
@@ -245,11 +245,14 @@ myGenericKeys = | |||
, ((modm .|. controlMask, xK_1), namedScratchpadAction scratchpads "screen-terminal") | |||
-- Launch a maintainance scratchpad | |||
, ((modm .|. controlMask, xK_2), namedScratchpadAction scratchpads "maintainance-terminal") | |||
, ((modm .|. controlMask, xK_2), namedScratchpadAction scratchpads "maintenance-terminal") | |||
-- Launch MC scratchpad | |||
, ((modm .|. controlMask, xK_3), namedScratchpadAction scratchpads "mc-scratch") | |||
-- Launch MC scratchpad | |||
, ((modm .|. controlMask, xK_4), namedScratchpadAction scratchpads "pavucontrol-scratch") | |||
-- Select window from dmenu and go to the workspace its on | |||
, ((modm .|. shiftMask, xK_g), gotoMenuArgs ["-i","-nb", "#040404","-nf","#00FFFF","-sf","#ffa0ff","-sb","#000000"]) | |||
@@ -343,7 +346,18 @@ myLayout = smartBorders . avoidStruts $ | |||
-- Percent of screen to increment by when resizing panes | |||
delta = 3/100 | |||
------------------------------------------------------------------------ | |||
-- Thanks to OODavo from #haskell on freenode; used for applications | |||
-- that do not doFullFloat well (they request a window size smaller | |||
-- then the widgets they contain) | |||
maxFloat = flip W.float $ rectWithBorder 0.05 | |||
where rectWithBorder x = let lt = x | |||
wh = 1 - 2*x | |||
in W.RationalRect lt lt wh wh | |||
doMaxFloat = ask >>= doF . maxFloat | |||
------------------------------------------------------------------------ | |||
-- Window rules: | |||
@@ -365,35 +379,39 @@ myManageHook = composeAll | |||
-- , title =? "DOOM 3" --> doIgnore | |||
, resource =? "Qt-subapplication" <&&> title /=? "Oracle VM VirtualBox Manager" --> doFloat | |||
, resource =? "vncviewer" --> doCenterFloat | |||
, resource =? "opennx" --> doMaxFloat | |||
, resource =? "Steam.exe" --> doCenterFloat | |||
, title =? "Xnest" --> doCenterFloat | |||
, title =? "Xnest" --> doCenterFloat | |||
-- , resource =? "hl2.exe" --> doCenterFloat | |||
, isFullscreen --> (doF W.focusDown <+> doFullFloat) | |||
, resource =? "desktop_window" --> doIgnore ] <+> namedScratchpadManageHook scratchpads <+> manageDocks | |||
-- NamedScratchPad Hook | |||
scratchpads = [ NS "emacs-scratch" spawnEmacsScratch findEmacsScratch manageEmacsScratch | |||
, NS "maintainance-terminal" spawnMaintainanceTerminal findMaintainanceTerminal manageMaintainanceTerminal | |||
, NS "maintenance-terminal" spawnMaintenanceTerminal findMaintenanceTerminal manageMaintenanceTerminal | |||
, NS "screen-terminal" spawnScreenTerminal findScreenTerminal manageScreenTerminal | |||
, NS "mc-scratch" spawnMcScratch findMcScratch manageMcScratch] | |||
, NS "mc-scratch" spawnMcScratch findMcScratch manageMcScratch | |||
, NS "pavucontrol-scratch" spawnPavucontrolScratch findPavucontrolScratch managePavucontrolScratch] | |||
where | |||
findEmacsScratch = resource =? "emacs-scratch" | |||
findMaintainanceTerminal = resource =? "scratchpad" | |||
findMaintenanceTerminal = resource =? "scratchpad" | |||
findScreenTerminal = resource =? "screen-scratch" | |||
findMcScratch = resource =? "mc-scratch" | |||
findPavucontrolScratch = resource =? "pavucontrol" | |||
spawnEmacsScratch = myTerminal ++ " -name emacs-scratch -pe -tabbedex -e emacsclient -nw" | |||
spawnMaintainanceTerminal = myTerminal ++ " -name scratchpad" | |||
spawnMaintenanceTerminal = myTerminal ++ " -name scratchpad" | |||
spawnScreenTerminal = myTerminal ++ " -name screen-scratch -bg black" | |||
spawnMcScratch = myTerminal ++ " -name mc-scratch -pe -tabbedex -e mc" | |||
spawnPavucontrolScratch = "pavucontrol" | |||
manageEmacsScratch = customFloating $ W.RationalRect l t w h | |||
where | |||
h = 0.65 -- terminal height (%) | |||
w = 0.55 -- terminal width (%) | |||
t = 1 - h -- distance from top edge (%) | |||
l = 1 - w -- distance from left edge (%) | |||
manageMaintainanceTerminal = customFloating $ W.RationalRect l t w h | |||
manageMaintenanceTerminal = customFloating $ W.RationalRect l t w h | |||
where | |||
h = 0.33 -- terminal height (%) | |||
w = 1 -- terminal width (%) | |||
@@ -411,6 +429,12 @@ scratchpads = [ NS "emacs-scratch" spawnEmacsScratch findEmacsScratch manageEmac | |||
w = 0.55 -- terminal width (%) | |||
t = 1 - h -- distance from top edge (%) | |||
l = 1 - w -- distance from left edge (%) | |||
managePavucontrolScratch = customFloating $ W.RationalRect l t w h | |||
where | |||
h = 0.80 -- terminal height (%) | |||
w = 0.55 -- terminal width (%) | |||
t = 1 - h -- distance from top edge (%) | |||
l = 1 - w -- distance from left edge (%) | |||
------------------------------------------------------------------------ | |||
-- Event handling | |||