2012-04-03 3 views
4

Je suis un débutant Haskell et j'utilise xmonad. J'essaye de le faire m'inviter avant de quitter car je frappe occasionnellement mod + q par accident. J'ai trouvé deux façons de le faire, mais je dois faire quelque chose de mal parce qu'aucun d'entre eux ne fonctionne pour moi: https://bbs.archlinux.org/viewtopic.php?id=120298 http://comments.gmane.org/gmane.comp.lang.haskell.xmonad/11699Confirmation de XMonad lors du redémarrage

Voici mes xmonad.hs:

import XMonad 
import XMonad.Config.Gnome 
import XMonad.Actions.Plane 
import XMonad.Util.EZConfig 
import XMonad.Util.Run(spawnPipe) 
import qualified Data.Map as M 
import XMonad.Hooks.DynamicLog 
import XMonad.Hooks.ManageDocks 
import XMonad.Hooks.UrgencyHook 
import System.IO(Handle, hPutStrLn) 
import System.Exit 
import Control.Monad 
import XMonad 
import XMonad.Util.EZConfig 
import XMonad.Util.Dmenu 
import XMonad.Util.Run 

workspaces' = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"] 

quit_confirm :: X() 
quit_confirm = do 
    let m = "confirm restart" 
    s <- dmenu [m] 
    when (m == s) (spawn "xmonad --restart") 

conf_quit = do 
    response <- runProcessWithInput "dmenu" ["-p", "Quit?"] "yes\nno\n" 
    when (response == "yes") (spawn "xmonad --restart") 

main = do 
     dzen2Pipe <- spawnPipe "dzen2 -w 1200 -xs 1 -ta l -fn '-*-terminus-*-*-*-*-16-*-*-*-*-*-*-*' -bg black -fg #d3d7cf " 
     dzen2Right <- spawnPipe "~/.xmonad/status-dzen.sh" 
     startupProgs <- spawnPipe "~/.xmonad/startups.sh" 
     xmonad $ defaultConfig 
      { 
      workspaces = workspaces' 
      , manageHook = manageHook' <+> manageHook defaultConfig 
      , modMask = mod4Mask 
      , terminal = "gnome-terminal" 
    , layoutHook = layoutHook' 
     , logHook = logHook' dzen2Pipe 
      } 
      `additionalKeysP` 
       [ -- Lock Screen 
       ("M-S-l", spawn "gnome-screensaver-command -l") 
       -- Sleep 
       , ("M-S-;", spawn "gnome-screensaver-command -l; pmi action suspend") 
       -- wireless 
       , ("M-S-C-w", spawn "~/.xmonad/wireless.sh") 
       -- 1 screen reconf 
       , ("M-S-C-1", spawn "~/.xmonad/1-screen.sh") 
       -- 2 screen reconf 
       , ("M-S-C-2", spawn "~/.xmonad/2-screen.sh") 
       -- confirm for quit 
       , ("M-q", conf_quit) 
       ] 
      `additionalKeys` 
      M.toList (planeKeys mod4Mask GConf Finite) 

layoutHook' = avoidStruts $ layoutHook defaultConfig 

logHook' = dynamicLogWithPP . dzenPP' 

dzenPP' h = defaultPP 
      { 
      ppOutput = hPutStrLn h 
      } 

manageHook' = composeAll 
    [ className =? "Pidgin" --> doShift "1" , 
    className =? "Firefox" --> doShift "2" , 
    className =? "Thunderbird" --> doShift "3" , 
    className =? "OpenOffice.org 3.2" --> doShift "4", 
    manageDocks ] 

Merci! Editer: le menu est affiché, mais le processus de spawn ne semble pas fonctionner.

+0

vous l'avez nommé 'conf_quit', mais il fait un redémarrage. Voulez-vous qu'il quitte ou redémarre après une confirmation réussie? –

+0

J'ai traversé les deux, mais il n'effectue pas le processus de spawn. Je commence à penser que mon problème vient d'ailleurs car le code fonctionne pour d'autres personnes. –

+0

Que se passe-t-il exactement? Qu'est-ce qui vous fait penser que le «spawn» ne se produit pas? Que se passe-t-il lorsque vous liez la clé à quelque chose de plus évident qu'un spawn, par exemple, un abandon réel? Pouvez-vous vérifier que votre exécutable xmonad est dans 'PATH' de xmonad (qui peut différer de' PATH' de votre terminal et 'PATH' de votre console)? –

Répondre

2

