2013-02-13 12 views
6

मैं या तो विंडोड या पूर्ण स्क्रीन है, जहां मैं Alt + टैब की तरह किसी भी WM कुंजीपटल शॉर्टकट, अवरोध डालने के बिना माउस पकड़ लिया लेकिन है, एक आवेदन जहां मैं एक खिड़की पर आकर्षित बनाना चाहते हैं, और मैं भी सूचना प्राप्त करने की जरूरत है जब भी उपयोगकर्ता फोकस करता है/छोड़ देता है। गूगल क्रोम, Firefox या GNOME टर्मिनल की तरहलिनक्स में Alt + Tab अनुकूल पूर्णस्क्रीन प्रोग्राम (जैसे गेम) कैसे बनाएं?

आम अनुप्रयोगों संभाल कर सकते हैं यह सिर्फ ठीक (F11 के साथ पूर्ण स्क्रीन जा रहा है, लेकिन अभी भी होने Alt + टैब), लेकिन वे माउस हड़पने नहीं है।

एसडीएल उपयोग के इस मामले के एक कुख्यात गरीब हैंडलिंग है: SDL_WM_GrabInput माउस पकड़ लेता है, लेकिन यह भी WM शॉर्टकट को बीच में रोक; और SDL_FULLSCREEN के पास स्वयं से कुछ प्रकार का स्वचालित हड़पने लगता है (मुझे क्यों नहीं पूछें)।

एक समाधान Alt + टैब खुद के लिए कोड लिखने के लिए हो सकता है, लेकिन यह बेकार है (और अन्य कार्य-स्थल को बदलने जैसे अन्य WM शॉर्टकट के लिए मदद नहीं करता है)।

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

तो मैं एसडीएल के साथ पागल हूं और विकल्पों को देखना चाहता हूं। मैं एसडीएल का उपयोग करने के लिए पसंद करूंगा लेकिन यह आवश्यक नहीं है।

This question करते रहे कि क्या एसडीएल लेकिन वास्तव में ऐसा XGrabKeyboard उपयोग करने के लिए है लगता है। मैन पेज को पढ़कर यह मुझे तुरंत स्पष्ट नहीं करता है कि क्या आप कीबोर्ड को पकड़ने के बिना माउस को पकड़ सकते हैं (मैंने कभी एक्सलिब का उपयोग नहीं किया)।

मुझे पता है कि जीटीके साथ "नकली फुलस्क्रीन" बनाने के लिए (कि Alt + टैब के अनुकूल, GNOME टर्मिनल किस्म की, है)। मुझे कल्पना है कि ऐसा करने के साथ-साथ माउस छिपाने के साथ-साथ इसे केंद्र में ले जाना ("नकली हथियाने") चाल कर सकता है, लेकिन यह बहुत अधिक नली टेप की तरह लगता है। एक आसान तरीका होना चाहिए। (इसके अलावा मैं एक निर्भरता के रूप में जीटीके नहीं जोड़ना चाहता हूं, लेकिन मुझे यह भी यकीन नहीं है कि कच्चे एक्सलिब कॉल करना एक अच्छा विचार है)।

इसके लिए क्या अच्छा समाधान है?

मुझे एक लिनक्स/एक्स 11 समाधान की आवश्यकता है, लेकिन यह क्रॉस-प्लेटफॉर्म होने के लिए अच्छा होगा - मुझे पता है कि इसे आसानी से विंडोज़ पर हल किया जा सकता है, इसलिए शायद एक लाइब्रेरी है जो वास्तव में ऐसा करती है। (यह भी, मैं ओपन के साथ प्रस्तुत करना है, लेकिन यह अप्रासंगिक है)

पुनश्च: शायद मैं इस मुद्दे का एक बुरा समझ कर रहा हूँ और मैं सही सवाल नहीं पूछ रहा हूँ, इसलिए बाहर बिंदु के लिए स्वतंत्र महसूस दृष्टिकोण मैं हेवन ' टी माना जाता है।

+0

