aboutsummaryrefslogtreecommitdiff
path: root/src/Rahm/Desktop/Common.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Rahm/Desktop/Common.hs')
-rw-r--r--src/Rahm/Desktop/Common.hs33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/Rahm/Desktop/Common.hs b/src/Rahm/Desktop/Common.hs
index 71ffad0..307dd89 100644
--- a/src/Rahm/Desktop/Common.hs
+++ b/src/Rahm/Desktop/Common.hs
@@ -2,6 +2,7 @@ module Rahm.Desktop.Common
( focusLocation,
masterWindow,
windowsInWorkspace,
+ duplWindow,
pointerWorkspace,
getString,
askWindowId,
@@ -26,6 +27,7 @@ module Rahm.Desktop.Common
where
import Control.Applicative ((<*))
+import Control.Exception (SomeException (SomeException), catch)
import Control.Monad (forM_, void, when)
import Control.Monad.Trans.Class
import Control.Monad.Trans.Except (ExceptT (..), catchE, runExceptT, throwE)
@@ -34,9 +36,11 @@ import Control.Monad.Trans.Maybe (MaybeT (..))
import Data.Char (toLower)
import Data.Either (either)
import Data.List (concatMap, head, isInfixOf, map, (++))
+import Data.List.Split (splitOn)
import qualified Data.Map as Map (fromListWith)
import Data.Maybe (Maybe (..), maybe)
import Data.Void (Void (..), absurd)
+import Data.Word (Word32)
import Rahm.Desktop.DMenu (runDMenuPromptWithMap)
import Rahm.Desktop.Logger
import qualified Rahm.Desktop.StackSet as S
@@ -63,17 +67,21 @@ import XMonad
asks,
focus,
io,
+ liftX,
refresh,
runQuery,
setWindowBorderWidth,
setWindowBorderWithFallback,
+ stringProperty,
title,
windows,
withFocused,
withWindowSet,
)
import qualified XMonad as X
+import qualified XMonad.Hooks.ManageHelpers as X
import XMonad.Prompt (XPrompt (commandToComplete, showXPrompt))
+import qualified XMonad.Util.Run as X
import XMonad.Util.XUtils (pixelToString, stringToPixel)
-- A location is a workspace and maybe a window with that workspace.
@@ -253,3 +261,28 @@ pointerWorkspace = runMaybeT $ do
(S.Screen (S.tag -> ws1) _ _) <- MaybeT $ X.pointScreen x y
return ws1
+-- Creates a duplicate process of a window by running the cmdline
+-- that created it.
+duplWindow :: Window -> X ()
+duplWindow = runQuery $ do
+ pid' <- X.pid
+ liftX $ logs Info "Duplicating for pid %s" (show pid')
+ forM_ pid' $ \pid -> do
+ cmd <-
+ liftX $
+ io $
+ catch
+ (fmap (Right . splitOn "\0") $ readFile $ "/proc/" <> show pid <> "/cmdline")
+ ( \e ->
+ let ex = e :: SomeException
+ in return $ Left (printf "Could not read cmdline file: %s" (show ex))
+ )
+
+ liftX $
+ case cmd of
+ Right c -> do
+ logs Info "executing cmdline: %s\n" (show c)
+ case c of
+ (a : (init -> as)) -> X.safeSpawn a as
+ _ -> return ()
+ Left err -> logs Info "%s" (err :: String)