Les réponses D'autres ont manqué que dmenu semble ajouter une espace supplémentaire à la fin de la chaîne qu'il renvoie. Vous avez juste besoin de faire ce qui suit et il fonctionne pour moi:

confirm :: String -> X() -> X() 
confirm m f = do 
    result <- dmenu [m] 
    when (init result == m) f 

Et puis, comme @mariop a suggéré l'utilisation soit

confirm "Restart" $ spawn "xmonad --recompile && xmonad --restart" 

ou

confirm "Exit" $ io (exitWith ExitSuccess) 
0

Vous dites que vous voulez une confirmation de quitter mais votre code confirme le redémarrage. Si c'est le redémarrage que vous voulez, j'ai testé et quit_confirm fonctionne.

Ce qui vous manque probablement, c'est la recompilation de xmonad pour voir votre nouvelle configuration. Essayez ceci:

quit_confirm :: X() 
quit_confirm = do 
    let m = "confirm restart" 
    s <- dmenu [m] 
    when (m == s) (spawn "xmonad recompile && xmonad --restart") 
+0

Salut. Malheureusement, cela n'a pas fonctionné. Le menu est affiché, mais il ne semble pas exécuter le processus de spawn. Je pense que c'est peut-être un crochet que j'ai raté ou une configuration x-miss. –

+0

Essayez d'engendrer autre chose que vous savez fonctionne comme wireless.sh. –

+0

C'est pareil et.xsession-errors ne semble pas y avoir quelque chose d'utile. –

1

Modifier la clé de liaison à

("M-q", confirm "Confirm restart?" $ restart "xmonad" True) 

Et ajouter une action de confirmation générique qui utilise dmenu

confirm :: String -> X() -> X() 
confirm msg f = do 
    a <- dmenu [msg,"y","n"] 
    when (a=="y") f 
+0

Salut, j'ai essayé, mais ne fonctionnait toujours pas. Le menu est affiché, mais il ne semble pas être exécuté et je ne trouve rien de pertinent dans mes erreurs .xsession non plus –

+0

J'ai eu des problèmes parfois en essayant de redémarrer xmonad et la solution était de redémarrer la session X au lieu de rechargement de Xmonad (par exemple, redémarrez gdm). Maintenant, j'ai essayé par moi-même et mon code fonctionne sur xmonad 0.10-2 (paquet debian). – mariop

0

j'ai écrit le module suivant, qui ne nécessite pas l'installation de dmenu:

----------------------------------------------------------------------------- 
-- | 
-- Module  : XMonad.Prompt 
-- Copyright : (C) 2015 Antoine Beaupré 
-- License  : BSD3 
-- 
-- Maintainer : Antoine Beaupré <[email protected]> 
-- Stability : unstable 
-- Portability : unportable 
-- 
-- A module for setting up simple confirmation prompts for keybindings. 
-- 
----------------------------------------------------------------------------- 
module XMonad.Prompt.ConfirmPrompt (confirmPrompt 
            -- * Usage 
            -- $usage 
            , module XMonad.Prompt 
            -- * Use case: confirming exit 
            -- $tip 
            , EnterPrompt 
            ) where 

import XMonad (X) 
import XMonad.Prompt (XPConfig, XPrompt, showXPrompt, mkXPrompt, mkComplFunFromList) 

{- $usage 

This module makes it easy to add a confirmation prompt for specific 
actions. Instead of just running the action, a simple confirmation 
prompt will be created using 'XMonad.Prompt' primitives. The action 
will then run normally if the user confirms. 
-} 

{- $tip 
This should be used something like this: 

> ... 
> , ((modm , xK_l), confirmPrompt defaultXPConfig "exit" $ io (exitWith ExitSuccess)) 
> ... 
-} 

{- | Customized 'XPrompt' prompt that will ask to confirm the given string -} 
data EnterPrompt = EnterPrompt String 
instance XPrompt EnterPrompt where 
    showXPrompt (EnterPrompt n) = "Confirm " ++ n ++ " (esc/ENTER)" 

{- | Prompt the user to confirm a given action. We offer no completion 
    and simply ask to confirm (ENTER) or cancel (ESCAPE). The actual key 
    handling is done by mkXPrompt.-} 
confirmPrompt :: XPConfig -> String -> X() -> X() 
confirmPrompt config app func = mkXPrompt (EnterPrompt app) config (mkComplFunFromList []) $ const func 

Installez cela dans un répertoire ~/.xmonad/lib/XMonad/Prompt et profitez-en!

(je submitted ce à la liste de diffusion xmonad et je suis en attente des commentaires ...)

Questions connexes