2012-06-15 8 views
5

मैं dynamicLogWithPPXMonad.Hooks.DynamicLog से xmonad के तहत स्टेटस बार के रूप में dzen2 के साथ उपयोग कर रहा हूं। बार में प्रदर्शित होने वाली चीजों में से एक यह है कि वर्तमान में अजीब (यदि कोई हो) में चल रहे ट्रैक में शेष समय है। इस जानकारी प्राप्त करना आसान है:xmonad का लॉगआउट लेआउट घटनाओं (केवल) प्रतिक्रिया के बजाय सेट अंतराल पर चलाया जा सकता है?

audStatus :: Player -> X (Maybe String) 
audStatus p = do 
    info <- liftIO $ tryS $ withPlayer p $ do 
       ispaused <- paused 
       md <- getMetadataString 
       timeleftmillis <- (-) <$> (getCurrentTrack >>= songFrames) <*> time 
       let artist = md ! "artist" 
        title = md ! "title" 
        timeleft = timeleftmillis `quot` 1000 
        (minutes, seconds) = timeleft `quotRem` 60 
        disp = artist ++ " - " ++ title ++ " (-"++(show minutes)++":"++(show seconds)++")" -- will be wrong if seconds < 10 
        audcolor False = dzenColor base0 base03 
        audcolor True = dzenColor base1 base02 
       return $ wrap "^ca(1, pms p)" "^ca()" (audcolor ispaused disp) 
    return $ either (const Nothing) Just info 

तो मुझे लगता है कि छड़ी कर सकते हैं ppExtras में है और यह ठीक काम करता है — यह केवल जब logHook चलाने हो जाता है चलाने हो जाता है, और कहा कि केवल जब एक उपयुक्त घटना पाइक नीचे आता है क्या होता है सिवाय । तो प्रदर्शन लंबे समय तक संभावित रूप से स्थिर है, जब तक कि मैं (उदा।) वर्कस्पेस स्विच नहीं करता।

ऐसा लगता है कि कुछ लोग सिर्फ दो डेजन बार चलाते हैं, जिसमें एक शेल स्क्रिप्ट से आउटपुट पाइप हो जाता है। क्या नियमित अपडेट करने का यही एकमात्र तरीका है? या यह xmonad के भीतर से किया जा सकता है (बिना पागल/हैकी प्राप्त किए बिना)?

ईटीए: मैं इस कोशिश की है, जो लगता के रूप में अगर यह बेहतर काम करना चाहिए की तुलना में यह करता है:

  1. XMonad से अद्यतन के लिए एक Tchan बनाते हैं, और एक समारोह मतदान दुस्साहसिक से अद्यतन के लिए एक और;
  2. PP फ़ील्ड DynamicLog से पहले टीसीएचएन को लिखने के लिए ppOutput फ़ील्ड सेट करें;
  3. ऑडियस-मतदान समारोह कांटा और इसे दूसरे टीसीएचएन में लिखा है;
  4. दोनों टीचन्स से पढ़ने के लिए एक फ़ंक्शन फोर्क (यह जांचना कि वे खाली नहीं हैं, पहले), और आउटपुट को संयोजित करते हैं।
XMonad से

अपडेट चैनल से पढ़ा जाता है और एक समय पर फैशन में संसाधित किया, परन्तु दुस्साहसिक से नई जानकारी शायद ही हर पांच या तो सेकंड में सबसे अच्छा सभी — पर पंजीकृत हैं। ऐसा लगता है जैसे इन लाइनों के साथ कुछ दृष्टिकोण काम करना चाहिए, हालांकि।

+0

मैंने अपने उत्तर को 'प्रस्तावित' टीसीएचएन समाधान - और दूसरों को एकाधिक धागे रखने के आधार पर कुछ स्पष्टीकरण के साथ अपडेट किया है - ठीक से काम नहीं करता है। –

+0

अद्यतन के लिए धन्यवाद। –

उत्तर

6

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैं यहां कुछ दिनों पहले इसका जवाब ढूंढ रहा था, और मैंने सोचा कि मैं इसे हल करने के तरीके को साझा करूंगा। आप वास्तव में इसे पूरी तरह से xmonad से कर सकते हैं। यह एक छोटा सा हैकी है, लेकिन मुझे लगता है कि मेरे द्वारा किए गए विकल्पों में से किसी भी तुलना में यह बहुत अच्छा है।

असल में, मैंने XMonad.Util.Timer लाइब्रेरी का उपयोग किया, जो निर्दिष्ट समय अवधि (इस मामले में, एक सेकंड में) के बाद एक एक्स ईवेंट भेज देगा।फिर मैंने इसके लिए एक इवेंट हुक लिखा, जो टाइमर को फिर से शुरू करता है, और उसके बाद मैन्युअल रूप से लॉग हुक चलाता है।

