2012-12-24 24 views
7

मेरे पास एक आर्केड कॉकटेल कैबिनेट (कोई कीबोर्ड, केवल जॉयस्टिक और बटन नहीं है) उबंटू 12.4.1 चला रहा है, जब पावर बटन दबाया जाता है तो पॉपअप दिखाई देता है और सिस्टम ठीक हो जाता है, लेकिन जब मेरा पूर्ण-स्क्रीन गेम लॉन्चर मेनू एप्लिकेशन चल रहा है तो बटन दबाकर कोई प्रभाव नहीं पड़ता है। जब बटन दबाया जाता है तो मैं ईवेंट को फंसाना चाहता हूं, इसलिए मेरा ऐप सिस्टम शट डाउन ट्रिगर कर सकता है। मेरा मेनू ऐप सी ++ में लिखा गया है और एसडीएल का उपयोग कर रहा है। किसी भी विचार पर मैं कैसे बिजली बंद बटन प्रेस घटना जाल कर सकते हैं?जब उपयोगकर्ता ने पावर ऑफ बटन दबाया है तो मैं कैसे पता लगा सकता हूं?

कक्षा सदस्य::

int m_acpidsock; 
sockaddr_un m_acpidsockaddr; 

सेटअप कोड:

/* Connect to acpid socket */ 
m_acpidsock = socket(AF_UNIX, SOCK_STREAM, 0); 
if(m_acpidsock>=0) 
{ 
    m_acpidsockaddr.sun_family = AF_UNIX; 
    strcpy(m_acpidsockaddr.sun_path,"/var/run/acpid.socket"); 
    if(connect(m_acpidsock, (struct sockaddr *)&m_acpidsockaddr, 108)<0) 
    { 
     /* can't connect */ 
     close(m_acpidsock); 
     m_acpidsock=-1; 
    } 
} 

उन है कि प्रतिक्रिया व्यक्त करने के लिए धन्यवाद, यहाँ वास्तविक कोड मैं पाने के लिए इस्तेमाल किया यह काम करने के लिए है

अद्यतन कोड:

/* check for any power events */ 
if(m_acpidsock) 
{ 
    char buf[1024]; 
    int s=recv(m_acpidsock, buf, sizeof(buf), MSG_DONTWAIT); 

    if(s>0) 
    { 
     buf[s]=0; 
     printf("ACPID:%s\n\n",buf); 
     if(!strncmp(buf,"button/power",12)) 
     { 
      setShutdown(); 
      system("shutdown -P now"); 
     } 
    } 
} 

बंद सॉकेट कोड:

if(m_acpidsock>=0) 
{ 
    close(m_acpidsock); 
    m_acpidsock=-1; 
} 

अन्त में, मैं गैर-रूट उपयोगकर्ताओं के लिए शट डाउन अनुमति देने के लिए की जरूरत है और है कि इस लाइन का उपयोग काम किया:

sudo chmod u+s /sbin/shutdown 
+2

नहीं, लेकिन यह बहुत अच्छा लगता है! –

+0

कनेक्ट() कॉल में वह नंबर 108 क्या है? इसके बजाय आकार (m_acpidsockaddr) नहीं होना चाहिए? –

उत्तर

5

तुम बस शुरू कर सकता है /proc/events/acpi से पढ़ने के लिए एक थ्रेड, और वहां संदेशों को डीकोड करें।

लेकिन ऐसा करने के लिए acpid का उपयोग करने के बारे में कैसे? आप /var/run/acpid.socket सुनेंगे, और जब आप जिस संदेश की परवाह करते हैं, उसमें करें जो आपने किया है।

देखें: http://www.linuxmanpages.com/man8/acpid.8.php

मुझे आशा है कि यह उपयोगी है।

2

acpid पर एक नज़र डालें, मुझे लगता है कि आप कस्टम आदेश जोड़ने के लिए /etc/acpi/ विशेष रूप से /etc/acpi/powerbtn.sh में स्क्रिप्ट्स में से एक को बदल सकते हैं। आप /proc/acpi/event स्वयं को पढ़ने का भी प्रयास कर सकते हैं।

2

पावर बटन को दबाए रखने जैसी चीजें एसीपीआई घटनाओं को ट्रिगर करती हैं जो एसिड/etc/acpi/events में कॉन्फ़िगर किए गए प्रतिक्रिया के रूप में एक स्क्रिप्ट को निकाल देती है।

event=button[ /]power 
action=/etc/acpi/powerbtn.sh 

आप /etc/acpi/powerbtn.sh को अनुकूलित कर सकते हैं, या अपनी पसंद के किसी दूसरी स्क्रिप्ट पर यह बात: इस मामले में आप चाहते/etc/ACPI/powerbtn, जो कुछ इस तरह दिखता है।

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