2012-04-03 3 views
4

Я начинаю Haskell, и я использую xmonad. Я пытаюсь заставить его подсказать мне, прежде чем уйти, когда я случайно ударил мод + q случайно. Я нашел два способа сделать это, но я должен делать что-то неправильно, потому что ни один из них не работает для меня: https://bbs.archlinux.org/viewtopic.php?id=120298 http://comments.gmane.org/gmane.comp.lang.haskell.xmonad/11699Подтверждение XMonad при перезапуске

Вот мой 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 ] 

Спасибо!

Редактировать: отображается меню, но процесс появления не работает.

+0

Вы назвали его 'conf_quit', но это делает рестарт. Вы хотите, чтобы он прекратил работу или перезапустился после успешного подтверждения? –

+0

Я прошел через оба, но он не выполняет процесс появления. Я начинаю думать, что моя проблема возникает откуда-то еще, поскольку код работает для других людей. –

+0

Что именно происходит? Что заставляет вас думать, что 'spawn' не происходит? Что происходит, когда вы привязываете ключ к чему-то более очевидному, чем икру, скажем, фактический выход? Можете ли вы проверить, что ваш исполняемый файл xmonad находится в «PATH» xmonad (который может отличаться от «PATH» вашего терминала и 'PATH вашей консоли?)? –

ответ

2

В ответы другие дали пропустили, что dmenu кажется, добавьте дополнительные пробелы до конца строки, которую он возвращает. Вам просто нужно сделать следующее, и это работает для меня:

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

А потом, как @mariop предложил использовать либо

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

или

confirm "Exit" $ io (exitWith ExitSuccess) 
0

Вы говорите, что хотите подтвердить, но ваш код подтверждает подтверждение перезагрузки. Если это перезапуск, который вы хотите, я тестировал и работает quit_confirm.

Что вы, скорее всего, пропустите, это перекомпиляция xmonad, чтобы увидеть вашу новую конфигурацию. Попробуйте это:

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

Привет. К сожалению, это не сработало. Отобразится меню, но, похоже, он не выполняет процесс появления. Я думаю, что это может засохнуть крючок, который я пропустил, или пропустить конфигурацию x. –

+0

Попробуйте создать что-то еще, что вы знаете, например, wireless.sh. –

+0

Это то же самое и.xsession-errors не имеет ничего полезного в этом. –

1

Изменить ключ привязки к

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

И добавить действие родовое подтверждения, который использует dmenu

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

Привет, я пробовал, но все равно не работал. Отображается меню, но, похоже, оно не выполняется, и я не могу найти что-либо в моих ошибках .xsession. –

+0

Иногда у меня возникали проблемы при попытке перезапустить xmonad, и решение заключалось в том, чтобы перезапустить сеанс X вместо перезагрузка Xmonad (например, перезапуск gdm). Теперь я попробовал сам, и мой код работает над xmonad 0.10-2 (debian package). – mariop

0

Я написал следующий модуль, который не требует установки 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 

Установите это в каталог ~/.xmonad/lib/XMonad/Prompt и наслаждайтесь!

(I submitted это список рассылки XMonad и я жду обратной связи ...)

Смежные вопросы