मुझे XMonad.Util.ExtensibleState लाइब्रेरी का भी उपयोग करना पड़ा, क्योंकि टाइमर यह सुनिश्चित करने के लिए एक आईडी चर का उपयोग करता है कि यह सही घटना का जवाब दे रहा है, इसलिए मुझे ईवेंट के बीच उस चर को स्टोर करना होगा।

{-# LANGUAGE DeriveDataTypeable #-} 

import qualified XMonad.Util.ExtensibleState as XS 
import XMonad.Util.Timer 

... 

-- wrapper for the Timer id, so it can be stored as custom mutable state 
data TidState = TID TimerId deriving Typeable 

instance ExtensionClass TidState where 
    initialValue = TID 0 

... 

-- put this in your startupHook 
-- start the initial timer, store its id 
clockStartupHook = startTimer 1 >>= XS.put . TID 

-- put this in your handleEventHook 
clockEventHook e = do    -- e is the event we've hooked 
    (TID t) <- XS.get     -- get the recent Timer id 
    handleTimer t e $ do    -- run the following if e matches the id 
    startTimer 1 >>= XS.put . TID -- restart the timer, store the new id 
    ask >>= logHook.config   -- get the loghook and run it 
    return Nothing     -- return required type 
    return $ All True     -- return required type 

सुंदर सरल:

यहाँ मेरी कोड है। मुझे आशा है कि यह किसी के लिए सहायक होगा।

+0

इस कोड का उपयोग करने वाले किसी और के लिए, आपको 'डेटा आयात करना होगा। मॉनिइड' – user316146

+0

यह मेरे लिए xmonad को पुनरारंभ करने की क्षमता को तोड़ देता है: मुझे लगता है कि पुनरारंभ प्रक्रिया पुरानी प्रक्रिया से ईवेंट को संभाल नहीं सकती है (सुनिश्चित नहीं है कि वे कैसे जीवित रहते हैं हालांकि प्रक्रिया फिर से शुरू)। शटडाउन शुरू होने पर मुझे गोलीबारी रोकने के लिए इसे विस्तारित करना पड़ा और बंद होने के दौरान अंतिम घटना को संभालने तक प्रतीक्षा करें। – akosch

+0

@akosch ओह वाह, मैं इस सवाल के बारे में भूल गया। हां, यह मुझे पुनरारंभ करने में सक्षम होने से भी रोकता है, और मैंने अपना व्यक्तिगत सेटअप बदल दिया है क्योंकि मैंने यह जवाब पोस्ट किया है। आजकल मेरे पास एक कॉन्की इंस्टेंस है जो एक एक्स इवेंट भेजता है जो हर सेकेंड में एक बार xmonad पर भेजता है। इस कार्यक्रम में हार्डवेयर जानकारी है, जिसे मैं भी dzen में प्रदर्शित करता हूं, लेकिन बिंदु यह है कि मैं अब अद्यतन को ट्रिगर करने के लिए बाहरी प्रोग्राम का उपयोग कर रहा हूं। लेकिन अगर आपको इसे पुनरारंभ करने के साथ काम मिल रहा है, तो शायद आपके कोड के साथ उत्तर अपडेट किया जाना चाहिए? – DarthFennec

2

यह xmonad के भीतर से नहीं किया जा सकता है; एक्समोनाड का वर्तमान थ्रेडिंग मॉडल थोड़ा कम है (और इसलिए डेजन है)। हालांकि, आप एक अलग प्रक्रिया शुरू कर सकते हैं जो समय-समय पर आपके संगीत प्लेयर को चुनाव करे और फिर दो प्रक्रियाओं से आउटपुट को गठबंधन करने के लिए एक डेजन मल्टीप्लेक्सर्स (उदा। dmplex) का उपयोग करें।

आप xmobar और taffybar पर भी देखना चाहते हैं, दोनों में डजेन की तुलना में बेहतर थ्रेडिंग कहानियां हैं।

के साथ क्यों अपने प्रस्तावित TChan समाधान my crash course on the FFI and gtk पर ठीक से काम नहीं करता है, तो आप वर्गों "सम्मलेन", "विदेशी आयात" पढ़ने के लिए चाहते हो सकता है, और "गैर पिरोया रनटाइम" के संबंध

, ध्यान रखें कि xmonad में रखते हुए वर्तमान में जीएचसी के गैर-थ्रेडेड रनटाइम का उपयोग करता है। संक्षिप्त जवाब यह है कि एक्सोनैड का मुख्य पाश एक्सएलआईबी को एक एफएफआई कॉल बनाता है जो एक्स घटना की प्रतीक्षा करता है; यह कॉल अन्य सभी हास्केल धागे को तब तक चलने से रोकता है जब तक यह वापस नहीं आ जाता है।

संबंधित मुद्दे