ENH add hook to remove Vbox dynamic workspace after Vbox closes

This commit is contained in:
Nathan Dwarshuis 2020-03-04 23:28:25 -05:00
parent 6371fde067
commit 19999bb3b9
1 changed files with 33 additions and 2 deletions

View File

@ -9,9 +9,15 @@ module Main (main) where
import System.Exit import System.Exit
import System.IO import System.IO
import Data.Char
import Data.List (sortBy) import Data.List (sortBy)
import Data.Maybe (fromMaybe, isJust) import Data.Maybe (fromMaybe, isJust)
import Data.Ord (comparing) import Data.Ord (comparing)
import Data.Monoid (All(..))
import Graphics.X11.Xlib.Atom
import Graphics.X11.Xlib.Extras
import Graphics.X11.Types
import XMonad import XMonad
import XMonad.Actions.CopyWindow import XMonad.Actions.CopyWindow
@ -57,7 +63,7 @@ main = do
, modMask = myModMask , modMask = myModMask
, layoutHook = myLayouts , layoutHook = myLayouts
, manageHook = myManageHook <+> manageDocks <+> manageHook def , manageHook = myManageHook <+> manageDocks <+> manageHook def
, handleEventHook = docksEventHook <+> handleEventHook def , handleEventHook = myEventHook <+> docksEventHook <+> handleEventHook def
, startupHook = docksStartupHook <+> startupHook def , startupHook = docksStartupHook <+> startupHook def
, workspaces = myWorkspaces , workspaces = myWorkspaces
, logHook = myLoghook h , logHook = myLoghook h
@ -189,6 +195,31 @@ myManageHook = composeOne
, isDialog -?> doCenterFloat , isDialog -?> doCenterFloat
] ]
-- This is a giant hack to "listen" for applications that close. Some
-- apps like Virtualbox go on their own workspace which is dynamically
-- created. But I want said workspace to disappear when the app
-- closes. This is actually hard. We can't just listen to
-- DestroyWindow events as VBox will "destroy" windows when it
-- switches to fullscreen and back. We also can't just monitor the
-- process from the window since WindowDestroy events don't have PIDs
-- attached to them. Therefore, the hack to make this all work is to
-- make a script fire when VirtualBox (and other apps that I want to
-- control in this manner) close. This script fires a bogus
-- ClientMessage event to the root window. This event will have a
-- BITMAP atom (which should do nothing) and a "magic string" in the
-- data field that can be intercepted here. When this event is
-- registered here, close the dynamic workspaces that are empty.
myEventHook (ClientMessageEvent { ev_message_type = t, ev_data = d })
| t == bITMAP && magicstring == data2string d = do
mapM_ removeEmptyWorkspaceByTag [myVMWorkspace, myGimpWorkspace]
return (All True)
| otherwise = return (All True)
where
magicstring = "xxxxxxxxxxxxxxxxxxxx"
data2string = map (chr . fromInteger . toInteger)
myEventHook _ = do
return (All True)
-- themes -- themes
myFont = "xft:DejaVu Sans:size=11:autohint=false" myFont = "xft:DejaVu Sans:size=11:autohint=false"
@ -283,7 +314,7 @@ myModMask = mod4Mask
_myRofi = "rofi -m -4" -- show rofi always with the focused window _myRofi = "rofi -m -4" -- show rofi always with the focused window
myTerm = "urxvt" myTerm = "urxvt"
myBrowser = "brave" myBrowser = "brave"
myVBox = "VBoxManage startvm win8raw" myVBox = "vbox-start win8raw"
myEditor = "emacsclient -c -e \"(select-frame-set-input-focus (selected-frame))\"" myEditor = "emacsclient -c -e \"(select-frame-set-input-focus (selected-frame))\""
myCalc = "urxvt -e R" myCalc = "urxvt -e R"
myFileManager = "pcmanfm" myFileManager = "pcmanfm"