[प्रश्न मैंने उद्धृत किया है] (http://stackoverflow.com/questions/10916997/alt-tab-from-fullscreen-sdl), मेरी राय में, वास्तव में एक डुप्लिकेट नहीं है, क्योंकि मैं नहीं देख रहा हूं विशेष रूप से एक एसडीएल समाधान के लिए। एसडीएल केवल लाइब्रेरी है जिसका मैं उपयोग कर रहा हूं * अभी *। – darque

+0

मैंने अभी एक्सएलआईबी एपीआई [XGrabPointer] (http://tronche.com/gui/x/xlib/input/XGrabPointer.html) फ़ंक्शन पर देखा था। तो जाहिर है, Xlib कीबोर्ड को पकड़ने के बिना * केवल * माउस को हथियाने के लिए पर्याप्त कार्यक्षमता है। – darque

उत्तर

4

मैं लिनक्स पर जुआ खेलने के लिए जीटीके और GtkGLExt का उपयोग कर रहे हैं इन दिनों (जैसे, मेरे खेल खेल प्रविष्टियों डेयर)। यहां (gtk.c Gist) मेरा कोड है, मैंने इसे फ्रीबीएसडी लाइसेंस के तहत जारी किया है। आप उस कोड को देख सकते हैं जिसे मैंने विंडो स्टेटस डिबगिंग के लिए टिप्पणी की है। मैं उल्लेख करना चाहिए कि यह एक बहुत बड़ा ढांचा जो मैं की तरह खेल खेल डेयर बातों के लिए उपयोग करने का हिस्सा है, और मैं ठीक एक ही कारण है कि आप का उल्लेख के लिए एसडीएल के लिए इसे पसंद करते हैं: जिसके परिणामस्वरूप आवेदनों पर देशी अनुप्रयोगों के लिए उपयोगकर्ताओं की अपेक्षाओं को और अधिक बारीकी से पालन उनके प्लेटफ़ॉर्म (लिनक्स, ओएस एक्स, विंडोज़)। कहने की जरूरत नहीं है, इस मार्ग पर जाना बहुत काम है।

कच्चे एक्स 11 प्रोग्रामिंग, हालांकि, एक वास्तविक गड़बड़ है। मेरा अनुमान है कि मुझे अपने जीटीके कोड को एक्स 11 कोड में बदलने के लिए ठोस प्रोग्रामिंग और पढ़ने के दस्तावेज़ों के कुछ हफ्तों का समय लगेगा; यह सिर्फ मेरे लिए लायक नहीं है लेकिन आप अलग-अलग निर्णय ले सकते हैं। (किसी भी निर्भरता को खत्म करने के लिए बस कई घंटों को हर किसी ने स्थापित किया है!) जीटीके निर्भरता असल में अपमानजनक नहीं है, शायद यह पहले से ही स्मृति में लोड हो चुकी है, और एबीआई 2.x के लिए बहुत स्थिर है इसलिए यह बाइनरी संगतता को नुकसान नहीं पहुंचाएगा ।

गेम के लिए एक्स 11 प्रोग्रामिंग के साथ एक बड़ी समस्या यह है कि ईवेंट हैंडलिंग कुल गड़बड़ है। आप घटनाओं के लिए आसानी से मतदान नहीं कर सकते हैं। एक्सलिब इंटरफ़ेस अवरुद्ध हो रहा है, इसलिए आपको डेटा पढ़ने के लिए फ़ंक्शन कॉल के एक आर्केन अनुक्रम का उपयोग करना होगा, जांचें कि ईवेंट लंबित हैं, और उसके बाद केवल कतार से ईवेंट पढ़ते हैं (अन्यथा आपका एप्लिकेशन ईवेंट प्रकट होने तक अवरुद्ध होगा)। एक्ससीबी लाइब्रेरी एक्सलिब के लिए वैकल्पिक है जो चारों ओर बहुत बेहतर है और एक गैर-अवरुद्ध इंटरफेस का समर्थन करता है, लेकिन यह ओपनजीएल के साथ अच्छा नहीं खेलता है। तो आप दोनों को मिश्रण करने का प्रयास कर सकते हैं, या आप केवल जीटीके का उपयोग कर सकते हैं।

static void toggle_fullscreen() 
{ 
    if (sg_gtk_status & SG_STATUS_VISIBLE) { 
     if (sg_gtk_status & SG_STATUS_FULLSCREEN) 
      gtk_window_unfullscreen(sg_window); 
     else 
      gtk_window_fullscreen(sg_window); 
    } 
} 

जरा कल्पना यह कितना काम X11 इंटरफेस के साथ होगा::

मुझे आप फुलस्क्रीन के लिए जीटीके कोड का एक टुकड़ा देने के स्क्रीन के आकार पता लगाने (वहाँ की तुलना में अधिक हो सकता है एक!), खिड़की का आकार बदलें, ऑर्डरिंग बदलें ताकि यह सबकुछ के ऊपर हो, सजावट बदल सके, और फिर उपयोगकर्ता बुद्धिमान डेस्कटॉप स्विच करता है तो बुद्धिमानी से प्रतिक्रिया दें। ब्ला! (दरअसल, यह वर्णन करता है कि मेरा कोड ओएस एक्स पर कैसे काम करता है, लेकिन एपीआई बहुत अच्छे हैं।)

यदि आप X11 का उपयोग कर रहे हैं, तो आपको यह सीखना होगा कि उपयोगकर्ता को कैसे प्रतिक्रिया दें अपेक्षित तरीका एक्स 11 1 9 80 के दशक से है। जीटीके, तुलनात्मक रूप से, आपके एप्लिकेशन को जीटीके के यूआई डिजाइनरों से उचित चूक का एक स्वैथ देता है। यूआई डिजाइन काम है। और याद रखें: आप एक्स 11 को जीटीके के साथ ठीक कर सकते हैं।

सारांश: एक्स 11 प्रोग्रामिंग बहुत समय के साथ प्रोग्रामर के लिए है।

नोट्स: GtkGLExt एक कष्टप्रद लिंकर ध्वज, -Wl,--export-dynamic जोड़ता है। मेरी बिल्ड स्क्रिप्ट pkg-config के आउटपुट से झंडा हटा देती हैं।

एक्स 11 अनुभव: मुझे लगता है कि मैंने X11 में काम करने वाली पूरी चीज़ को प्राप्त करने की कोशिश करने में लगभग एक सप्ताह बिताया, और इस प्रक्रिया में बहुत से मृत सिरों के बाद मैं समाप्त हो गया। मेरी असफलताओं से सीखो।

+0

अरे, एक बड़ा धन्यवाद! मैं आपके कोड पर एक नज़र डालेगा। मैं मानता हूं कि प्रोग्रामिंग को सरल बनाने के लाभ जीटीके जैसी वसा निर्भरता जोड़ने की कमी से अधिक है। मैं एक छोटी सी पुस्तकालय पसंद करूंगा जो वही काम करता है। (या ईमानदार होने के लिए, मैं यह पसंद करूंगा कि एसडीएल ने यह किया ..) – darque

+0

@ डेर्क: मैं यह भी चाहता हूं कि एसडीएल ने ऐसा किया, लेकिन मुझे लगता है कि दुर्भाग्यपूर्ण वास्तविकता यह है कि एसडीएल 1.2 का डिजाइन पहले के युग से अवशेष है। शायद एसडीएल 1.3 बेहतर है। और एसडीएल ज्यादातर लोगों के लिए काफी अच्छा है। एसडीएल के लिए आधुनिक प्रतिस्थापन के लिए निश्चित रूप से कमरा है, लेकिन 2013 के बाद से इसे एंड्रॉइड और आईओएस पर अच्छी तरह से काम करना होगा, जो उपक्रम को और अधिक जटिल बनाता है। –

+0

एसडीएल 1.3? हम्म मैंने सुना है कि एसडीएल 2.0 इसे सुधारने जा रहा था, लेकिन मुझे इसे Google पर नहीं मिला ([इस रोडमैप को छोड़कर] (http://wiki.libsdl.org/moin।सीजीआई/रोडमैप # माउस_इनपूट) जो विस्तृत किए बिना माउस हड़पने पर सुधार बताता है)। – darque

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