मेरे पास एक आर्केड कॉकटेल कैबिनेट (कोई कीबोर्ड, केवल जॉयस्टिक और बटन नहीं है) उबंटू 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
नहीं, लेकिन यह बहुत अच्छा लगता है! –
कनेक्ट() कॉल में वह नंबर 108 क्या है? इसके बजाय आकार (m_acpidsockaddr) नहीं होना चाहिए? –