2009-01-20 12 views
10

मैं xscreensaver, kscreensaver, या gnome-screensaver को अवरुद्ध करने के लिए एक सभ्य, गैर-लंगड़ा तरीका ढूंढ रहा हूं, जो शायद स्क्रीनसेवर-अज्ञेय तरीके से चल रहा हो, और यह पूरी तरह सकारात्मक रूप से तेज निष्पादित करना होगा।क्या लिनक्स में स्क्रीनसेवर को बाधित करने का कोई शानदार तरीका है?

मैंने xscreensaver FAQ (http://www.jwz.org/xscreensaver/faq.html) पढ़ा है।

मेरे पास एक gtk आधारित गेम प्रोग्राम है जो ऑडियो के कई चैनलों को मिलाते समय 30 फ्रेम/सेकेंड क्रैंकिंग कर रहा है, और चूंकि इसे जॉयस्टिक द्वारा नियंत्रित किया जाता है, कभी-कभी "स्क्रीन" स्क्रीनसेवर किक कर देगा। मैंने उद्धरणों में "द" रखा है, क्योंकि कम से कम तीन अलग-अलग लोकप्रिय स्क्रीनसेवर, xscreensaver, gnome-screensaver, और kscreensaver हैं, जिनमें से प्रत्येक अपनी अनूठी और क्लंकी विधियों के साथ है जिसके द्वारा कोई एप्लिकेशन उन्हें रोक सकता है।

क्या किसी ने कोड को इन सभी को तेजी से कोड में अवरुद्ध करने के लिए कोड को समाहित किया है? ओह, और यह जीपीएल संगत होना चाहिए।

वर्तमान में मेरा कोड आसानी से असंगत स्क्रीनसेवर डेवलपर्स के बारे में चिंतित है, यदि कोई स्क्रीनसेवर पता चला है और जॉयस्टिक उपयोग में है, और वास्तव में उपयोगकर्ता को स्क्रीनसेवर को मैन्युअल रूप से अक्षम करने की सलाह देने के अलावा कुछ भी करने की कोशिश नहीं करता है, केवल दूसरी बात जो मैं सोच सकता हूं वह इतनी अविश्वसनीय रूप से बदसूरत है कि मैं इसे करने से इंकार कर देता हूं।

बस सोच रहा है कि किसी और ने इसमें क्या किया है, और उन्होंने क्या किया है, और यदि उन्होंने कुछ भी किया है, तो अगर यह बदसूरत था तो ऐसा लगता है कि यह होना चाहिए, या अगर कुछ सुरुचिपूर्ण समाधान है वहाँ लगता है कि शायद एक्स घटनाओं को संश्लेषित करना संभवतः स्क्रीनसेवर को बेवकूफ बनाने के लिए सोच रहा है कि कुछ गतिविधि एक सार्वभौमिक तरीके से चाल कर सकती है, लेकिन मुझे सच में यकीन नहीं है कि यह कैसे करना है (और उम्मीद है कि आपको होने की आवश्यकता नहीं होगी इसे करने के लिए रूट।)

कोई विचार?

धन्यवाद,

- स्टीव


हम्म, unfortuanately, कम से कम फेडोरा कोर 8 पर, इस काम करने के लिए प्रकट नहीं होता।

एक्सडीजी-स्क्रीनसेवर स्क्रिप्ट वहां है, और ऐसा लगता है कि काम करने का इरादा है, यह वास्तव में काम नहीं करता है।

एक बार जब आप कर मैन्युअल रूप से "XDG-स्क्रीनसेवर निलंबित खिड़की-आईडी", जहां खिड़की आईडी

 
xwindow_id = GDK_WINDOW_XWINDOW (GTK_WIDGET (widget)->window); 

के माध्यम से या कि क्या खिड़की आईडी xprop के माध्यम से मिल गया है कार्यक्रम के भीतर से मिल गया है, और XDG-स्क्रीनसेवर रन दो प्रक्रियाओं बनाई गई हैं:

 
[[email protected] wordwarvi]$ ps -efa | grep xdg 
scameron 4218  1 0 20:12 pts/2 00:00:00 /bin/sh /usr/bin/xdg-screensaver suspend 0x3a00004 
scameron 4223  1 0 20:12 pts/2 00:00:00 /bin/sh /usr/bin/xdg-screensaver suspend 0x3a00004 
scameron 4313 3151 0 20:15 pts/1 00:00:00 grep xdg 
[[email protected] wordwarvi]$ 

और वे मर जाते हैं कभी नहीं, कार्यक्रम वे माना जाता है मरता के लिए इंतजार कर रहे हैं के बाद भी, और स्क्रीनसेवर कभी नहीं फिर से सक्षम है।

 
[[email protected] wordwarvi]$ xdg-screensaver status 
disabled 
[[email protected] wordwarvi]$ ls -ltr /tmp | grep xdg 
-rw------- 1 scameron scameron 15 2009-01-20 20:12 xdg-screensaver-scameron--0.0 
[[email protected] wordwarvi]$ 

एक्सडीजी-स्क्रीनसेवर फिर से शुरू विंडो-आईडी चलाना स्क्रीनसेवर को फिर से शुरू नहीं करता है।

स्क्रीनसेवर को पुनः चालू करने, मैं मैन्युअल रूप से उन्हें मार, और मैन्युअल रूप से फ़ाइलें यह/tmp में चारों ओर छोड़ देता है दूर करने के लिए है:

 
[[email protected] wordwarvi]$ kill 4218 4223 
[[email protected] wordwarvi]$ rm /tmp/xdg-screensaver-scameron--0.0 
[[email protected] wordwarvi]$ xdg-screensaver status 
enabled 
[[email protected] wordwarvi]$ 

तो, अच्छे इरादों, लेकिन वास्तव में काम करने के लिए प्रतीत नहीं होता ।


नहीं है, निश्चित रूप से यह हर फ्रेम को चलाने के लिए उम्मीद नहीं है, लेकिन यह हिचकी के कारण जब यह चलती है नहीं करना चाहते, सब है। एक्स घटनाओं को संश्लेषित करने के अपने विचार के साथ, मैं कल्पना कर रहा था कि स्क्रीन सेवर को लगता है कि गतिविधि होने के कारण यह अक्सर पर्याप्त होगा।

एक्सडीजी-स्क्रीनसेवर को देखकर (जो एक शेल स्क्रिप्ट लगता है जो आखिरकार मेरी प्रक्रिया के लिए "प्रतीक्षा" करता है - ठंडा) ऐसा लगता है कि मैं जो चाहता हूं उसे करने के लिए ऐसा लगता है। मुझे पता था कि मैं इस समस्या का सामना करने वाला एकमात्र या पहला नहीं हो सकता था।

धन्यवाद!

- स्टीव

उत्तर

2

मूवी-प्लेयर आमतौर पर स्क्रीनसेवर अक्षम करते हैं। आप यह देखने के लिए mplayer -code के आसपास पोक कर सकते हैं कि वे इसे कैसे करते हैं।

नियमित एक्स के लिए, वे XScreenSaverSuspend का उपयोग करते हैं जहां समर्थित है।

8

नहीं, लेकिन हाँ ...

ऐसा करने का कोई अच्छा साफ तरीका नहीं है। मेरी राय में एक्स सर्वर द्वारा प्रशासित एक तंत्र होना चाहिए, जो दोनों स्क्रीनसेवर और रुचि वाले अनुप्रयोग स्वेच्छा से एक या अधिक कार्यक्रमों के रनटाइम के दौरान किसी भी स्क्रीनसेवर के दमन पर बातचीत करने के लिए उपयोग कर सकते हैं। लेकिन मेरे ज्ञान के लिए अभी तक ऐसा कोई तंत्र मौजूद नहीं है। गनोम और केडीई इस समस्या के लिए एक डीबीयूएस दृष्टिकोण को लागू करने के लिए लग रहे हैं, लेकिन मेरी राय में यदि यह व्यापक हो जाता है (यह अभी तक तीसरे पक्ष के कोड में भरोसा करने के लिए पर्याप्त नहीं है) यह सही दृष्टिकोण नहीं है।

हालांकि, xdg-screensaver एक फ्रीडिस्कटॉप मानकीकृत शैल स्क्रिप्ट है जिसे आप स्क्रीनसेवर को नियंत्रित करने के लिए उप-प्रक्रिया के रूप में चला सकते हैं। यह सबसे लोकप्रिय स्क्रीनसेवर को नियंत्रित करता है, और ओएस विक्रेता इसे नए स्क्रीनसेवर या भविष्य में ऐसा करने के बेहतर तरीके से काम करने के लिए इसे अद्यतन/बनाए रखने के लिए ज़िम्मेदार होगा। कई अन्य क्लुज के विपरीत यह स्क्रीनसेवर को फिर से सक्षम कर देगा यदि आपका एप्लिकेशन कुछ रूट के माध्यम से क्रैश या निकलता है जो पुनः सक्षम कोड को कॉल करना भूल जाता है। इसका उपयोग कैसे करें इसके विवरण के लिए मैन्युअल पृष्ठ देखें।

एक जीटीके + उपयोगकर्ता के रूप में शायद आपके लिए सबसे कठिन पहलू शैल स्क्रिप्ट चलाने के लिए उप-प्रक्रिया बना रहे हैं (अगर आपने यह नहीं किया है तो आप फोर्क + exec का उपयोग करने के बारे में एक ट्यूटोरियल खोजना चाहते हैं) और xdg-screensaver को देने के लिए अपने एप्लिकेशन की मुख्य विंडो की XWindow आईडी प्राप्त करना।

आप पूछते हैं कि कोड "तेज़" होना चाहिए। इससे मुझे आश्चर्य होता है कि क्या आप इसे हर फ्रेम चलाने की उम्मीद कर रहे हैं - नहीं। Xdg-screensaver समाधान आपको प्रति फ्रेम या किसी भी चीज़ को एक बार दबाए जाने की बजाय, स्क्रीनसेवर को स्पष्ट रूप से अक्षम या किराए पर लेने की अनुमति देता है।

+0

XDG-स्क्रीनसेवर (XDG-utils संस्करण 1.1.0 के रूप में) (D-Feet कभी बदलते डी-बस विधि के नाम आत्मनिरीक्षण के लिए विशेष रूप से उपयोगी है) चल रहा स्क्रीनसेवर कार्यक्रम का पता लगाने में विफल रहता है: यह एक फ़ंक्शन detectDE() है जो कई लोकप्रिय डेस्कटॉप वातावरणों की जांच करता है। उदाहरण: यदि आप केडीई को अपने डेस्कटॉप वातावरण के रूप में चलाने के लिए होते हैं तो xdg-screensaver झूठा मानता है कि आप केडीई के डिफ़ॉल्ट स्क्रीनसेवर भी चलाएंगे। यदि आपने अपने डेस्कटॉप को कस्टमाइज़ किया है और इसके बजाय जेमी ज़विंस्किस xscreensaver का उपयोग करने का निर्णय लिया है तो यह धारणा झूठी है और xdg-screensaver विज्ञापित के रूप में काम नहीं करेगा। IMHO यह एक बग है। – pefu

+1

मुझे अभी पता चला है कि xdg-utils को संस्करण 1.1.1 में अपग्रेड करके ऊपर दी गई मेरी टिप्पणी में वर्णित बग को ठीक किया गया है। – pefu

2

यह एक पूरी तरह से डेस्कटॉप-अज्ञेयवाद समाधान नहीं है, लेकिन कोर Gnome पुस्तकालयों स्थापित कर रहे हैं अगर (कई जीटीके आधारित एप्लिकेशन उन्हें आवश्यकता होती है) यह भी अन्य डेस्कटॉप वातावरण पर काम कर सकता था:

अक्षम स्क्रीनसेवर:

gsettings set org.gnome.desktop.screensaver idle-activation-enabled false 

(फिर से) सक्षम स्क्रीनसेवर:

gsettings set org.gnome.desktop.screensaver idle-activation-enabled true 
1

इस प्रयास करें: xdg-screensaver suspend [window id]

(देखें: http://portland.freedesktop.org/xdg-utils-1.0/xdg-screensaver.html)

एक बैश स्क्रिप्ट समाधान:

activ_win_id=`DISPLAY=:0.${display} xprop -root _NET_ACTIVE_WINDOW` 
activ_win_id=${activ_win_id:40:9} 
xdg-screensaver suspend $activ_win_id 

यह सूक्ति-स्क्रीनसेवर के लिए काम करता है।

और वहाँ और अधिक जटिल DBus "रोकना" विधि है: https://people.gnome.org/~mccann/gnome-screensaver/docs/gnome-screensaver.html#gs-method-Inhibit

dbus-send --session \ 
     --dest=org.gnome.ScreenSaver \ 
     --type=method_call \ 
     --print-reply \ 
     --reply-timeout=20000 \ 
     /org/gnome/ScreenSaver \ 
     org.gnome.ScreenSaver.Inhibit \ 
     [application name e.g. ""] \ 
     [reason e.g."playing a game"] \ 
     [non-zero-random-integer e.g. 123] 
0

वर्तमान रास्ता (Gnome के अंतर्गत इस तरह केडीई के रूप में 3.22 और संभवतः अन्य) इस प्रतीत हो रहा है, जो एक uint32 के रूप में एक uninhibition कुकी रिटर्न :

dbus-send --session \ 
     --dest=org.freedesktop.ScreenSaver \ 
     --type=method_call \ 
     --print-reply \ 
     --reply-timeout=20000 \ 
     /org/freedesktop/ScreenSaver \ 
     org.freedesktop.ScreenSaver.Inhibit \ 
     string:program string:reason 

फिर, निषेध निष्क्रिय करने के लिए:

dbus-send --session \ 
     --dest=org.freedesktop.ScreenSaver \ 
     --type=method_call \ 
     --print-reply \ 
     --reply-timeout=20000 \ 
     /org/freedesktop/ScreenSaver \ 
     org.freedesktop.ScreenSaver.UnInhibit \ 
     uint32:<inhibit-cookie> 

यहां एक small script है जो किसी दिए गए प्रोग्राम के लिए स्क्रीनसेवर को अक्षम करता है, फिर बाद में इसे बाहर निकलने पर पुनर्स्थापित करता है।

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

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